thailint 0.15.1__tar.gz → 0.15.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thailint-0.15.1 → thailint-0.15.2}/PKG-INFO +3 -3
- {thailint-0.15.1 → thailint-0.15.2}/README.md +2 -2
- {thailint-0.15.1 → thailint-0.15.2}/pyproject.toml +1 -1
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/heuristics.py +47 -14
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/typescript_metrics_calculator.py +34 -10
- {thailint-0.15.1 → thailint-0.15.2}/CHANGELOG.md +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/LICENSE +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/analyzers/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/analyzers/ast_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/analyzers/rust_base.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/analyzers/rust_context.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/analyzers/typescript_base.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/api.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/__main__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/config_merge.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/code_patterns.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/code_smells.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/documentation.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/performance.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/shared.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/structure.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/linters/structure_quality.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/main.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli/utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/cli_main.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/base.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/cli_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/config_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/constants.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/linter_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/python_lint_rule.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/registry.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/rule_discovery.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/types.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/core/violation_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/formatters/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/formatters/sarif.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/directive_markers.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/ignore.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/loader.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/pattern_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linter_config/rule_matcher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/any_all_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/ast_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/continue_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/filter_map_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/collection_pipeline/suggestion_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/function_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/input_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/output_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/types.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/typescript_cqs_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/typescript_function_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/typescript_input_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/typescript_output_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/cqs/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/base_token_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/block_filter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/block_grouper.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/cache.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/cache_query.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/config_loader.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/constant.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/constant_matcher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/constant_violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/deduplicator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/duplicate_storage.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/file_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/inline_ignore.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/python_constant_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/single_statement_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/storage_initializer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/token_hasher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/typescript_constant_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/typescript_statement_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/typescript_value_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/violation_filter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/dry/violation_generator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/atemporal_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/base_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/bash_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/css_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/field_validator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/markdown_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/python_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/typescript_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_header/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/config_loader.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/directory_matcher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/path_resolver.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/pattern_matcher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/pattern_validator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/rule_checker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/file_placement/violation_factory.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/directive_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/header_parser.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/matcher.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/rule_id_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/skip_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/types.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lazy_ignores/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/base.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/dict_key_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/division_check_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/file_exists_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/hasattr_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/isinstance_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/len_check_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/none_check_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/string_validator_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/context_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/typescript_ignore_checker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/magic_numbers/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/method_property/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/method_property/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/method_property/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/method_property/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/method_property/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/typescript_function_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/nesting/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/constants.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/regex_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/regex_linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/performance/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/print_statements/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/class_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/metrics_evaluator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/typescript_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/srp/violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stateless_class/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stateless_class/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stateless_class/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stateless_class/python_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/config.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/context_filter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/function_call_violation_builder.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/ignore_checker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/ignore_utils.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/linter.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/call_tracker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/comparison_tracker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/condition_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/conditional_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/constants.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/match_analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/validation_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/variable_extractor.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/storage.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/storage_initializer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/typescript/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/typescript/analyzer.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/typescript/call_tracker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/typescript/comparison_tracker.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/violation_generator.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/orchestrator/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/orchestrator/core.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/orchestrator/language_detector.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/templates/thailint_config_template.yaml +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/utils/__init__.py +0 -0
- {thailint-0.15.1 → thailint-0.15.2}/src/utils/project_root.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thailint
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.2
|
|
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
|
|
@@ -38,7 +38,7 @@ Description-Content-Type: text/markdown
|
|
|
38
38
|
|
|
39
39
|
[](https://opensource.org/licenses/MIT)
|
|
40
40
|
[](https://www.python.org/downloads/)
|
|
41
|
-
[](https://pypi.org/project/thailint/)
|
|
42
42
|
[](https://thai-lint.readthedocs.io/)
|
|
43
43
|
|
|
44
44
|
**The AI Linter** - Catch the mistakes AI coding assistants keep making.
|
|
@@ -48,7 +48,7 @@ thailint detects anti-patterns that AI tools frequently introduce: duplicate cod
|
|
|
48
48
|
## Installation
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
pip install
|
|
51
|
+
pip install thailint
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
Or with Docker:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
4
|
[](https://www.python.org/downloads/)
|
|
5
|
-
[](https://pypi.org/project/thailint/)
|
|
6
6
|
[](https://thai-lint.readthedocs.io/)
|
|
7
7
|
|
|
8
8
|
**The AI Linter** - Catch the mistakes AI coding assistants keep making.
|
|
@@ -12,7 +12,7 @@ thailint detects anti-patterns that AI tools frequently introduce: duplicate cod
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
pip install
|
|
15
|
+
pip install thailint
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
Or with Docker:
|
|
@@ -17,7 +17,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
17
17
|
|
|
18
18
|
[tool.poetry]
|
|
19
19
|
name = "thailint"
|
|
20
|
-
version = "0.15.
|
|
20
|
+
version = "0.15.2"
|
|
21
21
|
description = "The AI Linter - Enterprise-grade linting and governance for AI-generated code across multiple languages"
|
|
22
22
|
authors = ["Steve Jackson"]
|
|
23
23
|
license = "MIT"
|
|
@@ -4,12 +4,13 @@ Purpose: SRP detection heuristics for analyzing code complexity and responsibili
|
|
|
4
4
|
Scope: Helper functions for method counting, LOC calculation, and keyword detection
|
|
5
5
|
|
|
6
6
|
Overview: Provides heuristic-based analysis functions for detecting Single Responsibility
|
|
7
|
-
Principle violations. Implements method counting that excludes property decorators
|
|
8
|
-
special methods. Provides LOC calculation that filters out blank
|
|
9
|
-
Includes keyword detection for identifying generic class names that
|
|
10
|
-
violations (Manager, Handler, etc.). Supports both Python AST and
|
|
11
|
-
nodes. These heuristics enable practical SRP detection without
|
|
12
|
-
analysis, focusing on measurable code metrics that correlate
|
|
7
|
+
Principle violations. Implements method counting that excludes property decorators,
|
|
8
|
+
private methods, and special methods. Provides LOC calculation that filters out blank
|
|
9
|
+
lines and comments. Includes keyword detection for identifying generic class names that
|
|
10
|
+
often indicate SRP violations (Manager, Handler, etc.). Supports both Python AST and
|
|
11
|
+
TypeScript tree-sitter nodes. These heuristics enable practical SRP detection without
|
|
12
|
+
requiring perfect semantic analysis, focusing on measurable code metrics that correlate
|
|
13
|
+
with responsibility scope.
|
|
13
14
|
|
|
14
15
|
Dependencies: ast module for Python AST analysis, typing for type hints
|
|
15
16
|
|
|
@@ -24,23 +25,55 @@ import ast
|
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
def count_methods(class_node: ast.ClassDef) -> int:
|
|
27
|
-
"""Count methods in a class (excludes properties and
|
|
28
|
+
"""Count public methods in a class (excludes properties and private methods).
|
|
29
|
+
|
|
30
|
+
Private methods are those starting with underscore (_), including dunder
|
|
31
|
+
methods (__init__, __str__, etc.). This focuses SRP analysis on the public
|
|
32
|
+
interface rather than implementation details.
|
|
28
33
|
|
|
29
34
|
Args:
|
|
30
35
|
class_node: AST node representing a class definition
|
|
31
36
|
|
|
32
37
|
Returns:
|
|
33
|
-
Number of methods in the class
|
|
38
|
+
Number of public methods in the class
|
|
34
39
|
"""
|
|
35
|
-
methods = 0
|
|
36
40
|
func_nodes = (
|
|
37
41
|
n for n in class_node.body if isinstance(n, (ast.FunctionDef, ast.AsyncFunctionDef))
|
|
38
42
|
)
|
|
39
|
-
for
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
public_methods = [n for n in func_nodes if _is_countable_method(n)]
|
|
44
|
+
return len(public_methods)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _is_countable_method(node: ast.FunctionDef | ast.AsyncFunctionDef) -> bool:
|
|
48
|
+
"""Check if a method should be counted (public and not a property).
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
node: Function AST node
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
True if method should be counted
|
|
55
|
+
"""
|
|
56
|
+
if has_property_decorator(node):
|
|
57
|
+
return False
|
|
58
|
+
if _is_private_method(node.name):
|
|
59
|
+
return False
|
|
60
|
+
return True
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _is_private_method(method_name: str) -> bool:
|
|
64
|
+
"""Check if method is private (starts with underscore).
|
|
65
|
+
|
|
66
|
+
This includes both single underscore (_helper) and dunder methods
|
|
67
|
+
(__init__, __str__). All underscore-prefixed methods are considered
|
|
68
|
+
implementation details.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
method_name: Name of the method to check
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
True if method is private, False otherwise
|
|
75
|
+
"""
|
|
76
|
+
return method_name.startswith("_")
|
|
44
77
|
|
|
45
78
|
|
|
46
79
|
def count_loc(class_node: ast.ClassDef, source: str) -> int:
|
|
@@ -4,9 +4,10 @@ Purpose: TypeScript class metrics calculation for SRP analysis
|
|
|
4
4
|
Scope: Calculates method count and lines of code for TypeScript classes
|
|
5
5
|
|
|
6
6
|
Overview: Provides metrics calculation functionality for TypeScript classes in SRP analysis. Counts
|
|
7
|
-
public methods in class bodies (excludes constructors
|
|
8
|
-
positions, and identifies class body nodes. Uses
|
|
9
|
-
calculation from class analysis and tree
|
|
7
|
+
public methods in class bodies (excludes constructors and private methods starting with _),
|
|
8
|
+
calculates lines of code from AST node positions, and identifies class body nodes. Uses
|
|
9
|
+
tree-sitter AST node types. Isolates metrics calculation from class analysis and tree
|
|
10
|
+
traversal logic.
|
|
10
11
|
|
|
11
12
|
Dependencies: typing
|
|
12
13
|
|
|
@@ -72,22 +73,45 @@ def _get_class_body(class_node: Any) -> Any:
|
|
|
72
73
|
|
|
73
74
|
|
|
74
75
|
def _is_countable_method(node: Any) -> bool:
|
|
75
|
-
"""Check if node is a method that should be counted.
|
|
76
|
+
"""Check if node is a public method that should be counted.
|
|
77
|
+
|
|
78
|
+
Excludes constructors and private methods (names starting with _).
|
|
76
79
|
|
|
77
80
|
Args:
|
|
78
81
|
node: Tree-sitter node to check
|
|
79
82
|
|
|
80
83
|
Returns:
|
|
81
|
-
True if node is a countable method
|
|
84
|
+
True if node is a countable public method
|
|
82
85
|
"""
|
|
83
86
|
if node.type != "method_definition":
|
|
84
87
|
return False
|
|
85
88
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
method_name = _get_method_name(node)
|
|
90
|
+
|
|
91
|
+
# Don't count constructors
|
|
92
|
+
if method_name == "constructor":
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
# Don't count private methods (underscore prefix convention)
|
|
96
|
+
if method_name and method_name.startswith("_"):
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _get_method_name(node: Any) -> str | None:
|
|
103
|
+
"""Extract method name from method_definition node.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
node: Method definition tree-sitter node
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
Method name or None if not found
|
|
110
|
+
"""
|
|
111
|
+
for child in node.children:
|
|
112
|
+
if child.type == "property_identifier":
|
|
113
|
+
return child.text.decode()
|
|
114
|
+
return None
|
|
91
115
|
|
|
92
116
|
|
|
93
117
|
# Legacy class wrapper for backward compatibility
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/division_check_detector.py
RENAMED
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/file_exists_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/isinstance_detector.py
RENAMED
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/len_check_detector.py
RENAMED
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/none_check_detector.py
RENAMED
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/lbyl/pattern_detectors/string_validator_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/function_call_violation_builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/condition_extractor.py
RENAMED
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/conditional_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/python/validation_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thailint-0.15.1 → thailint-0.15.2}/src/linters/stringly_typed/typescript/comparison_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|