Initial commit.
This commit is contained in:
commit
f51e34b674
91
.pre-commit-config.yaml
Normal file
91
.pre-commit-config.yaml
Normal file
|
@ -0,0 +1,91 @@
|
|||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.3.0
|
||||
hooks:
|
||||
# python
|
||||
- id: check-ast
|
||||
- id: check-builtin-literals
|
||||
- id: check-docstring-first
|
||||
- id: debug-statements
|
||||
- id: fix-encoding-pragma
|
||||
args: [--remove]
|
||||
|
||||
# text
|
||||
- id: check-executables-have-shebangs
|
||||
- id: check-merge-conflict
|
||||
- id: check-shebang-scripts-are-executable
|
||||
- id: detect-private-key
|
||||
- id: end-of-file-fixer
|
||||
- id: fix-byte-order-marker
|
||||
- id: mixed-line-ending
|
||||
args: [--fix=lf]
|
||||
- id: trailing-whitespace
|
||||
|
||||
# json
|
||||
- id: check-json
|
||||
|
||||
# toml
|
||||
- id: check-toml
|
||||
|
||||
# yaml
|
||||
- id: check-yaml
|
||||
|
||||
# python
|
||||
- repo: https://github.com/pre-commit/mirrors-isort
|
||||
rev: v5.10.1
|
||||
hooks:
|
||||
- id: isort
|
||||
args: [--profile, black]
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v0.961
|
||||
hooks:
|
||||
- id: mypy
|
||||
additional_dependencies: [types-all]
|
||||
- repo: https://github.com/pre-commit/pygrep-hooks
|
||||
rev: v1.9.0
|
||||
hooks:
|
||||
- id: python-check-blanket-noqa
|
||||
- id: python-check-blanket-type-ignore
|
||||
- id: python-no-eval
|
||||
- id: python-use-type-annotations
|
||||
- repo: https://github.com/asottile/dead
|
||||
rev: v1.5.0
|
||||
hooks:
|
||||
- id: dead
|
||||
args: [--exclude, ups/schemas/.*]
|
||||
- repo: https://github.com/asottile/pyupgrade
|
||||
rev: v2.34.0
|
||||
hooks:
|
||||
- id: pyupgrade
|
||||
args: [--py38-plus]
|
||||
- repo: https://github.com/psf/black/
|
||||
rev: 22.6.0
|
||||
hooks:
|
||||
- id: black
|
||||
language_version: python3.10
|
||||
- repo: https://github.com/PyCQA/bandit
|
||||
rev: 1.7.4
|
||||
hooks:
|
||||
- id: bandit
|
||||
args: [--severity-level, medium]
|
||||
- repo: https://github.com/PyCQA/flake8
|
||||
rev: 4.0.1
|
||||
hooks:
|
||||
- id: flake8
|
||||
additional_dependencies: [flake8-typing-imports==1.12.0]
|
||||
args: [--max-line-length, '100']
|
||||
|
||||
# toml
|
||||
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: pretty-format-toml
|
||||
args: [--autofix]
|
||||
files: pyproject.toml
|
||||
|
||||
# yaml
|
||||
- repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt
|
||||
rev: 0.2.1
|
||||
hooks:
|
||||
- id: yamlfmt
|
||||
args: [--mapping, '2', --sequence, '4', --offset, '2', --width, '100', --implicit_start]
|
71
clickusagemd.py
Executable file
71
clickusagemd.py
Executable file
|
@ -0,0 +1,71 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import importlib
|
||||
from typing import Iterator
|
||||
|
||||
import click
|
||||
import toml
|
||||
|
||||
|
||||
def iter_commands(
|
||||
module_name: str,
|
||||
cmd_chain: list,
|
||||
cliobj: click.Group | click.Command,
|
||||
depth: int = 1,
|
||||
) -> Iterator[str]:
|
||||
assert isinstance(cliobj, click.Command) or isinstance(cliobj, click.Group)
|
||||
|
||||
if isinstance(cliobj, click.Group):
|
||||
if depth > 1:
|
||||
yield f"{'#'*depth} {cliobj.name}"
|
||||
|
||||
for name in cliobj.commands:
|
||||
yield from iter_commands(
|
||||
module_name, cmd_chain + [name], cliobj.commands[name], depth=depth + 1
|
||||
)
|
||||
else:
|
||||
ctx = click.get_current_context()
|
||||
cmd = f"{module_name} {' '.join(cmd_chain)}"
|
||||
help_message = cliobj.get_help(ctx).replace(ctx.command_path, cmd)
|
||||
|
||||
if cliobj.name == "cli":
|
||||
cmd_title = "Default Command Line"
|
||||
else:
|
||||
cmd_title = cliobj.name
|
||||
|
||||
yield f"{'#'*(depth)} {cmd_title}\n```\n{help_message}\n```\n"
|
||||
|
||||
|
||||
def generate_usage_md(script: str):
|
||||
assert ":" in script
|
||||
module, cliobj = script.split(":")
|
||||
if "." in module:
|
||||
module_name = module.split(".")[0]
|
||||
else:
|
||||
module_name = module
|
||||
|
||||
mod = importlib.import_module(module)
|
||||
cli = getattr(mod, cliobj)
|
||||
|
||||
with open("USAGE.md", "wt") as fd:
|
||||
print(f"# {module_name.capitalize()} - Command Usage Overview", file=fd)
|
||||
for command in iter_commands(module_name, [], cli):
|
||||
print(command, file=fd)
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument("poetry_project_file", type=click.File())
|
||||
@click.pass_context
|
||||
def cli(ctx, poetry_project_file):
|
||||
contents = toml.loads(poetry_project_file.read())
|
||||
try:
|
||||
scripts = contents["tool"]["poetry"]["scripts"]
|
||||
for script in scripts.values():
|
||||
generate_usage_md(script)
|
||||
except KeyError:
|
||||
click.echo("[ERROR] File does not contain 'tool.poetry.scripts' definitions.")
|
||||
ctx.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
203
poetry.lock
generated
Normal file
203
poetry.lock
generated
Normal file
|
@ -0,0 +1,203 @@
|
|||
[[package]]
|
||||
name = "asttokens"
|
||||
version = "2.0.5"
|
||||
description = "Annotate AST trees with source code positions"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
six = "*"
|
||||
|
||||
[package.extras]
|
||||
test = ["astroid", "pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "cfgv"
|
||||
version = "3.3.1"
|
||||
description = "Validate configuration and produce human readable error messages."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6.1"
|
||||
|
||||
[[package]]
|
||||
name = "click"
|
||||
version = "8.1.3"
|
||||
description = "Composable command line interface toolkit"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
version = "0.4.5"
|
||||
description = "Cross-platform colored terminal text."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
|
||||
[[package]]
|
||||
name = "distlib"
|
||||
version = "0.3.4"
|
||||
description = "Distribution utilities"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "executing"
|
||||
version = "0.8.3"
|
||||
description = "Get the currently executing AST node of a frame, and other information"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "filelock"
|
||||
version = "3.7.1"
|
||||
description = "A platform independent file lock."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"]
|
||||
testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"]
|
||||
|
||||
[[package]]
|
||||
name = "icecream"
|
||||
version = "2.1.2"
|
||||
description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
asttokens = ">=2.0.1"
|
||||
colorama = ">=0.3.9"
|
||||
executing = ">=0.3.1"
|
||||
pygments = ">=2.2.0"
|
||||
|
||||
[[package]]
|
||||
name = "identify"
|
||||
version = "2.5.1"
|
||||
description = "File identification library for Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.extras]
|
||||
license = ["ukkonen"]
|
||||
|
||||
[[package]]
|
||||
name = "nodeenv"
|
||||
version = "1.7.0"
|
||||
description = "Node.js virtual environment builder"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "2.5.2"
|
||||
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"]
|
||||
test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"]
|
||||
|
||||
[[package]]
|
||||
name = "pre-commit"
|
||||
version = "2.20.0"
|
||||
description = "A framework for managing and maintaining multi-language pre-commit hooks."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
cfgv = ">=2.0.0"
|
||||
identify = ">=1.0.0"
|
||||
nodeenv = ">=0.11.1"
|
||||
pyyaml = ">=5.1"
|
||||
toml = "*"
|
||||
virtualenv = ">=20.0.8"
|
||||
|
||||
[[package]]
|
||||
name = "pygments"
|
||||
version = "2.12.0"
|
||||
description = "Pygments is a syntax highlighting package written in Python."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml"
|
||||
version = "6.0"
|
||||
description = "YAML parser and emitter for Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "six"
|
||||
version = "1.16.0"
|
||||
description = "Python 2 and 3 compatibility utilities"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.10.2"
|
||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
|
||||
[[package]]
|
||||
name = "virtualenv"
|
||||
version = "20.15.1"
|
||||
description = "Virtual Python Environment builder"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||
|
||||
[package.dependencies]
|
||||
distlib = ">=0.3.1,<1"
|
||||
filelock = ">=3.2,<4"
|
||||
platformdirs = ">=2,<3"
|
||||
six = ">=1.9.0,<2"
|
||||
|
||||
[package.extras]
|
||||
docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"]
|
||||
testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "84c8c86d4babe9a74088ea483f90699b35c06213b972b36977ba81e87386a30a"
|
||||
|
||||
[metadata.files]
|
||||
asttokens = []
|
||||
cfgv = []
|
||||
click = []
|
||||
colorama = []
|
||||
distlib = []
|
||||
executing = []
|
||||
filelock = []
|
||||
icecream = []
|
||||
identify = []
|
||||
nodeenv = []
|
||||
platformdirs = []
|
||||
pre-commit = []
|
||||
pygments = []
|
||||
pyyaml = []
|
||||
six = []
|
||||
toml = []
|
||||
virtualenv = []
|
20
pyproject.toml
Normal file
20
pyproject.toml
Normal file
|
@ -0,0 +1,20 @@
|
|||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry]
|
||||
name = "clickusagemd"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["Jules <jules@deutschebahn.com>"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.10"
|
||||
click = "^8.1.3"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
pre-commit = "^2.20.0"
|
||||
icecream = "^2.1.2"
|
||||
|
||||
[tool.poetry.scripts]
|
||||
clickusagemd = "clickusagemd:cli"
|
Loading…
Reference in New Issue
Block a user