Name | python-dev-cli JSON |
Version |
1.0.0
JSON |
| download |
home_page | |
Summary | Python developer CLI for running custom scripts defined in pyproject.toml |
upload_time | 2023-09-23 21:14:05 |
maintainer | |
docs_url | None |
author | |
requires_python | >=3.11 |
license | BSD |
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"
}