thailint 0.1.6__py3-none-any.whl → 0.2.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 (68) hide show
  1. src/__init__.py +7 -2
  2. src/analyzers/__init__.py +23 -0
  3. src/analyzers/typescript_base.py +148 -0
  4. src/api.py +1 -1
  5. src/cli.py +498 -141
  6. src/config.py +6 -31
  7. src/core/base.py +12 -0
  8. src/core/cli_utils.py +206 -0
  9. src/core/config_parser.py +99 -0
  10. src/core/linter_utils.py +168 -0
  11. src/core/registry.py +17 -92
  12. src/core/rule_discovery.py +132 -0
  13. src/core/violation_builder.py +122 -0
  14. src/linter_config/ignore.py +112 -40
  15. src/linter_config/loader.py +3 -13
  16. src/linters/dry/__init__.py +23 -0
  17. src/linters/dry/base_token_analyzer.py +76 -0
  18. src/linters/dry/block_filter.py +262 -0
  19. src/linters/dry/block_grouper.py +59 -0
  20. src/linters/dry/cache.py +218 -0
  21. src/linters/dry/cache_query.py +61 -0
  22. src/linters/dry/config.py +130 -0
  23. src/linters/dry/config_loader.py +44 -0
  24. src/linters/dry/deduplicator.py +120 -0
  25. src/linters/dry/duplicate_storage.py +126 -0
  26. src/linters/dry/file_analyzer.py +127 -0
  27. src/linters/dry/inline_ignore.py +140 -0
  28. src/linters/dry/linter.py +170 -0
  29. src/linters/dry/python_analyzer.py +517 -0
  30. src/linters/dry/storage_initializer.py +51 -0
  31. src/linters/dry/token_hasher.py +115 -0
  32. src/linters/dry/typescript_analyzer.py +590 -0
  33. src/linters/dry/violation_builder.py +74 -0
  34. src/linters/dry/violation_filter.py +91 -0
  35. src/linters/dry/violation_generator.py +174 -0
  36. src/linters/file_placement/config_loader.py +86 -0
  37. src/linters/file_placement/directory_matcher.py +80 -0
  38. src/linters/file_placement/linter.py +252 -472
  39. src/linters/file_placement/path_resolver.py +61 -0
  40. src/linters/file_placement/pattern_matcher.py +55 -0
  41. src/linters/file_placement/pattern_validator.py +106 -0
  42. src/linters/file_placement/rule_checker.py +229 -0
  43. src/linters/file_placement/violation_factory.py +177 -0
  44. src/linters/nesting/config.py +13 -3
  45. src/linters/nesting/linter.py +76 -152
  46. src/linters/nesting/typescript_analyzer.py +38 -102
  47. src/linters/nesting/typescript_function_extractor.py +130 -0
  48. src/linters/nesting/violation_builder.py +139 -0
  49. src/linters/srp/__init__.py +99 -0
  50. src/linters/srp/class_analyzer.py +113 -0
  51. src/linters/srp/config.py +76 -0
  52. src/linters/srp/heuristics.py +89 -0
  53. src/linters/srp/linter.py +225 -0
  54. src/linters/srp/metrics_evaluator.py +47 -0
  55. src/linters/srp/python_analyzer.py +72 -0
  56. src/linters/srp/typescript_analyzer.py +75 -0
  57. src/linters/srp/typescript_metrics_calculator.py +90 -0
  58. src/linters/srp/violation_builder.py +117 -0
  59. src/orchestrator/core.py +42 -7
  60. src/utils/__init__.py +4 -0
  61. src/utils/project_root.py +84 -0
  62. {thailint-0.1.6.dist-info → thailint-0.2.0.dist-info}/METADATA +414 -63
  63. thailint-0.2.0.dist-info/RECORD +75 -0
  64. src/.ai/layout.yaml +0 -48
  65. thailint-0.1.6.dist-info/RECORD +0 -28
  66. {thailint-0.1.6.dist-info → thailint-0.2.0.dist-info}/LICENSE +0 -0
  67. {thailint-0.1.6.dist-info → thailint-0.2.0.dist-info}/WHEEL +0 -0
  68. {thailint-0.1.6.dist-info → thailint-0.2.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,75 @@
1
+ src/__init__.py,sha256=f601zncODr2twrUHqTLS5wyOdZqZi9tMjAe2INhRKqU,2175
2
+ src/analyzers/__init__.py,sha256=fFloZtjkBGwYbAhKTxS3Qy3yDr2_3i3WSfKTw1mAioo,972
3
+ src/analyzers/typescript_base.py,sha256=4I7fAcMOAY9vY1AXh52QpohgFmguBECwOkvBRP4zCS4,5054
4
+ src/api.py,sha256=pJ5l3qxccKBEY-BkANwzTgLAl1ZFq7OP6hx6LSxbhDw,4664
5
+ src/cli.py,sha256=ihsUtuUSBnaxDZx1TqGVATIRa5ccfXZXyyyt615SU0M,31608
6
+ src/config.py,sha256=VCnsguO4BRTYlzmaD6lYJwgJNPcsquDg7P2Tn6Xa5nk,12333
7
+ src/core/__init__.py,sha256=5FtsDvhMt4SNRx3pbcGURrxn135XRbeRrjSUxiXwkNc,381
8
+ src/core/base.py,sha256=cFnFSK0K7JqYiXA31lr0JAKRoxvytdqzmlFpCz1tUJI,4787
9
+ src/core/cli_utils.py,sha256=rYOJz4mnr8RLP-nJdHOy-GJyxGNqkWtK3_rvKriHXj4,6083
10
+ src/core/config_parser.py,sha256=0PfLNSC0awV21SrpqdcJ2L8Cn2-B2YcwbA8znaC5YnE,3195
11
+ src/core/linter_utils.py,sha256=4jmC2YfpPvGhS_XHlHXa5SBIJh9CQlNj5zuW_GpdPKc,5273
12
+ src/core/registry.py,sha256=IMkic1ukmo8HCX1TY5YoKjwKT_IT-ZmVx6sdntC5X2M,3289
13
+ src/core/rule_discovery.py,sha256=smxJ9PEyMqEAIicsWaHOaSHD1PHUAOeFZT_a3DNRwgE,4163
14
+ src/core/types.py,sha256=dIYLaCDNtCAzVaplx5S5yxywkLIuX0BN9No_l2zCfV0,2887
15
+ src/core/violation_builder.py,sha256=7AQODqxwc3qp_4m1MPzknkeNGlht1LsDjPsTPpWAGJY,4678
16
+ src/linter_config/__init__.py,sha256=_I2VVlZlfKyT-tKukuUA5-aVcHLOe3m6C2cev43AiEc,298
17
+ src/linter_config/ignore.py,sha256=S2Ub0CCOOC-wpU5Y_EodMprciw18fgWcnp4z_h1MYNk,19638
18
+ src/linter_config/loader.py,sha256=HB09W-uVsEcgCbvUwUHS5Jm2n0bqBXA3744vMc4GAqk,2542
19
+ src/linters/__init__.py,sha256=-nnNsL8E5-2p9qlLKp_TaShHAjPH-NacOEU1sXmAR9k,77
20
+ src/linters/dry/__init__.py,sha256=p58tN3z_VbulfTkRm1kLZJ43Bemt66T2sro1teirUY8,826
21
+ src/linters/dry/base_token_analyzer.py,sha256=SgnsX4a4kUzOsA9hTkLkg4yB8I77ewAyiUp6cAybUrg,2684
22
+ src/linters/dry/block_filter.py,sha256=_ooo5g3PJMUUua_0-eu5NE9dFpEK42ZiundkzYQNyyY,8116
23
+ src/linters/dry/block_grouper.py,sha256=gBvSPgy8jumChZ53px3P7hDCJfi5PDrKhwxLTgNy7ig,1810
24
+ src/linters/dry/cache.py,sha256=QTQY5TSFU2OFFqua-uxazFzzylgkVawHTOyS3S5qdO8,6957
25
+ src/linters/dry/cache_query.py,sha256=NTBh4ISy76LJb9tJ6G94fE0R2OiE0eQ-zVvB08WG2bA,1802
26
+ src/linters/dry/config.py,sha256=CEcYK3SXZJP0kekiuX5us15xwCXDuU0k289A8vDV5Qs,5244
27
+ src/linters/dry/config_loader.py,sha256=wikqnigOp6p1h9jaAATV_3bDXSiaIUFaf9xg1jQMDpo,1313
28
+ src/linters/dry/deduplicator.py,sha256=a1TRvldxCszf5QByo1ihXF3W98dpGuyaRT74jPfQftM,3988
29
+ src/linters/dry/duplicate_storage.py,sha256=K-FDuFrRvSocSbFp-OuiTjOE36IKsy_8St0n30bHeuk,4376
30
+ src/linters/dry/file_analyzer.py,sha256=7bmXPMERsiI9uMVzuDYRzGVxdCeBxNM8txPLcveMLAY,4070
31
+ src/linters/dry/inline_ignore.py,sha256=ASfA-fp_1aPpkakN2e0T6qdTh8S7Jqj89ovxXJLmFlc,4439
32
+ src/linters/dry/linter.py,sha256=EmwDvjkapeoxazlkzC_FGcloftTUJYn5SuAO-tb_c1E,6127
33
+ src/linters/dry/python_analyzer.py,sha256=OdSemHuWiXofHUhZzFDRNJmO-BoOTbgsAG1gP80jcZQ,20937
34
+ src/linters/dry/storage_initializer.py,sha256=8FQPhnTOkU52QUrJVSH4qIo2v2uxwlp0X-KPmwqKnIU,1727
35
+ src/linters/dry/token_hasher.py,sha256=mCFuP0FQFALyKghBgZHcspsoOxgT7C7ZkfspnhFA5U4,3609
36
+ src/linters/dry/typescript_analyzer.py,sha256=n1rsQYp7nuPhgErbG8hWawkywRz-iFGhrGlQXDrIa14,21494
37
+ src/linters/dry/violation_builder.py,sha256=EUiEQIOZjzAoHEqZiIR8WZP8m4dgqJjcveR5mdMyClI,2803
38
+ src/linters/dry/violation_filter.py,sha256=lco3Gyt6qhxKMKQvNxdtoWsO03J9HicjCWg_gicEOAc,3013
39
+ src/linters/dry/violation_generator.py,sha256=cc6aKvTxtHSZm0F7Y-gL1bmD3JUphRmAvcbqk9aUzGg,6128
40
+ src/linters/file_placement/__init__.py,sha256=vJ43GZujcbAk-K3DwfsQZ0J3yP_5G35CKssatLyntXk,862
41
+ src/linters/file_placement/config_loader.py,sha256=Of5sTG2S-04efn3KOlXrSxpMcC1ipBpSvCjtJOMmWno,2640
42
+ src/linters/file_placement/directory_matcher.py,sha256=YaBeLGiT4bgqN_v4FmEmSASOBxkMC1lyEYpL17wLIDY,2607
43
+ src/linters/file_placement/linter.py,sha256=r3wnfGkss6HsPCqxQjBZ1dvyZdNdxppbSu9VRh0PMzw,13802
44
+ src/linters/file_placement/path_resolver.py,sha256=S6g7xOYsoSc0O_RDJh8j4Z2klcwzp16rSUfEAErGOTI,1972
45
+ src/linters/file_placement/pattern_matcher.py,sha256=3HZWYgQKXz_y13z3lO1YHn51khCaiGOrneGxKXGWGw0,1898
46
+ src/linters/file_placement/pattern_validator.py,sha256=eMt5GB5lgJMhhQACOlfDXQFfSfNrOY-wJN1JanGka6Q,3717
47
+ src/linters/file_placement/rule_checker.py,sha256=JONXcaYxZ8CM_7Zg6Th01p5cve1rJ8YkReAUJ44nfUg,7795
48
+ src/linters/file_placement/violation_factory.py,sha256=NkQmBcgpa3g3W2ZdFZNQ5djLVP4x9OKs65d7F1rCKvM,6040
49
+ src/linters/nesting/__init__.py,sha256=zBxZJPhxTO91ezWwXJ72wyxUS7i8t6lehjlJFJKRYvA,3134
50
+ src/linters/nesting/config.py,sha256=qU66jynd_GDVwFRFpk2S2--MhmLPoPdw1hj7oKpgoB0,2265
51
+ src/linters/nesting/linter.py,sha256=Mtbdbp-0rrfg4FMCt8Q8V78J-fEpgqUzE4qjIxJPiIE,6623
52
+ src/linters/nesting/python_analyzer.py,sha256=DF2lVnxYstakOpP_Zizox583Ypkb4eUpgQYEpu6x8gk,3078
53
+ src/linters/nesting/typescript_analyzer.py,sha256=up1Cf6W-NYCMZSX9YOvS2Uxm7-XrLtAi94lvL9UDemo,3774
54
+ src/linters/nesting/typescript_function_extractor.py,sha256=dDB1otJnFMCo-Pj4mTr4gekKe7V4ArOAtX6gV0dBDc4,4494
55
+ src/linters/nesting/violation_builder.py,sha256=sMHS45F2lrA1WYrG3Uug8HfeRPljnXcyJPHSe2F76Bs,4828
56
+ src/linters/srp/__init__.py,sha256=P3yHH57xUMVYncZ8kEkERbRn01AxDE9dColmYQqmbNU,3259
57
+ src/linters/srp/class_analyzer.py,sha256=wuwviwhN1F_VVPaQ3pZvffmY3e9ToxPNJhv6BjhsgZc,3761
58
+ src/linters/srp/config.py,sha256=idaPWd8QBFutzFgOYEg358s5inxqDlVmNqclm3Qvku4,3116
59
+ src/linters/srp/heuristics.py,sha256=Fwrro3I0qOV4o0epM0ZkqgQUU9bK1b2igxoxWjReljU,3185
60
+ src/linters/srp/linter.py,sha256=E23NPYpjHtu6JhyuJmE0ECy8mPWXJb-6uw2RVZoczqI,7404
61
+ src/linters/srp/metrics_evaluator.py,sha256=Prk_dPacas_dX7spAzV0g734srmzT5u0t5d4mTG9g2o,1606
62
+ src/linters/srp/python_analyzer.py,sha256=hA1gtiLJISier6B3rHJX5EkimQc8FJapy-XNtR7xaBQ,2621
63
+ src/linters/srp/typescript_analyzer.py,sha256=Wi0P_G1v5AnZYtMN3sNm1iHva84-8Kep2LZ5RmAS4c4,2885
64
+ src/linters/srp/typescript_metrics_calculator.py,sha256=2VLRux_tf1Cw645wwTuol3Z5A6-mkl4cgyW34myy00Q,2728
65
+ src/linters/srp/violation_builder.py,sha256=jaIjVtRYWUTs1SVJVwd0FxCojo0DxhPzfhyfMKmAroM,3881
66
+ src/orchestrator/__init__.py,sha256=XXLDJq2oaB-TpP2Y97GRnde9EkITGuFCmuLrDfxI9nY,245
67
+ src/orchestrator/core.py,sha256=zb4H4HtDNLmnsRCUXI3oNtfM3T-nTPW9Q2pAbI61VEs,8374
68
+ src/orchestrator/language_detector.py,sha256=rHyVMApit80NTTNyDH1ObD1usKD8LjGmH3DwqNAWYGc,2736
69
+ src/utils/__init__.py,sha256=NiBtKeQ09Y3kuUzeN4O1JNfUIYPQDS2AP1l5ODq-Dec,125
70
+ src/utils/project_root.py,sha256=ldv2-XeMT0IElpSgrHdTaP2CUfwmdZix8vQ2qXO1O5s,2735
71
+ thailint-0.2.0.dist-info/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
72
+ thailint-0.2.0.dist-info/METADATA,sha256=LOyjWZxLKsp2XmpyY4Ix7r4fqXT-SICr6pl9K5_gK_I,27109
73
+ thailint-0.2.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
74
+ thailint-0.2.0.dist-info/entry_points.txt,sha256=l7DQJgU18sVLDpSaXOXY3lLhnQHQIRrSJZTQjG1cEAk,62
75
+ thailint-0.2.0.dist-info/RECORD,,
src/.ai/layout.yaml DELETED
@@ -1,48 +0,0 @@
1
- file-placement:
2
- directories:
3
- .ai:
4
- allow:
5
- - .*\\.(md|yaml|yml)$
6
- .roadmap:
7
- allow:
8
- - .*\\.md$
9
- docs:
10
- allow:
11
- - .*\\.(md|rst|txt|py)$
12
- deny:
13
- - ^(?!.*\\.(md|rst|txt|py)$).*
14
- src:
15
- allow:
16
- - .*\\.py$
17
- deny:
18
- - test_.*\\.py$
19
- - .*_test\\.py$
20
- tests:
21
- allow:
22
- - test_.*\\.py$
23
- - .*_test\\.py$
24
- - conftest\\.py$
25
- - __init__\\.py$
26
- deny:
27
- - ^(?!test_|.*_test\\.py|conftest\\.py|__init__\\.py).*\\.py$
28
- global_patterns:
29
- deny:
30
- - message: Python files should be in src/, tests/, scripts/, docs/, .ai/, or .roadmap/
31
- directories
32
- pattern: ^(?!src/|tests/|scripts/|docs/|\\.ai/|\\.roadmap/).*\\.py$
33
- ignore:
34
- - __pycache__/
35
- - '*.pyc'
36
- - .git/
37
- - .venv/
38
- - venv/
39
- - .pytest_cache/
40
- - .mypy_cache/
41
- - .ruff_cache/
42
- - htmlcov/
43
- - '*.egg-info/'
44
- - dist/
45
- - build/
46
- nesting:
47
- enabled: true
48
- max_nesting_depth: 3
@@ -1,28 +0,0 @@
1
- src/.ai/layout.yaml,sha256=yF79hvJOQDCm8Y75OpMfJzVr0ORR4n4MpokIh3Ff84w,953
2
- src/__init__.py,sha256=OZ5CvL4rDK07lxwyB9g6ZFTY8cxKWlDkdoMH103sHWY,2042
3
- src/api.py,sha256=C-Co8fjY8ewT0O5IttAX045Fhr34MuXz_YL0wT5Q0x4,4644
4
- src/cli.py,sha256=s11vSyouEY4Jqu6bx7QyP-jvIefpTOso-JpkpiK7Bhk,20409
5
- src/config.py,sha256=ANDs6EF3IQbwHyNEVWXbpnNQMEe9wDqP3Bm2w_4zTU8,13139
6
- src/core/__init__.py,sha256=5FtsDvhMt4SNRx3pbcGURrxn135XRbeRrjSUxiXwkNc,381
7
- src/core/base.py,sha256=x_3swLyVwaIjPgtCNisEFEuMR2caFAuV20izok5afN0,4323
8
- src/core/registry.py,sha256=wjrxmyVyh0qW9q5ZOTDfCwVStcE_hFlVv8s4eUiJ3P4,6208
9
- src/core/types.py,sha256=dIYLaCDNtCAzVaplx5S5yxywkLIuX0BN9No_l2zCfV0,2887
10
- src/linter_config/__init__.py,sha256=_I2VVlZlfKyT-tKukuUA5-aVcHLOe3m6C2cev43AiEc,298
11
- src/linter_config/ignore.py,sha256=Ffjq6zpjh15FrcoGxt09goXn67QmZb8E_stT4VQ4wls,16239
12
- src/linter_config/loader.py,sha256=o3-ezigI9K3o4w478eR6l0fLVVLBQ_t11WwpOvePUvA,2879
13
- src/linters/__init__.py,sha256=-nnNsL8E5-2p9qlLKp_TaShHAjPH-NacOEU1sXmAR9k,77
14
- src/linters/file_placement/__init__.py,sha256=vJ43GZujcbAk-K3DwfsQZ0J3yP_5G35CKssatLyntXk,862
15
- src/linters/file_placement/linter.py,sha256=xUD7Kb0aJNSj1Vc-sqTGTXUU5_cXxJcvkm1-OeKFHxk,21973
16
- src/linters/nesting/__init__.py,sha256=zBxZJPhxTO91ezWwXJ72wyxUS7i8t6lehjlJFJKRYvA,3134
17
- src/linters/nesting/config.py,sha256=SC-TbKvC_llhkU-_9sC7ya1K7fkH1nLf-1HUzbHXcs8,1755
18
- src/linters/nesting/linter.py,sha256=h5lVuWgXqanwjg6F9AuWkEdRqYDYWosXGyTZP0qfb7c,9529
19
- src/linters/nesting/python_analyzer.py,sha256=DF2lVnxYstakOpP_Zizox583Ypkb4eUpgQYEpu6x8gk,3078
20
- src/linters/nesting/typescript_analyzer.py,sha256=rec4N0NccB9mQ2452g2hcz521-kHxSr5uItjCt1DlLs,6870
21
- src/orchestrator/__init__.py,sha256=XXLDJq2oaB-TpP2Y97GRnde9EkITGuFCmuLrDfxI9nY,245
22
- src/orchestrator/core.py,sha256=6LqaDcSBlH-hJmTpPRDTMo-tHTzEwVRQg4sZ0wyKdE0,7092
23
- src/orchestrator/language_detector.py,sha256=rHyVMApit80NTTNyDH1ObD1usKD8LjGmH3DwqNAWYGc,2736
24
- thailint-0.1.6.dist-info/LICENSE,sha256=kxh1J0Sb62XvhNJ6MZsVNe8PqNVJ7LHRn_EWa-T3djw,1070
25
- thailint-0.1.6.dist-info/METADATA,sha256=HFsKO5KqCcnArj44bl71NlFcn9NqOANWf1zNAWV_ukE,17057
26
- thailint-0.1.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
27
- thailint-0.1.6.dist-info/entry_points.txt,sha256=l7DQJgU18sVLDpSaXOXY3lLhnQHQIRrSJZTQjG1cEAk,62
28
- thailint-0.1.6.dist-info/RECORD,,