thailint 0.5.0__py3-none-any.whl → 0.15.3__py3-none-any.whl

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 (204) hide show
  1. src/__init__.py +1 -0
  2. src/analyzers/__init__.py +4 -3
  3. src/analyzers/ast_utils.py +54 -0
  4. src/analyzers/rust_base.py +155 -0
  5. src/analyzers/rust_context.py +141 -0
  6. src/analyzers/typescript_base.py +4 -0
  7. src/cli/__init__.py +30 -0
  8. src/cli/__main__.py +22 -0
  9. src/cli/config.py +480 -0
  10. src/cli/config_merge.py +241 -0
  11. src/cli/linters/__init__.py +67 -0
  12. src/cli/linters/code_patterns.py +270 -0
  13. src/cli/linters/code_smells.py +342 -0
  14. src/cli/linters/documentation.py +83 -0
  15. src/cli/linters/performance.py +287 -0
  16. src/cli/linters/shared.py +331 -0
  17. src/cli/linters/structure.py +327 -0
  18. src/cli/linters/structure_quality.py +328 -0
  19. src/cli/main.py +120 -0
  20. src/cli/utils.py +395 -0
  21. src/cli_main.py +37 -0
  22. src/config.py +38 -25
  23. src/core/base.py +7 -2
  24. src/core/cli_utils.py +19 -2
  25. src/core/config_parser.py +5 -2
  26. src/core/constants.py +54 -0
  27. src/core/linter_utils.py +95 -6
  28. src/core/python_lint_rule.py +101 -0
  29. src/core/registry.py +1 -1
  30. src/core/rule_discovery.py +147 -84
  31. src/core/types.py +13 -0
  32. src/core/violation_builder.py +78 -15
  33. src/core/violation_utils.py +69 -0
  34. src/formatters/__init__.py +22 -0
  35. src/formatters/sarif.py +202 -0
  36. src/linter_config/directive_markers.py +109 -0
  37. src/linter_config/ignore.py +254 -395
  38. src/linter_config/loader.py +45 -12
  39. src/linter_config/pattern_utils.py +65 -0
  40. src/linter_config/rule_matcher.py +89 -0
  41. src/linters/collection_pipeline/__init__.py +90 -0
  42. src/linters/collection_pipeline/any_all_analyzer.py +281 -0
  43. src/linters/collection_pipeline/ast_utils.py +40 -0
  44. src/linters/collection_pipeline/config.py +75 -0
  45. src/linters/collection_pipeline/continue_analyzer.py +94 -0
  46. src/linters/collection_pipeline/detector.py +360 -0
  47. src/linters/collection_pipeline/filter_map_analyzer.py +402 -0
  48. src/linters/collection_pipeline/linter.py +420 -0
  49. src/linters/collection_pipeline/suggestion_builder.py +130 -0
  50. src/linters/cqs/__init__.py +54 -0
  51. src/linters/cqs/config.py +55 -0
  52. src/linters/cqs/function_analyzer.py +201 -0
  53. src/linters/cqs/input_detector.py +139 -0
  54. src/linters/cqs/linter.py +159 -0
  55. src/linters/cqs/output_detector.py +84 -0
  56. src/linters/cqs/python_analyzer.py +54 -0
  57. src/linters/cqs/types.py +82 -0
  58. src/linters/cqs/typescript_cqs_analyzer.py +61 -0
  59. src/linters/cqs/typescript_function_analyzer.py +192 -0
  60. src/linters/cqs/typescript_input_detector.py +203 -0
  61. src/linters/cqs/typescript_output_detector.py +117 -0
  62. src/linters/cqs/violation_builder.py +94 -0
  63. src/linters/dry/base_token_analyzer.py +16 -9
  64. src/linters/dry/block_filter.py +120 -20
  65. src/linters/dry/block_grouper.py +4 -0
  66. src/linters/dry/cache.py +104 -10
  67. src/linters/dry/cache_query.py +4 -0
  68. src/linters/dry/config.py +54 -11
  69. src/linters/dry/constant.py +92 -0
  70. src/linters/dry/constant_matcher.py +223 -0
  71. src/linters/dry/constant_violation_builder.py +98 -0
  72. src/linters/dry/duplicate_storage.py +5 -4
  73. src/linters/dry/file_analyzer.py +4 -2
  74. src/linters/dry/inline_ignore.py +7 -16
  75. src/linters/dry/linter.py +183 -48
  76. src/linters/dry/python_analyzer.py +60 -439
  77. src/linters/dry/python_constant_extractor.py +100 -0
  78. src/linters/dry/single_statement_detector.py +417 -0
  79. src/linters/dry/token_hasher.py +116 -112
  80. src/linters/dry/typescript_analyzer.py +68 -382
  81. src/linters/dry/typescript_constant_extractor.py +138 -0
  82. src/linters/dry/typescript_statement_detector.py +255 -0
  83. src/linters/dry/typescript_value_extractor.py +70 -0
  84. src/linters/dry/violation_builder.py +4 -0
  85. src/linters/dry/violation_filter.py +5 -4
  86. src/linters/dry/violation_generator.py +71 -14
  87. src/linters/file_header/atemporal_detector.py +68 -50
  88. src/linters/file_header/base_parser.py +93 -0
  89. src/linters/file_header/bash_parser.py +66 -0
  90. src/linters/file_header/config.py +90 -16
  91. src/linters/file_header/css_parser.py +70 -0
  92. src/linters/file_header/field_validator.py +36 -33
  93. src/linters/file_header/linter.py +140 -144
  94. src/linters/file_header/markdown_parser.py +130 -0
  95. src/linters/file_header/python_parser.py +14 -58
  96. src/linters/file_header/typescript_parser.py +73 -0
  97. src/linters/file_header/violation_builder.py +13 -12
  98. src/linters/file_placement/config_loader.py +3 -1
  99. src/linters/file_placement/directory_matcher.py +4 -0
  100. src/linters/file_placement/linter.py +66 -34
  101. src/linters/file_placement/pattern_matcher.py +41 -6
  102. src/linters/file_placement/pattern_validator.py +31 -12
  103. src/linters/file_placement/rule_checker.py +12 -7
  104. src/linters/lazy_ignores/__init__.py +43 -0
  105. src/linters/lazy_ignores/config.py +74 -0
  106. src/linters/lazy_ignores/directive_utils.py +164 -0
  107. src/linters/lazy_ignores/header_parser.py +177 -0
  108. src/linters/lazy_ignores/linter.py +158 -0
  109. src/linters/lazy_ignores/matcher.py +168 -0
  110. src/linters/lazy_ignores/python_analyzer.py +209 -0
  111. src/linters/lazy_ignores/rule_id_utils.py +180 -0
  112. src/linters/lazy_ignores/skip_detector.py +298 -0
  113. src/linters/lazy_ignores/types.py +71 -0
  114. src/linters/lazy_ignores/typescript_analyzer.py +146 -0
  115. src/linters/lazy_ignores/violation_builder.py +135 -0
  116. src/linters/lbyl/__init__.py +31 -0
  117. src/linters/lbyl/config.py +63 -0
  118. src/linters/lbyl/linter.py +67 -0
  119. src/linters/lbyl/pattern_detectors/__init__.py +53 -0
  120. src/linters/lbyl/pattern_detectors/base.py +63 -0
  121. src/linters/lbyl/pattern_detectors/dict_key_detector.py +107 -0
  122. src/linters/lbyl/pattern_detectors/division_check_detector.py +232 -0
  123. src/linters/lbyl/pattern_detectors/file_exists_detector.py +220 -0
  124. src/linters/lbyl/pattern_detectors/hasattr_detector.py +119 -0
  125. src/linters/lbyl/pattern_detectors/isinstance_detector.py +119 -0
  126. src/linters/lbyl/pattern_detectors/len_check_detector.py +173 -0
  127. src/linters/lbyl/pattern_detectors/none_check_detector.py +146 -0
  128. src/linters/lbyl/pattern_detectors/string_validator_detector.py +145 -0
  129. src/linters/lbyl/python_analyzer.py +215 -0
  130. src/linters/lbyl/violation_builder.py +354 -0
  131. src/linters/magic_numbers/context_analyzer.py +227 -225
  132. src/linters/magic_numbers/linter.py +28 -82
  133. src/linters/magic_numbers/python_analyzer.py +4 -16
  134. src/linters/magic_numbers/typescript_analyzer.py +9 -12
  135. src/linters/magic_numbers/typescript_ignore_checker.py +81 -0
  136. src/linters/method_property/__init__.py +49 -0
  137. src/linters/method_property/config.py +138 -0
  138. src/linters/method_property/linter.py +414 -0
  139. src/linters/method_property/python_analyzer.py +473 -0
  140. src/linters/method_property/violation_builder.py +119 -0
  141. src/linters/nesting/linter.py +24 -16
  142. src/linters/nesting/python_analyzer.py +4 -0
  143. src/linters/nesting/typescript_analyzer.py +6 -12
  144. src/linters/nesting/violation_builder.py +1 -0
  145. src/linters/performance/__init__.py +91 -0
  146. src/linters/performance/config.py +43 -0
  147. src/linters/performance/constants.py +49 -0
  148. src/linters/performance/linter.py +149 -0
  149. src/linters/performance/python_analyzer.py +365 -0
  150. src/linters/performance/regex_analyzer.py +312 -0
  151. src/linters/performance/regex_linter.py +139 -0
  152. src/linters/performance/typescript_analyzer.py +236 -0
  153. src/linters/performance/violation_builder.py +160 -0
  154. src/linters/print_statements/config.py +7 -12
  155. src/linters/print_statements/linter.py +26 -43
  156. src/linters/print_statements/python_analyzer.py +91 -93
  157. src/linters/print_statements/typescript_analyzer.py +15 -25
  158. src/linters/print_statements/violation_builder.py +12 -14
  159. src/linters/srp/class_analyzer.py +11 -7
  160. src/linters/srp/heuristics.py +56 -22
  161. src/linters/srp/linter.py +15 -16
  162. src/linters/srp/python_analyzer.py +55 -20
  163. src/linters/srp/typescript_metrics_calculator.py +110 -50
  164. src/linters/stateless_class/__init__.py +25 -0
  165. src/linters/stateless_class/config.py +58 -0
  166. src/linters/stateless_class/linter.py +349 -0
  167. src/linters/stateless_class/python_analyzer.py +290 -0
  168. src/linters/stringly_typed/__init__.py +36 -0
  169. src/linters/stringly_typed/config.py +189 -0
  170. src/linters/stringly_typed/context_filter.py +451 -0
  171. src/linters/stringly_typed/function_call_violation_builder.py +135 -0
  172. src/linters/stringly_typed/ignore_checker.py +100 -0
  173. src/linters/stringly_typed/ignore_utils.py +51 -0
  174. src/linters/stringly_typed/linter.py +376 -0
  175. src/linters/stringly_typed/python/__init__.py +33 -0
  176. src/linters/stringly_typed/python/analyzer.py +348 -0
  177. src/linters/stringly_typed/python/call_tracker.py +175 -0
  178. src/linters/stringly_typed/python/comparison_tracker.py +257 -0
  179. src/linters/stringly_typed/python/condition_extractor.py +134 -0
  180. src/linters/stringly_typed/python/conditional_detector.py +179 -0
  181. src/linters/stringly_typed/python/constants.py +21 -0
  182. src/linters/stringly_typed/python/match_analyzer.py +94 -0
  183. src/linters/stringly_typed/python/validation_detector.py +189 -0
  184. src/linters/stringly_typed/python/variable_extractor.py +96 -0
  185. src/linters/stringly_typed/storage.py +620 -0
  186. src/linters/stringly_typed/storage_initializer.py +45 -0
  187. src/linters/stringly_typed/typescript/__init__.py +28 -0
  188. src/linters/stringly_typed/typescript/analyzer.py +157 -0
  189. src/linters/stringly_typed/typescript/call_tracker.py +335 -0
  190. src/linters/stringly_typed/typescript/comparison_tracker.py +378 -0
  191. src/linters/stringly_typed/violation_generator.py +419 -0
  192. src/orchestrator/core.py +252 -14
  193. src/orchestrator/language_detector.py +5 -3
  194. src/templates/thailint_config_template.yaml +196 -0
  195. src/utils/project_root.py +3 -0
  196. thailint-0.15.3.dist-info/METADATA +187 -0
  197. thailint-0.15.3.dist-info/RECORD +226 -0
  198. thailint-0.15.3.dist-info/entry_points.txt +4 -0
  199. src/cli.py +0 -1665
  200. thailint-0.5.0.dist-info/METADATA +0 -1286
  201. thailint-0.5.0.dist-info/RECORD +0 -96
  202. thailint-0.5.0.dist-info/entry_points.txt +0 -4
  203. {thailint-0.5.0.dist-info → thailint-0.15.3.dist-info}/WHEEL +0 -0
  204. {thailint-0.5.0.dist-info → thailint-0.15.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,187 @@
1
+ Metadata-Version: 2.4
2
+ Name: thailint
3
+ Version: 0.15.3
4
+ Summary: The AI Linter - Enterprise-grade linting and governance for AI-generated code across multiple languages
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Keywords: linter,ai,code-quality,static-analysis,file-placement,governance,multi-language,cli,docker,python,performance,typescript,rust
8
+ Author: Steve Jackson
9
+ Requires-Python: >=3.11,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Topic :: Software Development :: Quality Assurance
23
+ Classifier: Topic :: Software Development :: Testing
24
+ Classifier: Topic :: Utilities
25
+ Classifier: Typing :: Typed
26
+ Requires-Dist: click (>=8.1.0,<9.0.0)
27
+ Requires-Dist: pyprojroot (>=0.3.0,<0.4.0)
28
+ Requires-Dist: pyyaml (>=6.0,<7.0)
29
+ Requires-Dist: tree-sitter (>=0.25.2,<0.26.0)
30
+ Requires-Dist: tree-sitter-rust (>=0.23.2,<0.24.0)
31
+ Requires-Dist: tree-sitter-typescript (>=0.23.2,<0.24.0)
32
+ Project-URL: Documentation, https://thai-lint.readthedocs.io/
33
+ Project-URL: Homepage, https://github.com/be-wise-be-kind/thai-lint
34
+ Project-URL: Repository, https://github.com/be-wise-be-kind/thai-lint
35
+ Description-Content-Type: text/markdown
36
+
37
+ # thai-lint
38
+
39
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
40
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
41
+ [![PyPI](https://img.shields.io/pypi/v/thailint)](https://pypi.org/project/thailint/)
42
+ [![Documentation](https://readthedocs.org/projects/thai-lint/badge/?version=latest)](https://thai-lint.readthedocs.io/)
43
+
44
+ **The AI Linter** - Catch the mistakes AI coding assistants keep making.
45
+
46
+ thailint detects anti-patterns that AI tools frequently introduce: duplicate code, excessive nesting, magic numbers, SRP violations, and more. It works across Python, TypeScript, and JavaScript with unified rules - filling gaps that existing linters miss.
47
+
48
+ ## Installation
49
+
50
+ ```bash
51
+ pip install thailint
52
+ ```
53
+
54
+ Or with Docker:
55
+ ```bash
56
+ docker run --rm -v $(pwd):/data washad/thailint:latest --help
57
+ ```
58
+
59
+ ## Quick Start
60
+
61
+ ```bash
62
+ # Generate a config file (optional)
63
+ thailint init-config
64
+
65
+ # Run any linter
66
+ thailint dry src/
67
+ ```
68
+
69
+ That's it. See violations, fix them, ship better code.
70
+
71
+ ## Available Linters
72
+
73
+ | Linter | What It Catches | Command | Docs |
74
+ |--------|-----------------|---------|------|
75
+ | **DRY** | Duplicate code across files | `thailint dry src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/dry-linter/) |
76
+ | **Nesting** | Deeply nested if/for/while blocks | `thailint nesting src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/nesting-linter/) |
77
+ | **Magic Numbers** | Unnamed numeric literals | `thailint magic-numbers src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/magic-numbers-linter/) |
78
+ | **Performance** | O(n²) patterns: string += in loops, regex in loops | `thailint perf src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/performance-linter/) |
79
+ | **SRP** | Classes doing too much | `thailint srp src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/srp-linter/) |
80
+ | **File Header** | Missing documentation headers | `thailint file-header src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/file-header-linter/) |
81
+ | **Stateless Class** | Classes that should be functions | `thailint stateless-class src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/stateless-class-linter/) |
82
+ | **Collection Pipeline** | Loops with embedded filtering | `thailint pipeline src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/collection-pipeline-linter/) |
83
+ | **Method Property** | Methods that should be @property | `thailint method-property src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/method-property-linter/) |
84
+ | **File Placement** | Files in wrong directories | `thailint file-placement src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/file-placement-linter/) |
85
+ | **Lazy Ignores** | Unjustified linting suppressions | `thailint lazy-ignores src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/lazy-ignores-linter/) |
86
+ | **Print Statements** | Debug prints left in code | `thailint print-statements src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/print-statements-linter/) |
87
+ | **Stringly Typed** | Strings that should be enums | `thailint stringly-typed src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/stringly-typed-linter/) |
88
+ | **LBYL** | Look Before You Leap anti-patterns | `thailint lbyl src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/lbyl-linter/) |
89
+
90
+ ## Configuration
91
+
92
+ Create `.thailint.yaml` in your project root:
93
+
94
+ ```yaml
95
+ dry:
96
+ enabled: true
97
+ min_duplicate_lines: 4
98
+
99
+ nesting:
100
+ enabled: true
101
+ max_nesting_depth: 3
102
+
103
+ magic-numbers:
104
+ enabled: true
105
+ allowed_numbers: [-1, 0, 1, 2, 10, 100]
106
+ ```
107
+
108
+ Or generate one automatically:
109
+ ```bash
110
+ thailint init-config --preset lenient # or: strict, standard
111
+ ```
112
+
113
+ See [Configuration Reference](https://thai-lint.readthedocs.io/en/latest/configuration/) for all options.
114
+
115
+ ## Output Formats
116
+
117
+ ```bash
118
+ # Human-readable (default)
119
+ thailint dry src/
120
+
121
+ # JSON for CI/CD
122
+ thailint dry --format json src/
123
+
124
+ # SARIF for GitHub Code Scanning
125
+ thailint dry --format sarif src/ > results.sarif
126
+ ```
127
+
128
+ ## Ignoring Violations
129
+
130
+ ```python
131
+ # Line-level
132
+ timeout = 3600 # thailint: ignore[magic-numbers]
133
+
134
+ # File-level
135
+ # thailint: ignore-file[dry]
136
+ ```
137
+
138
+ Or in config:
139
+ ```yaml
140
+ dry:
141
+ ignore:
142
+ - "tests/"
143
+ - "**/generated/**"
144
+ ```
145
+
146
+ See [How to Ignore Violations](https://thai-lint.readthedocs.io/en/latest/how-to-ignore-violations/) for all 5 ignore levels.
147
+
148
+ ## CI/CD Integration
149
+
150
+ ```yaml
151
+ # GitHub Actions
152
+ - name: Run thailint
153
+ run: |
154
+ pip install thai-lint
155
+ thailint dry src/
156
+ thailint nesting src/
157
+ ```
158
+
159
+ Exit codes: `0` = success, `1` = violations found, `2` = error.
160
+
161
+ ## Documentation
162
+
163
+ - **[Quick Start Guide](https://thai-lint.readthedocs.io/en/latest/quick-start/)** - Get running in 5 minutes
164
+ - **[Configuration Reference](https://thai-lint.readthedocs.io/en/latest/configuration/)** - All config options
165
+ - **[Troubleshooting](https://thai-lint.readthedocs.io/en/latest/troubleshooting/)** - Common issues
166
+ - **[Full Documentation](https://thai-lint.readthedocs.io/)** - Everything else
167
+
168
+ ## Contributing
169
+
170
+ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
171
+
172
+ ```bash
173
+ git clone https://github.com/be-wise-be-kind/thai-lint.git
174
+ cd thai-lint
175
+ poetry install
176
+ just test
177
+ ```
178
+
179
+ ## License
180
+
181
+ MIT License - see [LICENSE](LICENSE) for details.
182
+
183
+ ## Support
184
+
185
+ - **Issues**: [github.com/be-wise-be-kind/thai-lint/issues](https://github.com/be-wise-be-kind/thai-lint/issues)
186
+ - **Docs**: [thai-lint.readthedocs.io](https://thai-lint.readthedocs.io/)
187
+
@@ -0,0 +1,226 @@
1
+ src/__init__.py,sha256=0IT3HnAnSBEfos4G_27cflJiaoWWfeSEfHxsUr53OsM,2192
2
+ src/analyzers/__init__.py,sha256=hCN7ugG_Xs2N_WfWO7ZId-Cv4kvN1AxhIYTA4SD2fJ4,1062
3
+ src/analyzers/ast_utils.py,sha256=iWCRzlTw2QF5wWzQx1OmKshx7TU3pHxC8_omv9XUInw,1630
4
+ src/analyzers/rust_base.py,sha256=_sqmXhH4vylXbQEPp-gHnUYmf6F_2c5YXZgXBqk2Kcg,5185
5
+ src/analyzers/rust_context.py,sha256=8dV-LRst6CUPc2Z9iBXt70GtRTKo62PF3_uFBtFAKuw,4046
6
+ src/analyzers/typescript_base.py,sha256=Dtc_2jLSNoadh53MyeW2syrJMBIMVPvotcM8SeDEXH8,5244
7
+ src/api.py,sha256=pJ5l3qxccKBEY-BkANwzTgLAl1ZFq7OP6hx6LSxbhDw,4664
8
+ src/cli/__init__.py,sha256=nMxKv4D0t09LwUm4Z5w-b7vIuyn24SFzv78BKzE3AOQ,1272
9
+ src/cli/__main__.py,sha256=xIKI57yqB1NOw9eXnGXfU8rC2UwcAJYjDxlZbt9eP0w,671
10
+ src/cli/config.py,sha256=wh9lp0Z2FUEKbYawB65Y9vrlu1Yiqe8-CD_vnRDqwEg,14467
11
+ src/cli/config_merge.py,sha256=A1eCthiLwjj0SEhOcxa6t2hYwWMapGJpL9sCmYvUFw4,8464
12
+ src/cli/linters/__init__.py,sha256=Dlx2CRHT5_QeIeCJ0horPXci9zRP_KzSz_-mg0VMbOw,2343
13
+ src/cli/linters/code_patterns.py,sha256=2AcFdLPPdkJ8U883ozXE_0eLWRdiL_xfzXm4kmRn-Ro,11072
14
+ src/cli/linters/code_smells.py,sha256=yrKqRD3JTVVqyPL8rwK9VPbHgccXoj2IfaLK3lBF4Jc,11782
15
+ src/cli/linters/documentation.py,sha256=AhkyXfH2FbcxXT3BV6GIKkGbWCjyrz8qcKhz3sx7Yww,3289
16
+ src/cli/linters/performance.py,sha256=qvCW6T84zNZi1TyuxHtsEksgCtMA5TUgt_UdSq0vqHo,9878
17
+ src/cli/linters/shared.py,sha256=eVXhBDr69fRGAP4lApTR_M0gDfLeWlDAqx6VCEAWXsU,10117
18
+ src/cli/linters/structure.py,sha256=EGjw0zMLdGi4lTwM1zd_FzxQ7A-AG3fNPcKcF5uGFSo,10748
19
+ src/cli/linters/structure_quality.py,sha256=0npTcI6OUMVmvd-Ha6NjDZb2Dn1EhpfTLXmMRB69qaI,10739
20
+ src/cli/main.py,sha256=mRyRN_IQI2WyqDCxI8vuzdhbkCkVrK6INfJPjU8ayIU,3844
21
+ src/cli/utils.py,sha256=wFMvW7ScseHxKgvAmuQCWWHBGbtBzu8oPwATsCyNsfU,12610
22
+ src/cli_main.py,sha256=C0Ey7YNlG3ipqb3KsJZ8rL8PJ4ueVp_45IUirGidvHI,1618
23
+ src/config.py,sha256=O3ixzsYekGjlggmIsawCU1bctOa0MyG2IczHpg3mGyw,12753
24
+ src/core/__init__.py,sha256=5FtsDvhMt4SNRx3pbcGURrxn135XRbeRrjSUxiXwkNc,381
25
+ src/core/base.py,sha256=u5A8geprlKnsJk4ShiLHTKXRekZUB4I6rPQWxgiFeto,8019
26
+ src/core/cli_utils.py,sha256=ZdFSPrZ4WfpTMh-mc_Z3u5OYidE1YyPRKflMynPosa8,6552
27
+ src/core/config_parser.py,sha256=CRHV2-csxag6yQzx_4IYYz57QSUYjPkeSb0XvOyshRI,4272
28
+ src/core/constants.py,sha256=PKtPDqk6k9VuOSgjq1FAdi2CTvlnhdXvLj91dNaMDTA,1584
29
+ src/core/linter_utils.py,sha256=StnKFzJgSvLyao1S0LpTKhsXo8nOwpdKpxo7mXl5PIg,8594
30
+ src/core/python_lint_rule.py,sha256=OpdIDLPV1MDtmjy6GPrrOA3_rRV2_x14keHAQQtI_pc,3516
31
+ src/core/registry.py,sha256=yRA8mQLiZwjmgxl1wSTgdj1cuo_QXuRdrXt3NpCBUgE,3285
32
+ src/core/rule_discovery.py,sha256=tgRH-BJGKsQTxfa249yrY7UJuonRjobMCENqmhcbAeY,5496
33
+ src/core/types.py,sha256=SElFzf_VSrAMsoiE0aU8ZYXuvKqdfwfM5umUHx4eT8w,3342
34
+ src/core/violation_builder.py,sha256=dOPFfZx6U5_TMgaTop-4SUV2jHOZjBo67uwgiS_s-uE,6694
35
+ src/core/violation_utils.py,sha256=hSTSfQaaB7038G2Au4vqBLYTnkoaSN3k70IxWacjbl8,1993
36
+ src/formatters/__init__.py,sha256=yE1yIL8lplTMEjsmQm7F-kOMaYq7OjmbFuiwwK0D-gM,815
37
+ src/formatters/sarif.py,sha256=gGOwb_v7j4mx4bpvV1NNDd-JyHH8i8XX89iQ6uRSvG4,7050
38
+ src/linter_config/__init__.py,sha256=_I2VVlZlfKyT-tKukuUA5-aVcHLOe3m6C2cev43AiEc,298
39
+ src/linter_config/directive_markers.py,sha256=nRc2Mp3B1mn6tu1XH88ugMxWffk1k8OUNohepaRQ0S0,3245
40
+ src/linter_config/ignore.py,sha256=40afiMsu1zC29RiwGX8hUPUqM056H_wcOgZZUNOwIes,13111
41
+ src/linter_config/loader.py,sha256=K6mKRkP2jgwar-pwBoJGWgwynLVjqdez-l3Nd6bUCMk,3363
42
+ src/linter_config/pattern_utils.py,sha256=BjV95SySST3HqZBwF1Og8yoHqFxuqQ16VPCacE21ks0,2056
43
+ src/linter_config/rule_matcher.py,sha256=EWqSv4UY90fWps3AzDCSF7PZCbYyFTEBZT2h_txcRms,2779
44
+ src/linters/__init__.py,sha256=-nnNsL8E5-2p9qlLKp_TaShHAjPH-NacOEU1sXmAR9k,77
45
+ src/linters/collection_pipeline/__init__.py,sha256=BcnbY3wgJB1XLfZ9J9qfUJQ1_yCo_THjGDTppxJEMZY,3231
46
+ src/linters/collection_pipeline/any_all_analyzer.py,sha256=u8NGIYrJTuP3U6je5rkeEUV2Bh1yePC12vl-czAU5GU,7554
47
+ src/linters/collection_pipeline/ast_utils.py,sha256=JZsJeel9BzVIOfnENgVcZR8wMNoQ-RJoxuBx-J7w9Uk,1227
48
+ src/linters/collection_pipeline/config.py,sha256=EDlPcYEsECfAhZu9h1z5MVszRdr9Okdp3Ea8bf8c2mI,2782
49
+ src/linters/collection_pipeline/continue_analyzer.py,sha256=Azn7-2MLpi0M68dXDLgXCbIBpCT1i3GSUGE13U2Tl4U,2728
50
+ src/linters/collection_pipeline/detector.py,sha256=7_keKR5lGo5rvOVCAvV_6-bG29I_SYAhkkxP6ES3wKg,11696
51
+ src/linters/collection_pipeline/filter_map_analyzer.py,sha256=QbTjObryaLVB71MD4b4SyoOMEO_EgMNedNZLVm05QCQ,11829
52
+ src/linters/collection_pipeline/linter.py,sha256=53pkC1a6mvNTzjK_LDV_JmMysbZBLUsM_NjavvAZZBQ,13552
53
+ src/linters/collection_pipeline/suggestion_builder.py,sha256=4-RHBw95u7gPKpoN1xZlpSOkqzXY7_TRrB_otUXsdDE,4357
54
+ src/linters/cqs/__init__.py,sha256=d78ktPDBk_D9BStrNA99lYFHmuIVWke9wbVHiX_h81g,2120
55
+ src/linters/cqs/config.py,sha256=09U8rGSC8B4QS6ivrCKFPTXzLsU6oTSAjgIkwUrmQlc,2148
56
+ src/linters/cqs/function_analyzer.py,sha256=lPAmqLM2slEN0YkVEUy8xrq3pT7dQahy6sQUY6KvgfA,7756
57
+ src/linters/cqs/input_detector.py,sha256=GdCqXvVIGXOjKdCy5rQsX-IP88-taPcU3TLCumjMIqc,5004
58
+ src/linters/cqs/linter.py,sha256=QWgKuIzE678nUy60dY5BMh1NllLblSh9sbfIxmRlq-o,5666
59
+ src/linters/cqs/output_detector.py,sha256=uLddl9skCTICYXHSvIDYsKLbmKb3wXpZVkXjASVf-fk,3077
60
+ src/linters/cqs/python_analyzer.py,sha256=84x8-vUPRK0GkAgPKB-UzGmRX5Sb84Vq-fi_tpTQAGE,1879
61
+ src/linters/cqs/types.py,sha256=QL_kt1ywYB8KC2QRO-vMMygqHPVMoNS9FAU19zQmRs0,2816
62
+ src/linters/cqs/typescript_cqs_analyzer.py,sha256=kd1_b6dsKDWifxD436zss32eoiX5opURsqm6G8no7YQ,2318
63
+ src/linters/cqs/typescript_function_analyzer.py,sha256=f3TVZXpaDYRUc8xEw3TRBc4Xbg41qmAbACRnjHkTdcQ,7790
64
+ src/linters/cqs/typescript_input_detector.py,sha256=0PazhU69Utc_TGJTehYtSFLn0nhDfELWiX5YcvLWyWk,7979
65
+ src/linters/cqs/typescript_output_detector.py,sha256=b3JlDabgvRElsAkkopIVJfGq6BV0y_wcsNvWzPGO9F4,4122
66
+ src/linters/cqs/violation_builder.py,sha256=6bRWs9b9bqiSYaxi87gxWieKMTZaPCwHMMpplVpKZMo,2868
67
+ src/linters/dry/__init__.py,sha256=p58tN3z_VbulfTkRm1kLZJ43Bemt66T2sro1teirUY8,826
68
+ src/linters/dry/base_token_analyzer.py,sha256=hkR3MI6UYwQ7PNJiyGiIPiX7uMrDRHr0mzI-aG8wVCM,3199
69
+ src/linters/dry/block_filter.py,sha256=3RgmRSqYFk2eqATLOWN3hET09JuaPEFux3ResA0ltqo,11432
70
+ src/linters/dry/block_grouper.py,sha256=NP66BlofaY7HVXcWwmK5lyiNXbaTlU1V3IbcZubIq_I,1937
71
+ src/linters/dry/cache.py,sha256=909Va6bsq_DREooZGE1VDisefN_QqfPTL1ZKPi7k7Bk,8911
72
+ src/linters/dry/cache_query.py,sha256=qu_uHe360ZvKmFTBvfREjjPMGbJgLQsFTKPVIA2jQJ0,1949
73
+ src/linters/dry/config.py,sha256=3l1Ly3JbeYLvBbpyBsti2hGAKvxDShZ6d4uc8FEMB0I,7283
74
+ src/linters/dry/config_loader.py,sha256=wikqnigOp6p1h9jaAATV_3bDXSiaIUFaf9xg1jQMDpo,1313
75
+ src/linters/dry/constant.py,sha256=n9cNwa-1GQPISGZ3dgGcpLv7tc-uy56ravHiFsIwoRk,3249
76
+ src/linters/dry/constant_matcher.py,sha256=GcfCRKNvUchandcqM8lz54BpEpSkdxr4K2Vb1aTAlcc,8074
77
+ src/linters/dry/constant_violation_builder.py,sha256=F88aLlgscWmyUeIr_EgF4CeheXEc6Iv2pBG2eKJTmts,4048
78
+ src/linters/dry/deduplicator.py,sha256=a1TRvldxCszf5QByo1ihXF3W98dpGuyaRT74jPfQftM,3988
79
+ src/linters/dry/duplicate_storage.py,sha256=9pIALnwAuz5BJUYNXrPbObbP932CE9x0vgUkICryT_s,1970
80
+ src/linters/dry/file_analyzer.py,sha256=3uO2fy8HvxFiRCtYaBs9LztkzvDynqmy7INYRaJjK-g,2990
81
+ src/linters/dry/inline_ignore.py,sha256=3fgPsn_kXeF7kVy_9FL8xYwSUA9cSmgUR3F0tOwzjuY,4275
82
+ src/linters/dry/linter.py,sha256=oXhFAFYrukiVQq8KmfwGBXvbPLutwW_OuzZAElRTYbc,12066
83
+ src/linters/dry/python_analyzer.py,sha256=b7n7u3NbOW3DFZHeC-bG3N_6VgW2NU2easG8pIHYaZc,10962
84
+ src/linters/dry/python_constant_extractor.py,sha256=v9-3NDCq9CKT6uvti_PRIC3DMEESHW2g3i2IfFy0hw8,3469
85
+ src/linters/dry/single_statement_detector.py,sha256=ZmMo_tsvVxugFmnNzWtGc-4e5sGOw18HHxHre3lRUUA,18220
86
+ src/linters/dry/storage_initializer.py,sha256=ykMALFs4uMUrN0_skEwySDl_t5Dm_LGHllF0OxDhiUI,1366
87
+ src/linters/dry/token_hasher.py,sha256=RoUXByVHwf9TZjRqXB3aI1htNZS0pX41oOsUxvlsF00,4951
88
+ src/linters/dry/typescript_analyzer.py,sha256=xGUcQO8MvJnAVgn5GZRwQAc5xZsD0T-qOQlFuJcvfZM,10777
89
+ src/linters/dry/typescript_constant_extractor.py,sha256=ri5NivpcxLAxwdMJvbeTF4Vu0WS_Fgf7FydQGoVNgm0,5130
90
+ src/linters/dry/typescript_statement_detector.py,sha256=8WiwcjLs8j8_wp0UTsoXN0vVr1mNa562O1CB-FtaQR4,8848
91
+ src/linters/dry/typescript_value_extractor.py,sha256=TbHIvcEnmjSV1WNnkRbXeUi_JA9-rGX0_BrD4bczO9Y,2519
92
+ src/linters/dry/violation_builder.py,sha256=WkCibSNytoqMHGC-3GrVff4PD7-SOnVzzZgkMeqmzco,2952
93
+ src/linters/dry/violation_filter.py,sha256=2e6NHN7GYadt27Pz5kiXhttKPJu1loiXhOi0G3J3Epk,3211
94
+ src/linters/dry/violation_generator.py,sha256=aXKVB-ERpigzwFD4iY5GoN2BWTESBhZaO6Qr7Vm7mzU,8146
95
+ src/linters/file_header/__init__.py,sha256=S3a2xrOlxnNWD02To5K2ZwILsNEvSj1IvUAH8RjgOV4,791
96
+ src/linters/file_header/atemporal_detector.py,sha256=lerkiMwiUhYv3X3vxpm_88otZhSMG3DBgryhFyxe3As,3934
97
+ src/linters/file_header/base_parser.py,sha256=k6ymg1ocuesA6PH7NMDQOy0LTgSglu0wXed68fPaHxM,3382
98
+ src/linters/file_header/bash_parser.py,sha256=aRlIbR6x8IeYAj8w6a3eQzdZZivHB0oPg843CTnQm-Y,2481
99
+ src/linters/file_header/config.py,sha256=gdnZoJ-lEq8DACr6C2UKLorHiFCNdQspP_88FQBtoyc,4755
100
+ src/linters/file_header/css_parser.py,sha256=ijpGMixg2ZqNWWdiZjSNtMXCOhm6XDfSY7OU68B9fS8,2332
101
+ src/linters/file_header/field_validator.py,sha256=owA-ahjx0cUWBIqCxT0dMyGTABQA0b8HbdWbZPQk7pw,2769
102
+ src/linters/file_header/linter.py,sha256=t51VJzKnRo8s_RM0iZLSQBmmLT4mmM8UDpaRekNurwE,12564
103
+ src/linters/file_header/markdown_parser.py,sha256=4rNYrxuZbJz4LoSmv0U741Cv7wP9jftTl0Ty7mBDHRI,5323
104
+ src/linters/file_header/python_parser.py,sha256=RTOeEt1b3tCvFWbZIt89awQA37CUOSBIGagEYnayn-M,1432
105
+ src/linters/file_header/typescript_parser.py,sha256=R11Vkr6dUVaU8t90m8rrkMzODtBYk7u-TYFsMDRwzX8,2532
106
+ src/linters/file_header/violation_builder.py,sha256=HPYTmrcCmcO6Dx5dhmj85zZgEBM5EZqTgql-0CA0A0k,2745
107
+ src/linters/file_placement/__init__.py,sha256=vJ43GZujcbAk-K3DwfsQZ0J3yP_5G35CKssatLyntXk,862
108
+ src/linters/file_placement/config_loader.py,sha256=tLBeP9njYmtD0FNQsKkywMQJWrZaDBl7z_5sqVLzndc,2690
109
+ src/linters/file_placement/directory_matcher.py,sha256=1rxJtCEzqDYDQnscVX6pzk7gxCMD11pVIGaWcli-tHY,2742
110
+ src/linters/file_placement/linter.py,sha256=tjmoTYadTrXpyGXGiUNYwo8g5P2eGZ82LArgp9S8ztk,15283
111
+ src/linters/file_placement/path_resolver.py,sha256=S6g7xOYsoSc0O_RDJh8j4Z2klcwzp16rSUfEAErGOTI,1972
112
+ src/linters/file_placement/pattern_matcher.py,sha256=56PCVL_4ajpTCnebHNUZKMJyAWeUOUHkeEwd4o3ofXQ,3183
113
+ src/linters/file_placement/pattern_validator.py,sha256=P6qbgnVxxFlBrsPzxjXjVlVPpr4ppeuJMhhnCScE6fA,4266
114
+ src/linters/file_placement/rule_checker.py,sha256=HInWmyxxZfqmrBH-5RealvYIV5ChzGd4EwxB6RNZE9w,7930
115
+ src/linters/file_placement/violation_factory.py,sha256=NkQmBcgpa3g3W2ZdFZNQ5djLVP4x9OKs65d7F1rCKvM,6040
116
+ src/linters/lazy_ignores/__init__.py,sha256=qPwCC1Y-TPn6tNLTO4X6QsACaAiPMBpsIKlKh_dSz5k,1656
117
+ src/linters/lazy_ignores/config.py,sha256=Bg7A01BLt4zhXOSb_AQsNP7vNtyyL30HTcACdsdBStY,2960
118
+ src/linters/lazy_ignores/directive_utils.py,sha256=x0Xaj92R1Z7kAmCpH0rUWRBd32rRwd8z9NBZNgG_LeI,5111
119
+ src/linters/lazy_ignores/header_parser.py,sha256=ADtVJUoJfoVx_zehoPpo6YLws0N-7c2PLK1PhNqn5Uk,6030
120
+ src/linters/lazy_ignores/linter.py,sha256=1bl3b2NliVurlb9bUcZUzd8sBZG6KJhRODD-Mb46HnE,6052
121
+ src/linters/lazy_ignores/matcher.py,sha256=3djc1iRiwBeigmRl5OIeIIZqRYRiku7E65WyzELg2LY,6496
122
+ src/linters/lazy_ignores/python_analyzer.py,sha256=MuP-mXuLrZ3Qe3OHl63iVVvlja5YbziUUEcOKkKVNG8,7383
123
+ src/linters/lazy_ignores/rule_id_utils.py,sha256=sE7kAQFO6zGAR5JQN2OLLVjAdiVNPZONTb0sY01ri9w,5809
124
+ src/linters/lazy_ignores/skip_detector.py,sha256=9RK5uD4b2pAfdJsK1dHRTAWG4kKfAf1yfjc1OBsI14M,10461
125
+ src/linters/lazy_ignores/types.py,sha256=2lnFazlxbJ7SEThEVcWaV5PWLztYyGcPzYQVzHE9iO0,2334
126
+ src/linters/lazy_ignores/typescript_analyzer.py,sha256=k8R60Mcw9OxvHFFUPhUErrb-tbek7Q7PXXZDq_H0ioM,5322
127
+ src/linters/lazy_ignores/violation_builder.py,sha256=FIlybBPgXTQfot745eQwM4gm7-Pst50SBpBhriG53-w,4342
128
+ src/linters/lbyl/__init__.py,sha256=5_an3Zy9iQvbajvuQT_DTMtlIMfOWxwewZGFe-cSDg8,1124
129
+ src/linters/lbyl/config.py,sha256=kWCjBRs1HEVf9oK4dHKHfjQX8KU-o5i-Jc_94ULDD4Y,2434
130
+ src/linters/lbyl/linter.py,sha256=sp6PETOKuk13wzfWYPYmWVqcdCwcFRr6CGvFmNPunaU,2288
131
+ src/linters/lbyl/pattern_detectors/__init__.py,sha256=23wnoXvQs9IFpk1RqjQhqpdtUhEE-MjiIlKrrhrtfxs,2064
132
+ src/linters/lbyl/pattern_detectors/base.py,sha256=O1R2k9ZLECLou7IN-FsNHC530CFxqQ6knhxhhQwpp6w,1881
133
+ src/linters/lbyl/pattern_detectors/dict_key_detector.py,sha256=xUPlHP1ZP8eQhUG8SUd5_Ke_J-h-XuB8_0ZPe9XGhH4,3982
134
+ src/linters/lbyl/pattern_detectors/division_check_detector.py,sha256=FG8PTtF0Ukg6cf7AGhqsSzuyDw90y7R2F63w0BAwwbA,7936
135
+ src/linters/lbyl/pattern_detectors/file_exists_detector.py,sha256=ZXK0rr60QgUNXm96mZmIuoMzHzpZ1USGiR4E_snoWUs,8410
136
+ src/linters/lbyl/pattern_detectors/hasattr_detector.py,sha256=mE0-mgMxArQ2RdQsI8u2dlRUm912k-pufd-6cAEbdfo,4376
137
+ src/linters/lbyl/pattern_detectors/isinstance_detector.py,sha256=3Zv_jPqB29vlrnthAOyEd6fN3f2P-cYtASLHt0PIKp4,4600
138
+ src/linters/lbyl/pattern_detectors/len_check_detector.py,sha256=A2Hlz7tAPmrcccJlXHEVKnEUGwSt9poBwcksRljQshM,6407
139
+ src/linters/lbyl/pattern_detectors/none_check_detector.py,sha256=mrLIK6sZ1QwM734qr5MtsyU-yaXr8zBNOjasXQ5PsEs,5428
140
+ src/linters/lbyl/pattern_detectors/string_validator_detector.py,sha256=GXXcsCfmp0yU7cgmg2LpYl8JRXpeRjZhYdq5A-lTPZY,5068
141
+ src/linters/lbyl/python_analyzer.py,sha256=auPrWFUEmFxtv1GB3exJzz7uX71gXqEUCHKO64UDR8w,8041
142
+ src/linters/lbyl/violation_builder.py,sha256=6wVX9U7Jq1ONWcGuasvIwJE9mXHcT778p0OcPC0Wx7w,10296
143
+ src/linters/magic_numbers/__init__.py,sha256=17dkCUf0uiYLvpOZF01VDojj92NzxXZMtRhrSBUzsdc,1689
144
+ src/linters/magic_numbers/config.py,sha256=3zV6ZNezouBWUYy4kMw5PUlPNvIWXVwOxTz1moZfRoI,3270
145
+ src/linters/magic_numbers/context_analyzer.py,sha256=EgDyxxjvEqyD3FX0Fnxj5RcOPyvyVs_rYFxj2HOxYdg,7309
146
+ src/linters/magic_numbers/linter.py,sha256=CGo_35ujoCbNXbb0XI4KGCm5C9PCe_LzvXrgmvYN-I4,16736
147
+ src/linters/magic_numbers/python_analyzer.py,sha256=Ba-EODvAkUIOhqMFv86MxMlXqF20ngvgubiWN_U_IUk,2446
148
+ src/linters/magic_numbers/typescript_analyzer.py,sha256=-2YPmNWXHJN8R2siV3pJk_3Baj-A9nnvQRpU35YBKgs,7519
149
+ src/linters/magic_numbers/typescript_ignore_checker.py,sha256=9JWqtXd8KU_GCc_66KSZT2X7uQhNGpxE2ikOyjcLyao,2847
150
+ src/linters/magic_numbers/violation_builder.py,sha256=SqIQv3N9lpP2GRC1TC5InrvaEdrAq24V7Ec2Xj5olb0,3308
151
+ src/linters/method_property/__init__.py,sha256=t0C6zD5WLm-McgmvVajQJg4HQfOi7_4YzNLhKNA484w,1415
152
+ src/linters/method_property/config.py,sha256=_TbUc0piC1FeW3qsw4hYryzWPUOq_laia_QNLe1Y0aw,5529
153
+ src/linters/method_property/linter.py,sha256=9pgUEIK7ASZVwtsRVOg3U0k-GR0lHSLpUv_1TnIcZPA,12700
154
+ src/linters/method_property/python_analyzer.py,sha256=uyNUJHxACw01Z1Uz6lRUPe753MpzUOYuQ999rRt5ocE,15386
155
+ src/linters/method_property/violation_builder.py,sha256=A7SwZWlVG_7W5pJiHOvIroI2q4UuOQNryOYvmX3APLs,4251
156
+ src/linters/nesting/__init__.py,sha256=tszmyCEQMpEwB5H84WcAUfRYDQl7jpsn04es5DtAHsM,3200
157
+ src/linters/nesting/config.py,sha256=PfPA2wJn3i6HHXeM0qu6Qx-v1KJdRwlRkFOdpf7NhS8,2405
158
+ src/linters/nesting/linter.py,sha256=bn5aPlxKZNw3T2LsOSfZUK_shkxcsdUS_LtFVsGJexk,6622
159
+ src/linters/nesting/python_analyzer.py,sha256=__fs_NE9xA4NM1MDOHBGdrI0zICkTcgbVZtfT03cxF0,3230
160
+ src/linters/nesting/typescript_analyzer.py,sha256=70TsjP3EJWiHJ1ncMaveFE0e9_HdukWZr9LM0_MDXr8,3639
161
+ src/linters/nesting/typescript_function_extractor.py,sha256=dDB1otJnFMCo-Pj4mTr4gekKe7V4ArOAtX6gV0dBDc4,4494
162
+ src/linters/nesting/violation_builder.py,sha256=WwgR_Q9pfPJOoVuNZQL4MU3-Wc6RX_GGL5Rc2-RVlbI,4829
163
+ src/linters/performance/__init__.py,sha256=UXJwfTk2ZCBqdy0Rtqcn2rMffWXXauq14oNMPtJDO3o,3118
164
+ src/linters/performance/config.py,sha256=TmOdKtbrYx8POzFx_7fkgWfHcri2oBIXsm4V9FqkAek,1458
165
+ src/linters/performance/constants.py,sha256=WBiSCOMGNd01o5D0M95Lyx_liZAd3zBkIPu7ZXzcW3M,1127
166
+ src/linters/performance/linter.py,sha256=PrzHt5Y83eUlLWnZol7PPJsYRTPlIPv8-2FDJ-u88j8,5719
167
+ src/linters/performance/python_analyzer.py,sha256=EgRBzk-0CHS48RM2IlqilKkDsMadyjf1IumMUvfw2zs,13808
168
+ src/linters/performance/regex_analyzer.py,sha256=GZKf3jWWH28TxGlTqDeyd97JDbxjIT1pPO2jcgZwofY,10520
169
+ src/linters/performance/regex_linter.py,sha256=velv84oQ3TxP9cJlYmSts3_DjS1h-RINuZDmQx-YatU,5078
170
+ src/linters/performance/typescript_analyzer.py,sha256=t0jvLvVG97ffgC-4KhXobKa9iG9iGREOV5Kta7XsbFw,8740
171
+ src/linters/performance/violation_builder.py,sha256=q4fy3SVVrveyYYg9O2-MZfWjlHlKRP3llH1-8VQ6sUU,5752
172
+ src/linters/print_statements/__init__.py,sha256=yhvdTFSqBB4UDreeadTHKFzhayxeT6JkF3yxUHMgn1g,1893
173
+ src/linters/print_statements/config.py,sha256=rth3XmzqZGzXkRXDIVZswdtNOXIe1vIRaF46tVLKnyQ,3041
174
+ src/linters/print_statements/linter.py,sha256=CcKolaaHYJzhpxWXthYZ7xXhfTnxmyOIhuE40Ly3ofA,14351
175
+ src/linters/print_statements/python_analyzer.py,sha256=48IDRQEv861B90qCl5w8ASxcXR7juZ429YX2ST9n2ic,5028
176
+ src/linters/print_statements/typescript_analyzer.py,sha256=EFE3bjRENvCPEYmNNxZ4jiq1VCA-rEUAJ_VFWJApLqY,4935
177
+ src/linters/print_statements/violation_builder.py,sha256=Vs5m3AnWjrQqQHf6JJDaPP5B1V3YNl5pepG_oiTJnx4,3333
178
+ src/linters/srp/__init__.py,sha256=GbhaSB2_AYY-mWgG_ThbyAcDXoVZuB5eLzguoShf38w,3367
179
+ src/linters/srp/class_analyzer.py,sha256=tZ6xAT0Y7LkzeVlGHckQRhFdnssuetUYxTQdUHwBoCo,4045
180
+ src/linters/srp/config.py,sha256=hTxrM21HIOmg0sM6eJ_h3hRnuxqRZEgs13Ie97-PDr4,3397
181
+ src/linters/srp/heuristics.py,sha256=hMWRdTJoIY-T0s7ruB6ju27RPBJCATMiUvLZXzQvTsY,4229
182
+ src/linters/srp/linter.py,sha256=ut6k8QDb4P2CXHl5Jnem0eFBN2lxcvsRyGnnQqMZL8w,7660
183
+ src/linters/srp/metrics_evaluator.py,sha256=Prk_dPacas_dX7spAzV0g734srmzT5u0t5d4mTG9g2o,1606
184
+ src/linters/srp/python_analyzer.py,sha256=PH27l38BFPNmj22Z10QDBioLDCZ4xpJFzBfTh_4XMZ4,3585
185
+ src/linters/srp/typescript_analyzer.py,sha256=Wi0P_G1v5AnZYtMN3sNm1iHva84-8Kep2LZ5RmAS4c4,2885
186
+ src/linters/srp/typescript_metrics_calculator.py,sha256=cDaHlnzMgFSTd2Sn5-tldR2HS6P8GMv4Qptep6PJozw,4093
187
+ src/linters/srp/violation_builder.py,sha256=jaIjVtRYWUTs1SVJVwd0FxCojo0DxhPzfhyfMKmAroM,3881
188
+ src/linters/stateless_class/__init__.py,sha256=8ePpinmCD27PCz7ukwUWcNwo-ZgyvhOquns-U51MyiQ,1063
189
+ src/linters/stateless_class/config.py,sha256=u8Jt_xygIkuxZx2o0Uw_XFatOh11QhC9aN8lB_vfnLk,1993
190
+ src/linters/stateless_class/linter.py,sha256=Rm3fZfkyUOYeBodcLPUcMNKUHPuc5NgKOeDioGXyu_M,11338
191
+ src/linters/stateless_class/python_analyzer.py,sha256=psEx2pG-eZJfK9ViX4YaNCLFEXEqUoViA3rc32o_sVQ,7623
192
+ src/linters/stringly_typed/__init__.py,sha256=6r4IIykZ6mm551KQpRTSDp418EFqJQbuzjSfLHcwyBc,1511
193
+ src/linters/stringly_typed/config.py,sha256=-M7fwwr9axQsQcGtowVINC9Bh1cS1b2-KPxFb2GtL3M,7500
194
+ src/linters/stringly_typed/context_filter.py,sha256=JohTFvXiHKfVzUowRbsDrY37QngJDmhFfoxyoTzKriY,11422
195
+ src/linters/stringly_typed/function_call_violation_builder.py,sha256=RiuzeKmUzb6Fzdc4j8lXl4V-jf-0xae-5t7YcIaKTMY,4234
196
+ src/linters/stringly_typed/ignore_checker.py,sha256=QU1x3S6RVujmnIWMTKWD4bwSfrmPLLRBp36T2KD_o1g,3382
197
+ src/linters/stringly_typed/ignore_utils.py,sha256=hw0wfnGFJQkysr1qi_vmykZPr02SNBElwVHFu55tB6M,1531
198
+ src/linters/stringly_typed/linter.py,sha256=mKokag3XCQl4QuhT25sekuiX2bMERDUdq9SNxqBpNCw,13440
199
+ src/linters/stringly_typed/python/__init__.py,sha256=y1ELj3We0_VeA0ygXd1DxudSWrZE5OhLGtZNkKwuomA,1359
200
+ src/linters/stringly_typed/python/analyzer.py,sha256=HAhSAMIXMr4FoSKE9ovrWuB0f3Zjp9Py3AoruArmaOU,12247
201
+ src/linters/stringly_typed/python/call_tracker.py,sha256=Re_BgUQQhWNTg9jM6XsyyqYxmeVhoqVJXPe2ITcNhhA,6046
202
+ src/linters/stringly_typed/python/comparison_tracker.py,sha256=MAYQF-IKYaJLV4DYwbAPz8E2fWFBoSMTxhCwnGFP5Jw,8384
203
+ src/linters/stringly_typed/python/condition_extractor.py,sha256=_Y-lSqmqfUYbJjmSjOcQDetCNwWvW6bAAdyHjRSVAek,4222
204
+ src/linters/stringly_typed/python/conditional_detector.py,sha256=js1wTcXwLOrHVAJY9dq0xqXVZVNXh5FSFQNvIZ4SUtg,6006
205
+ src/linters/stringly_typed/python/constants.py,sha256=IF3Y2W96hihHlr5HMenq5Q93uOo7KHzNazVVvhq3E58,671
206
+ src/linters/stringly_typed/python/match_analyzer.py,sha256=mgarAtnL79iOrK6xuiRE2Hw-9tR8ocrIRza6g0SorY8,2719
207
+ src/linters/stringly_typed/python/validation_detector.py,sha256=jzcowBcA7R_aKeXFf2sxI2yGGUoT1lGj1y7DTnmO88M,6288
208
+ src/linters/stringly_typed/python/variable_extractor.py,sha256=yYJQ5jTSMz94SD_0IMfCHMWcw1F57GmRuh9h51oiAEs,2769
209
+ src/linters/stringly_typed/storage.py,sha256=4ymgg1JiBPLUazKShOb6djPGAVSma3SOIUDmOmeqH5A,21742
210
+ src/linters/stringly_typed/storage_initializer.py,sha256=3-4St1ieN8325Xkb0HTS27dVyjjluM_X-bkwOfJW1JM,1548
211
+ src/linters/stringly_typed/typescript/__init__.py,sha256=lOgclS9wxLNyszfwVGbVxKfCkbTLX1pvskHzcADi5Xg,1121
212
+ src/linters/stringly_typed/typescript/analyzer.py,sha256=iNEk6wQJJfmJoRTXx29GEeqTpKzQ5TcNIimSuQPb6UU,6376
213
+ src/linters/stringly_typed/typescript/call_tracker.py,sha256=NPRpjqTe-Owi3_qJk_baojAazqaL6EsH4E2SIOsUAjU,11299
214
+ src/linters/stringly_typed/typescript/comparison_tracker.py,sha256=TiEldIqppu6i2XYd9a040HK0U4cy7IFf6Qjjlb93wAA,12573
215
+ src/linters/stringly_typed/violation_generator.py,sha256=g1dTc6EvjvTYmW3zdfTydmLaTCnqWDq4Q5UIntYxF1A,15336
216
+ src/orchestrator/__init__.py,sha256=XXLDJq2oaB-TpP2Y97GRnde9EkITGuFCmuLrDfxI9nY,245
217
+ src/orchestrator/core.py,sha256=rt3h-YFgF1aAFeKvTa0PP7k_8zfwpeGIqrIxKuyckxY,17683
218
+ src/orchestrator/language_detector.py,sha256=ALt2BEZKXQM2dWr1ChF9lZVj83YF4Bl9xwrB9ezfmMc,2799
219
+ src/templates/thailint_config_template.yaml,sha256=57ZtLxnIoOHtR5Ejq3clb4nhY9J4n6h36XFb79ZZPlc,12020
220
+ src/utils/__init__.py,sha256=NiBtKeQ09Y3kuUzeN4O1JNfUIYPQDS2AP1l5ODq-Dec,125
221
+ src/utils/project_root.py,sha256=aaxUM-LQ1okrPClmZWPFd_D09W3V1ArgJiidEEp_eU8,6262
222
+ thailint-0.15.3.dist-info/METADATA,sha256=ARqaTSsuA3wy3qHEDuxB3F5fxddwATw4A9y_DNRYfX8,7202
223
+ thailint-0.15.3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
224
+ thailint-0.15.3.dist-info/entry_points.txt,sha256=DNoGUlxpaMFqxQDgHp1yeGqohOjdFR-kH19uHYi3OUY,72
225
+ thailint-0.15.3.dist-info/licenses/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
226
+ thailint-0.15.3.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ thai-lint=src.cli_main:cli
3
+ thailint=src.cli_main:cli
4
+