ml-lints 0.12.1__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.
Files changed (97) hide show
  1. ml_lints-0.12.1/.githooks/pre-commit +9 -0
  2. ml_lints-0.12.1/.github/workflows/ci.yml +37 -0
  3. ml_lints-0.12.1/.github/workflows/release-please.yml +101 -0
  4. ml_lints-0.12.1/.gitignore +13 -0
  5. ml_lints-0.12.1/.release-please-manifest.json +3 -0
  6. ml_lints-0.12.1/CHANGELOG.md +272 -0
  7. ml_lints-0.12.1/CLAUDE.md +1 -0
  8. ml_lints-0.12.1/CONTRIBUTING_RULES.md +256 -0
  9. ml_lints-0.12.1/GEMINI.md +64 -0
  10. ml_lints-0.12.1/PKG-INFO +7 -0
  11. ml_lints-0.12.1/README.md +214 -0
  12. ml_lints-0.12.1/docs/rules/ML100.md +31 -0
  13. ml_lints-0.12.1/docs/rules/ML101.md +30 -0
  14. ml_lints-0.12.1/docs/rules/ML102.md +42 -0
  15. ml_lints-0.12.1/docs/rules/ML103.md +30 -0
  16. ml_lints-0.12.1/docs/rules/ML104.md +26 -0
  17. ml_lints-0.12.1/docs/rules/ML105.md +29 -0
  18. ml_lints-0.12.1/docs/rules/ML106.md +31 -0
  19. ml_lints-0.12.1/docs/rules/ML107.md +28 -0
  20. ml_lints-0.12.1/docs/rules/ML108.md +44 -0
  21. ml_lints-0.12.1/docs/rules/ML109.md +39 -0
  22. ml_lints-0.12.1/docs/rules/ML110.md +37 -0
  23. ml_lints-0.12.1/docs/rules/ML200.md +30 -0
  24. ml_lints-0.12.1/docs/rules/ML201.md +34 -0
  25. ml_lints-0.12.1/docs/rules/ML202.md +41 -0
  26. ml_lints-0.12.1/docs/rules/ML300.md +48 -0
  27. ml_lints-0.12.1/docs/rules/ML400.md +34 -0
  28. ml_lints-0.12.1/docs/rules/ML500.md +50 -0
  29. ml_lints-0.12.1/docs/rules/ML501.md +32 -0
  30. ml_lints-0.12.1/docs/rules/ML600.md +50 -0
  31. ml_lints-0.12.1/justfile +131 -0
  32. ml_lints-0.12.1/pyproject.toml +79 -0
  33. ml_lints-0.12.1/release-please-config.json +9 -0
  34. ml_lints-0.12.1/scripts/branch_summary.py +74 -0
  35. ml_lints-0.12.1/scripts/generate_rule_docs.py +120 -0
  36. ml_lints-0.12.1/scripts/generate_rules_table.py +69 -0
  37. ml_lints-0.12.1/src/ml_lints/__init__.py +4 -0
  38. ml_lints-0.12.1/src/ml_lints/analyzers/__init__.py +0 -0
  39. ml_lints-0.12.1/src/ml_lints/analyzers/forbidden_types.py +136 -0
  40. ml_lints-0.12.1/src/ml_lints/analyzers/newtype_casts.py +344 -0
  41. ml_lints-0.12.1/src/ml_lints/analyzers/newtype_index.py +326 -0
  42. ml_lints-0.12.1/src/ml_lints/cli.py +512 -0
  43. ml_lints-0.12.1/src/ml_lints/noqa.py +27 -0
  44. ml_lints-0.12.1/src/ml_lints/rules/__init__.py +136 -0
  45. ml_lints-0.12.1/src/ml_lints/rules/_newtype_cast_base.py +103 -0
  46. ml_lints-0.12.1/src/ml_lints/rules/_template.py +59 -0
  47. ml_lints-0.12.1/src/ml_lints/rules/ml100_bare_dict.py +72 -0
  48. ml_lints-0.12.1/src/ml_lints/rules/ml101_bare_tuple.py +71 -0
  49. ml_lints-0.12.1/src/ml_lints/rules/ml102_dict_of_primitives.py +87 -0
  50. ml_lints-0.12.1/src/ml_lints/rules/ml103_fixed_tuple.py +71 -0
  51. ml_lints-0.12.1/src/ml_lints/rules/ml104_variable_tuple.py +67 -0
  52. ml_lints-0.12.1/src/ml_lints/rules/ml105_newtype_forbidden.py +74 -0
  53. ml_lints-0.12.1/src/ml_lints/rules/ml106_bare_mapping.py +72 -0
  54. ml_lints-0.12.1/src/ml_lints/rules/ml107_mapping_of_primitives.py +69 -0
  55. ml_lints-0.12.1/src/ml_lints/rules/ml108_newtype_self_cast.py +71 -0
  56. ml_lints-0.12.1/src/ml_lints/rules/ml109_newtype_cross_cast.py +70 -0
  57. ml_lints-0.12.1/src/ml_lints/rules/ml110_variable_tuple_param.py +88 -0
  58. ml_lints-0.12.1/src/ml_lints/rules/ml200_frozen_dataclass.py +75 -0
  59. ml_lints-0.12.1/src/ml_lints/rules/ml201_wrapper_class.py +79 -0
  60. ml_lints-0.12.1/src/ml_lints/rules/ml202_dict_spread_constructor.py +103 -0
  61. ml_lints-0.12.1/src/ml_lints/rules/ml300_inner_class.py +81 -0
  62. ml_lints-0.12.1/src/ml_lints/rules/ml400_untrusted_data.py +200 -0
  63. ml_lints-0.12.1/src/ml_lints/rules/ml500_australian_english.py +322 -0
  64. ml_lints-0.12.1/src/ml_lints/rules/ml501_hacky_pluralisation.py +124 -0
  65. ml_lints-0.12.1/src/ml_lints/rules/ml600.py +120 -0
  66. ml_lints-0.12.1/src/ml_lints/rules/spelling_map.json +1768 -0
  67. ml_lints-0.12.1/src/ml_lints/runner.py +95 -0
  68. ml_lints-0.12.1/src/ml_lints/violation.py +45 -0
  69. ml_lints-0.12.1/tests/__init__.py +0 -0
  70. ml_lints-0.12.1/tests/conftest.py +39 -0
  71. ml_lints-0.12.1/tests/rules/__init__.py +0 -0
  72. ml_lints-0.12.1/tests/rules/_template.py +45 -0
  73. ml_lints-0.12.1/tests/rules/test_ml100.py +49 -0
  74. ml_lints-0.12.1/tests/rules/test_ml101.py +41 -0
  75. ml_lints-0.12.1/tests/rules/test_ml102.py +149 -0
  76. ml_lints-0.12.1/tests/rules/test_ml103.py +70 -0
  77. ml_lints-0.12.1/tests/rules/test_ml104.py +24 -0
  78. ml_lints-0.12.1/tests/rules/test_ml105.py +79 -0
  79. ml_lints-0.12.1/tests/rules/test_ml106.py +36 -0
  80. ml_lints-0.12.1/tests/rules/test_ml107.py +42 -0
  81. ml_lints-0.12.1/tests/rules/test_ml108.py +228 -0
  82. ml_lints-0.12.1/tests/rules/test_ml109.py +215 -0
  83. ml_lints-0.12.1/tests/rules/test_ml110.py +118 -0
  84. ml_lints-0.12.1/tests/rules/test_ml200.py +107 -0
  85. ml_lints-0.12.1/tests/rules/test_ml201.py +108 -0
  86. ml_lints-0.12.1/tests/rules/test_ml202_dict_spread_constructor.py +186 -0
  87. ml_lints-0.12.1/tests/rules/test_ml300.py +57 -0
  88. ml_lints-0.12.1/tests/rules/test_ml400.py +265 -0
  89. ml_lints-0.12.1/tests/rules/test_ml500_australian_english.py +424 -0
  90. ml_lints-0.12.1/tests/rules/test_ml501_hacky_pluralisation.py +148 -0
  91. ml_lints-0.12.1/tests/rules/test_ml600.py +123 -0
  92. ml_lints-0.12.1/tests/test_cli_exclusions.py +127 -0
  93. ml_lints-0.12.1/tests/test_cli_explain.py +50 -0
  94. ml_lints-0.12.1/tests/test_cli_filtering.py +179 -0
  95. ml_lints-0.12.1/tests/test_rule_examples.py +92 -0
  96. ml_lints-0.12.1/tests/test_runner.py +53 -0
  97. ml_lints-0.12.1/uv.lock +487 -0
@@ -0,0 +1,9 @@
1
+ #!/bin/sh
2
+ # Git pre-commit hook — runs the full justfile precommit suite before each commit.
3
+ #
4
+ # This file is version-controlled in .githooks/. To activate it on a fresh clone:
5
+ #
6
+ # git config core.hooksPath .githooks
7
+ #
8
+ # Or run: just setup-git-hooks
9
+ just precommit
@@ -0,0 +1,37 @@
1
+ name: CI
2
+
3
+ # The justfile is the single source of truth for all check commands.
4
+ # This workflow calls justfile recipes directly — the same commands
5
+ # that pre-commit hooks invoke locally. To add or change a check,
6
+ # edit the justfile recipe and update the steps here to match.
7
+
8
+ on:
9
+ push:
10
+ branches: ["main"]
11
+ pull_request:
12
+ branches: ["main"]
13
+
14
+ jobs:
15
+ ci:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+
20
+ - uses: actions/setup-python@v6
21
+ with:
22
+ python-version: "3.13"
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v8.1.0
26
+
27
+ - name: Install just
28
+ uses: taiki-e/install-action@v2
29
+ with:
30
+ tool: just
31
+
32
+ - name: Install dependencies
33
+ run: uv sync
34
+
35
+ # Pre-commit logic is defined in the justfile `precommit` target — do not add steps here.
36
+ - name: Validate project
37
+ run: just precommit
@@ -0,0 +1,101 @@
1
+ name: Release Please
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ release-please:
14
+ runs-on: ubuntu-latest
15
+ outputs:
16
+ release_created: ${{ steps.release.outputs.release_created }}
17
+ pr: ${{ steps.release.outputs.pr }}
18
+ tag_name: ${{ steps.release.outputs.tag_name }}
19
+ steps:
20
+ - uses: googleapis/release-please-action@v5
21
+ id: release
22
+ with:
23
+ token: ${{ secrets.GITHUB_TOKEN }}
24
+ config-file: release-please-config.json
25
+ manifest-file: .release-please-manifest.json
26
+
27
+ ci:
28
+ runs-on: ubuntu-latest
29
+ needs: release-please
30
+ if: ${{ needs.release-please.outputs.release_created }}
31
+ steps:
32
+ - uses: actions/checkout@v6
33
+
34
+ - uses: actions/setup-python@v6
35
+ with:
36
+ python-version: "3.13"
37
+
38
+ - name: Install uv
39
+ uses: astral-sh/setup-uv@v8.1.0
40
+
41
+ - name: Install just
42
+ uses: taiki-e/install-action@v2
43
+ with:
44
+ tool: just
45
+
46
+ - name: Install dependencies
47
+ run: uv sync
48
+
49
+ - name: Validate project
50
+ run: just precommit
51
+
52
+ update-lockfile:
53
+ runs-on: ubuntu-latest
54
+ needs: release-please
55
+ if: ${{ needs.release-please.outputs.pr }}
56
+ permissions:
57
+ contents: write
58
+ steps:
59
+ - uses: actions/checkout@v6
60
+ with:
61
+ ref: release-please--branches--main
62
+ token: ${{ secrets.GITHUB_TOKEN }}
63
+
64
+ - name: Install uv
65
+ uses: astral-sh/setup-uv@v8.1.0
66
+
67
+ - name: Update lock file
68
+ run: uv lock
69
+
70
+ - name: Commit updated lock file
71
+ run: |
72
+ git config user.name "github-actions[bot]"
73
+ git config user.email "github-actions[bot]@users.noreply.github.com"
74
+ git add uv.lock
75
+ git diff --staged --quiet || git commit -m "chore: update uv.lock for version bump"
76
+ git push
77
+
78
+ publish-release:
79
+ needs: [release-please, ci]
80
+ if: ${{ needs.release-please.outputs.release_created }}
81
+ runs-on: ubuntu-latest
82
+ environment: pypi
83
+ permissions:
84
+ contents: write
85
+ id-token: write
86
+ steps:
87
+ - uses: actions/checkout@v6
88
+
89
+ - name: Install uv
90
+ uses: astral-sh/setup-uv@v8.1.0
91
+
92
+ - name: Build package
93
+ run: uv build
94
+
95
+ - name: Publish GitHub release
96
+ env:
97
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
98
+ run: gh release edit "${{ needs.release-please.outputs.tag_name }}" --draft=false
99
+
100
+ - name: Publish package to PyPI
101
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,13 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .ruff_cache/
5
+ .pytest_cache/
6
+ dist/
7
+ *.egg-info/
8
+
9
+ # Coverage
10
+ .coverage
11
+ htmlcov/
12
+ coverage.xml
13
+ *.lcov
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.12.1"
3
+ }
@@ -0,0 +1,272 @@
1
+ # Changelog
2
+
3
+ ## [0.12.1](https://github.com/lawther/python-lint-hooks/compare/v0.12.0...v0.12.1) (2026-07-26)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ci:** correct PyPI GitHub Action repository path ([a101777](https://github.com/lawther/python-lint-hooks/commit/a101777e8f51d7b698ad15936171fa36caab1281))
9
+
10
+ ## [0.12.0](https://github.com/lawther/python-lint-hooks/compare/v0.11.0...v0.12.0) (2026-07-26)
11
+
12
+
13
+ ### Features
14
+
15
+ * rename project to ml-lints and module to ml_lints ([4e2e1aa](https://github.com/lawther/python-lint-hooks/commit/4e2e1aa89e5b2bfe244838ae43383412bbb0aa9c))
16
+ * **rules:** add ML600 to ban [@patch](https://github.com/patch)(new=Mock(...)) decorators ([765b94d](https://github.com/lawther/python-lint-hooks/commit/765b94de03aff2d0530e640dfb902f018487e5e8))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **cli:** load pyproject.toml per target project root when linting external directories ([81f45f9](https://github.com/lawther/python-lint-hooks/commit/81f45f91fa87a206d45c9ebba8c936b3ecb5dab4)), closes [#32](https://github.com/lawther/python-lint-hooks/issues/32)
22
+ * **cli:** resolve path objects in _collect_out_of_root_files consistently ([516e1dd](https://github.com/lawther/python-lint-hooks/commit/516e1dd631b7c5ea4f08397ce4ec5d46bd6db67d))
23
+ * **cli:** stop --select/--ignore/--exclude from swallowing paths ([6f367e3](https://github.com/lawther/python-lint-hooks/commit/6f367e3c8dae80e63e2190ac58db8cd197f16f0a))
24
+ * resolve project root and gitignore per target path ([cbb8c0d](https://github.com/lawther/python-lint-hooks/commit/cbb8c0d63ee5eb80199c55a29fe8b3a779848549)), closes [#30](https://github.com/lawther/python-lint-hooks/issues/30)
25
+
26
+
27
+ ### Documentation
28
+
29
+ * add missing rule-category rows to CONTRIBUTING_RULES.md ([f4fc7ae](https://github.com/lawther/python-lint-hooks/commit/f4fc7ae89570ef4f810db82ac8307f6f907308a2))
30
+
31
+ ## [0.11.0](https://github.com/lawther/python-lint-hooks/compare/v0.10.1...v0.11.0) (2026-06-08)
32
+
33
+
34
+ ### Features
35
+
36
+ * **rules:** add ML110 to detect variable-length tuple parameter annotations ([863896f](https://github.com/lawther/python-lint-hooks/commit/863896fd8a87a45033856412c96ce81cdcd16425))
37
+ * **rules:** add ML202 to detect __dict__/vars() spread into constructors ([348ef41](https://github.com/lawther/python-lint-hooks/commit/348ef418039a73da70c28bc1e326de7eedf03a61))
38
+
39
+
40
+ ### Bug Fixes
41
+
42
+ * make register decorator generic to preserve subclass types ([3032f66](https://github.com/lawther/python-lint-hooks/commit/3032f661524db2a08622b64d7968ea4c14c399cb))
43
+
44
+ ## [0.10.1](https://github.com/lawther/python-lint-hooks/compare/v0.10.0...v0.10.1) (2026-06-03)
45
+
46
+
47
+ ### Bug Fixes
48
+
49
+ * remove American-to-British spelling mappings for practice variants ([804caf1](https://github.com/lawther/python-lint-hooks/commit/804caf10aa6b772ed3c87f6aa542c40563e28448))
50
+ * remove incorrect spelling mapping for ankle ([483a58b](https://github.com/lawther/python-lint-hooks/commit/483a58b3bac71b9f862e25669a203311553ff648))
51
+
52
+ ## [0.10.0](https://github.com/lawther/python-lint-hooks/compare/v0.9.0...v0.10.0) (2026-06-03)
53
+
54
+
55
+ ### Features
56
+
57
+ * **ml500:** exempt override methods from Australian English check ([eb4a7b3](https://github.com/lawther/python-lint-hooks/commit/eb4a7b39f69bad45f248bd70cedc96abb594dfa7))
58
+
59
+
60
+ ### Bug Fixes
61
+
62
+ * **ml500:** resolve base-class chains longer than two levels ([5a67b40](https://github.com/lawther/python-lint-hooks/commit/5a67b40eac20115fc741df445829336e3ff42634))
63
+
64
+
65
+ ### Documentation
66
+
67
+ * remove bad merge from README ([b8f1cb1](https://github.com/lawther/python-lint-hooks/commit/b8f1cb18b1857908a71e6a7d00ce0ebd5b7ef92d))
68
+ * update ML500 rule documentation and test examples to exclude overridden methods ([57ed9e0](https://github.com/lawther/python-lint-hooks/commit/57ed9e026aa9ca28a332f4f9b344208a27af9a39))
69
+
70
+ ## [0.9.0](https://github.com/lawther/python-lint-hooks/compare/v0.8.0...v0.9.0) (2026-05-29)
71
+
72
+
73
+ ### Features
74
+
75
+ * **rules:** add ML501 to detect hacky pluralisation in strings ([ace61d7](https://github.com/lawther/python-lint-hooks/commit/ace61d756c79274e6661d3b618ce9b2b07a97c48))
76
+
77
+
78
+ ### Documentation
79
+
80
+ * **rules:** improve ML300 rationale to explain Python's scoping illusion ([4d85cea](https://github.com/lawther/python-lint-hooks/commit/4d85ceac35717a88f6ea43e7e3e7dfb364ebed45))
81
+
82
+ ## [0.8.0](https://github.com/lawther/python-lint-hooks/compare/v0.7.7...v0.8.0) (2026-05-15)
83
+
84
+
85
+ ### Features
86
+
87
+ * **rules:** add ML108 and ML109 for redundant NewType casts ([ecfffd9](https://github.com/lawther/python-lint-hooks/commit/ecfffd9bd59091367d80113fc30564b454c74b01))
88
+ * **rules:** catch redundant NewType casts on for-loop and comprehension targets ([6ac09b6](https://github.com/lawther/python-lint-hooks/commit/6ac09b69229f3431df207df17692c8f247333555))
89
+
90
+
91
+ ### Bug Fixes
92
+
93
+ * **rules:** make ML108 and ML109 messages name a concrete fix ([6ab3aee](https://github.com/lawther/python-lint-hooks/commit/6ab3aee797a6d1465cc924017bcf69b4798e461b))
94
+
95
+ ## [0.7.7](https://github.com/lawther/python-lint-hooks/compare/v0.7.6...v0.7.7) (2026-05-15)
96
+
97
+
98
+ ### Bug Fixes
99
+
100
+ * **rules:** exempt to_dict and as_dict from ML102 ([5eb8939](https://github.com/lawther/python-lint-hooks/commit/5eb8939543f41078c5c9d56e1c731a5174776605))
101
+ * **rules:** exempt URLs and dotted names from ML500 spelling checks ([d12f659](https://github.com/lawther/python-lint-hooks/commit/d12f659f68698ce1f27f9f07cc737d5b88051e87))
102
+
103
+ ## [0.7.6](https://github.com/lawther/python-lint-hooks/compare/v0.7.5...v0.7.6) (2026-05-15)
104
+
105
+
106
+ ### Bug Fixes
107
+
108
+ * **rules:** allow noqa on closing docstring line to suppress ML500 ([f91548a](https://github.com/lawther/python-lint-hooks/commit/f91548acacbaa9e0dd348ec6255baa53f546160e))
109
+ * **rules:** exempt imported names from ML500 spelling checks ([48945fa](https://github.com/lawther/python-lint-hooks/commit/48945fa6cb60026370ceaf7d180f32db6d343db4))
110
+
111
+
112
+ ### Documentation
113
+
114
+ * **rules:** document ML500 automatic exemptions in README ([6ff1a3a](https://github.com/lawther/python-lint-hooks/commit/6ff1a3a22131d2164dbcd944a07bcbaa6b27d7f1))
115
+
116
+ ## [0.7.5](https://github.com/lawther/python-lint-hooks/compare/v0.7.4...v0.7.5) (2026-05-15)
117
+
118
+
119
+ ### Documentation
120
+
121
+ * **cli:** clarify override behavior of exclude, select, and ignore flags ([801ad84](https://github.com/lawther/python-lint-hooks/commit/801ad84ce4fdc3767661571be933382d96ee0c88))
122
+
123
+ ## [0.7.4](https://github.com/lawther/python-lint-hooks/compare/v0.7.3...v0.7.4) (2026-05-10)
124
+
125
+
126
+ ### Bug Fixes
127
+
128
+ * **rules:** add 'initializer' to ML500 spelling map ([dfdf10a](https://github.com/lawther/python-lint-hooks/commit/dfdf10a98e56f2f79ba26105745f259403e5e573))
129
+
130
+ ## [0.7.3](https://github.com/lawther/python-lint-hooks/compare/v0.7.2...v0.7.3) (2026-05-10)
131
+
132
+
133
+ ### Bug Fixes
134
+
135
+ * **rules:** implement case-preserving and aggregated suggestions for ML500 ([c0a96b1](https://github.com/lawther/python-lint-hooks/commit/c0a96b17f0c1cad3474c42c35edbf68fb706e9d5))
136
+
137
+
138
+ ### Documentation
139
+
140
+ * remove mention of inner class exemptions from README ([9d566d6](https://github.com/lawther/python-lint-hooks/commit/9d566d670818aa9fc550a46d2e005bfe8aa04969))
141
+
142
+ ## [0.7.2](https://github.com/lawther/python-lint-hooks/compare/v0.7.1...v0.7.2) (2026-05-10)
143
+
144
+
145
+ ### Bug Fixes
146
+
147
+ * **rules:** flag American English in docstrings (ML500) ([5f083f5](https://github.com/lawther/python-lint-hooks/commit/5f083f5ba2e8241d71434591832a06e31df4d57d))
148
+
149
+ ## [0.7.1](https://github.com/lawther/python-lint-hooks/compare/v0.7.0...v0.7.1) (2026-05-10)
150
+
151
+
152
+ ### Bug Fixes
153
+
154
+ * removed erroneous words ([352f682](https://github.com/lawther/python-lint-hooks/commit/352f682996a0454cd2fbd048dc42c8ebcd93ed56))
155
+
156
+ ## [0.7.0](https://github.com/lawther/python-lint-hooks/compare/v0.6.1...v0.7.0) (2026-05-10)
157
+
158
+
159
+ ### Features
160
+
161
+ * **rules:** add ML106 and ML107 to detect forbidden Mapping types ([8db371c](https://github.com/lawther/python-lint-hooks/commit/8db371c91460ea58084d43233ca60754788c33ac))
162
+ * **rules:** add ML500 to enforce Australian English spelling ([8041781](https://github.com/lawther/python-lint-hooks/commit/80417816f564cbbc44636a1cd1c5f89e1ef62c1a))
163
+
164
+
165
+ ### Bug Fixes
166
+
167
+ * **cli:** implement Ruff-style path exclusion logic ([d0686f3](https://github.com/lawther/python-lint-hooks/commit/d0686f3a4c106ad3accf632e574ef72b44535249)), closes [#15](https://github.com/lawther/python-lint-hooks/issues/15)
168
+
169
+
170
+ ### Documentation
171
+
172
+ * implement rationale and examples for all lint rules ([7aa5d7e](https://github.com/lawther/python-lint-hooks/commit/7aa5d7e9c91288c15a8e4570bc2b9f17875218c3))
173
+ * update legacy rule references in README ([4af4329](https://github.com/lawther/python-lint-hooks/commit/4af43290f1af49baf89fd336ca88f458e752dabd))
174
+
175
+ ## [0.6.1](https://github.com/lawther/python-lint-hooks/compare/v0.6.0...v0.6.1) (2026-05-08)
176
+
177
+
178
+ ### Bug Fixes
179
+
180
+ * exclude ClassVar fields from ML201 all-forbidden-types check ([42cf5b1](https://github.com/lawther/python-lint-hooks/commit/42cf5b1f474488af94f7a23bee7db6559b36ab97))
181
+ * recognise [@alias](https://github.com/alias).dataclass regardless of module alias name ([d51ae7e](https://github.com/lawther/python-lint-hooks/commit/d51ae7e67b83d24d7e9473b70524027ac302b96e))
182
+ * recognise t.NewType regardless of typing module alias name ([0f26908](https://github.com/lawther/python-lint-hooks/commit/0f26908bf9201b62101741b47d261438ac6bf800))
183
+
184
+ ## [0.6.0](https://github.com/lawther/python-lint-hooks/compare/v0.5.0...v0.6.0) (2026-05-08)
185
+
186
+
187
+ ### Features
188
+
189
+ * add per-file branch coverage breakdown to just test output ([417afcb](https://github.com/lawther/python-lint-hooks/commit/417afcb6cf887829873298e98616219c86a9c55e))
190
+ * introduce RuleCode StrEnum for type-safe rule codes ([f72ecd6](https://github.com/lawther/python-lint-hooks/commit/f72ecd64c007a41086815a189c985b99b9acc2ef))
191
+
192
+
193
+ ### Bug Fixes
194
+
195
+ * handle ast.Starred in _get_names so starred unpack variables are tainted ([46be6e0](https://github.com/lawther/python-lint-hooks/commit/46be6e0115087cad9626c41c50eefa626e77aef9))
196
+ * isolate comprehension variable taint with per-comprehension scope ([a0731f7](https://github.com/lawther/python-lint-hooks/commit/a0731f75d6846ce2cfcebd2eb7f68c77014cee3a))
197
+ * unconditionally update loop-variable taint in enter_For ([e49073d](https://github.com/lawther/python-lint-hooks/commit/e49073dfeda9ad114ce2ad128600868d28970b52))
198
+ * use gen.iter as source_node in comprehension taint propagation ([54750ac](https://github.com/lawther/python-lint-hooks/commit/54750ac60d46f24636baa107f88658c8572d5579))
199
+
200
+ ## [0.5.0](https://github.com/lawther/python-lint-hooks/compare/v0.4.0...v0.5.0) (2026-05-08)
201
+
202
+
203
+ ### Features
204
+
205
+ * add docs-rules, check-rules-docs, and new-rule justfile recipes ([e5ac3f5](https://github.com/lawther/python-lint-hooks/commit/e5ac3f5657548104bc7d97690e7d6e30617a8ff5))
206
+ * add ML400 rule to detect unvalidated external data usage ([8bd289b](https://github.com/lawther/python-lint-hooks/commit/8bd289b8e530642cae8161dadfce69cfe02af8cb))
207
+
208
+
209
+ ### Bug Fixes
210
+
211
+ * disallow bare # noqa suppressions to prevent over-suppression ([9e6e668](https://github.com/lawther/python-lint-hooks/commit/9e6e6689b9f0befc8c1c38a4eca9c5ca2c3268cc))
212
+ * include ml400_untrusted_data.py omitted from previous staging ([53f31a6](https://github.com/lawther/python-lint-hooks/commit/53f31a63fcfcb688d6ae6b5d1c1da6524f0132ff))
213
+ * suppress ML400 on tomllib.load in cli (pre-validation navigation) ([4b65652](https://github.com/lawther/python-lint-hooks/commit/4b6565272ce57b1d044c719c2082fe580b3b7fd0))
214
+
215
+
216
+ ### Documentation
217
+
218
+ * add CONTRIBUTING_RULES.md and link from GEMINI.md ([485b189](https://github.com/lawther/python-lint-hooks/commit/485b189259fedc2379739011be4fd9017c0e4059))
219
+ * update justfile integration example in README ([e6d12ef](https://github.com/lawther/python-lint-hooks/commit/e6d12efcceb5b7a3c927514bedcc061bd07234d0))
220
+
221
+ ## [0.4.0](https://github.com/lawther/python-lint-hooks/compare/v0.3.0...v0.4.0) (2026-05-06)
222
+
223
+
224
+ ### Features
225
+
226
+ * add ML105 to catch NewType bypasses of return type rules ([0321c6d](https://github.com/lawther/python-lint-hooks/commit/0321c6db90c8b67f28296bd43028ad84fc7ccd65))
227
+ * add ML201 to catch classes wrapping only forbidden types ([4e9886d](https://github.com/lawther/python-lint-hooks/commit/4e9886de156bb132d4bd6002f9662e4f76a9300e))
228
+
229
+ ## [0.3.0](https://github.com/lawther/python-lint-hooks/compare/v0.2.0...v0.3.0) (2026-05-06)
230
+
231
+
232
+ ### Features
233
+
234
+ * add pytest-randomly to development dependencies ([14cd9f8](https://github.com/lawther/python-lint-hooks/commit/14cd9f800263df0d6979556e370dd5db4e4dbd68))
235
+ * add Ruff-like --select and --ignore CLI filtering ([71e76aa](https://github.com/lawther/python-lint-hooks/commit/71e76aa158e53d6aa764bb3aca92437a6622c2b7))
236
+ * enforce frozen=True for dataclasses (ML005) ([5b46303](https://github.com/lawther/python-lint-hooks/commit/5b46303192d9830e837b6a3480ff2a60a842dfd3))
237
+ * expanded return type enforcement and thematic renumbering ([ed4a0f4](https://github.com/lawther/python-lint-hooks/commit/ed4a0f4403e1db7f2b71137ca626fb4784ce72f5)), closes [#5](https://github.com/lawther/python-lint-hooks/issues/5)
238
+
239
+
240
+ ### Documentation
241
+
242
+ * document --select, --ignore and prefix matching behavior ([988de6a](https://github.com/lawther/python-lint-hooks/commit/988de6a6428da1ce20b08c6d1684c753244f64f5))
243
+ * update README with ML005 and new CLI options ([49400bf](https://github.com/lawther/python-lint-hooks/commit/49400bfee22fc5dae417e14246085a6a2a6b2494))
244
+
245
+ ## [0.2.0](https://github.com/lawther/python-lint-hooks/compare/v0.1.0...v0.2.0) (2026-05-06)
246
+
247
+
248
+ ### Features
249
+
250
+ * add Ruff-like exclusion options to CLI ([8a137ff](https://github.com/lawther/python-lint-hooks/commit/8a137ffba6278a62f62999863a9efd4c46d6ba18))
251
+
252
+
253
+ ### Documentation
254
+
255
+ * add GEMINI.md coding conventions and link in CLAUDE.md ([407948d](https://github.com/lawther/python-lint-hooks/commit/407948d51f03a7f5e6ae4e7d8276df053e31aeb8))
256
+
257
+ ## 0.1.0 (2026-05-06)
258
+
259
+
260
+ ### Features
261
+
262
+ * initial implementation of ML001 (bare dict/tuple returns) and ML002 (class inside function) ([d2756d7](https://github.com/lawther/python-lint-hooks/commit/d2756d74c603058852c30b11c35bf2e5295dad41))
263
+
264
+
265
+ ### Bug Fixes
266
+
267
+ * commit ruff auto-fixes missed by precommit staging; rename noqa section comment ([b2a0fc3](https://github.com/lawther/python-lint-hooks/commit/b2a0fc3550624600ecb4e96e46a1ad47bf967bad))
268
+
269
+
270
+ ### Documentation
271
+
272
+ * add README covering installation, rules, configuration and integration ([eee9cf1](https://github.com/lawther/python-lint-hooks/commit/eee9cf1777510086c34478adb8e938edf0494d1b))
@@ -0,0 +1 @@
1
+ @GEMINI.md