thailint 0.16.0__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 (35) hide show
  1. src/cli/linters/__init__.py +8 -1
  2. src/cli/linters/rust.py +177 -0
  3. src/core/base.py +30 -0
  4. src/core/constants.py +1 -0
  5. src/core/linter_utils.py +42 -1
  6. src/linters/blocking_async/__init__.py +31 -0
  7. src/linters/blocking_async/config.py +67 -0
  8. src/linters/blocking_async/linter.py +183 -0
  9. src/linters/blocking_async/rust_analyzer.py +419 -0
  10. src/linters/blocking_async/violation_builder.py +97 -0
  11. src/linters/clone_abuse/__init__.py +31 -0
  12. src/linters/clone_abuse/config.py +65 -0
  13. src/linters/clone_abuse/linter.py +183 -0
  14. src/linters/clone_abuse/rust_analyzer.py +356 -0
  15. src/linters/clone_abuse/violation_builder.py +94 -0
  16. src/linters/magic_numbers/linter.py +92 -0
  17. src/linters/magic_numbers/rust_analyzer.py +148 -0
  18. src/linters/magic_numbers/violation_builder.py +31 -0
  19. src/linters/nesting/linter.py +50 -0
  20. src/linters/nesting/rust_analyzer.py +118 -0
  21. src/linters/nesting/violation_builder.py +32 -0
  22. src/linters/srp/class_analyzer.py +49 -0
  23. src/linters/srp/linter.py +22 -0
  24. src/linters/srp/rust_analyzer.py +206 -0
  25. src/linters/unwrap_abuse/__init__.py +30 -0
  26. src/linters/unwrap_abuse/config.py +59 -0
  27. src/linters/unwrap_abuse/linter.py +166 -0
  28. src/linters/unwrap_abuse/rust_analyzer.py +118 -0
  29. src/linters/unwrap_abuse/violation_builder.py +89 -0
  30. src/templates/thailint_config_template.yaml +88 -0
  31. {thailint-0.16.0.dist-info → thailint-0.17.0.dist-info}/METADATA +5 -2
  32. {thailint-0.16.0.dist-info → thailint-0.17.0.dist-info}/RECORD +35 -16
  33. {thailint-0.16.0.dist-info → thailint-0.17.0.dist-info}/WHEEL +0 -0
  34. {thailint-0.16.0.dist-info → thailint-0.17.0.dist-info}/entry_points.txt +0 -0
  35. {thailint-0.16.0.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.16.0
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
@@ -44,7 +44,7 @@ Description-Content-Type: text/markdown
44
44
 
45
45
  **The AI Linter** - Catch the mistakes AI coding assistants keep making.
46
46
 
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, 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.
48
48
 
49
49
  ## Installation
50
50
 
@@ -87,6 +87,9 @@ That's it. See violations, fix them, ship better code.
87
87
  | **Improper Logging** | Print statements and conditional verbose patterns | `thailint improper-logging src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/improper-logging-linter/) |
88
88
  | **Stringly Typed** | Strings that should be enums | `thailint stringly-typed src/` | [Guide](https://thai-lint.readthedocs.io/en/latest/stringly-typed-linter/) |
89
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/) |
90
93
 
91
94
  ## Configuration
92
95
 
@@ -9,11 +9,12 @@ src/cli/__init__.py,sha256=nMxKv4D0t09LwUm4Z5w-b7vIuyn24SFzv78BKzE3AOQ,1272
9
9
  src/cli/__main__.py,sha256=xIKI57yqB1NOw9eXnGXfU8rC2UwcAJYjDxlZbt9eP0w,671
10
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=Gf3_Ksh4a1TB86j4O2weCwrdCujOYvJ_YSOLFeG60J4,2501
12
+ src/cli/linters/__init__.py,sha256=7Kk209UZlbFBBhtr89NH827P-mP4F6KnHsT1-2tmbCo,2714
13
13
  src/cli/linters/code_patterns.py,sha256=0ajlHI9kesHryBjF_YBHltMi2gjkPPacMxYoJ1h0Qck,11463
14
14
  src/cli/linters/code_smells.py,sha256=9J_CPdCFDv6fHQwfLP01PgBnF1c8DwioeIICLA-N7Zo,11608
15
15
  src/cli/linters/documentation.py,sha256=bvrW4OfgeKOYlzzHv3Zl-XjGjItviX_zLlP94btlUkI,3211
16
16
  src/cli/linters/performance.py,sha256=TZoe8hs-5j68tUiiKRwnhdGEKm432QlmwAG4eAqgcVo,9747
17
+ src/cli/linters/rust.py,sha256=ePfPb5sR58sroBn70i17-NtugifWdvyWTEQpDumbo5E,7447
17
18
  src/cli/linters/shared.py,sha256=dC8SS8UxJR3WvQr1SkWJAf-AZalN-u-eDrM-FXmKqtw,10043
18
19
  src/cli/linters/structure.py,sha256=4SxM2ekq2OPDQfEXxKuQAEn7pqt6cGrLgHLqZ4S57eQ,10636
19
20
  src/cli/linters/structure_quality.py,sha256=5cCPz9Jmtvzr3hZZjac3aVFmUIH7HLlkshv_rvs12xI,10627
@@ -22,11 +23,11 @@ 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
25
  src/core/__init__.py,sha256=1iGdoUB15Hi7xT7jwxUybP3e5IbQ6yiM34IbFNJRCaE,703
25
- src/core/base.py,sha256=u5A8geprlKnsJk4ShiLHTKXRekZUB4I6rPQWxgiFeto,8019
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
32
33
  src/core/rule_aliases.py,sha256=EEPrI2syrK18Zg1oHZBMNiU1Z-zIdORJjXTAN738h1A,2570
@@ -43,6 +44,16 @@ src/linter_config/loader.py,sha256=K6mKRkP2jgwar-pwBoJGWgwynLVjqdez-l3Nd6bUCMk,3
43
44
  src/linter_config/pattern_utils.py,sha256=BjV95SySST3HqZBwF1Og8yoHqFxuqQ16VPCacE21ks0,2056
44
45
  src/linter_config/rule_matcher.py,sha256=5q-cO9S2JbIB3Hr1BU4yAPmbS89eE7y7leiMfaMCKVk,4555
45
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
46
57
  src/linters/collection_pipeline/__init__.py,sha256=BcnbY3wgJB1XLfZ9J9qfUJQ1_yCo_THjGDTppxJEMZY,3231
47
58
  src/linters/collection_pipeline/any_all_analyzer.py,sha256=u8NGIYrJTuP3U6je5rkeEUV2Bh1yePC12vl-czAU5GU,7554
48
59
  src/linters/collection_pipeline/ast_utils.py,sha256=JZsJeel9BzVIOfnENgVcZR8wMNoQ-RJoxuBx-J7w9Uk,1227
@@ -145,11 +156,12 @@ src/linters/magic_numbers/__init__.py,sha256=17dkCUf0uiYLvpOZF01VDojj92NzxXZMtRh
145
156
  src/linters/magic_numbers/config.py,sha256=l18AO6XY6zkrX6_aumn3CZLpCsw185sfy5B_v2nY-OA,4233
146
157
  src/linters/magic_numbers/context_analyzer.py,sha256=EgDyxxjvEqyD3FX0Fnxj5RcOPyvyVs_rYFxj2HOxYdg,7309
147
158
  src/linters/magic_numbers/definition_detector.py,sha256=brENrT17ofYzZUpFjAq05DeG4DS2pKdWAWm4DyGTrDY,6156
148
- src/linters/magic_numbers/linter.py,sha256=JoguQjpWNt1Xp818HuzzCdTv9RqVKQoZXy6fFK8zk0o,17023
159
+ src/linters/magic_numbers/linter.py,sha256=ML-DOeBShEXwt0VUVHr6uwS8ssJ2FhR7BGkJQ8q8Hu8,19984
149
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
150
162
  src/linters/magic_numbers/typescript_analyzer.py,sha256=-2YPmNWXHJN8R2siV3pJk_3Baj-A9nnvQRpU35YBKgs,7519
151
163
  src/linters/magic_numbers/typescript_ignore_checker.py,sha256=9JWqtXd8KU_GCc_66KSZT2X7uQhNGpxE2ikOyjcLyao,2847
152
- src/linters/magic_numbers/violation_builder.py,sha256=SqIQv3N9lpP2GRC1TC5InrvaEdrAq24V7Ec2Xj5olb0,3308
164
+ src/linters/magic_numbers/violation_builder.py,sha256=ao366b7KiVthWTBzdQlBiCk-5hXjXVqgrsG3KTE-xhs,4188
153
165
  src/linters/method_property/__init__.py,sha256=t0C6zD5WLm-McgmvVajQJg4HQfOi7_4YzNLhKNA484w,1415
154
166
  src/linters/method_property/config.py,sha256=_TbUc0piC1FeW3qsw4hYryzWPUOq_laia_QNLe1Y0aw,5529
155
167
  src/linters/method_property/linter.py,sha256=9pgUEIK7ASZVwtsRVOg3U0k-GR0lHSLpUv_1TnIcZPA,12700
@@ -157,11 +169,12 @@ src/linters/method_property/python_analyzer.py,sha256=uyNUJHxACw01Z1Uz6lRUPe753M
157
169
  src/linters/method_property/violation_builder.py,sha256=A7SwZWlVG_7W5pJiHOvIroI2q4UuOQNryOYvmX3APLs,4251
158
170
  src/linters/nesting/__init__.py,sha256=tszmyCEQMpEwB5H84WcAUfRYDQl7jpsn04es5DtAHsM,3200
159
171
  src/linters/nesting/config.py,sha256=PfPA2wJn3i6HHXeM0qu6Qx-v1KJdRwlRkFOdpf7NhS8,2405
160
- src/linters/nesting/linter.py,sha256=bn5aPlxKZNw3T2LsOSfZUK_shkxcsdUS_LtFVsGJexk,6622
172
+ src/linters/nesting/linter.py,sha256=ybNcwIYFGHnvXlMUrgSs0NVtno_L0F7R1OLkOpDc0rc,8491
161
173
  src/linters/nesting/python_analyzer.py,sha256=ZaZuFErwpyEG3G0O5LqYwWn7Kmae9mqB8GCSRHSkjmU,5344
174
+ src/linters/nesting/rust_analyzer.py,sha256=fDGNlNioTF02Q5M2DaCzF-78ztKjUjPCjTR07uCu0kQ,3917
162
175
  src/linters/nesting/typescript_analyzer.py,sha256=70TsjP3EJWiHJ1ncMaveFE0e9_HdukWZr9LM0_MDXr8,3639
163
176
  src/linters/nesting/typescript_function_extractor.py,sha256=dDB1otJnFMCo-Pj4mTr4gekKe7V4ArOAtX6gV0dBDc4,4494
164
- 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
165
178
  src/linters/performance/__init__.py,sha256=UXJwfTk2ZCBqdy0Rtqcn2rMffWXXauq14oNMPtJDO3o,3118
166
179
  src/linters/performance/config.py,sha256=TmOdKtbrYx8POzFx_7fkgWfHcri2oBIXsm4V9FqkAek,1458
167
180
  src/linters/performance/constants.py,sha256=WBiSCOMGNd01o5D0M95Lyx_liZAd3zBkIPu7ZXzcW3M,1127
@@ -180,12 +193,13 @@ src/linters/print_statements/python_analyzer.py,sha256=48IDRQEv861B90qCl5w8ASxcX
180
193
  src/linters/print_statements/typescript_analyzer.py,sha256=EFE3bjRENvCPEYmNNxZ4jiq1VCA-rEUAJ_VFWJApLqY,4935
181
194
  src/linters/print_statements/violation_builder.py,sha256=Vs5m3AnWjrQqQHf6JJDaPP5B1V3YNl5pepG_oiTJnx4,3333
182
195
  src/linters/srp/__init__.py,sha256=GbhaSB2_AYY-mWgG_ThbyAcDXoVZuB5eLzguoShf38w,3367
183
- src/linters/srp/class_analyzer.py,sha256=tZ6xAT0Y7LkzeVlGHckQRhFdnssuetUYxTQdUHwBoCo,4045
196
+ src/linters/srp/class_analyzer.py,sha256=7qYxjGT3zDyVNmW9ide-w6iVBLeIyFVhQK4rLQNth_8,5820
184
197
  src/linters/srp/config.py,sha256=hTxrM21HIOmg0sM6eJ_h3hRnuxqRZEgs13Ie97-PDr4,3397
185
198
  src/linters/srp/heuristics.py,sha256=hMWRdTJoIY-T0s7ruB6ju27RPBJCATMiUvLZXzQvTsY,4229
186
- src/linters/srp/linter.py,sha256=ut6k8QDb4P2CXHl5Jnem0eFBN2lxcvsRyGnnQqMZL8w,7660
199
+ src/linters/srp/linter.py,sha256=t0QuSrmQDxoKPDLPFk9ezbk5oY2Z-5TfVNT5VeipUp0,8512
187
200
  src/linters/srp/metrics_evaluator.py,sha256=Prk_dPacas_dX7spAzV0g734srmzT5u0t5d4mTG9g2o,1606
188
201
  src/linters/srp/python_analyzer.py,sha256=PH27l38BFPNmj22Z10QDBioLDCZ4xpJFzBfTh_4XMZ4,3585
202
+ src/linters/srp/rust_analyzer.py,sha256=QsA9DzjxYJd1azeclyIgyCCtKq-0Bb8RZxc9VPQh0OE,7049
189
203
  src/linters/srp/typescript_analyzer.py,sha256=Wi0P_G1v5AnZYtMN3sNm1iHva84-8Kep2LZ5RmAS4c4,2885
190
204
  src/linters/srp/typescript_metrics_calculator.py,sha256=cDaHlnzMgFSTd2Sn5-tldR2HS6P8GMv4Qptep6PJozw,4093
191
205
  src/linters/srp/violation_builder.py,sha256=jaIjVtRYWUTs1SVJVwd0FxCojo0DxhPzfhyfMKmAroM,3881
@@ -217,14 +231,19 @@ src/linters/stringly_typed/typescript/analyzer.py,sha256=iNEk6wQJJfmJoRTXx29GEeq
217
231
  src/linters/stringly_typed/typescript/call_tracker.py,sha256=NPRpjqTe-Owi3_qJk_baojAazqaL6EsH4E2SIOsUAjU,11299
218
232
  src/linters/stringly_typed/typescript/comparison_tracker.py,sha256=TiEldIqppu6i2XYd9a040HK0U4cy7IFf6Qjjlb93wAA,12573
219
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
220
239
  src/orchestrator/__init__.py,sha256=XXLDJq2oaB-TpP2Y97GRnde9EkITGuFCmuLrDfxI9nY,245
221
240
  src/orchestrator/core.py,sha256=rt3h-YFgF1aAFeKvTa0PP7k_8zfwpeGIqrIxKuyckxY,17683
222
241
  src/orchestrator/language_detector.py,sha256=ALt2BEZKXQM2dWr1ChF9lZVj83YF4Bl9xwrB9ezfmMc,2799
223
- src/templates/thailint_config_template.yaml,sha256=57ZtLxnIoOHtR5Ejq3clb4nhY9J4n6h36XFb79ZZPlc,12020
242
+ src/templates/thailint_config_template.yaml,sha256=THQCYMMyjOERkGReb3G_KXtLNULW3eaI88BelHgONbo,14975
224
243
  src/utils/__init__.py,sha256=NiBtKeQ09Y3kuUzeN4O1JNfUIYPQDS2AP1l5ODq-Dec,125
225
244
  src/utils/project_root.py,sha256=aaxUM-LQ1okrPClmZWPFd_D09W3V1ArgJiidEEp_eU8,6262
226
- thailint-0.16.0.dist-info/METADATA,sha256=Q5acUtAfA1CtsNVOj3tdeyU8Ly05QycjyDW6QXBD7Pk,7381
227
- thailint-0.16.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
228
- thailint-0.16.0.dist-info/entry_points.txt,sha256=DNoGUlxpaMFqxQDgHp1yeGqohOjdFR-kH19uHYi3OUY,72
229
- thailint-0.16.0.dist-info/licenses/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
230
- thailint-0.16.0.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,,