bsp_tool provides a Command Line Interface for analysing .bsp files

Overview

bsp_tool

Python library for analysing .bsp files

bsp_tool provides a Command Line Interface for analysing .bsp files
Current development is focused on bringing new maps to Counter-Strike: Online 2 & the Titanfall Engine

Installation

To use the latest version, clone from git:

$ git clone [email protected]:snake-biscuits/bsp_tool.git

Or to use the latest stable release, install via pip (Python 3.7+):

pip install bsp_tool

Fair Use

Please do not use bsp_tool to copy or steal another creator's work
The primary goal of bsp_tool is to extend community mapping tools

Always

  • Ask the creator's permission before touching their work
  • Understand that by default creator's works are under copyright
  • Contact the original creator to get their permission
    • This can get complicated
    • Some creators don't hold the copyright on their works
      • often because of Company / Publisher contracts
  • Credit the original creator; once you have permission to share a derivative work
  • Support the official release

DO NOT use this tool to steal another creator's work
DO use this tool to understand the .bsp format(s) and create more specific tools

Be aware that this gets even more complicated with commercial projects

Usage

To load a .bsp file in python:

">
>>> import bsp_tool
>>> bsp_tool.load_bsp("map_folder/filename.bsp")
<ValveBsp filename.bsp (VBSP version 20) at 0x00...>

Full documentation: snake-biscuits.github.io/bsp_tool/

Supported Games

The emoji indicates tests are failing
The emoji indicates a lack of .bsps to test

Thanks

  • BobTheBob
    • Identified loads of Titanfall lumps (90% of static props + more)
  • Chris Strahl
    • Preserving extensive documentation, mods & source code for Quake 3 & Ubertools games
  • Ficool2
    • Providing lots of current and detailed info on Source & helping track down some rarer titles
  • Maxime Dupuis
    • Helping me identify multiple lumps in Source Engine .bsps
  • MobyGames
    • Keeping records of the credits on so many games, helping to pin down engine origins
  • pakextract
    • Super useful tool for .pak files
  • REDxEYE
    • Being very open and actively collaborating on SourceIO & Titanfall .bsps
  • Taskinoz
    • Helping me find people that can actively use my research & tools
  • All of the Wiki Editors
    • Except the uncited Id Tech 3 -> Treyarch NGL on CoDWiki, that was a massive pain to verify
Comments
  • Refactor to allow reloading lumps

    Refactor to allow reloading lumps

    When mapping out methods / lump formats it would be quite handy to use importlib to reload branch scripts and reload a single lump

    >>> import bsp_tool
    >>> import my_branch_script
    >>> bsp = bsp_tool.load_bsp("maps/subject.bsp", branch=my_branch_script)
    ERROR LOADING LUMP_XX:
    	...
    # edit my_branch_script.py
    >>> import importlib
    >>> importlib.reload(my_branch_script)
    >>> bsp.set_branch(my_branch_script)
    >>> bsp.reload("LUMP_XX")
    

    or even writing a test lump class live in editor

    >>> import bsp_tool
    >>> import enum
    >>> class BranchScript:
    ...    class LUMP(enum.Enum):
    ...        LUMP_XX = 42
    ...    lump_header_address = {LUMP.LUMP_XX: (16 + 42 * 16)}
    ...    LUMP_CLASSES = dict()
    ...    SPECIAL_LUMP_CLASSES = dict()
    ...    methods = []
    >>> branch_script = BranchScript()
    >>> class Xx(bsp_tool.branches.base.MappedArray):
    ...     _format = "3f"
    ...     _mapping = [*"xyz"]
    >>> branch_script.LUMP_CLASSES["LUMP_XX"] = Xx
    >>> bsp = bsp_tool.load_bsp("maps/subject.bsp", branch=branch_script)
    ERROR LOADING LUMP_XX
    	...
    >>> class NewXx(bsp_tool.branches.base.MappedArray):
    ...     _format = "4f"
    ...     _mapping = [*"xyzw"]
    >>> bsp.branch.LUMP_CLASSES["LUMP_XX"] = NewXx
    >>> bsp.reload("LUMP_XX")
    

    Though even this theorised process could be simplified a little, but loading new lump classes faster would be a very helpful tool

    enhancement 
    opened by snake-biscuits 4
  • Is 29 (LUMP_PHYSCOLLIDE) really unused?

    Is 29 (LUMP_PHYSCOLLIDE) really unused?

    https://github.com/snake-biscuits/bsp_tool/blob/56c425188073178d7d605c15b24be8e691ca831f/bsp_tool/branches/respawn/apex_legends.py#L53

    Appears this is unused, but I'm not sure if that was just put there in a haste or is actually reality. I could not find any information on LUMP_PHYSLEVEL which I suspect may be the alternative lump which holds collision data.

    opened by lf94 4
  • BitFields are busted in places

    BitFields are busted in places

    Keep forgetting about the reverse order needed since we're matching gcc bitfield order I have no idea how/if bitfield order is standardised, and I fear endian flipped bitfields

    Testing apex_legends.BVHNode index bitfields gave some wierd errors

    >>> base.BitField(0xAAAAAABC, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    Traceback (most recent call last):
      ...
    OverflowError: a is out of range! (max allowed value = 16777215)
    >>> 0XFFFFFFFF == (2 ** 32) - 1
    True
    >>> 0xAAAAAA < (2 ** 24) - 1
    True
    >>> 0xAAAABC < (2 ** 24) - 1
    True
    >>> bsp_tool.branches.base.BitField(0xAAAAAABC, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    Traceback (most recent call last):
      ...
    OverflowError: a is out of range! (max allowed value = 16777215)
    >>> bsp_tool.branches.base.BitField(0x00000123, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    <BitField (a: 291, b: 0, c: 0)>
    >>> bsp_tool.branches.base.BitField(0x00000123, _format="I", _fields={"c": 4, "b": 4, "a": 24})
    Traceback (most recent call last):
      ...
    OverflowError: c is out of range! (max allowed value = 15)
    >>> 0x123 >> 24
    0
    >>> (0x123 >> 24) & 0xFFFFFF
    0
    

    __init__ shouldn't be throwing bounds errors, there should be a mask keeping us in bounds... will need to expand tests for regression as well

    bug 
    opened by snake-biscuits 3
  • Any progress on save_as() function ?

    Any progress on save_as() function ?

    I am working on a program which automatically adds an eventlistener to any given csgo .bsp file. I have already made a progress on adding the entities to the bsp and the only thing left is to save the map to a new bsp file. I just wanted to know if any progress was made in the past 4 months ?

    enhancement 
    opened by miifanboy 3
  • Cannot load entities lump

    Cannot load entities lump

    I made a small script to play around with bsp_tool:

    from bsp_tool import load_bsp
    from bsp_tool.branches.respawn.apex_legends import LUMP
    
    file = "/home/lee/Code/Mine/Analysis/ApexLegends/Maps/KingsCanyon/mp_rr_canyonlands_staging.bsp"
    bsp = load_bsp(file)
    bsp.read_lump(LUMP.ENTITIES)
    

    Note I do have the ...0000.bsp_lump.

    But I'm unable to retrieve the entities lump:

    $ python3 test.py
    Loading mp_rr_canyonlands_staging.bsp (rBSP version 49)...
    ERROR PARSING TEXDATA:
    TEXDATA lump is an unusual size (400 / 36). Wrong engine branch?
    Loaded  mp_rr_canyonlands_staging.bsp
    Traceback (most recent call last):
      File "/home/lee/Code/Others/bsp_tool/test.py", line 6, in <module>
        bsp.read_lump(LUMP.ENTITIES)
      File "/home/lee/Code/Others/bsp_tool/bsp_tool/respawn.py", line 29, in read_lump
        self.file.seek(self.branch.lump_header_address[LUMP])
    ValueError: seek of closed file
    

    After this I'm going to probably export the vertices to see some point clouds (as you've done in lump_analysis.py).

    Have you gotten chunks of the level to render with planes? Do you know how LOD is handled?

    bug 
    opened by lf94 3
  • Can't peek lumps with dot notation

    Can't peek lumps with dot notation

    Shouldn't use setattr imo, as there is no type hinting on what sorts of lumps a bsp contains. https://github.com/snake-biscuits/bsp_tool/blob/2a3e1e7d10a6d94c7686b2799d3c7c2db898b4b6/bsp_tool/valve.py#L57

    documentation 
    opened by kristiker 2
  • [Test Maps] `orange_box`

    [Test Maps] `orange_box`

    • [x] Tools:

      • Source SDK
      • Source SDK Base 2006
      • Source SDK Base 2007
      • [x] Level Editor(s):
      • [x] Compiler(s): Source SDK
    • [x] Map(s):

      • [x] mapsrc/Hammer/Team Fortress 2/test2.vmf ->maps/Team Fortress 2/test2.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer/Team Fortress 2/test_displacement_decompile.vmf ->maps/Team Fortress 2/test_displacement_decompile.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer/Team Fortress 2/test_physcollide.vmf ->maps/Team Fortress 2/test_physcollide.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer++/Team Fortress 2/mp_lobby.vmf -> maps/Team Fortress 2/mp_lobby.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested

    Active Mods / Modding Community (Optional):

    Test Map Test Map: Tools: Hammer 
    opened by snake-biscuits 2
  • [Test Maps] `quake2`

    [Test Maps] `quake2`

    • [x] Tools:

      • Documentation / Guides:
        • TODO: see #30 for now
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/TrenchBroom/Quake/mp_lobby.map -> maps/Quake 2/mp_lobby.bsp
        • [x] sources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log
        • [x] Tested

    Active Mods / Modding Community (Optional):

    • TODO: see #30 for now
    Test Map Test Map: Tools: Trenchbroom Test Map: Tools: Obscure 
    opened by snake-biscuits 2
  • [Test Maps] `quake`

    [Test Maps] `quake`

    • [x] Tools:

      • Documentation / Guides:
        • TODO: see #30 for now
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/TrenchBroom/Quake/mp_lobby.map -> maps/Quake/mp_lobby.bsp
        • [x] sources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log
        • [x] Tested

    Active Mods / Modding Community (Optional):

    • TODO: see #30 for now
    Test Map Test Map: Tools: Trenchbroom 
    opened by snake-biscuits 2
  • Need helper class for Bitfields in Struct & MappedArray classes

    Need helper class for Bitfields in Struct & MappedArray classes

    Thanks Fifty.

    struct CellAABBNode_t {
        Vector3f  mins;
        uint32_t  num_children: 8;
        uint32_t  first_child: 16;
        uint32_t  child_flags: 8;
        Vector3f  maxs;
        uint32_t  num_obj_refs: 8;
        uint32_t  first_obj_ref: 16;
        uint32_t  obj_ref_flags: 8;
    };
    

    Looks like respawn structs use bitfields a lot This makes sense with the "Extreme SIMD" method of vec4(a.xyz, a.metadata)

    valve.source.Leaf also uses a bitfield at present we just write a getter & setter property for each member

    This means CellAABBNode would need 12 property methods Automating this would minimize errors & reduce bloat

    enhancement 
    opened by snake-biscuits 2
  • Entity data lost due to duplicate keys not being handled by parser

    Entity data lost due to duplicate keys not being handled by parser

    Duplicate keys in entities are lost just like in QtPyHammer-devs/vmf_tool#13

    UPDATE: This isn't actually a bug, turns out I forgot the code handles this case and didn't check before creating the issue :P Still, an update would be nice

    Try handling this like https://github.com/pySourceSDK / ValveVMF Where instead of a dict a list of [(key, value)] tuples store all keys without duplicates

    This will require:

    • [ ] New parsing approach
    • [ ] Refactor of Entities.search
      • [ ] Refactor all bsp methods (in branch scripts, e.g. worldspawn_volume) that touch ENTITIES lumps
        • TODO: list all such methods here so we can track progress
    • [ ] Re-compiling test/maps/Team Fortress 2/test2.bsp to match QtPyHammer-devs/vmf_tool's test2.vmf
    • [ ] A test that uses this test map to confirm this issue has not reappeared

    NOTE: io_import_rbsp will also need updating to support these changes

    Extending

    This might also be a good opportunity to use ValveVMF's parser on values And even using ValveFGD & custom classes for entities However this would likely require some re-engineering (of ValveVMF) to allow feeding the system flat nodes (unnamed curly brace groups) Not to mention some extra details to the parser, and maybe a deeper look at .fgd generation

    NOTE: Many source engine titles have .fgd files available via the VDC: link

    Maybe extenstions/fgd.py or bsp_tool_examples would be a place to try this out It would be preferable for the core lib to continue to function without any external dependencies ValveVMF parsing can also be quite slow, so deferring it's use until needed would be ideal

    enhancement 
    opened by snake-biscuits 2
  • [Test Maps] `monochrome.contagion`

    [Test Maps] `monochrome.contagion`

    • [x] Tools:

      • [x] Level Editor(s):
        • Hammer
        • Hammer++ TODO: figure out setup
      • [x] Compiler(s): Contagion SDK (comes with Contagion)
    • [ ] Map(s):

      • [ ] Basic room with spawnpoint & lighting
        • [ ] Entry insources.txt crediting mapper / contributor
        • [ ] Compiled
        • [ ] .bsp.info.txt file with compile log (.log in mapsrc)
        • [ ] Tested

    Active Mods / Modding Community (Optional):

    NOTE: monochrome.contagion branch is currently no different from valve.left4dead2 (at current level of understanding)

    Test Map Test Map: Tools: Hammer 
    opened by snake-biscuits 0
  • DisplacementInfo Neighbours aren’t mapped yet

    DisplacementInfo Neighbours aren’t mapped yet

    ~~The Source Engine definitions for ddispinfo_t mess with how C/C++ packs structs to create some oddly aligned structures~~

    ~~This means we can't use the Python struct module to define the whole structure, so we'll have to tack extra .from_bytes & .to_bytes methods on~~

    ~~It's going to get extremely messy but properly dealing with displacements is likely going to be the most complicated thing we ever do, besides advanced bitfields...~~

    Displacement Neighbour sub-structs aren't mapped yet

    Look at #74 & #73 for arguments for using inheritance to simplify this nightmare (valve.source.DisplacementInfo can do the black magic and the others can copy)

    We will also need Test Maps (#16) with at least one Displacement for #63, #38, #40 & #72

    4 DisplacementInfo variants to finish up:

    • [x] valve.source
      • [x] Test map: tests/maps/Team Fortress 2/test2.bsp
      • [x] Test map: tests/maps/Team Fortress 2/test_decompile_displacement.bsp
    • [ ] chaos_initiative.chaos
      • [ ] Test map: TODO
    • [ ] nexon.vindictus
      • [ ] Test map: TODO
      • [ ] nexon.cso2_2018
        • [ ] Test map: TODO

    NOTE: Team Fortress 2 test maps are for valve.orange_box, but they use the valve.source DisplacementInfo spec

    ~~Current DisplacementInfo implementations use base.Struct, which utilises __slots__, so no private members can be utilised afaik Stick to _classes if possible~~

    Enjoy the pain

    enhancement Test Map Test Map: Tools: Hammer Test Map: Tools: Unknown Test Map: Tools: Obscure documentation slow burn 
    opened by snake-biscuits 2
  • Reduce & Test for Duplicate `LumpClasses`

    Reduce & Test for Duplicate `LumpClasses`

    Many branch_scripts are for engine changes that just expand limits by increasing the size of indexing members Some of these changes were already performed in older branches e.g. id_software.quake_remake_old appears to be the first to update quake.Edge from uint16_t -> uint32_t

    Lots of branches likely do this We'll need to collect identically named branches (plus v2 etc. variants) & diff .as_cpp() cpp should be more reliable for the type footprint, since member names & definitions are still being unified (see #73)

    This should reduce the overall scale of the code base and help reduce those duplicates with largely copy-pasted definitions

    LumpClasses end up re-declaring & copying documentation from their parents a lot, as it's largely intended for each branch_script to serve as documentation, as much as code

    Though the LUMP_CLASSES etc. inheritance flies in the face of that a little... docs/supported somewhat remedies this At this point in time I still think LumpClasses should only be loosely dependant on their parents. though simplifying could help... If .as_cpp() collected comments from the annotations / type-hints we could probably simplify a lot of LumpClasses

    enhancement documentation slow burn 
    opened by snake-biscuits 1
  • Unified naming convention for lump names & LumpClass members

    Unified naming convention for lump names & LumpClass members

    This will involve some light refactoring

    A bunch of lump names differ across different branch scripts Many of these lumps share functionality, and even structs in some cases Unifying these different lumps to singular names with clearly conveyed use & context would really help documentation

    This could also hugely help research & tracing the iteration of various small engine concept (e.g. .bsp geometry rendering)

    I've already started doing a little of this and am already seeing some Quake 3 -> MoH:AA -> CoD -> Titanfall connections

    Refer to the new "Etymology" page on the wiki for more info on the rationale behind this

    TL;DR: make more code the same so we write less code and don't get confused as frequently

    documentation slow burn 
    opened by snake-biscuits 6
  • [Test Maps] `chaos`

    [Test Maps] `chaos`

    • [x] Tools:

      • Momentum Mod Playtest 0.9.4 [there is a waiting list]
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/Hammer/Momentum Mod/mp_lobby.vmf -> maps/Momentum Mod/mp_lobby.bsp
        • [x] Entry insources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log (.log in mapsrc)
        • [x] Tested
      • [ ] At least 1 Displacement
        • [ ] Entry in sources.txt crediting mapper / contributor
        • [ ] Compiled
        • [ ] .bsp.info.txt file with compile log (.log in mapsrc)
        • [ ] Tested

    NOTE: converted q3/chronic w/ BSPConversionLib --newbsp & it threw no loading errors, unsure if that was a fluke quake3 conversion seems to break texture projection, might look into fixes

    Active Mods / Modding Community (Optional):

    Test Map Test Map: Tools: Hammer Test Map: Tools: Obscure 
    opened by snake-biscuits 4
  • [extensions/decompile_rbsp] revisit plane indexing

    [extensions/decompile_rbsp] revisit plane indexing

    @F1F7Y over at MRVN-radiant/MRVN-radiant figured out plane indexing Time to revisit brush slicing https://github.com/MRVN-radiant/MRVN-radiant/blob/main/tools/remap/source/bspfile_titanfall.cpp#L607-L629

    Also seems like the discard/ignore plane flags are linked to ray collision, but not player collision

    Still doesn't solve model brush indexing for r2 so put in a lazy fix for that edge case so we can get sliced brush geo

    enhancement Test Map: Tools: Radiant 
    opened by snake-biscuits 0
Releases(v0.3.1)
  • v0.3.1(Oct 4, 2021)

  • v0.3.0(Sep 29, 2021)

    This version brings many changes to how files are handled, and supports a large number of games More big refactors to come, to help with handling associated files & saving changes back to the .bsp

    New

    • Added load_bsp function to identify bsp type
    • Added D3DBsp, IdTechBsp, RespawnBsp & ValveBsp classes
    • Added general support for the PakFile lump
    • Added general support for the GameLump lump
    • Extension scripts
      • archive.py extractor for CoD .iwd / Quake .pk3
      • diff.py compare bsps for changelogs / study
      • lightmaps.py bsp lightmap -> .png
    • Made a basic C++ 17 implementation in src/

    Changed

    • Bsp lumps are loaded dynamically, reducing memory usage
      • New wrapper classes can be found in bsp_tool/lumps.py
    • mods/ changed to branches/
      • Added subfolders for developers
      • Helpful lists for auto-detecting a .bsp's origin
      • Renamed team_fortress2 to valve/orange_box
    • LumpClasses now end up in 3 dictionaries per branch script
      • BASIC_LUMP_CLASSES for types like short int
      • LUMP_CLASSES for standard LumpClasses
      • SPECIAL_LUMP_CLASSES for irregular types (e.g. PakFile)
      • GAME_LUMP_CLASSES for GameLump SpecialLumpClasses
    • Bsps no longer print to console once loaded
    • Base.Bsp & subclasses have reserved ALL CAPS member names for lumps only
      • BSP_VERSION, FILE_MAGIC, HEADERS, REVISION -> bsp_version, file_magic, headers, revision
    • TODO: load external lumps and internal lumps at the same time

    New Supported Games

    • GoldSrc Engine (excluding Half-Life: Blue Shift)
    • Quake II
    • Quake 3 Arena
    • Source Engine

    Broken Support

    • Call of Duty
    • Dark Messiah of Might and Magic
    • Half-Life: Blue Shift
    • Quake

    Updated Game Support

    • Apex Legends
    • Orange Box
    • Titanfall
    • Titanfall 2
    Source code(tar.gz)
    Source code(zip)
    bsp_tool-0.3.0-py3-none-any.whl(95.53 KB)
    bsp_tool-0.3.0-py3.9.egg(175.66 KB)
    bsp_tool-0.3.0.tar.gz(69.92 KB)
Owner
Jared Ketterer
Jared Ketterer
img-proof (IPA) provides a command line utility to test images in the Public Cloud

overview img-proof (IPA) provides a command line utility to test images in the Public Cloud (AWS, Azure, GCE, etc.). With img-proof you can now test c

null 13 Jan 7, 2022
A supercharged AWS command line interface (CLI).

SAWS Motivation AWS CLI Although the AWS CLI is a great resource to manage your AWS-powered services, it's tough to remember usage of: 70+ top-level c

Donne Martin 5.1k Jan 5, 2023
Command line interface for testing internet bandwidth using speedtest.net

speedtest-cli Command line interface for testing internet bandwidth using speedtest.net Versions speedtest-cli works with Python 2.4-3.7 Installation

Matt Martz 12.4k Jan 8, 2023
Universal Command Line Interface for Amazon Web Services

This package provides a unified command line interface to Amazon Web Services.

Amazon Web Services 13.3k Jan 7, 2023
command line interface to manage VALORANT skins

A PROPER RELEASE IS COMING SOON, IF YOU KNOW HOW TO USE PYTHON YOU CAN USE IT NOW! valorant skin manager command line interface simple command line in

colinh 131 Dec 25, 2022
Microsoft Azure CLI - Azure Command-Line Interface

A great cloud needs great tools; we're excited to introduce Azure CLI, our next generation multi-platform command line experience for Azure.

Microsoft Azure 3.4k Dec 30, 2022
flora-dev-cli (fd-cli) is command line interface software to interact with flora blockchain.

Install git clone https://github.com/Flora-Network/fd-cli.git cd fd-cli python3 -m venv venv source venv/bin/activate pip install -e . --extra-index-u

null 14 Sep 11, 2022
A command line interface to buy things in stregsystemet

Stregsystemet-CLI This repository is the Stregsystemet CLI, to buy things in Stregsystemet, at AAU. Use of this cli-tool is at your own risk and there

F-klubben 14 Oct 18, 2022
moviepy-cli: Command line interface for MoviePy.

Moviepy-cli is designed to apply several video editing in a single command with Moviepy as an alternative to Video-cli.

Kentaro Wada 23 Jun 29, 2022
Command line interface for unasync

CLI for unasync Command line interface for unasync Getting started Install Run the following command to install the package with pip: pip install unas

Leynier Gutiérrez González 3 Apr 4, 2022
Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Website

?? rover Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Websit

Saketha Ramanjam 4 Jan 19, 2022
Investing library and command-line interface inspired by the Bogleheads philosophy

Lakshmi (Screenshot of the lak command in action) Background This project is inspired by Bogleheads forum. Bogleheads focus on a simple but powerful p

Sarvjeet Singh 108 Dec 26, 2022
⚙ A lightweight command line interface library for creating commands.

⚙ A lightweight command line interface library for creating cli commands. About | Installation | Usage | Features | Contributors | License About Next:

Serum 16 Sep 25, 2022
Command-line interface to PyPI Stats API to get download stats for Python packages

pypistats Python 3.6+ interface to PyPI Stats API to get aggregate download statistics on Python packages on the Python Package Index without having t

Hugo van Kemenade 140 Jan 3, 2023
A minimal and ridiculously good looking command-line-interface toolkit.

Pyceo Pyceo is a Python package for creating beautiful, composable, and ridiculously good looking command-line-user-interfaces without having to write

Juan-Pablo Scaletti 21 Mar 25, 2022
Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications.

Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications. Quo is making headway towards composing speedy and orderly CLI applications while forestalling any disappointments brought about by the failure to execute a CLI API. Simple to code, easy to learn, and does not come with needless baggage.

Secretum Inc. 16 Oct 15, 2022
The command line interface for Gradient - Gradient is an an end-to-end MLOps platform

Gradient CLI Get started: Create Account • Install CLI • Tutorials • Docs Resources: Website • Blog • Support • Contact Sales Gradient is an an end-to

Paperspace 58 Dec 6, 2022
Program Command Line Interface (CLI) Sederhana: Pemesanan Nasi Goreng Hekel

Program ini merupakan aplikasi yang berjalan di dalam command line (terminal). Program ini menggunakan built-in library python yaitu argparse yang dapat menerima parameter saat program ini dijalankan melalui terminal atau CLI.

Habib Abdurrasyid 5 Nov 19, 2021
A command line interface to interact with the Hypixel api allowing the user to get stats, leaderboards, etc

HyConsole is a way to get data on players and leaderboards from the Hypixel Minecraft server from the command line. Keep in mind I have no a

null 1 Feb 14, 2022