python-dev-cli


Namepython-dev-cli JSON
Version 1.0.0 PyPI version JSON
download
home_page
SummaryPython developer CLI for running custom scripts defined in pyproject.toml
upload_time2023-09-23 21:14:05
maintainer
docs_urlNone
author
requires_python>=3.11
licenseBSD
keywords python dev cli scripts pyproject.toml automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python Developer CLI

Python developer CLI enables you to run custom scripts defined in your [pyproject.toml] file, eliminating the need for
shell scripts and Makefiles, and reducing extraneous cognitive load on your teammates and contributors.

- Optional [Jinja2] template support enables you to reference built-in Python syntax, arbitrary Python modules, and even
other scripts from within your script configurations.
- String together multiple scripts with a single command, to simplify complex workflows.
- All custom scripts are automatically documented in the `dev` CLI help page. Just run `dev --help` to see exactly what
each script does.

## Installation

```shell
pip install python-dev-cli
```

## Usage

Define custom scripts in your `pyproject.toml` file:

```toml
[tool.python-dev-cli.scripts]
up = "docker compose up -d"
down = "docker compose down -v --remove-orphans"
```

Then run the `dev` command followed by the script name:

```shell
dev up
# docker compose up -d

dev down
# docker compose down -v --remove-orphans
```

All scripts defined in your `pyproject.toml` file will be automatically documented in the `dev` CLI help page:

```shell
dev --help
# usage: dev [-h] [-d] {down,up} ...
# 
# Python developer CLI for running custom scripts defined in pyproject.toml
# 
# options:
#   -h, --help            show this help message and exit
#   -d, --debug           enable debug logging
# 
# available scripts:
#   {down,up}
#     down                ['docker compose down -v --remove-orphans']
#     up                  ['docker compose up -d']
```

Any script that is prefixed with an underscore (`_`) will be hidden from the help page and cannot be run directly:

```toml
[tool.python-dev-cli.scripts]
_foo = "foo"
_bar = "bar"
foobar = "echo {{ dev._foo }}{{ dev._bar }}"
```

```shell
dev -h
# usage: dev [-h] [-d] {foobar} ...
# Python developer CLI for running custom scripts defined in pyproject.toml
# 
# options:
#   -h, --help            show this help message and exit
#   -d, --debug           enable debug logging
# 
# available scripts:
#   {foobar}
#     foobar              ['echo foobar']
```

You can also define scripts as a list of script references, which will be run in order:

```toml
[tool.python-dev-cli.scripts]
black = "black --check --config pyproject.toml ."
black_fix = "black --config pyproject.toml ."
ruff = "ruff --config pyproject.toml ."
ruff_fix = "ruff --fix --exit-non-zero-on-fix --config pyproject.toml ."
lint = ["black", "ruff"]
lint_fix = ["black_fix", "ruff_fix"]
```

```shell
dev lint
# black --check --config pyproject.toml .
# ruff --config pyproject.toml .

dev lint_fix
# black --config pyproject.toml .
# ruff --fix --exit-non-zero-on-fix --config pyproject.toml .
```

By default, scripts can utilize [Jinja2] template syntax, enabling you to reference built-in Python syntax, arbitrary
Python modules, and even other scripts:

```toml
[tool.python-dev-cli.settings]
include = ["os", "uuid:uuid4 as uuid"]

[tool.python-dev-cli.scripts]
python = "echo {{ 1 + 1 }}"
module = "echo {{ uuid() }}"
env_vars = "echo PATH={{ os.getenv('PATH') }} PWD={{ os.getenv('PWD') }} HOME={{ os.getenv('HOME') }}"
other_scripts = "echo {{ dev._foo }}{{ dev._bar }}"
_foo = "foo"
_bar = "bar"
```

```shell
dev python
# 2

dev module
# 2b2e0b9e-0b9e-4a4a-9a9a-9a9a9a9a9a9a

dev env_vars
# PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin PWD=/Users/username/Projects HOME=/Users/username

dev other_scripts
# foobar
```

Script template functionality can be disabled, if you prefer to keep things simple. See the [Settings](#settings)
section below for more information.

## Settings

You can configure this package by adding a `tool.python-dev-cli.settings` section to your `pyproject.toml` file:

```toml
[tool.python-dev-cli.settings]
enable_templates = true
include = ["os", "sys"]
script_refs = "dev"
```

### enable_templates

Enable or disable the use of [Jinja2] templates in your scripts. If you disable this, all other settings will be ignored
and scripts will be run as-is, without any preprocessing.

> **NOTE:** Disabling this setting will prevent you from referencing other scripts from within a script, but you will
> still be able to reference other scripts in a list of scripts.

For example, this will still work:

```toml
[tool.python-dev-cli.settings]
enable_templates = false

[tool.python-dev-cli.scripts]
_foo = "echo foo"
_bar = "echo bar"
foobar = ["_foo", "_bar"]
```

```shell
dev foobar
# foo
# bar
```

However, this will not work as intended because the template will not be parsed:

```toml
[tool.python-dev-cli.settings]
enable_templates = false

[tool.python-dev-cli.scripts]
_foo = "foo"
_bar = "bar"
foobar = "echo {{ dev._foo }}{{ dev._bar }}"
```

```shell
dev foobar
# {{ dev._foo }}{{ dev._bar }}
```

### include

A list of modules to include in the [Jinja2] environment, when parsing scripts. This enables you to reference Python
modules in your scripts:

```toml
[tool.python-dev-cli.settings]
include = ["os:getcwd", "os:getenv as env"]

[tool.python-dev-cli.scripts]
test_docker = "docker run -it --rm -v {{ getcwd() }}:/app -w /app --name test {{ env('MY_DOCKER_IMAGE', 'python:3.11-alpine') }} echo test"
```

```shell
dev test_docker
# docker run -it --rm -v /Users/username/Projects/dev:/app -w /app --name test python:3.11-alpine echo test

MY_DOCKER_IMAGE="python:3.11-slim-bookworm"; dev test_docker
# docker run -it --rm -v /Users/username/Projects/dev:/app -w /app --name test python:3.11-slim-bookworm echo test
```

Valid formats for including modules are:

| Include Syntax                | Python Equivalent                       |
|-------------------------------|-----------------------------------------|
| `"os"`                        | `import os`                             |
| `"os:path"`                   | `from os import path`                   |
| `"os.path:join"`              | `from os.path import join`              |
| `"os.path:join as path_join"` | `from os.path import join as path_join` |

> **NOTE:** Any module available in your project can be made available to your scripts, including third-party modules
> and even your own modules.

### script_refs

Scripts can contain references to other scripts, using the `{{ dev.my_script }}` syntax:

```toml
[tool.python-dev-cli.scripts]
_foo = "foo"
_bar = "bar"
foobar = "echo {{ dev._foo }}{{ dev._bar }}"
```

```shell
dev foobar
# foobar
```

The name of the `dev` object is configurable using the `script_refs` setting. For example, you could change it to
`scripts`:

```toml
[tool.python-dev-cli.settings]
script_refs = "scripts"

[tool.python-dev-cli.scripts]
_foo = "foo"
_bar = "bar"
foobar = "echo {{ scripts._foo }}{{ scripts._bar }}"
```

```shell
dev foobar
# foobar
```

## Caveats

### Shell Syntax

Scripts are run in a Python subprocess using [subprocess.run()], not the shell interpreter that the `dev` CLI is being
run in. As a result, it has the following limitations:

- Environment variables cannot be referenced as you would in a shell script (e.g. `$HOME` or `${HOME}`).
- Shell syntax (e.g. pipes `|`; redirects `>`, `>>`, `<`; backgrounding [`&`]) is not supported.

To work around these limitations, you can use the `os` module to reference environment variables, and the `subprocess`
module to run shell commands:

```toml
[tool.python-dev-cli.settings]
include = ["os", "subprocess"]

[tool.python-dev-cli.scripts]
env_vars = "echo PATH={{ os.getenv('PATH') }} PWD={{ os.getenv('PWD') }} HOME={{ os.getenv('HOME') }}"
shell = "echo {{ subprocess.run('echo foo | tr a-z A-Z', shell=True, capture_output=True).stdout.decode().strip() }}"
```

```shell
dev env_vars
# PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin PWD=/Users/username/Projects HOME=/Users/username

dev shell
# FOO
```

These constraints actually have the benefit of making your `dev` scripts more cross-platform compatible, as they do not
rely on any shell-specific syntax (unless you use the `subprocess` workaround, as in the example above). This means your
scripts should work on Windows, Linux, and macOS.

Also, it's worth pointing out that the `shell` example above would be better written as a Python script, rather than a
`dev` script in your `pyproject.toml` file:

```python
# scripts/shell.py
import subprocess

def main() -> str:
    return subprocess.run('echo foo | tr a-z A-Z', shell=True, capture_output=True).stdout.decode().strip()

if __name__ == '__main__':
    output: str = main()
    print(output)
```

Then, you could reference it in your script definition:

```toml
[tool.python-dev-cli.scripts]
shell = "python -m scripts.shell"
```

This is a better design pattern, as it keeps your Python logic in a Python file rather than a TOML file, where it cannot
be easily tested or linted.

### Script Names

Script names must be valid Python identifiers, which means they must start with a letter or underscore (`_`), and can
only contain letters, numbers, and underscores (`_`).  This is because script names are used as attribute names on the
`dev` object, which means they must be valid Python identifiers.

Also, keep in mind that any scripts prefixed with an underscore (`_`) will be hidden from the help page and cannot be
run directly. Think of these as "private" script variables, which can only be referenced by other scripts.

## License

This open source project is licensed under the terms of the [BSD 3-Clause License].

## Contributing

Contributions are welcome! Please read [CONTRIBUTING.md] for details.

### Code of Conduct

This project has adopted the [Contributor Covenant]. For more information, see the [Code of Conduct]
page.


[BSD 3-Clause License]: https://github.com/sscovil/devblob/master/LICENSE
[Code of Conduct]: https://github.com/sscovil/devblob/master/CODE_OF_CONDUCT.md
[CONTRIBUTING.md]: https://github.com/sscovil/devblob/master/CONTRIBUTING.md
[Contributor Covenant]: https://contributor-covenant.org/
[Jinja2]: https://jinja.palletsprojects.com/en/3.0.x/
[pyproject.toml]: https://peps.python.org/pep-0518/#tool-table
[subprocess.run()]: https://docs.python.org/3/library/subprocess.html#subprocess.run

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "python-dev-cli",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": "",
    "keywords": "python,dev,cli,scripts,pyproject.toml,automation",
    "author": "",
    "author_email": "Shaun Scovil <sscovil@pythondevcli.io>",
    "download_url": "https://files.pythonhosted.org/packages/a6/e1/69991e70d2048d20f5d9e3eca9cd84cdf94218a08684e15ebfd621c2061c/python-dev-cli-1.0.0.tar.gz",
    "platform": null,
    "description": "# Python Developer CLI\n\nPython developer CLI enables you to run custom scripts defined in your [pyproject.toml] file, eliminating the need for\nshell scripts and Makefiles, and reducing extraneous cognitive load on your teammates and contributors.\n\n- Optional [Jinja2] template support enables you to reference built-in Python syntax, arbitrary Python modules, and even\nother scripts from within your script configurations.\n- String together multiple scripts with a single command, to simplify complex workflows.\n- All custom scripts are automatically documented in the `dev` CLI help page. Just run `dev --help` to see exactly what\neach script does.\n\n## Installation\n\n```shell\npip install python-dev-cli\n```\n\n## Usage\n\nDefine custom scripts in your `pyproject.toml` file:\n\n```toml\n[tool.python-dev-cli.scripts]\nup = \"docker compose up -d\"\ndown = \"docker compose down -v --remove-orphans\"\n```\n\nThen run the `dev` command followed by the script name:\n\n```shell\ndev up\n# docker compose up -d\n\ndev down\n# docker compose down -v --remove-orphans\n```\n\nAll scripts defined in your `pyproject.toml` file will be automatically documented in the `dev` CLI help page:\n\n```shell\ndev --help\n# usage: dev [-h] [-d] {down,up} ...\n# \n# Python developer CLI for running custom scripts defined in pyproject.toml\n# \n# options:\n#   -h, --help            show this help message and exit\n#   -d, --debug           enable debug logging\n# \n# available scripts:\n#   {down,up}\n#     down                ['docker compose down -v --remove-orphans']\n#     up                  ['docker compose up -d']\n```\n\nAny script that is prefixed with an underscore (`_`) will be hidden from the help page and cannot be run directly:\n\n```toml\n[tool.python-dev-cli.scripts]\n_foo = \"foo\"\n_bar = \"bar\"\nfoobar = \"echo {{ dev._foo }}{{ dev._bar }}\"\n```\n\n```shell\ndev -h\n# usage: dev [-h] [-d] {foobar} ...\n# Python developer CLI for running custom scripts defined in pyproject.toml\n# \n# options:\n#   -h, --help            show this help message and exit\n#   -d, --debug           enable debug logging\n# \n# available scripts:\n#   {foobar}\n#     foobar              ['echo foobar']\n```\n\nYou can also define scripts as a list of script references, which will be run in order:\n\n```toml\n[tool.python-dev-cli.scripts]\nblack = \"black --check --config pyproject.toml .\"\nblack_fix = \"black --config pyproject.toml .\"\nruff = \"ruff --config pyproject.toml .\"\nruff_fix = \"ruff --fix --exit-non-zero-on-fix --config pyproject.toml .\"\nlint = [\"black\", \"ruff\"]\nlint_fix = [\"black_fix\", \"ruff_fix\"]\n```\n\n```shell\ndev lint\n# black --check --config pyproject.toml .\n# ruff --config pyproject.toml .\n\ndev lint_fix\n# black --config pyproject.toml .\n# ruff --fix --exit-non-zero-on-fix --config pyproject.toml .\n```\n\nBy default, scripts can utilize [Jinja2] template syntax, enabling you to reference built-in Python syntax, arbitrary\nPython modules, and even other scripts:\n\n```toml\n[tool.python-dev-cli.settings]\ninclude = [\"os\", \"uuid:uuid4 as uuid\"]\n\n[tool.python-dev-cli.scripts]\npython = \"echo {{ 1 + 1 }}\"\nmodule = \"echo {{ uuid() }}\"\nenv_vars = \"echo PATH={{ os.getenv('PATH') }} PWD={{ os.getenv('PWD') }} HOME={{ os.getenv('HOME') }}\"\nother_scripts = \"echo {{ dev._foo }}{{ dev._bar }}\"\n_foo = \"foo\"\n_bar = \"bar\"\n```\n\n```shell\ndev python\n# 2\n\ndev module\n# 2b2e0b9e-0b9e-4a4a-9a9a-9a9a9a9a9a9a\n\ndev env_vars\n# PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin PWD=/Users/username/Projects HOME=/Users/username\n\ndev other_scripts\n# foobar\n```\n\nScript template functionality can be disabled, if you prefer to keep things simple. See the [Settings](#settings)\nsection below for more information.\n\n## Settings\n\nYou can configure this package by adding a `tool.python-dev-cli.settings` section to your `pyproject.toml` file:\n\n```toml\n[tool.python-dev-cli.settings]\nenable_templates = true\ninclude = [\"os\", \"sys\"]\nscript_refs = \"dev\"\n```\n\n### enable_templates\n\nEnable or disable the use of [Jinja2] templates in your scripts. If you disable this, all other settings will be ignored\nand scripts will be run as-is, without any preprocessing.\n\n> **NOTE:** Disabling this setting will prevent you from referencing other scripts from within a script, but you will\n> still be able to reference other scripts in a list of scripts.\n\nFor example, this will still work:\n\n```toml\n[tool.python-dev-cli.settings]\nenable_templates = false\n\n[tool.python-dev-cli.scripts]\n_foo = \"echo foo\"\n_bar = \"echo bar\"\nfoobar = [\"_foo\", \"_bar\"]\n```\n\n```shell\ndev foobar\n# foo\n# bar\n```\n\nHowever, this will not work as intended because the template will not be parsed:\n\n```toml\n[tool.python-dev-cli.settings]\nenable_templates = false\n\n[tool.python-dev-cli.scripts]\n_foo = \"foo\"\n_bar = \"bar\"\nfoobar = \"echo {{ dev._foo }}{{ dev._bar }}\"\n```\n\n```shell\ndev foobar\n# {{ dev._foo }}{{ dev._bar }}\n```\n\n### include\n\nA list of modules to include in the [Jinja2] environment, when parsing scripts. This enables you to reference Python\nmodules in your scripts:\n\n```toml\n[tool.python-dev-cli.settings]\ninclude = [\"os:getcwd\", \"os:getenv as env\"]\n\n[tool.python-dev-cli.scripts]\ntest_docker = \"docker run -it --rm -v {{ getcwd() }}:/app -w /app --name test {{ env('MY_DOCKER_IMAGE', 'python:3.11-alpine') }} echo test\"\n```\n\n```shell\ndev test_docker\n# docker run -it --rm -v /Users/username/Projects/dev:/app -w /app --name test python:3.11-alpine echo test\n\nMY_DOCKER_IMAGE=\"python:3.11-slim-bookworm\"; dev test_docker\n# docker run -it --rm -v /Users/username/Projects/dev:/app -w /app --name test python:3.11-slim-bookworm echo test\n```\n\nValid formats for including modules are:\n\n| Include Syntax                | Python Equivalent                       |\n|-------------------------------|-----------------------------------------|\n| `\"os\"`                        | `import os`                             |\n| `\"os:path\"`                   | `from os import path`                   |\n| `\"os.path:join\"`              | `from os.path import join`              |\n| `\"os.path:join as path_join\"` | `from os.path import join as path_join` |\n\n> **NOTE:** Any module available in your project can be made available to your scripts, including third-party modules\n> and even your own modules.\n\n### script_refs\n\nScripts can contain references to other scripts, using the `{{ dev.my_script }}` syntax:\n\n```toml\n[tool.python-dev-cli.scripts]\n_foo = \"foo\"\n_bar = \"bar\"\nfoobar = \"echo {{ dev._foo }}{{ dev._bar }}\"\n```\n\n```shell\ndev foobar\n# foobar\n```\n\nThe name of the `dev` object is configurable using the `script_refs` setting. For example, you could change it to\n`scripts`:\n\n```toml\n[tool.python-dev-cli.settings]\nscript_refs = \"scripts\"\n\n[tool.python-dev-cli.scripts]\n_foo = \"foo\"\n_bar = \"bar\"\nfoobar = \"echo {{ scripts._foo }}{{ scripts._bar }}\"\n```\n\n```shell\ndev foobar\n# foobar\n```\n\n## Caveats\n\n### Shell Syntax\n\nScripts are run in a Python subprocess using [subprocess.run()], not the shell interpreter that the `dev` CLI is being\nrun in. As a result, it has the following limitations:\n\n- Environment variables cannot be referenced as you would in a shell script (e.g. `$HOME` or `${HOME}`).\n- Shell syntax (e.g. pipes `|`; redirects `>`, `>>`, `<`; backgrounding [`&`]) is not supported.\n\nTo work around these limitations, you can use the `os` module to reference environment variables, and the `subprocess`\nmodule to run shell commands:\n\n```toml\n[tool.python-dev-cli.settings]\ninclude = [\"os\", \"subprocess\"]\n\n[tool.python-dev-cli.scripts]\nenv_vars = \"echo PATH={{ os.getenv('PATH') }} PWD={{ os.getenv('PWD') }} HOME={{ os.getenv('HOME') }}\"\nshell = \"echo {{ subprocess.run('echo foo | tr a-z A-Z', shell=True, capture_output=True).stdout.decode().strip() }}\"\n```\n\n```shell\ndev env_vars\n# PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin PWD=/Users/username/Projects HOME=/Users/username\n\ndev shell\n# FOO\n```\n\nThese constraints actually have the benefit of making your `dev` scripts more cross-platform compatible, as they do not\nrely on any shell-specific syntax (unless you use the `subprocess` workaround, as in the example above). This means your\nscripts should work on Windows, Linux, and macOS.\n\nAlso, it's worth pointing out that the `shell` example above would be better written as a Python script, rather than a\n`dev` script in your `pyproject.toml` file:\n\n```python\n# scripts/shell.py\nimport subprocess\n\ndef main() -> str:\n    return subprocess.run('echo foo | tr a-z A-Z', shell=True, capture_output=True).stdout.decode().strip()\n\nif __name__ == '__main__':\n    output: str = main()\n    print(output)\n```\n\nThen, you could reference it in your script definition:\n\n```toml\n[tool.python-dev-cli.scripts]\nshell = \"python -m scripts.shell\"\n```\n\nThis is a better design pattern, as it keeps your Python logic in a Python file rather than a TOML file, where it cannot\nbe easily tested or linted.\n\n### Script Names\n\nScript names must be valid Python identifiers, which means they must start with a letter or underscore (`_`), and can\nonly contain letters, numbers, and underscores (`_`).  This is because script names are used as attribute names on the\n`dev` object, which means they must be valid Python identifiers.\n\nAlso, keep in mind that any scripts prefixed with an underscore (`_`) will be hidden from the help page and cannot be\nrun directly. Think of these as \"private\" script variables, which can only be referenced by other scripts.\n\n## License\n\nThis open source project is licensed under the terms of the [BSD 3-Clause License].\n\n## Contributing\n\nContributions are welcome! Please read [CONTRIBUTING.md] for details.\n\n### Code of Conduct\n\nThis project has adopted the [Contributor Covenant]. For more information, see the [Code of Conduct]\npage.\n\n\n[BSD 3-Clause License]: https://github.com/sscovil/devblob/master/LICENSE\n[Code of Conduct]: https://github.com/sscovil/devblob/master/CODE_OF_CONDUCT.md\n[CONTRIBUTING.md]: https://github.com/sscovil/devblob/master/CONTRIBUTING.md\n[Contributor Covenant]: https://contributor-covenant.org/\n[Jinja2]: https://jinja.palletsprojects.com/en/3.0.x/\n[pyproject.toml]: https://peps.python.org/pep-0518/#tool-table\n[subprocess.run()]: https://docs.python.org/3/library/subprocess.html#subprocess.run\n",
    "bugtrack_url": null,
    "license": "BSD",
    "summary": "Python developer CLI for running custom scripts defined in pyproject.toml",
    "version": "1.0.0",
    "project_urls": {
        "Changelog": "https://github.com/sscovil/python-dev-cli/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/sscovil/python-dev-cli/blob/main/README.md",
        "Homepage": "https://pythondevcli.io/",
        "Issues": "https://github.com/sscovil/python-dev-cli/issues",
        "Repository": "https://github.com/sscovil/python-dev-cli"
    },
    "split_keywords": [
        "python",
        "dev",
        "cli",
        "scripts",
        "pyproject.toml",
        "automation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2ce90cea865007c5383254314863abd7d39a85f65b7767bbf1b615fbd68726ef",
                "md5": "ba614b66227796e504b894204021bb30",
                "sha256": "0c4d0c340ec858b69d461bb01ee6ad324947791c19b2502af032058c2477ff5b"
            },
            "downloads": -1,
            "filename": "python_dev_cli-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ba614b66227796e504b894204021bb30",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 12422,
            "upload_time": "2023-09-23T21:14:03",
            "upload_time_iso_8601": "2023-09-23T21:14:03.600764Z",
            "url": "https://files.pythonhosted.org/packages/2c/e9/0cea865007c5383254314863abd7d39a85f65b7767bbf1b615fbd68726ef/python_dev_cli-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a6e169991e70d2048d20f5d9e3eca9cd84cdf94218a08684e15ebfd621c2061c",
                "md5": "d8afdfd4a7dec0de2bcdfb3a3e646884",
                "sha256": "55212f6f9f4449f7643a8a26f131314f81b230647b1dd1f6d7205ae458b1e4f0"
            },
            "downloads": -1,
            "filename": "python-dev-cli-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "d8afdfd4a7dec0de2bcdfb3a3e646884",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 14684,
            "upload_time": "2023-09-23T21:14:05",
            "upload_time_iso_8601": "2023-09-23T21:14:05.479129Z",
            "url": "https://files.pythonhosted.org/packages/a6/e1/69991e70d2048d20f5d9e3eca9cd84cdf94218a08684e15ebfd621c2061c/python-dev-cli-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-09-23 21:14:05",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "sscovil",
    "github_project": "python-dev-cli",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "python-dev-cli"
}
        
Elapsed time: 0.40655s