pycmdcheck 0.1.1__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pycmdcheck-0.2.0/.gitignore +38 -0
- pycmdcheck-0.2.0/CHANGELOG.md +311 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/LICENSE +1 -1
- pycmdcheck-0.2.0/PKG-INFO +919 -0
- pycmdcheck-0.2.0/README.md +877 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/pyproject.toml +61 -26
- pycmdcheck-0.2.0/skills/pycmdcheck/SKILL.md +154 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/__init__.py +19 -2
- pycmdcheck-0.2.0/src/pycmdcheck/__main__.py +18 -0
- pycmdcheck-0.2.0/src/pycmdcheck/_osi_licenses.py +915 -0
- pycmdcheck-0.2.0/src/pycmdcheck/_skill.py +145 -0
- pycmdcheck-0.2.0/src/pycmdcheck/_stdlib_names.py +361 -0
- pycmdcheck-0.2.0/src/pycmdcheck/ast_cache.py +128 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/base.py +217 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/build.py +199 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/changelog.py +239 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/ci.py +125 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/citation.py +171 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/community.py +119 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/dependencies.py +433 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/docs.py +669 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/doctests.py +380 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/formatting.py +250 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/imports.py +54 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/license.py +460 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/linting.py +395 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/metadata.py +542 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/py_typed.py +213 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/python_versions.py +342 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/structure.py +270 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/test_suite.py +178 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/tests.py +371 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/typing.py +377 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/urls.py +553 -0
- pycmdcheck-0.2.0/src/pycmdcheck/checks/version.py +263 -0
- pycmdcheck-0.2.0/src/pycmdcheck/cli.py +927 -0
- pycmdcheck-0.2.0/src/pycmdcheck/config.py +481 -0
- pycmdcheck-0.2.0/src/pycmdcheck/constants.py +83 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/discovery.py +40 -14
- pycmdcheck-0.2.0/src/pycmdcheck/fileio.py +594 -0
- pycmdcheck-0.2.0/src/pycmdcheck/import_scan.py +182 -0
- pycmdcheck-0.2.0/src/pycmdcheck/package_layout.py +986 -0
- pycmdcheck-0.2.0/src/pycmdcheck/profiles.py +262 -0
- pycmdcheck-0.2.0/src/pycmdcheck/pyproject_reader.py +771 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/results.py +165 -6
- pycmdcheck-0.2.0/src/pycmdcheck/runner.py +444 -0
- pycmdcheck-0.2.0/src/pycmdcheck/subprocess_runner.py +450 -0
- pycmdcheck-0.2.0/tests/conftest.py +759 -0
- pycmdcheck-0.2.0/tests/helpers.py +93 -0
- pycmdcheck-0.2.0/tests/test_ast_cache.py +286 -0
- pycmdcheck-0.2.0/tests/test_check_build.py +302 -0
- pycmdcheck-0.2.0/tests/test_check_changelog.py +360 -0
- pycmdcheck-0.2.0/tests/test_check_ci.py +136 -0
- pycmdcheck-0.2.0/tests/test_check_citation.py +244 -0
- pycmdcheck-0.2.0/tests/test_check_community.py +116 -0
- pycmdcheck-0.2.0/tests/test_check_dependencies.py +663 -0
- pycmdcheck-0.2.0/tests/test_check_docs.py +1010 -0
- pycmdcheck-0.2.0/tests/test_check_doctests.py +1151 -0
- pycmdcheck-0.2.0/tests/test_check_formatting.py +467 -0
- pycmdcheck-0.2.0/tests/test_check_imports.py +44 -0
- pycmdcheck-0.2.0/tests/test_check_license.py +736 -0
- pycmdcheck-0.2.0/tests/test_check_linting.py +685 -0
- pycmdcheck-0.2.0/tests/test_check_metadata.py +651 -0
- pycmdcheck-0.2.0/tests/test_check_py_typed.py +323 -0
- pycmdcheck-0.2.0/tests/test_check_python_versions.py +506 -0
- pycmdcheck-0.2.0/tests/test_check_structure.py +507 -0
- pycmdcheck-0.2.0/tests/test_check_test_suite.py +233 -0
- pycmdcheck-0.2.0/tests/test_check_tests.py +534 -0
- pycmdcheck-0.2.0/tests/test_check_typing.py +526 -0
- pycmdcheck-0.2.0/tests/test_check_urls.py +885 -0
- pycmdcheck-0.2.0/tests/test_check_version.py +329 -0
- pycmdcheck-0.2.0/tests/test_cli.py +1840 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/test_config.py +21 -5
- pycmdcheck-0.2.0/tests/test_config_file.py +529 -0
- pycmdcheck-0.2.0/tests/test_config_validation.py +131 -0
- pycmdcheck-0.2.0/tests/test_discovery.py +100 -0
- pycmdcheck-0.2.0/tests/test_docs_sync.py +495 -0
- pycmdcheck-0.2.0/tests/test_e2e_triage.py +400 -0
- pycmdcheck-0.2.0/tests/test_fileio.py +694 -0
- pycmdcheck-0.2.0/tests/test_integration.py +51 -0
- pycmdcheck-0.2.0/tests/test_package_layout.py +895 -0
- pycmdcheck-0.2.0/tests/test_profiles.py +336 -0
- pycmdcheck-0.2.0/tests/test_pyproject_reader.py +906 -0
- pycmdcheck-0.2.0/tests/test_result_contract.py +220 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/test_results.py +141 -10
- pycmdcheck-0.2.0/tests/test_runner.py +559 -0
- pycmdcheck-0.2.0/tests/test_skill.py +169 -0
- pycmdcheck-0.2.0/tests/test_subprocess_runner.py +632 -0
- pycmdcheck-0.1.1/.devcontainer/Dockerfile +0 -17
- pycmdcheck-0.1.1/.devcontainer/devcontainer.json +0 -61
- pycmdcheck-0.1.1/.devcontainer/requirements-dev.txt +0 -5
- pycmdcheck-0.1.1/.github/workflows/ci.yml +0 -54
- pycmdcheck-0.1.1/.github/workflows/release.yml +0 -52
- pycmdcheck-0.1.1/.gitignore +0 -22
- pycmdcheck-0.1.1/CHANGELOG.md +0 -69
- pycmdcheck-0.1.1/PKG-INFO +0 -336
- pycmdcheck-0.1.1/README.md +0 -294
- pycmdcheck-0.1.1/docs/.gitignore +0 -2
- pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/.gitignore +0 -3
- pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/_extension.yml +0 -7
- pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/interlinks.lua +0 -411
- pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/objects.txt +0 -7
- pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/test.qmd +0 -22
- pycmdcheck-0.1.1/docs/_inv/python_objects.json +0 -1
- pycmdcheck-0.1.1/docs/_quarto.yml +0 -85
- pycmdcheck-0.1.1/docs/_site/changelog.html +0 -618
- pycmdcheck-0.1.1/docs/_site/cli.html +0 -788
- pycmdcheck-0.1.1/docs/_site/configuration.html +0 -900
- pycmdcheck-0.1.1/docs/_site/custom-checks.html +0 -882
- pycmdcheck-0.1.1/docs/_site/getting-started.html +0 -784
- pycmdcheck-0.1.1/docs/_site/index.html +0 -680
- pycmdcheck-0.1.1/docs/_site/reference/CheckResult.html +0 -693
- pycmdcheck-0.1.1/docs/_site/reference/CheckStatus.html +0 -638
- pycmdcheck-0.1.1/docs/_site/reference/Report.html +0 -797
- pycmdcheck-0.1.1/docs/_site/reference/check.html +0 -657
- pycmdcheck-0.1.1/docs/_site/reference/checks.base.BaseCheck.html +0 -727
- pycmdcheck-0.1.1/docs/_site/reference/checks.base.Check.html +0 -684
- pycmdcheck-0.1.1/docs/_site/reference/checks.docs.DocsCheck.html +0 -707
- pycmdcheck-0.1.1/docs/_site/reference/checks.imports.ImportsCheck.html +0 -707
- pycmdcheck-0.1.1/docs/_site/reference/checks.license.LicenseCheck.html +0 -698
- pycmdcheck-0.1.1/docs/_site/reference/checks.linting.LintingCheck.html +0 -713
- pycmdcheck-0.1.1/docs/_site/reference/checks.metadata.MetadataCheck.html +0 -709
- pycmdcheck-0.1.1/docs/_site/reference/checks.structure.StructureCheck.html +0 -701
- pycmdcheck-0.1.1/docs/_site/reference/checks.tests.TestsCheck.html +0 -709
- pycmdcheck-0.1.1/docs/_site/reference/checks.typing.TypingCheck.html +0 -707
- pycmdcheck-0.1.1/docs/_site/reference/config.get_check_config.html +0 -645
- pycmdcheck-0.1.1/docs/_site/reference/config.is_check_enabled.html +0 -636
- pycmdcheck-0.1.1/docs/_site/reference/config.load_config.html +0 -643
- pycmdcheck-0.1.1/docs/_site/reference/discovery.discover_checks.html +0 -636
- pycmdcheck-0.1.1/docs/_site/reference/discovery.list_available_checks.html +0 -652
- pycmdcheck-0.1.1/docs/_site/reference/index.html +0 -688
- pycmdcheck-0.1.1/docs/_site/reference/runner.run_checks.html +0 -661
- pycmdcheck-0.1.1/docs/_site/search.json +0 -856
- pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-5b4ad623e5705c0698d39aec6f10cf02.min.css +0 -12
- pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-icons.css +0 -2106
- pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-icons.woff +0 -0
- pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap.min.js +0 -7
- pycmdcheck-0.1.1/docs/_site/site_libs/clipboard/clipboard.min.js +0 -7
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/anchor.min.js +0 -9
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/axe/axe-check.js +0 -145
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/popper.min.js +0 -6
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -236
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/quarto.js +0 -847
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tabsets/tabsets.js +0 -95
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tippy.css +0 -1
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tippy.umd.min.js +0 -2
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-nav/headroom.min.js +0 -7
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-nav/quarto-nav.js +0 -325
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/autocomplete.umd.js +0 -3
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/fuse.min.js +0 -9
- pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/quarto-search.js +0 -1290
- pycmdcheck-0.1.1/docs/changelog.qmd +0 -5
- pycmdcheck-0.1.1/docs/cli.qmd +0 -264
- pycmdcheck-0.1.1/docs/configuration.qmd +0 -299
- pycmdcheck-0.1.1/docs/custom-checks.qmd +0 -264
- pycmdcheck-0.1.1/docs/getting-started.qmd +0 -137
- pycmdcheck-0.1.1/docs/index.qmd +0 -71
- pycmdcheck-0.1.1/docs/objects.json +0 -1
- pycmdcheck-0.1.1/docs/reference/CheckResult.qmd +0 -91
- pycmdcheck-0.1.1/docs/reference/CheckStatus.qmd +0 -44
- pycmdcheck-0.1.1/docs/reference/Report.qmd +0 -178
- pycmdcheck-0.1.1/docs/reference/_sidebar.yml +0 -36
- pycmdcheck-0.1.1/docs/reference/check.qmd +0 -73
- pycmdcheck-0.1.1/docs/reference/checks.base.BaseCheck.qmd +0 -116
- pycmdcheck-0.1.1/docs/reference/checks.base.Check.qmd +0 -72
- pycmdcheck-0.1.1/docs/reference/checks.docs.DocsCheck.qmd +0 -101
- pycmdcheck-0.1.1/docs/reference/checks.imports.ImportsCheck.qmd +0 -96
- pycmdcheck-0.1.1/docs/reference/checks.license.LicenseCheck.qmd +0 -89
- pycmdcheck-0.1.1/docs/reference/checks.linting.LintingCheck.qmd +0 -105
- pycmdcheck-0.1.1/docs/reference/checks.metadata.MetadataCheck.qmd +0 -98
- pycmdcheck-0.1.1/docs/reference/checks.structure.StructureCheck.qmd +0 -92
- pycmdcheck-0.1.1/docs/reference/checks.tests.TestsCheck.qmd +0 -102
- pycmdcheck-0.1.1/docs/reference/checks.typing.TypingCheck.qmd +0 -102
- pycmdcheck-0.1.1/docs/reference/config.get_check_config.qmd +0 -57
- pycmdcheck-0.1.1/docs/reference/config.is_check_enabled.qmd +0 -38
- pycmdcheck-0.1.1/docs/reference/config.load_config.qmd +0 -42
- pycmdcheck-0.1.1/docs/reference/discovery.discover_checks.qmd +0 -51
- pycmdcheck-0.1.1/docs/reference/discovery.list_available_checks.qmd +0 -60
- pycmdcheck-0.1.1/docs/reference/index.qmd +0 -56
- pycmdcheck-0.1.1/docs/reference/runner.run_checks.qmd +0 -73
- pycmdcheck-0.1.1/src/pycmdcheck/__main__.py +0 -6
- pycmdcheck-0.1.1/src/pycmdcheck/ast_cache.py +0 -45
- pycmdcheck-0.1.1/src/pycmdcheck/checks/base.py +0 -143
- pycmdcheck-0.1.1/src/pycmdcheck/checks/build.py +0 -101
- pycmdcheck-0.1.1/src/pycmdcheck/checks/changelog.py +0 -101
- pycmdcheck-0.1.1/src/pycmdcheck/checks/ci.py +0 -87
- pycmdcheck-0.1.1/src/pycmdcheck/checks/citation.py +0 -102
- pycmdcheck-0.1.1/src/pycmdcheck/checks/community.py +0 -108
- pycmdcheck-0.1.1/src/pycmdcheck/checks/dependencies.py +0 -309
- pycmdcheck-0.1.1/src/pycmdcheck/checks/docs.py +0 -305
- pycmdcheck-0.1.1/src/pycmdcheck/checks/doctests.py +0 -129
- pycmdcheck-0.1.1/src/pycmdcheck/checks/formatting.py +0 -200
- pycmdcheck-0.1.1/src/pycmdcheck/checks/imports.py +0 -239
- pycmdcheck-0.1.1/src/pycmdcheck/checks/license.py +0 -304
- pycmdcheck-0.1.1/src/pycmdcheck/checks/linting.py +0 -304
- pycmdcheck-0.1.1/src/pycmdcheck/checks/metadata.py +0 -235
- pycmdcheck-0.1.1/src/pycmdcheck/checks/py_typed.py +0 -207
- pycmdcheck-0.1.1/src/pycmdcheck/checks/python_versions.py +0 -188
- pycmdcheck-0.1.1/src/pycmdcheck/checks/structure.py +0 -285
- pycmdcheck-0.1.1/src/pycmdcheck/checks/tests.py +0 -231
- pycmdcheck-0.1.1/src/pycmdcheck/checks/typing.py +0 -259
- pycmdcheck-0.1.1/src/pycmdcheck/checks/urls.py +0 -124
- pycmdcheck-0.1.1/src/pycmdcheck/checks/version.py +0 -184
- pycmdcheck-0.1.1/src/pycmdcheck/cli.py +0 -309
- pycmdcheck-0.1.1/src/pycmdcheck/config.py +0 -194
- pycmdcheck-0.1.1/src/pycmdcheck/constants.py +0 -29
- pycmdcheck-0.1.1/src/pycmdcheck/package_layout.py +0 -234
- pycmdcheck-0.1.1/src/pycmdcheck/profiles.py +0 -162
- pycmdcheck-0.1.1/src/pycmdcheck/pyproject_reader.py +0 -226
- pycmdcheck-0.1.1/src/pycmdcheck/runner.py +0 -236
- pycmdcheck-0.1.1/src/pycmdcheck/subprocess_runner.py +0 -166
- pycmdcheck-0.1.1/tests/conftest.py +0 -375
- pycmdcheck-0.1.1/tests/test_ast_cache.py +0 -37
- pycmdcheck-0.1.1/tests/test_check_build.py +0 -130
- pycmdcheck-0.1.1/tests/test_check_changelog.py +0 -49
- pycmdcheck-0.1.1/tests/test_check_ci.py +0 -63
- pycmdcheck-0.1.1/tests/test_check_citation.py +0 -56
- pycmdcheck-0.1.1/tests/test_check_community.py +0 -74
- pycmdcheck-0.1.1/tests/test_check_dependencies.py +0 -143
- pycmdcheck-0.1.1/tests/test_check_deps_enhanced.py +0 -53
- pycmdcheck-0.1.1/tests/test_check_docs.py +0 -120
- pycmdcheck-0.1.1/tests/test_check_doctests.py +0 -110
- pycmdcheck-0.1.1/tests/test_check_formatting.py +0 -202
- pycmdcheck-0.1.1/tests/test_check_license.py +0 -102
- pycmdcheck-0.1.1/tests/test_check_metadata.py +0 -131
- pycmdcheck-0.1.1/tests/test_check_py_typed.py +0 -40
- pycmdcheck-0.1.1/tests/test_check_python_versions.py +0 -90
- pycmdcheck-0.1.1/tests/test_check_urls.py +0 -61
- pycmdcheck-0.1.1/tests/test_check_version.py +0 -140
- pycmdcheck-0.1.1/tests/test_checks.py +0 -592
- pycmdcheck-0.1.1/tests/test_cli.py +0 -232
- pycmdcheck-0.1.1/tests/test_config_validation.py +0 -40
- pycmdcheck-0.1.1/tests/test_integration.py +0 -45
- pycmdcheck-0.1.1/tests/test_package_layout.py +0 -97
- pycmdcheck-0.1.1/tests/test_profiles.py +0 -140
- pycmdcheck-0.1.1/tests/test_pyproject_reader.py +0 -154
- pycmdcheck-0.1.1/tests/test_runner.py +0 -247
- pycmdcheck-0.1.1/tests/test_subprocess_runner.py +0 -762
- pycmdcheck-0.1.1/tests/test_tool_checks_mocked.py +0 -204
- pycmdcheck-0.1.1/uv.lock +0 -1264
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/checks/__init__.py +0 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/py.typed +0 -0
- {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/__init__.py +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
*.egg
|
|
8
|
+
|
|
9
|
+
# Virtual environments
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
|
|
13
|
+
# Test and tool caches
|
|
14
|
+
.coverage
|
|
15
|
+
.coverage.*
|
|
16
|
+
coverage.xml
|
|
17
|
+
htmlcov/
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.mypy_cache/
|
|
20
|
+
.ruff_cache/
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
|
|
25
|
+
# IDE
|
|
26
|
+
.idea/
|
|
27
|
+
.vscode/
|
|
28
|
+
*.swp
|
|
29
|
+
|
|
30
|
+
# Generated documentation
|
|
31
|
+
docs/_site/
|
|
32
|
+
docs/reference/
|
|
33
|
+
docs/_inv/
|
|
34
|
+
docs/objects.json
|
|
35
|
+
docs/.quarto/
|
|
36
|
+
|
|
37
|
+
# Plans (keep locally, don't track)
|
|
38
|
+
docs/plans/
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to pycmdcheck will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-10-12
|
|
9
|
+
|
|
10
|
+
This release raises fewer false alarms and explains every finding. On 18 real
|
|
11
|
+
repositories checked with the `triage` profile, errors and warnings fell from
|
|
12
|
+
11 to 4, and 9 of the 11 were false alarms.
|
|
13
|
+
|
|
14
|
+
### New features
|
|
15
|
+
|
|
16
|
+
- Every finding now has a rule code, such as `license.missing`, and a
|
|
17
|
+
one-sentence suggestion that says what to do about it. `--verbose` shows
|
|
18
|
+
the suggestions, `--list-rules` lists all 81 rules, and the JSON report
|
|
19
|
+
holds both under `findings` in each result.
|
|
20
|
+
|
|
21
|
+
- `--format markdown` writes a report made for a pull request or issue
|
|
22
|
+
comment, and `--output FILE` saves any report to a file.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pycmdcheck --profile triage --format markdown --output report.md
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- New `test_suite` check says whether a project has tests without running
|
|
29
|
+
them, so the `triage` profile can now report a missing test suite.
|
|
30
|
+
|
|
31
|
+
- New `--config FILE` option takes the profile, the checks and their options
|
|
32
|
+
from a settings file kept outside the checked project. It is for bots and
|
|
33
|
+
organizations that check repositories they do not own. The
|
|
34
|
+
`[tool.pycmdcheck]` table of the checked project is then not read at all.
|
|
35
|
+
|
|
36
|
+
- `--profile triage` now gives the same results whatever the checked
|
|
37
|
+
project's `[tool.pycmdcheck.checks]` table says. Its checks only read
|
|
38
|
+
files, and the profile sets every option they use.
|
|
39
|
+
|
|
40
|
+
- Skipped checks now say why. Each one has a `skip_reason`, such as
|
|
41
|
+
`tool-missing`, `not-configured` or `not-applicable`, and never fails a
|
|
42
|
+
run.
|
|
43
|
+
|
|
44
|
+
- New Agent Skill teaches an AI assistant to run pycmdcheck and to fix each
|
|
45
|
+
finding by its rule code and suggestion. `pycmdcheck --install-skill`
|
|
46
|
+
copies it into `.claude/skills`, and the repository also works as a Claude
|
|
47
|
+
Code plugin.
|
|
48
|
+
|
|
49
|
+
- `--check` and `--skip` now take several names separated by commas, as in
|
|
50
|
+
`--check tests,linting`.
|
|
51
|
+
|
|
52
|
+
- `--list-profiles` now shows the checks and options of each profile, and
|
|
53
|
+
`--list`, `--list-profiles` and `--list-rules` take `--json`.
|
|
54
|
+
|
|
55
|
+
- The JSON report gains `schema_version`, `pycmdcheck_version`, `profile`,
|
|
56
|
+
`config_file`, `fail_on`, `failed`, `requested_checks` and
|
|
57
|
+
`skipped_checks`, and every result gains `findings` and `skip_reason`. A
|
|
58
|
+
program that compares the exact set of keys needs an update.
|
|
59
|
+
|
|
60
|
+
- Exit code 3 now marks a failure of pycmdcheck itself, so a caller can tell
|
|
61
|
+
it from a report of findings.
|
|
62
|
+
|
|
63
|
+
- The Python API gains `pycmdcheck.Finding`, `BaseCheck.rules`,
|
|
64
|
+
`BaseCheck.hints` and `CheckResult.skip()` for custom checks that report
|
|
65
|
+
findings, and a `profile=` argument for `check()` and `run_checks()`. A
|
|
66
|
+
custom check that reports no findings still works.
|
|
67
|
+
|
|
68
|
+
### Breaking changes
|
|
69
|
+
|
|
70
|
+
- Python 3.10 is no longer supported. pycmdcheck needs Python 3.11 or later.
|
|
71
|
+
|
|
72
|
+
- Many results change status. A check with nothing to look at is now
|
|
73
|
+
skipped and no longer gives a note, a warning or an error, and each cause
|
|
74
|
+
is reported by one check. A project with no tests, for example, now gets
|
|
75
|
+
its warning from `test_suite` and a skipped `tests`.
|
|
76
|
+
|
|
77
|
+
- `linting` and `typing` now run only when the project has configured a
|
|
78
|
+
tool, and are skipped otherwise. To run one anyway, name the tool, as in
|
|
79
|
+
`linting = { tool = "ruff" }` under `[tool.pycmdcheck.checks]`.
|
|
80
|
+
|
|
81
|
+
- `formatting` no longer takes a `[tool.ruff]` table alone as the sign of a
|
|
82
|
+
ruff formatter, so such a project is now skipped. Add a
|
|
83
|
+
`[tool.ruff.format]` table, which may be empty, to keep the check.
|
|
84
|
+
|
|
85
|
+
- `--fail-on` now names a threshold, so `--fail-on warning` also fails on an
|
|
86
|
+
error. `fail_on` in `[tool.pycmdcheck]` now takes effect when `--fail-on`
|
|
87
|
+
is not given, under every profile, so a project that sets
|
|
88
|
+
`fail_on = ["warning"]` can now get exit code 1. Pass `--fail-on` or use
|
|
89
|
+
`--config` when you check repositories you do not own.
|
|
90
|
+
|
|
91
|
+
- `doctests` now gives an error for a failed docstring example, and the run
|
|
92
|
+
exits with code 1. Fix the example, or mark it with `# doctest: +SKIP`.
|
|
93
|
+
|
|
94
|
+
- `dependencies` now warns about an undeclared import also when the module
|
|
95
|
+
is installed, and when the project declares no dependencies at all. Add
|
|
96
|
+
the package to `dependencies` in the `[project]` table.
|
|
97
|
+
|
|
98
|
+
- `--skip` now gives a usage error with exit code 2 when it names an unknown
|
|
99
|
+
check, holds an empty name, or leaves no check to run. So does a `PATH`
|
|
100
|
+
that is a file.
|
|
101
|
+
|
|
102
|
+
- `--profile default` and the `imports` check are deprecated. Use
|
|
103
|
+
`--profile core`, which runs the same checks, and `--check dependencies`,
|
|
104
|
+
which now does the work of `imports`. Take `imports` out of `--skip`.
|
|
105
|
+
|
|
106
|
+
- `--profile strict` now runs ruff and mypy whatever tool the project names
|
|
107
|
+
in `[tool.pycmdcheck.checks]`, such as flake8 or pyright. Use
|
|
108
|
+
`--profile pyopensci` to keep the project's choice.
|
|
109
|
+
|
|
110
|
+
- The `all` extra now installs the `build` package, as the new `build` extra
|
|
111
|
+
does, so the `build` check builds the project where it was skipped. Pass
|
|
112
|
+
`--skip build` to leave it out.
|
|
113
|
+
|
|
114
|
+
- Report text is reworded. The closing line starts with `Failed:` after a
|
|
115
|
+
failed run, many messages and detail lines changed, and advice moved from
|
|
116
|
+
the detail lines to the suggestion. A program should read the JSON report
|
|
117
|
+
and match the `code` of a finding.
|
|
118
|
+
|
|
119
|
+
- A check that raises an exception no longer prints its traceback. Run with
|
|
120
|
+
`--debug` to see it.
|
|
121
|
+
|
|
122
|
+
- The `dev` and `docs` extras are gone. Both are now dependency groups for
|
|
123
|
+
people who work on pycmdcheck.
|
|
124
|
+
|
|
125
|
+
- `check()` and `run_checks()` now raise `FileNotFoundError` or
|
|
126
|
+
`NotADirectoryError` for a path that is not a directory, and `ValueError`
|
|
127
|
+
for an unknown profile or an unknown name in `checks=`.
|
|
128
|
+
|
|
129
|
+
- A plugin can no longer replace a built-in check by registering under its
|
|
130
|
+
name.
|
|
131
|
+
|
|
132
|
+
- For authors of custom checks, the class attributes `CHANGELOG_FILENAMES`,
|
|
133
|
+
`CITATION_FILENAMES`, `CONTRIBUTING_FILENAMES` and
|
|
134
|
+
`CODE_OF_CONDUCT_FILENAMES` give way to `CHANGELOG_STEMS`,
|
|
135
|
+
`CITATION_EXTENSIONS`, `CONTRIBUTING_STEMS` and `CODE_OF_CONDUCT_STEMS`.
|
|
136
|
+
Several undocumented helpers of `pycmdcheck.package_layout` are gone too.
|
|
137
|
+
|
|
138
|
+
### Minor improvements and fixes
|
|
139
|
+
|
|
140
|
+
- `--profile pyopensci` and `--profile strict` now set the minimum docstring
|
|
141
|
+
coverage to 50% and 80%, so missing docstrings give a note only below that
|
|
142
|
+
coverage.
|
|
143
|
+
|
|
144
|
+
- `build` now builds a project that has only a `setup.py`, and a `build.py`
|
|
145
|
+
or `build/` in the project no longer gets in its way.
|
|
146
|
+
|
|
147
|
+
- `changelog`, `ci`, `citation` and `community` now accept many more file
|
|
148
|
+
names and services, such as `RELEASE_NOTES`, a directory of news
|
|
149
|
+
fragments, Forgejo Actions, `CITATION.rst`, `codemeta.json` and `CONDUCT`.
|
|
150
|
+
|
|
151
|
+
- `changelog`, `ci`, `citation`, `community` and `docs` now match file names
|
|
152
|
+
in any letter case, so results agree between macOS and Linux.
|
|
153
|
+
|
|
154
|
+
- `dependencies` no longer flags guarded imports, such as those under
|
|
155
|
+
`if TYPE_CHECKING` or in a `try` that catches `ImportError`. It also
|
|
156
|
+
leaves out the standard library, the project's own modules, and code in
|
|
157
|
+
tests and documentation.
|
|
158
|
+
|
|
159
|
+
- `docs` gains a `check_docs_site` option, which gives a note when a project
|
|
160
|
+
has no documentation beyond its README. The `triage`, `pyopensci` and
|
|
161
|
+
`strict` profiles turn it on.
|
|
162
|
+
|
|
163
|
+
- `docs` now finds a README in `.github/` or `docs/`, or one declared in
|
|
164
|
+
`pyproject.toml`.
|
|
165
|
+
|
|
166
|
+
- `doctests` now names each failed example and gives the line and the
|
|
167
|
+
reason, as in `line 29: expected 10, got 9`.
|
|
168
|
+
|
|
169
|
+
- `doctests` now collects only the project's own packages, and still runs
|
|
170
|
+
the other examples when one file cannot be imported.
|
|
171
|
+
|
|
172
|
+
- `license` now gives a note when the declared license expression names no
|
|
173
|
+
license approved by the Open Source Initiative. The approved licenses come
|
|
174
|
+
from the SPDX license list.
|
|
175
|
+
|
|
176
|
+
- `license` now accepts `LICENSE/` and `LICENSES/` directories, `UNLICENSE`,
|
|
177
|
+
and files that are not UTF-8. It no longer labels MPL, LGPL, AGPL or EPL
|
|
178
|
+
texts as GPL.
|
|
179
|
+
|
|
180
|
+
- `linting` no longer rewrites files when the project's ruff settings turn
|
|
181
|
+
`fix` on, and lists each finding as `path:row:col CODE message`.
|
|
182
|
+
|
|
183
|
+
- `linting` and `formatting` now find ruff and black when they are installed
|
|
184
|
+
next to pycmdcheck, which is where `pipx` and `uv tool` put them.
|
|
185
|
+
|
|
186
|
+
- `metadata` now flags values that cannot be right. An empty `name` or
|
|
187
|
+
`version` gives an error, and a setuptools project that lists a
|
|
188
|
+
`License ::` classifier beside a license expression gets a warning,
|
|
189
|
+
because setuptools 77 and later refuses to build it.
|
|
190
|
+
|
|
191
|
+
- `metadata` now gives a warning, not an error, when `setup.py` or
|
|
192
|
+
`setup.cfg` holds the metadata beside a `pyproject.toml` that has no
|
|
193
|
+
`[project]` table.
|
|
194
|
+
|
|
195
|
+
- `py_typed` now suggests the `py.typed` marker only for a package that is
|
|
196
|
+
clearly typed, and counts `.pyi` stub files.
|
|
197
|
+
|
|
198
|
+
- `python_versions` now reads `python_requires` from `setup.py`, and knows
|
|
199
|
+
end-of-life dates through Python 3.15.
|
|
200
|
+
|
|
201
|
+
- `structure` now finds a package beside `src/`, namespace packages,
|
|
202
|
+
stub-only packages and packages with underscore names. It no longer warns
|
|
203
|
+
about Rust, C or front-end directories under `src/`, and it recognizes
|
|
204
|
+
native build tools named under `[build-system] requires`, such as
|
|
205
|
+
setuptools-rust, Cython, pybind11 and cffi.
|
|
206
|
+
|
|
207
|
+
- `tests` now finds tests inside the package, under `testpaths`, and in
|
|
208
|
+
`*_test.py` files. It says "Tests could not be collected" when a test
|
|
209
|
+
module cannot be imported.
|
|
210
|
+
|
|
211
|
+
- `typing` now gives ok when mypy prints only notes, counts the warnings of
|
|
212
|
+
pyright apart from its errors, and no longer passes `--strict` to pyright.
|
|
213
|
+
|
|
214
|
+
- `urls` no longer contacts local or private hosts, and follows a redirect
|
|
215
|
+
only to another `http` or `https` address.
|
|
216
|
+
|
|
217
|
+
- `urls` now gives a note, not a warning, for an address it could not
|
|
218
|
+
verify, such as one that answers HTTP 403 or times out. Only 404, 410 and
|
|
219
|
+
an unknown host give a warning.
|
|
220
|
+
|
|
221
|
+
- `version` now treats `1.0` and `1.0.0` as the same version, as PEP 440
|
|
222
|
+
does.
|
|
223
|
+
|
|
224
|
+
- A `pyproject.toml` that cannot be parsed no longer ends the run with a
|
|
225
|
+
traceback. `metadata` reports the file, and the checks that need it are
|
|
226
|
+
skipped.
|
|
227
|
+
|
|
228
|
+
- A tool that is installed but cannot run now gives a warning that names it,
|
|
229
|
+
such as "ruff could not run", not an error.
|
|
230
|
+
|
|
231
|
+
- Files in the checked repository are now read only when they are regular
|
|
232
|
+
files, and only up to a size limit.
|
|
233
|
+
|
|
234
|
+
- `python -m pycmdcheck` now removes the current directory from the module
|
|
235
|
+
search path, so a repository checked from its own root cannot register
|
|
236
|
+
checks of its own.
|
|
237
|
+
|
|
238
|
+
- The documentation gains pages on the rules, on triage and on working with
|
|
239
|
+
an AI assistant, and is published at
|
|
240
|
+
<https://py-pkg.thecoatlessprofessor.com/pycmdcheck/>.
|
|
241
|
+
|
|
242
|
+
## [0.1.1] - 2026-06-25
|
|
243
|
+
|
|
244
|
+
### Added
|
|
245
|
+
|
|
246
|
+
- `--exit-zero` flag for the command line interface (CLI). It always exits
|
|
247
|
+
with `0` regardless of check results, so the exit code reflects whether
|
|
248
|
+
pycmdcheck ran rather than what it found. Intended for CI and other
|
|
249
|
+
automation that parses the results itself, for example from `--json`.
|
|
250
|
+
|
|
251
|
+
### Fixed
|
|
252
|
+
|
|
253
|
+
- Project URLs now point to the actual repository
|
|
254
|
+
(`github.com/coatless-py-pkg/pycmdcheck`). The previously declared
|
|
255
|
+
`pycmdcheck/pycmdcheck` URLs referenced a repository that does not exist (404).
|
|
256
|
+
- Installation instructions use `pip install pycmdcheck` now that the package is
|
|
257
|
+
published on PyPI.
|
|
258
|
+
- Corrected inaccurate docstrings (the `metadata`/`tests`/`structure`/`typing`
|
|
259
|
+
Returns sections, the `check`/`run_checks` built-in-check lists, `get_profile`,
|
|
260
|
+
and `discover_checks`) and the illustrative API doctests that crashed under
|
|
261
|
+
`pytest --doctest-modules`.
|
|
262
|
+
|
|
263
|
+
### Changed
|
|
264
|
+
|
|
265
|
+
- Documentation and docstrings no longer hard-code the built-in check list.
|
|
266
|
+
They reference `pycmdcheck --list`, and a test keeps `ALL_CHECKS` in sync with
|
|
267
|
+
the registered entry points.
|
|
268
|
+
- Updated GitHub Actions to current versions (`checkout` v7, `setup-uv` v8.2.0,
|
|
269
|
+
`upload-artifact` v7, `download-artifact` v8, `gh-action-pypi-publish` v1.14.0).
|
|
270
|
+
|
|
271
|
+
## [0.1.0] - 2026-06-25
|
|
272
|
+
|
|
273
|
+
First release of pycmdcheck on PyPI.
|
|
274
|
+
|
|
275
|
+
### Added
|
|
276
|
+
|
|
277
|
+
- Core `check()` function and `pycmdcheck` CLI, with Rich terminal output and
|
|
278
|
+
JSON output for CI integration.
|
|
279
|
+
- Built-in checks: `metadata`, `structure`, `tests`, `linting`, `typing`,
|
|
280
|
+
`imports`, `license`, `docs`, `dependencies`, `build`, `formatting`,
|
|
281
|
+
`version`, `py_typed`, `community`, `ci`, `changelog`, `citation`,
|
|
282
|
+
`python_versions`, `urls`, `doctests`.
|
|
283
|
+
- Profile system with five profiles (`minimal`, `triage`, `default`,
|
|
284
|
+
`pyopensci`, `strict`), selected with `--profile` and listed with
|
|
285
|
+
`--list-profiles`. The `triage` profile runs only static,
|
|
286
|
+
no-install/no-network checks, intended for CI triage of arbitrary
|
|
287
|
+
(un-installed) repositories.
|
|
288
|
+
- Configuration via `[tool.pycmdcheck]` in pyproject.toml, a plugin system via
|
|
289
|
+
entry points for custom checks, and parallel check execution.
|
|
290
|
+
- Support for legacy Poetry projects (`[tool.poetry]` with no PEP 621
|
|
291
|
+
`[project]` table) across the metadata, version, python_versions, and
|
|
292
|
+
dependencies checks.
|
|
293
|
+
- Recognition of PEP 420 namespace packages, single-file modules, and
|
|
294
|
+
native-extension build backends (maturin and scikit-build) in the
|
|
295
|
+
`structure` check. This entry first named setuptools-rust as well, which
|
|
296
|
+
0.1.0 and 0.1.1 did not detect. See the `structure` entry under 0.2.0.
|
|
297
|
+
- `formatting` check auto-detects the configured formatter (ruff vs black) and
|
|
298
|
+
is skipped when none is configured.
|
|
299
|
+
- GitHub Actions workflows for CI (lint + type-check + pytest on 3.10 to
|
|
300
|
+
3.13) and for a tag-triggered PyPI release via Trusted Publishing, which
|
|
301
|
+
uses OpenID Connect (OIDC).
|
|
302
|
+
- Public API: `CheckResult`, `CheckStatus`, `Report`, and the `BaseCheck`
|
|
303
|
+
abstract class for custom checks.
|
|
304
|
+
|
|
305
|
+
The checks are intentionally lenient to avoid false positives on legitimate
|
|
306
|
+
real-world packages (PEP 621 `dynamic` fields, dual-license filenames, RST
|
|
307
|
+
READMEs, community files under `.github/`/`docs/`, dependency extras, and more).
|
|
308
|
+
|
|
309
|
+
[0.2.0]: https://github.com/coatless-py-pkg/pycmdcheck/compare/v0.1.1...v0.2.0
|
|
310
|
+
[0.1.1]: https://github.com/coatless-py-pkg/pycmdcheck/compare/v0.1.0...v0.1.1
|
|
311
|
+
[0.1.0]: https://github.com/coatless-py-pkg/pycmdcheck/releases/tag/v0.1.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2024 pycmdcheck contributors
|
|
3
|
+
Copyright (c) 2024 James Joseph Balamuta and pycmdcheck contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|