thailint 0.15.8__py3-none-any.whl → 0.17.0__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 (52) hide show
  1. src/cli/config.py +4 -12
  2. src/cli/linters/__init__.py +13 -3
  3. src/cli/linters/code_patterns.py +42 -38
  4. src/cli/linters/code_smells.py +8 -17
  5. src/cli/linters/documentation.py +3 -6
  6. src/cli/linters/performance.py +4 -10
  7. src/cli/linters/rust.py +177 -0
  8. src/cli/linters/shared.py +2 -7
  9. src/cli/linters/structure.py +4 -11
  10. src/cli/linters/structure_quality.py +4 -11
  11. src/cli/main.py +9 -12
  12. src/cli/utils.py +7 -16
  13. src/core/__init__.py +14 -0
  14. src/core/base.py +30 -0
  15. src/core/constants.py +1 -0
  16. src/core/linter_utils.py +42 -1
  17. src/core/rule_aliases.py +84 -0
  18. src/linter_config/rule_matcher.py +53 -8
  19. src/linters/blocking_async/__init__.py +31 -0
  20. src/linters/blocking_async/config.py +67 -0
  21. src/linters/blocking_async/linter.py +183 -0
  22. src/linters/blocking_async/rust_analyzer.py +419 -0
  23. src/linters/blocking_async/violation_builder.py +97 -0
  24. src/linters/clone_abuse/__init__.py +31 -0
  25. src/linters/clone_abuse/config.py +65 -0
  26. src/linters/clone_abuse/linter.py +183 -0
  27. src/linters/clone_abuse/rust_analyzer.py +356 -0
  28. src/linters/clone_abuse/violation_builder.py +94 -0
  29. src/linters/magic_numbers/linter.py +92 -0
  30. src/linters/magic_numbers/rust_analyzer.py +148 -0
  31. src/linters/magic_numbers/violation_builder.py +31 -0
  32. src/linters/nesting/linter.py +50 -0
  33. src/linters/nesting/rust_analyzer.py +118 -0
  34. src/linters/nesting/violation_builder.py +32 -0
  35. src/linters/print_statements/__init__.py +23 -11
  36. src/linters/print_statements/conditional_verbose_analyzer.py +200 -0
  37. src/linters/print_statements/conditional_verbose_rule.py +254 -0
  38. src/linters/print_statements/linter.py +2 -2
  39. src/linters/srp/class_analyzer.py +49 -0
  40. src/linters/srp/linter.py +22 -0
  41. src/linters/srp/rust_analyzer.py +206 -0
  42. src/linters/unwrap_abuse/__init__.py +30 -0
  43. src/linters/unwrap_abuse/config.py +59 -0
  44. src/linters/unwrap_abuse/linter.py +166 -0
  45. src/linters/unwrap_abuse/rust_analyzer.py +118 -0
  46. src/linters/unwrap_abuse/violation_builder.py +89 -0
  47. src/templates/thailint_config_template.yaml +88 -0
  48. {thailint-0.15.8.dist-info → thailint-0.17.0.dist-info}/METADATA +7 -3
  49. {thailint-0.15.8.dist-info → thailint-0.17.0.dist-info}/RECORD +52 -30
  50. {thailint-0.15.8.dist-info → thailint-0.17.0.dist-info}/WHEEL +0 -0
  51. {thailint-0.15.8.dist-info → thailint-0.17.0.dist-info}/entry_points.txt +0 -0
  52. {thailint-0.15.8.dist-info → thailint-0.17.0.dist-info}/licenses/LICENSE +0 -0
@@ -328,6 +328,94 @@ performance:
328
328
  # - "tests/**"
329
329
  # - "scripts/**"
330
330
 
331
+ # ============================================================================
332
+ # UNWRAP ABUSE LINTER (Rust)
333
+ # ============================================================================
334
+ # Detects .unwrap() and .expect() calls in Rust code that may panic at runtime
335
+ # Suggests safer alternatives like ?, unwrap_or(), unwrap_or_default()
336
+ #
337
+ unwrap-abuse:
338
+ enabled: true
339
+
340
+ # Allow .unwrap()/.expect() in #[test] functions and #[cfg(test)] modules
341
+ # Default: true
342
+ allow_in_tests: true
343
+
344
+ # Allow .expect() calls (they provide error context unlike bare .unwrap())
345
+ # Default: false
346
+ allow_expect: false
347
+
348
+ # -------------------------------------------------------------------------
349
+ # OPTIONAL: File patterns to ignore
350
+ # -------------------------------------------------------------------------
351
+ # ignore:
352
+ # - "examples/"
353
+ # - "benches/"
354
+
355
+ # ============================================================================
356
+ # CLONE ABUSE LINTER (Rust)
357
+ # ============================================================================
358
+ # Detects .clone() abuse patterns in Rust code: clone in loops, chained clones,
359
+ # and unnecessary clones where the original is not used after cloning
360
+ #
361
+ clone-abuse:
362
+ enabled: true
363
+
364
+ # Allow .clone() in #[test] functions and #[cfg(test)] modules
365
+ # Default: true
366
+ allow_in_tests: true
367
+
368
+ # Toggle detection of .clone() inside loop bodies (for, while, loop)
369
+ # Default: true
370
+ detect_clone_in_loop: true
371
+
372
+ # Toggle detection of chained .clone().clone() calls
373
+ # Default: true
374
+ detect_clone_chain: true
375
+
376
+ # Toggle detection of unnecessary clones (clone before move)
377
+ # Default: true
378
+ detect_unnecessary_clone: true
379
+
380
+ # -------------------------------------------------------------------------
381
+ # OPTIONAL: File patterns to ignore
382
+ # -------------------------------------------------------------------------
383
+ # ignore:
384
+ # - "examples/"
385
+ # - "benches/"
386
+
387
+ # ============================================================================
388
+ # BLOCKING ASYNC LINTER (Rust)
389
+ # ============================================================================
390
+ # Detects blocking operations inside async functions in Rust code:
391
+ # std::fs I/O, std::thread::sleep, and blocking std::net calls
392
+ #
393
+ blocking-async:
394
+ enabled: true
395
+
396
+ # Allow blocking calls in #[test] functions and #[cfg(test)] modules
397
+ # Default: true
398
+ allow_in_tests: true
399
+
400
+ # Toggle detection of std::fs operations in async functions
401
+ # Default: true
402
+ detect_fs_in_async: true
403
+
404
+ # Toggle detection of std::thread::sleep in async functions
405
+ # Default: true
406
+ detect_sleep_in_async: true
407
+
408
+ # Toggle detection of std::net blocking calls in async functions
409
+ # Default: true
410
+ detect_net_in_async: true
411
+
412
+ # -------------------------------------------------------------------------
413
+ # OPTIONAL: File patterns to ignore
414
+ # -------------------------------------------------------------------------
415
+ # ignore:
416
+ # - "examples/"
417
+ # - "benches/"
418
+
331
419
  # ============================================================================
332
420
  # GLOBAL SETTINGS
333
421
  # ============================================================================
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thailint
3
- Version: 0.15.8
3
+ Version: 0.17.0
4
4
  Summary: The AI Linter - Enterprise-grade linting and governance for AI-generated code across multiple languages
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -24,6 +24,7 @@ Classifier: Topic :: Software Development :: Testing
24
24
  Classifier: Topic :: Utilities
25
25
  Classifier: Typing :: Typed
26
26
  Requires-Dist: click (>=8.1.0,<9.0.0)
27
+ Requires-Dist: loguru (>=0.7.3,<0.8.0)
27
28
  Requires-Dist: pyprojroot (>=0.3.0,<0.4.0)
28
29
  Requires-Dist: pyyaml (>=6.0,<7.0)
29
30
  Requires-Dist: tree-sitter (>=0.25.2,<0.26.0)
@@ -43,7 +44,7 @@ Description-Content-Type: text/markdown
43
44
 
44
45
  **The AI Linter** - Catch the mistakes AI coding assistants keep making.
45
46
 
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
+ thailint detects anti-patterns that AI tools frequently introduce: duplicate code, excessive nesting, magic numbers, SRP violations, and more. It works across Python, TypeScript, JavaScript, and Rust with unified rules - filling gaps that existing linters miss.
47
48
 
48
49
  ## Installation
49
50
 
@@ -83,9 +84,12 @@ That's it. See violations, fix them, ship better code.
83
84
  | **Method Property** | Methods that should be @property | `thailint method-property src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/method-property-linter/) |
84
85
  | **File Placement** | Files in wrong directories | `thailint file-placement src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/file-placement-linter/) |
85
86
  | **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
+ | **Improper Logging** | Print statements and conditional verbose patterns | `thailint improper-logging src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/improper-logging-linter/) |
87
88
  | **Stringly Typed** | Strings that should be enums | `thailint stringly-typed src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/stringly-typed-linter/) |
88
89
  | **LBYL** | Look Before You Leap anti-patterns | `thailint lbyl src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/lbyl-linter/) |
90
+ | **Unwrap Abuse** | `.unwrap()`/`.expect()` that panic at runtime (Rust) | `thailint unwrap-abuse src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/unwrap-abuse-linter/) |
91
+ | **Clone Abuse** | `.clone()` abuse: loops, chains, unnecessary (Rust) | `thailint clone-abuse src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/clone-abuse-linter/) |
92
+ | **Blocking Async** | Blocking std:: calls in async functions (Rust) | `thailint blocking-async src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/blocking-async-linter/) |
89
93
 
90
94
  ## Configuration
91
95
 
@@ -7,28 +7,30 @@ src/analyzers/typescript_base.py,sha256=Dtc_2jLSNoadh53MyeW2syrJMBIMVPvotcM8SeDE
7
7
  src/api.py,sha256=pJ5l3qxccKBEY-BkANwzTgLAl1ZFq7OP6hx6LSxbhDw,4664
8
8
  src/cli/__init__.py,sha256=nMxKv4D0t09LwUm4Z5w-b7vIuyn24SFzv78BKzE3AOQ,1272
9
9
  src/cli/__main__.py,sha256=xIKI57yqB1NOw9eXnGXfU8rC2UwcAJYjDxlZbt9eP0w,671
10
- src/cli/config.py,sha256=wh9lp0Z2FUEKbYawB65Y9vrlu1Yiqe8-CD_vnRDqwEg,14467
10
+ src/cli/config.py,sha256=uAcc1NMe4uvC5619wyGIrSJtOWeOWT3No8_qBvowqXk,14293
11
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
12
+ src/cli/linters/__init__.py,sha256=7Kk209UZlbFBBhtr89NH827P-mP4F6KnHsT1-2tmbCo,2714
13
+ src/cli/linters/code_patterns.py,sha256=0ajlHI9kesHryBjF_YBHltMi2gjkPPacMxYoJ1h0Qck,11463
14
+ src/cli/linters/code_smells.py,sha256=9J_CPdCFDv6fHQwfLP01PgBnF1c8DwioeIICLA-N7Zo,11608
15
+ src/cli/linters/documentation.py,sha256=bvrW4OfgeKOYlzzHv3Zl-XjGjItviX_zLlP94btlUkI,3211
16
+ src/cli/linters/performance.py,sha256=TZoe8hs-5j68tUiiKRwnhdGEKm432QlmwAG4eAqgcVo,9747
17
+ src/cli/linters/rust.py,sha256=ePfPb5sR58sroBn70i17-NtugifWdvyWTEQpDumbo5E,7447
18
+ src/cli/linters/shared.py,sha256=dC8SS8UxJR3WvQr1SkWJAf-AZalN-u-eDrM-FXmKqtw,10043
19
+ src/cli/linters/structure.py,sha256=4SxM2ekq2OPDQfEXxKuQAEn7pqt6cGrLgHLqZ4S57eQ,10636
20
+ src/cli/linters/structure_quality.py,sha256=5cCPz9Jmtvzr3hZZjac3aVFmUIH7HLlkshv_rvs12xI,10627
21
+ src/cli/main.py,sha256=VUtesVpLXeRP9fb2Ko_imGeUybO7JhImsJnHYxQTIN4,3852
22
+ src/cli/utils.py,sha256=5IYu9KltZEg76wgbW-qfKwcXzCK3qsEuvgnr4i_UkqY,12437
22
23
  src/cli_main.py,sha256=C0Ey7YNlG3ipqb3KsJZ8rL8PJ4ueVp_45IUirGidvHI,1618
23
24
  src/config.py,sha256=O3ixzsYekGjlggmIsawCU1bctOa0MyG2IczHpg3mGyw,12753
24
- src/core/__init__.py,sha256=5FtsDvhMt4SNRx3pbcGURrxn135XRbeRrjSUxiXwkNc,381
25
- src/core/base.py,sha256=u5A8geprlKnsJk4ShiLHTKXRekZUB4I6rPQWxgiFeto,8019
25
+ src/core/__init__.py,sha256=1iGdoUB15Hi7xT7jwxUybP3e5IbQ6yiM34IbFNJRCaE,703
26
+ src/core/base.py,sha256=H_eomk-V4ZK4N2H0x8nx75C7tdsZIsPL8TpSl6EW4oo,9019
26
27
  src/core/cli_utils.py,sha256=o7lWPSlic96lRyfcsmBf8S1ej25M1-wlclx8_Eup20g,7446
27
28
  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
29
+ src/core/constants.py,sha256=2RGlojy0z0_SLhU9bbLtXpl6DM6JMtcW3wNfoMCyXj4,1602
30
+ src/core/linter_utils.py,sha256=HJ4SBCCqx7WgdLaFt35qj-nGSG_vTWV5kVyom4Bv9nU,9714
30
31
  src/core/python_lint_rule.py,sha256=OpdIDLPV1MDtmjy6GPrrOA3_rRV2_x14keHAQQtI_pc,3516
31
32
  src/core/registry.py,sha256=yRA8mQLiZwjmgxl1wSTgdj1cuo_QXuRdrXt3NpCBUgE,3285
33
+ src/core/rule_aliases.py,sha256=EEPrI2syrK18Zg1oHZBMNiU1Z-zIdORJjXTAN738h1A,2570
32
34
  src/core/rule_discovery.py,sha256=tgRH-BJGKsQTxfa249yrY7UJuonRjobMCENqmhcbAeY,5496
33
35
  src/core/types.py,sha256=SElFzf_VSrAMsoiE0aU8ZYXuvKqdfwfM5umUHx4eT8w,3342
34
36
  src/core/violation_builder.py,sha256=dOPFfZx6U5_TMgaTop-4SUV2jHOZjBo67uwgiS_s-uE,6694
@@ -40,8 +42,18 @@ src/linter_config/directive_markers.py,sha256=nRc2Mp3B1mn6tu1XH88ugMxWffk1k8OUNo
40
42
  src/linter_config/ignore.py,sha256=40afiMsu1zC29RiwGX8hUPUqM056H_wcOgZZUNOwIes,13111
41
43
  src/linter_config/loader.py,sha256=K6mKRkP2jgwar-pwBoJGWgwynLVjqdez-l3Nd6bUCMk,3363
42
44
  src/linter_config/pattern_utils.py,sha256=BjV95SySST3HqZBwF1Og8yoHqFxuqQ16VPCacE21ks0,2056
43
- src/linter_config/rule_matcher.py,sha256=EWqSv4UY90fWps3AzDCSF7PZCbYyFTEBZT2h_txcRms,2779
45
+ src/linter_config/rule_matcher.py,sha256=5q-cO9S2JbIB3Hr1BU4yAPmbS89eE7y7leiMfaMCKVk,4555
44
46
  src/linters/__init__.py,sha256=-nnNsL8E5-2p9qlLKp_TaShHAjPH-NacOEU1sXmAR9k,77
47
+ src/linters/blocking_async/__init__.py,sha256=nO9brw2svlDkKez3LjfesweZ_ytL01ea-W6b1P3uWY0,1303
48
+ src/linters/blocking_async/config.py,sha256=0b7XIQlVMYPOmFG3alWQLo5qyoUVlmiiTB1bYNGLgEI,2474
49
+ src/linters/blocking_async/linter.py,sha256=17vJXy0zPq5XLtLb1dSv4eboFVDH75b7NwDvpgtGmbw,6117
50
+ src/linters/blocking_async/rust_analyzer.py,sha256=oDm6vcTpU2mT4MaaBpQn6wD8u8Q01ryRw2OL1VAl_v4,12749
51
+ src/linters/blocking_async/violation_builder.py,sha256=DA9mIyWBLor_vMBCCc6xrGu8RPkJrZrQyZPT-UdhiC8,3188
52
+ src/linters/clone_abuse/__init__.py,sha256=lkNBqe_fW7cf5_n-iuH_p-covCtWD_MfcyW-r7dbzQo,1214
53
+ src/linters/clone_abuse/config.py,sha256=_QkaVtyXBPVkY2JV1nu3x3gfAKDzw4IRv1tezdYsrF4,2382
54
+ src/linters/clone_abuse/linter.py,sha256=GoCYc_UhwSl7mR5z5JAo94229SkD9M7CD9tO5WZvbMU,5901
55
+ src/linters/clone_abuse/rust_analyzer.py,sha256=L9TCRvISf2_ccCJc7pcvRg_eETPWhlU7cpNp2Z2XSiE,11434
56
+ src/linters/clone_abuse/violation_builder.py,sha256=DV5KI1crvMqhPpMa-kT0dNbD25mp2L169atTFTddDfk,2980
45
57
  src/linters/collection_pipeline/__init__.py,sha256=BcnbY3wgJB1XLfZ9J9qfUJQ1_yCo_THjGDTppxJEMZY,3231
46
58
  src/linters/collection_pipeline/any_all_analyzer.py,sha256=u8NGIYrJTuP3U6je5rkeEUV2Bh1yePC12vl-czAU5GU,7554
47
59
  src/linters/collection_pipeline/ast_utils.py,sha256=JZsJeel9BzVIOfnENgVcZR8wMNoQ-RJoxuBx-J7w9Uk,1227
@@ -144,11 +156,12 @@ src/linters/magic_numbers/__init__.py,sha256=17dkCUf0uiYLvpOZF01VDojj92NzxXZMtRh
144
156
  src/linters/magic_numbers/config.py,sha256=l18AO6XY6zkrX6_aumn3CZLpCsw185sfy5B_v2nY-OA,4233
145
157
  src/linters/magic_numbers/context_analyzer.py,sha256=EgDyxxjvEqyD3FX0Fnxj5RcOPyvyVs_rYFxj2HOxYdg,7309
146
158
  src/linters/magic_numbers/definition_detector.py,sha256=brENrT17ofYzZUpFjAq05DeG4DS2pKdWAWm4DyGTrDY,6156
147
- src/linters/magic_numbers/linter.py,sha256=JoguQjpWNt1Xp818HuzzCdTv9RqVKQoZXy6fFK8zk0o,17023
159
+ src/linters/magic_numbers/linter.py,sha256=ML-DOeBShEXwt0VUVHr6uwS8ssJ2FhR7BGkJQ8q8Hu8,19984
148
160
  src/linters/magic_numbers/python_analyzer.py,sha256=Ba-EODvAkUIOhqMFv86MxMlXqF20ngvgubiWN_U_IUk,2446
161
+ src/linters/magic_numbers/rust_analyzer.py,sha256=WTQ6NICZRoC48pITaS2OjKIt41BWSTahh9OFb0_G-SM,4934
149
162
  src/linters/magic_numbers/typescript_analyzer.py,sha256=-2YPmNWXHJN8R2siV3pJk_3Baj-A9nnvQRpU35YBKgs,7519
150
163
  src/linters/magic_numbers/typescript_ignore_checker.py,sha256=9JWqtXd8KU_GCc_66KSZT2X7uQhNGpxE2ikOyjcLyao,2847
151
- src/linters/magic_numbers/violation_builder.py,sha256=SqIQv3N9lpP2GRC1TC5InrvaEdrAq24V7Ec2Xj5olb0,3308
164
+ src/linters/magic_numbers/violation_builder.py,sha256=ao366b7KiVthWTBzdQlBiCk-5hXjXVqgrsG3KTE-xhs,4188
152
165
  src/linters/method_property/__init__.py,sha256=t0C6zD5WLm-McgmvVajQJg4HQfOi7_4YzNLhKNA484w,1415
153
166
  src/linters/method_property/config.py,sha256=_TbUc0piC1FeW3qsw4hYryzWPUOq_laia_QNLe1Y0aw,5529
154
167
  src/linters/method_property/linter.py,sha256=9pgUEIK7ASZVwtsRVOg3U0k-GR0lHSLpUv_1TnIcZPA,12700
@@ -156,11 +169,12 @@ src/linters/method_property/python_analyzer.py,sha256=uyNUJHxACw01Z1Uz6lRUPe753M
156
169
  src/linters/method_property/violation_builder.py,sha256=A7SwZWlVG_7W5pJiHOvIroI2q4UuOQNryOYvmX3APLs,4251
157
170
  src/linters/nesting/__init__.py,sha256=tszmyCEQMpEwB5H84WcAUfRYDQl7jpsn04es5DtAHsM,3200
158
171
  src/linters/nesting/config.py,sha256=PfPA2wJn3i6HHXeM0qu6Qx-v1KJdRwlRkFOdpf7NhS8,2405
159
- src/linters/nesting/linter.py,sha256=bn5aPlxKZNw3T2LsOSfZUK_shkxcsdUS_LtFVsGJexk,6622
172
+ src/linters/nesting/linter.py,sha256=ybNcwIYFGHnvXlMUrgSs0NVtno_L0F7R1OLkOpDc0rc,8491
160
173
  src/linters/nesting/python_analyzer.py,sha256=ZaZuFErwpyEG3G0O5LqYwWn7Kmae9mqB8GCSRHSkjmU,5344
174
+ src/linters/nesting/rust_analyzer.py,sha256=fDGNlNioTF02Q5M2DaCzF-78ztKjUjPCjTR07uCu0kQ,3917
161
175
  src/linters/nesting/typescript_analyzer.py,sha256=70TsjP3EJWiHJ1ncMaveFE0e9_HdukWZr9LM0_MDXr8,3639
162
176
  src/linters/nesting/typescript_function_extractor.py,sha256=dDB1otJnFMCo-Pj4mTr4gekKe7V4ArOAtX6gV0dBDc4,4494
163
- src/linters/nesting/violation_builder.py,sha256=WwgR_Q9pfPJOoVuNZQL4MU3-Wc6RX_GGL5Rc2-RVlbI,4829
177
+ src/linters/nesting/violation_builder.py,sha256=mKEv52D9an5-mw1-sNlkECn0MaEdLNyIYX-6sGI0u5Y,5912
164
178
  src/linters/performance/__init__.py,sha256=UXJwfTk2ZCBqdy0Rtqcn2rMffWXXauq14oNMPtJDO3o,3118
165
179
  src/linters/performance/config.py,sha256=TmOdKtbrYx8POzFx_7fkgWfHcri2oBIXsm4V9FqkAek,1458
166
180
  src/linters/performance/constants.py,sha256=WBiSCOMGNd01o5D0M95Lyx_liZAd3zBkIPu7ZXzcW3M,1127
@@ -170,19 +184,22 @@ src/linters/performance/regex_analyzer.py,sha256=GZKf3jWWH28TxGlTqDeyd97JDbxjIT1
170
184
  src/linters/performance/regex_linter.py,sha256=velv84oQ3TxP9cJlYmSts3_DjS1h-RINuZDmQx-YatU,5078
171
185
  src/linters/performance/typescript_analyzer.py,sha256=t0jvLvVG97ffgC-4KhXobKa9iG9iGREOV5Kta7XsbFw,8740
172
186
  src/linters/performance/violation_builder.py,sha256=q4fy3SVVrveyYYg9O2-MZfWjlHlKRP3llH1-8VQ6sUU,5752
173
- src/linters/print_statements/__init__.py,sha256=yhvdTFSqBB4UDreeadTHKFzhayxeT6JkF3yxUHMgn1g,1893
187
+ src/linters/print_statements/__init__.py,sha256=xvqQOc3Lp_YAJChFQh-DnX9KCkj4hksRBFFE_7i5nKA,2268
188
+ src/linters/print_statements/conditional_verbose_analyzer.py,sha256=qhspk0WAC3zGBVGsLFogtbyQrVnb6doLnXhcgbZFdFc,6475
189
+ src/linters/print_statements/conditional_verbose_rule.py,sha256=uGsKXDbuHBTHfFj3ScqK1xh-BvAJ7TrJhWgpHHthLoE,9290
174
190
  src/linters/print_statements/config.py,sha256=rth3XmzqZGzXkRXDIVZswdtNOXIe1vIRaF46tVLKnyQ,3041
175
- src/linters/print_statements/linter.py,sha256=CcKolaaHYJzhpxWXthYZ7xXhfTnxmyOIhuE40Ly3ofA,14351
191
+ src/linters/print_statements/linter.py,sha256=er--FN_uu6C3wxxUti13-wG1GkjeVU0Mx_2uHGGFxcc,14376
176
192
  src/linters/print_statements/python_analyzer.py,sha256=48IDRQEv861B90qCl5w8ASxcXR7juZ429YX2ST9n2ic,5028
177
193
  src/linters/print_statements/typescript_analyzer.py,sha256=EFE3bjRENvCPEYmNNxZ4jiq1VCA-rEUAJ_VFWJApLqY,4935
178
194
  src/linters/print_statements/violation_builder.py,sha256=Vs5m3AnWjrQqQHf6JJDaPP5B1V3YNl5pepG_oiTJnx4,3333
179
195
  src/linters/srp/__init__.py,sha256=GbhaSB2_AYY-mWgG_ThbyAcDXoVZuB5eLzguoShf38w,3367
180
- src/linters/srp/class_analyzer.py,sha256=tZ6xAT0Y7LkzeVlGHckQRhFdnssuetUYxTQdUHwBoCo,4045
196
+ src/linters/srp/class_analyzer.py,sha256=7qYxjGT3zDyVNmW9ide-w6iVBLeIyFVhQK4rLQNth_8,5820
181
197
  src/linters/srp/config.py,sha256=hTxrM21HIOmg0sM6eJ_h3hRnuxqRZEgs13Ie97-PDr4,3397
182
198
  src/linters/srp/heuristics.py,sha256=hMWRdTJoIY-T0s7ruB6ju27RPBJCATMiUvLZXzQvTsY,4229
183
- src/linters/srp/linter.py,sha256=ut6k8QDb4P2CXHl5Jnem0eFBN2lxcvsRyGnnQqMZL8w,7660
199
+ src/linters/srp/linter.py,sha256=t0QuSrmQDxoKPDLPFk9ezbk5oY2Z-5TfVNT5VeipUp0,8512
184
200
  src/linters/srp/metrics_evaluator.py,sha256=Prk_dPacas_dX7spAzV0g734srmzT5u0t5d4mTG9g2o,1606
185
201
  src/linters/srp/python_analyzer.py,sha256=PH27l38BFPNmj22Z10QDBioLDCZ4xpJFzBfTh_4XMZ4,3585
202
+ src/linters/srp/rust_analyzer.py,sha256=QsA9DzjxYJd1azeclyIgyCCtKq-0Bb8RZxc9VPQh0OE,7049
186
203
  src/linters/srp/typescript_analyzer.py,sha256=Wi0P_G1v5AnZYtMN3sNm1iHva84-8Kep2LZ5RmAS4c4,2885
187
204
  src/linters/srp/typescript_metrics_calculator.py,sha256=cDaHlnzMgFSTd2Sn5-tldR2HS6P8GMv4Qptep6PJozw,4093
188
205
  src/linters/srp/violation_builder.py,sha256=jaIjVtRYWUTs1SVJVwd0FxCojo0DxhPzfhyfMKmAroM,3881
@@ -214,14 +231,19 @@ src/linters/stringly_typed/typescript/analyzer.py,sha256=iNEk6wQJJfmJoRTXx29GEeq
214
231
  src/linters/stringly_typed/typescript/call_tracker.py,sha256=NPRpjqTe-Owi3_qJk_baojAazqaL6EsH4E2SIOsUAjU,11299
215
232
  src/linters/stringly_typed/typescript/comparison_tracker.py,sha256=TiEldIqppu6i2XYd9a040HK0U4cy7IFf6Qjjlb93wAA,12573
216
233
  src/linters/stringly_typed/violation_generator.py,sha256=g1dTc6EvjvTYmW3zdfTydmLaTCnqWDq4Q5UIntYxF1A,15336
234
+ src/linters/unwrap_abuse/__init__.py,sha256=ykT2V55ztzU7KwAle-ETBjJMQsTedGszffCpW6SC-C4,1154
235
+ src/linters/unwrap_abuse/config.py,sha256=rpf7j-YXR7jL0rb8kM-iryW2zyeZnJB73a5Siak-B4g,2210
236
+ src/linters/unwrap_abuse/linter.py,sha256=8Wgx4ul84_ywrCnlKR2T6y6_FlY0wNzaukziffG39II,5625
237
+ src/linters/unwrap_abuse/rust_analyzer.py,sha256=RRL7Sed07aO9hUGFZOraH4miruxalTEWwNJFo3iQDbc,4131
238
+ src/linters/unwrap_abuse/violation_builder.py,sha256=5IgvsK642AluT89Cd2QS43fV6ZsH70lZRxohoEjHoUQ,2623
217
239
  src/orchestrator/__init__.py,sha256=XXLDJq2oaB-TpP2Y97GRnde9EkITGuFCmuLrDfxI9nY,245
218
240
  src/orchestrator/core.py,sha256=rt3h-YFgF1aAFeKvTa0PP7k_8zfwpeGIqrIxKuyckxY,17683
219
241
  src/orchestrator/language_detector.py,sha256=ALt2BEZKXQM2dWr1ChF9lZVj83YF4Bl9xwrB9ezfmMc,2799
220
- src/templates/thailint_config_template.yaml,sha256=57ZtLxnIoOHtR5Ejq3clb4nhY9J4n6h36XFb79ZZPlc,12020
242
+ src/templates/thailint_config_template.yaml,sha256=THQCYMMyjOERkGReb3G_KXtLNULW3eaI88BelHgONbo,14975
221
243
  src/utils/__init__.py,sha256=NiBtKeQ09Y3kuUzeN4O1JNfUIYPQDS2AP1l5ODq-Dec,125
222
244
  src/utils/project_root.py,sha256=aaxUM-LQ1okrPClmZWPFd_D09W3V1ArgJiidEEp_eU8,6262
223
- thailint-0.15.8.dist-info/METADATA,sha256=7kLsrDHppJeIvPAlTUieZEBLz7kG0bqG6o7SyTV-Zg0,7318
224
- thailint-0.15.8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
225
- thailint-0.15.8.dist-info/entry_points.txt,sha256=DNoGUlxpaMFqxQDgHp1yeGqohOjdFR-kH19uHYi3OUY,72
226
- thailint-0.15.8.dist-info/licenses/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
227
- thailint-0.15.8.dist-info/RECORD,,
245
+ thailint-0.17.0.dist-info/METADATA,sha256=lDQImp9sIhDaLVPjdFgedYSVWlAaLdBg0ePMVK6ow50,7929
246
+ thailint-0.17.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
247
+ thailint-0.17.0.dist-info/entry_points.txt,sha256=DNoGUlxpaMFqxQDgHp1yeGqohOjdFR-kH19uHYi3OUY,72
248
+ thailint-0.17.0.dist-info/licenses/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
249
+ thailint-0.17.0.dist-info/RECORD,,