lintro 0.23.1__tar.gz → 0.24.3__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.
- {lintro-0.23.1/lintro.egg-info → lintro-0.24.3}/PKG-INFO +3 -1
- lintro-0.24.3/docs/debugging.md +172 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/__init__.py +1 -1
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/config_loader.py +7 -2
- lintro-0.24.3/lintro/enums/display_column.py +35 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/__init__.py +2 -3
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/formatter.py +18 -54
- lintro-0.24.3/lintro/parsers/ruff/ruff_format_issue.py +24 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/base.py +13 -3
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/execution_preparation.py +3 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/file_discovery.py +3 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/subprocess_executor.py +41 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/bandit.py +1 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/mypy.py +2 -2
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/check.py +10 -8
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/native_parsers.py +48 -16
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/manager.py +6 -0
- {lintro-0.23.1 → lintro-0.24.3/lintro.egg-info}/PKG-INFO +3 -1
- {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/SOURCES.txt +6 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/requires.txt +2 -0
- {lintro-0.23.1 → lintro-0.24.3}/pyproject.toml +3 -1
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loader.py +65 -0
- lintro-0.24.3/tests/unit/formatters/test_format_issues.py +443 -0
- lintro-0.24.3/tests/unit/plugins/base/test_subprocess_streaming.py +163 -0
- lintro-0.24.3/tests/unit/tools/ruff/check/test_output_truncation.py +156 -0
- lintro-0.24.3/tests/unit/utils/test_native_parsers.py +186 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/utils/test_output_manager.py +41 -0
- lintro-0.23.1/lintro/parsers/ruff/ruff_format_issue.py +0 -18
- {lintro-0.23.1 → lintro-0.24.3}/LICENSE +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/MANIFEST.in +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/README.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/assets/images/coverage-badge.svg +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/assets/images/lintro.png +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/README.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/SHELL-SCRIPT-STYLE-GUIDE.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/ARCHITECTURE.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/README.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/ROADMAP.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/VISION.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/configuration.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/contributing.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/docker.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/getting-started.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/github-integration.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/lintro-self-use.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/plugins.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/security/assurance.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/security/requirements.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/style-guide.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/README.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/actionlint-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/bandit-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/biome-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/black-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/clippy-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/darglint-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/hadolint-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/markdownlint-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/mypy-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/prettier-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/pytest-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/ruff-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/yamllint-analysis.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/docs/troubleshooting.md +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/__main__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/ascii-art/fail.txt +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/ascii-art/success.txt +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/command_chainer.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/check.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/init.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/list_tools.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/test.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/versions.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/enforce_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/execution_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/lintro_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/tool_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/config/tool_config_generator.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/action.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/bandit_levels.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/boolean_string.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/config_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/config_key.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/darglint_strictness.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/env_bool.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/git_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/git_ref.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/group_by.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/hadolint_enums.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/hyphenated_str_enum.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/output_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/pytest_enums.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/severity_level.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_name.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_option_key.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_order.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_type.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tools_value.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/uppercase_str_enum.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/yamllint_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/exceptions/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/exceptions/errors.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/core/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/core/format_registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/csv.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/grid.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/html.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/json.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/markdown.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/plain.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/base_tool_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/black_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/prettier_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/pytest_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/ruff_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/tool_result.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/yamllint_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/bandit_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/bandit_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/base_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/base_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/biome_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/biome_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/black_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/black_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/clippy_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/clippy_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/darglint_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/darglint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/markdownlint_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/markdownlint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/mypy_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/mypy_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/prettier_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/prettier_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/format_parsers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/models.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/pytest_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/pytest_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/summary_extractor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/ruff_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/ruff_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/streaming.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/discovery.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/protocol.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/command_builders.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/config_injection.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/line_length_checker.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/option_spec.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/option_validators.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/runtime_discovery.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/timeout_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/tool_manager.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_checking.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_requirements.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/actionlint.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/biome.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/black.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/clippy.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/darglint.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/hadolint.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/markdownlint.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/prettier.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/pytest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/ruff.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/yamllint.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/collection.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/coverage_processor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/formatters.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/markers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/output_parsers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_command_builder.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_error_handler.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_executor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_handlers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_option_validators.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_output_processor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_result_processor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/test_analytics.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/commands.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/fix.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/ascii_normalize_cli.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/async_tool_executor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_priority.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_reporting.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_validation.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/logger.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/display_helpers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/exit_codes.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/parallel_executor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/tool_configuration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/file_cache.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/formatting.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/json_output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/logger_setup.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/file_writer.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/helpers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/parser_registration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/parser_registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/path_filtering.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/path_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/post_checks.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/result_formatters.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/streaming_output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/summary_tables.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_config_info.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_executor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/unified_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/unified_config_manager.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/dependency_links.txt +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/entry_points.txt +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/top_level.txt +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/setup.cfg +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/docker/Dockerfile.violations +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/github_actions/actionlint_violations.yml +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/yaml/yaml_violations.yml +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/javascript/biome/biome_violations.js +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/javascript/prettier/prettier_violations.js +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/bandit/bandit_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/darglint/darglint_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/mypy/mypy_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/pytest/pytest_clean.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/pytest/pytest_failures.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_annotations_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_black_e501_wrappable.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_bugbear_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_c4_comprehensions_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_clean.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_e501_f401_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_naming_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_sim_simplify_violations.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/cli/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/cli/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_cli.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_config_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_init_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/config/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_config_loader.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_init_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_lintro_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_tool_config_generator.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/formatters/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/formatters/test_formatters.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_actionlint_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_bandit_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_built_package.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_darglint_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_markdownlint_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_mypy_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_parallel_execution.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_bandit_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_black_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_mypy_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_prettier_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_ruff_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_ci_post_pr_comment.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_extract_version.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_encode.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_extract.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_find.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_semantic_release_compute_next.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_shell_scripts.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/test_documentation.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_check_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_commands.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_commands_more.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_lintro_group.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_programmatic.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_format_command.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_execute.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_group_commands.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_init.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_integration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_normalize_args.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_should_chain.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/commands/test_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/compatibility/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/compatibility/test_compatibility_ruff_black.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_compatibility.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loader_more.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loaders.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_tool_specific.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_enforce_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_execution_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_lintro_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_unified_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/core/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/core/test_version_requirements.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_bandit_levels.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_base.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_enum_normalizers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_output_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_tool_name.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/exceptions/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/exceptions/test_exceptions.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_csv.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_html.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_json.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_markdown.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_plain.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_common.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_csv.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_grid.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_html.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_json.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_markdown.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_plain.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/test_format_registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/test_console_logger.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/test_console_logger_more.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/output/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/output/test_output_manager_reports.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_continuation_lines.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_extract_fields.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_safe_parse.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_strip_ansi.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_validate_fields.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/pytest/test_pytest_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_collect.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_json_array.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_json_lines.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_parser_class.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_text_lines.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_actionlint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_bandit_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_base_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_base_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_biome_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_black_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_clippy_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_darglint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_hadolint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_markdownlint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_mypy_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_prettier_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_ruff_parser_additional.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_ruff_parser_more.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_yamllint_parser.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_execution.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_subprocess.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_base_plugin_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_discovery.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_cli_commands.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_cli_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_handlers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_programmatic_api.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_json_edge_cases.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_path_traversal.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_subprocess_injection.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/assertions/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/assertions/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/base/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_check_method.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_default_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_fix_method.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_set_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_timeout_handling.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_command_builders.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_line_length_checker.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_option_spec.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_option_validators.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_runtime_discovery.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_tool_options_spec.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_version_checking.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/darglint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/darglint/test_darglint_plugin.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_fmt_exclusion.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_more.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_post_checks.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_pytest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/test_execution.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/test_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/manager/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/manager/test_tool_manager.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/mypy/test_mypy_plugin.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_check_method.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_config_discovery.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_default_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_fix_method.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_output_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_set_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_timeout_handling.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_check_method.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_configuration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_json_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_junit_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_output_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_output_processing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_handlers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_issue.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_output_processor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_result_processor.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_set_options.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_text_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_validators.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_config_detection.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_error_handling.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_format_normalization.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_json_parsing.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_no_issues.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_output_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_path_filtering.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_real_plugin.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_timeout.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_with_issues.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_combined_issues.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_edge_cases.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_format_option.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_no_files.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_real_plugin.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_successful_fix.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_temporary_option.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_timeout.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_unsafe_fixes.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_version_check.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_common_behaviors.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_edge_cases.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_helpers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_plugin_definitions.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_tool_definitions.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_callbacks.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_exceptions.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_init.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_parallel_batches.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_run_tool_async.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_run_tools_parallel.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_shutdown.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/test_manager_configuration.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/test_manager_core.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/test_delegation.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/test_execution_summary.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_headers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_initialization.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_levels.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_metadata.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_output_methods.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_results.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_biome_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_config_constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_json_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_jsonc_comments.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_markdownlint_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_prettier_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_pyproject_tools.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_yamllint_config.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_common.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_csv.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_format.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_html.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_json.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_markdown.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_plain.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_helpers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_action_normalization.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_fix_action.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_fixable_hints.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_generic_output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_output_display.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_pytest_output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_ruff_formatting.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/test_display.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/test_safe_cast.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_ascii_normalize.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_ascii_normalize_cli.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_config_reporting.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_console_output_writer.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_display_helpers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_display_helpers_fallback.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_enums_and_normalizers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_file_cache.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_logger_setup.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_output_writers.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_parser_registry.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_path_filtering.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_path_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_streaming_output.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_timeout_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_tool_config_info.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_tool_utils.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/conftest.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_config_summary.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_consistency.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_constants.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_dataclasses.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_enums.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_injectable.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_line_length.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_nested_value.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_ordered_tools.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_tool_priority.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/utils/__init__.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/utils/test_formatting.py +0 -0
- {lintro-0.23.1 → lintro-0.24.3}/tests/utils/test_path_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lintro
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.3
|
|
4
4
|
Summary: A unified CLI tool for code formatting, linting, and quality assurance
|
|
5
5
|
Author-email: TurboCoder13 <turbocoder13@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -45,8 +45,10 @@ Requires-Dist: click==8.1.8
|
|
|
45
45
|
Requires-Dist: coverage-badge==1.1.2
|
|
46
46
|
Requires-Dist: darglint==1.8.1
|
|
47
47
|
Requires-Dist: loguru==0.7.3
|
|
48
|
+
Requires-Dist: packaging>=24.0
|
|
48
49
|
Requires-Dist: pathspec>=0.12.0
|
|
49
50
|
Requires-Dist: pydantic>=2.10.0
|
|
51
|
+
Requires-Dist: rich>=14.0.0
|
|
50
52
|
Requires-Dist: tabulate==0.9.0
|
|
51
53
|
Requires-Dist: yamllint==1.37.1
|
|
52
54
|
Requires-Dist: httpx==0.28.1
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Debugging Lintro
|
|
2
|
+
|
|
3
|
+
This guide explains how to use Lintro's logging system to diagnose issues.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Show DEBUG logs on console
|
|
9
|
+
lintro check --debug .
|
|
10
|
+
|
|
11
|
+
# Run with debug logging for a specific tool
|
|
12
|
+
lintro check --debug --tools ruff .
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Log Locations
|
|
16
|
+
|
|
17
|
+
### Console Output
|
|
18
|
+
|
|
19
|
+
| Mode | Log Level | What You See |
|
|
20
|
+
| --------- | --------- | ---------------------------------------------- |
|
|
21
|
+
| Default | WARNING+ | Tool failures, parse errors, permission issues |
|
|
22
|
+
| `--debug` | DEBUG+ | Full execution trace, commands, file counts |
|
|
23
|
+
|
|
24
|
+
### File Logs
|
|
25
|
+
|
|
26
|
+
Debug logs are always written to file, regardless of console verbosity:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
~/.lintro/run-<timestamp>/debug.log
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Each run creates a new timestamped directory containing:
|
|
33
|
+
|
|
34
|
+
- `debug.log` - Full DEBUG+ logs with timestamps
|
|
35
|
+
- Output files (JSON, CSV, etc.) if requested
|
|
36
|
+
|
|
37
|
+
### Log Rotation
|
|
38
|
+
|
|
39
|
+
- **Max files**: 5 rotated log files
|
|
40
|
+
- **Max size**: 100MB per file
|
|
41
|
+
- **Total**: Up to 500MB of logs retained
|
|
42
|
+
|
|
43
|
+
## Log Levels
|
|
44
|
+
|
|
45
|
+
| Level | When Used | Example |
|
|
46
|
+
| ------- | ------------------ | ----------------------------------------------- |
|
|
47
|
+
| DEBUG | Execution details | `[ruff] Ready: 45 files, timeout=30s` |
|
|
48
|
+
| WARNING | Recoverable issues | `Failed to parse .prettierrc: Unexpected token` |
|
|
49
|
+
| ERROR | Critical failures | `Command not found: ruff` |
|
|
50
|
+
|
|
51
|
+
## What Gets Logged
|
|
52
|
+
|
|
53
|
+
### Tool Execution (DEBUG)
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
[ruff] Preparing execution for 3 input paths
|
|
57
|
+
File discovery complete: 45 files matching ['*.py']
|
|
58
|
+
[ruff] Ready: 45 files, timeout=30s
|
|
59
|
+
Running subprocess: ruff check --output-format json... (timeout=30s, cwd=/project)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Subprocess Failures (DEBUG + WARNING)
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
# DEBUG - stderr preview on non-zero exit
|
|
66
|
+
Subprocess ruff exited with code 1, stderr: error: invalid config...
|
|
67
|
+
|
|
68
|
+
# WARNING - timeouts and missing commands
|
|
69
|
+
Subprocess ruff timed out after 30s
|
|
70
|
+
Command not found: ruff. Ensure it is installed and in PATH.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Config Parse Errors (WARNING)
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
Failed to parse JSON config .prettierrc: Expecting property name (line 5, col 3)
|
|
77
|
+
Failed to parse pyproject.toml at /project/pyproject.toml: Invalid value
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Permission Issues (WARNING)
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
Cannot write to /project/.lintro (permission denied), using fallback: /tmp/lintro/run-...
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Common Debug Scenarios
|
|
87
|
+
|
|
88
|
+
### Tool Not Running
|
|
89
|
+
|
|
90
|
+
**Symptom**: Tool shows "skipped" or doesn't appear in output.
|
|
91
|
+
|
|
92
|
+
**Debug**:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
lintro check --debug --tools <tool_name> .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Look for**:
|
|
99
|
+
|
|
100
|
+
- `Skipping <tool>: version check failed` - Tool not installed or wrong version
|
|
101
|
+
- `[<tool>] Early exit: No files to check` - No matching files found
|
|
102
|
+
- `Command not found: <tool>` - Tool binary not in PATH
|
|
103
|
+
|
|
104
|
+
### Silent Failures
|
|
105
|
+
|
|
106
|
+
**Symptom**: Tool reports ERROR status but no issues shown.
|
|
107
|
+
|
|
108
|
+
**Debug**:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
lintro check --debug .
|
|
112
|
+
# Then check the debug log
|
|
113
|
+
cat ~/.lintro/run-*/debug.log | grep -A5 "failed\|error\|stderr"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Look for**:
|
|
117
|
+
|
|
118
|
+
- `Subprocess <tool> exited with code N, stderr: ...` - Tool execution error
|
|
119
|
+
- `Failed to parse <config>` - Config file is malformed
|
|
120
|
+
|
|
121
|
+
### Slow Execution
|
|
122
|
+
|
|
123
|
+
**Symptom**: Lintro takes a long time or times out.
|
|
124
|
+
|
|
125
|
+
**Debug**:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
lintro check --debug .
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Look for**:
|
|
132
|
+
|
|
133
|
+
- `File discovery complete: N files` - Too many files being scanned?
|
|
134
|
+
- `Subprocess <tool> timed out after Ns` - Increase timeout with
|
|
135
|
+
`--tool-options tool:timeout=N`
|
|
136
|
+
|
|
137
|
+
### Config Not Applied
|
|
138
|
+
|
|
139
|
+
**Symptom**: Tool doesn't respect your config file.
|
|
140
|
+
|
|
141
|
+
**Debug**:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
lintro config --verbose
|
|
145
|
+
lintro check --debug .
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Look for**:
|
|
149
|
+
|
|
150
|
+
- `Discovered <tool> config at ...` - Config file found
|
|
151
|
+
- `Failed to parse <config>` - Config file has syntax errors
|
|
152
|
+
|
|
153
|
+
## Environment Variables
|
|
154
|
+
|
|
155
|
+
| Variable | Purpose |
|
|
156
|
+
| -------------- | ------------------------------------------------------------- |
|
|
157
|
+
| `LINTRO_DEBUG` | Set to `1` to enable debug logging (alternative to `--debug`) |
|
|
158
|
+
| `NO_COLOR` | Set to `1` to disable colored output |
|
|
159
|
+
|
|
160
|
+
## Getting Help
|
|
161
|
+
|
|
162
|
+
If debug logs don't help diagnose the issue:
|
|
163
|
+
|
|
164
|
+
1. Run with `--debug` and save the output
|
|
165
|
+
2. Check `~/.lintro/run-*/debug.log` for the full trace
|
|
166
|
+
3. [Open an issue][issues] with:
|
|
167
|
+
- Lintro version (`lintro --version`)
|
|
168
|
+
- Tool versions (`ruff --version`, etc.)
|
|
169
|
+
- Relevant debug log excerpts
|
|
170
|
+
- Steps to reproduce
|
|
171
|
+
|
|
172
|
+
[issues]: https://github.com/TurboCoder13/py-lintro/issues
|
|
@@ -112,8 +112,13 @@ def _load_pyproject_fallback() -> tuple[dict[str, Any], Path | None]:
|
|
|
112
112
|
with pyproject_path.open("rb") as f:
|
|
113
113
|
data = tomllib.load(f)
|
|
114
114
|
return data.get("tool", {}).get("lintro", {}), pyproject_path
|
|
115
|
-
except
|
|
116
|
-
logger.
|
|
115
|
+
except tomllib.TOMLDecodeError as e:
|
|
116
|
+
logger.warning(
|
|
117
|
+
f"Failed to parse pyproject.toml at {pyproject_path}: {e}",
|
|
118
|
+
)
|
|
119
|
+
return {}, None
|
|
120
|
+
except OSError as e:
|
|
121
|
+
logger.debug(f"Could not read pyproject.toml at {pyproject_path}: {e}")
|
|
117
122
|
return {}, None
|
|
118
123
|
|
|
119
124
|
# Move up one directory
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Display column enum definitions.
|
|
2
|
+
|
|
3
|
+
This module defines the standard columns used in issue table output.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from enum import StrEnum
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class DisplayColumn(StrEnum):
|
|
12
|
+
"""Standard columns for issue table display.
|
|
13
|
+
|
|
14
|
+
Values are title-case strings used as table column headers.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
FILE = "File"
|
|
18
|
+
LINE = "Line"
|
|
19
|
+
COLUMN = "Column"
|
|
20
|
+
CODE = "Code"
|
|
21
|
+
SEVERITY = "Severity"
|
|
22
|
+
FIXABLE = "Fixable"
|
|
23
|
+
MESSAGE = "Message"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# Standard column order for display - includes all fields since most tools report them
|
|
27
|
+
STANDARD_COLUMNS: list[DisplayColumn] = [
|
|
28
|
+
DisplayColumn.FILE,
|
|
29
|
+
DisplayColumn.LINE,
|
|
30
|
+
DisplayColumn.COLUMN,
|
|
31
|
+
DisplayColumn.CODE,
|
|
32
|
+
DisplayColumn.SEVERITY,
|
|
33
|
+
DisplayColumn.FIXABLE,
|
|
34
|
+
DisplayColumn.MESSAGE,
|
|
35
|
+
]
|
|
@@ -5,12 +5,11 @@ tool's issues by using the BaseIssue.to_display_row() method.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
# Base classes and utilities
|
|
8
|
+
from lintro.enums.display_column import STANDARD_COLUMNS, DisplayColumn
|
|
8
9
|
from lintro.formatters.core.format_registry import OutputStyle, TableDescriptor
|
|
9
10
|
|
|
10
11
|
# Unified formatter - the preferred way to format issues
|
|
11
12
|
from lintro.formatters.formatter import (
|
|
12
|
-
EXTENDED_COLUMNS,
|
|
13
|
-
STANDARD_COLUMNS,
|
|
14
13
|
UnifiedTableDescriptor,
|
|
15
14
|
format_issues,
|
|
16
15
|
format_issues_with_sections,
|
|
@@ -24,7 +23,7 @@ __all__ = [
|
|
|
24
23
|
"format_tool_result",
|
|
25
24
|
"UnifiedTableDescriptor",
|
|
26
25
|
"STANDARD_COLUMNS",
|
|
27
|
-
"
|
|
26
|
+
"DisplayColumn",
|
|
28
27
|
# Base classes
|
|
29
28
|
"TableDescriptor",
|
|
30
29
|
"OutputStyle",
|
|
@@ -19,22 +19,23 @@ Example:
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
from collections.abc import Sequence
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
22
|
|
|
23
|
+
from lintro.enums.display_column import STANDARD_COLUMNS, DisplayColumn
|
|
24
24
|
from lintro.enums.output_format import OutputFormat, normalize_output_format
|
|
25
25
|
from lintro.formatters.core.format_registry import TableDescriptor, get_style
|
|
26
26
|
from lintro.parsers.base_issue import BaseIssue
|
|
27
27
|
from lintro.utils.path_utils import normalize_file_path_for_display
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
# Map DisplayColumn enum to row dict keys
|
|
30
|
+
_COLUMN_KEY_MAP: dict[DisplayColumn, str] = {
|
|
31
|
+
DisplayColumn.FILE: "file",
|
|
32
|
+
DisplayColumn.LINE: "line",
|
|
33
|
+
DisplayColumn.COLUMN: "column",
|
|
34
|
+
DisplayColumn.CODE: "code",
|
|
35
|
+
DisplayColumn.MESSAGE: "message",
|
|
36
|
+
DisplayColumn.SEVERITY: "severity",
|
|
37
|
+
DisplayColumn.FIXABLE: "fixable",
|
|
38
|
+
}
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
class UnifiedTableDescriptor(TableDescriptor):
|
|
@@ -46,27 +47,14 @@ class UnifiedTableDescriptor(TableDescriptor):
|
|
|
46
47
|
|
|
47
48
|
def __init__(
|
|
48
49
|
self,
|
|
49
|
-
columns: list[
|
|
50
|
-
*,
|
|
51
|
-
include_severity: bool = False,
|
|
52
|
-
include_fixable: bool = False,
|
|
50
|
+
columns: list[DisplayColumn] | None = None,
|
|
53
51
|
) -> None:
|
|
54
52
|
"""Initialize the descriptor.
|
|
55
53
|
|
|
56
54
|
Args:
|
|
57
|
-
columns: Custom column list, or None to use
|
|
58
|
-
include_severity: Include severity column.
|
|
59
|
-
include_fixable: Include fixable column.
|
|
55
|
+
columns: Custom column list, or None to use STANDARD_COLUMNS.
|
|
60
56
|
"""
|
|
61
|
-
if columns is not None
|
|
62
|
-
self._columns = columns
|
|
63
|
-
elif include_severity or include_fixable:
|
|
64
|
-
self._columns = EXTENDED_COLUMNS
|
|
65
|
-
else:
|
|
66
|
-
self._columns = STANDARD_COLUMNS
|
|
67
|
-
|
|
68
|
-
self._include_severity = include_severity
|
|
69
|
-
self._include_fixable = include_fixable
|
|
57
|
+
self._columns = columns if columns is not None else STANDARD_COLUMNS
|
|
70
58
|
|
|
71
59
|
def get_columns(self) -> list[str]:
|
|
72
60
|
"""Return the column names.
|
|
@@ -74,7 +62,7 @@ class UnifiedTableDescriptor(TableDescriptor):
|
|
|
74
62
|
Returns:
|
|
75
63
|
List of column header names.
|
|
76
64
|
"""
|
|
77
|
-
return self._columns
|
|
65
|
+
return [str(col) for col in self._columns]
|
|
78
66
|
|
|
79
67
|
def get_rows(self, issues: Sequence[BaseIssue]) -> list[list[str]]:
|
|
80
68
|
"""Extract row data from issues using to_display_row().
|
|
@@ -87,18 +75,6 @@ class UnifiedTableDescriptor(TableDescriptor):
|
|
|
87
75
|
"""
|
|
88
76
|
rows: list[list[str]] = []
|
|
89
77
|
|
|
90
|
-
# Map column names to row dict keys
|
|
91
|
-
column_key_map = {
|
|
92
|
-
"File": "file",
|
|
93
|
-
"Line": "line",
|
|
94
|
-
"Col": "column",
|
|
95
|
-
"Column": "column",
|
|
96
|
-
"Code": "code",
|
|
97
|
-
"Message": "message",
|
|
98
|
-
"Severity": "severity",
|
|
99
|
-
"Fixable": "fixable",
|
|
100
|
-
}
|
|
101
|
-
|
|
102
78
|
for issue in issues:
|
|
103
79
|
display_data = issue.to_display_row()
|
|
104
80
|
|
|
@@ -110,7 +86,7 @@ class UnifiedTableDescriptor(TableDescriptor):
|
|
|
110
86
|
|
|
111
87
|
row = []
|
|
112
88
|
for col in self._columns:
|
|
113
|
-
key =
|
|
89
|
+
key = _COLUMN_KEY_MAP.get(col, str(col).lower())
|
|
114
90
|
value = display_data.get(key, "")
|
|
115
91
|
row.append(str(value) if value else "")
|
|
116
92
|
|
|
@@ -123,10 +99,8 @@ def format_issues(
|
|
|
123
99
|
issues: Sequence[BaseIssue],
|
|
124
100
|
output_format: OutputFormat | str = OutputFormat.GRID,
|
|
125
101
|
*,
|
|
126
|
-
columns: list[
|
|
102
|
+
columns: list[DisplayColumn] | None = None,
|
|
127
103
|
tool_name: str | None = None,
|
|
128
|
-
include_severity: bool = False,
|
|
129
|
-
include_fixable: bool = False,
|
|
130
104
|
) -> str:
|
|
131
105
|
"""Format any issues using unified display.
|
|
132
106
|
|
|
@@ -138,8 +112,6 @@ def format_issues(
|
|
|
138
112
|
output_format: Output format (grid, json, plain, etc.).
|
|
139
113
|
columns: Custom column list (defaults to STANDARD_COLUMNS).
|
|
140
114
|
tool_name: Tool name for JSON output.
|
|
141
|
-
include_severity: Include severity column in output.
|
|
142
|
-
include_fixable: Include fixable column in output.
|
|
143
115
|
|
|
144
116
|
Returns:
|
|
145
117
|
Formatted string.
|
|
@@ -152,11 +124,7 @@ def format_issues(
|
|
|
152
124
|
return "No issues found."
|
|
153
125
|
|
|
154
126
|
normalized_format = normalize_output_format(output_format)
|
|
155
|
-
descriptor = UnifiedTableDescriptor(
|
|
156
|
-
columns=columns,
|
|
157
|
-
include_severity=include_severity,
|
|
158
|
-
include_fixable=include_fixable,
|
|
159
|
-
)
|
|
127
|
+
descriptor = UnifiedTableDescriptor(columns=columns)
|
|
160
128
|
|
|
161
129
|
style = get_style(normalized_format)
|
|
162
130
|
cols = descriptor.get_columns()
|
|
@@ -205,7 +173,6 @@ def format_issues_with_sections(
|
|
|
205
173
|
issues,
|
|
206
174
|
output_format=normalized_format,
|
|
207
175
|
tool_name=tool_name,
|
|
208
|
-
include_fixable=group_by_fixable,
|
|
209
176
|
)
|
|
210
177
|
|
|
211
178
|
# Partition issues by fixable status
|
|
@@ -239,7 +206,6 @@ def format_tool_result(
|
|
|
239
206
|
issues: Sequence[BaseIssue],
|
|
240
207
|
output_format: OutputFormat | str = OutputFormat.GRID,
|
|
241
208
|
*,
|
|
242
|
-
include_severity: bool = False,
|
|
243
209
|
group_by_fixable: bool = False,
|
|
244
210
|
) -> str:
|
|
245
211
|
"""Format a tool's results with appropriate sections and metadata.
|
|
@@ -251,7 +217,6 @@ def format_tool_result(
|
|
|
251
217
|
tool_name: Name of the tool.
|
|
252
218
|
issues: List of issues from the tool.
|
|
253
219
|
output_format: Output format.
|
|
254
|
-
include_severity: Include severity column.
|
|
255
220
|
group_by_fixable: Group by fixable status.
|
|
256
221
|
|
|
257
222
|
Returns:
|
|
@@ -269,5 +234,4 @@ def format_tool_result(
|
|
|
269
234
|
issues,
|
|
270
235
|
output_format=output_format,
|
|
271
236
|
tool_name=tool_name,
|
|
272
|
-
include_severity=include_severity,
|
|
273
237
|
)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Model for ruff formatting issues."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
|
|
5
|
+
from lintro.parsers.base_issue import BaseIssue
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class RuffFormatIssue(BaseIssue):
|
|
10
|
+
"""Represents a ruff formatting issue.
|
|
11
|
+
|
|
12
|
+
Inherits from BaseIssue to be compatible with the unified formatter.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
file: File path that would be reformatted.
|
|
16
|
+
code: Defaults to "FORMAT" for format issues.
|
|
17
|
+
message: Defaults to "Would reformat file" for format issues.
|
|
18
|
+
fixable: Defaults to True since format issues are auto-fixable by fmt.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# file is inherited from BaseIssue
|
|
22
|
+
code: str = field(default="FORMAT")
|
|
23
|
+
message: str = field(default="Would reformat file")
|
|
24
|
+
fixable: bool = field(default=True)
|
|
@@ -25,6 +25,8 @@ from abc import ABC, abstractmethod
|
|
|
25
25
|
from dataclasses import dataclass, field
|
|
26
26
|
from typing import TYPE_CHECKING
|
|
27
27
|
|
|
28
|
+
from loguru import logger
|
|
29
|
+
|
|
28
30
|
from lintro.config.lintro_config import LintroConfig
|
|
29
31
|
from lintro.models.core.tool_result import ToolResult
|
|
30
32
|
from lintro.plugins.execution_preparation import (
|
|
@@ -372,6 +374,8 @@ class BaseToolPlugin(ABC):
|
|
|
372
374
|
cmd = self._build_command(ctx.rel_files)
|
|
373
375
|
success, output = self._run_subprocess(cmd, cwd=ctx.cwd)
|
|
374
376
|
"""
|
|
377
|
+
logger.debug(f"[{self.name}] Preparing execution for {len(paths)} input paths")
|
|
378
|
+
|
|
375
379
|
result = prepare_execution(
|
|
376
380
|
paths=paths,
|
|
377
381
|
options=options,
|
|
@@ -383,13 +387,19 @@ class BaseToolPlugin(ABC):
|
|
|
383
387
|
)
|
|
384
388
|
|
|
385
389
|
if "early_result" in result:
|
|
386
|
-
|
|
390
|
+
early_result = result["early_result"]
|
|
391
|
+
logger.debug(f"[{self.name}] Early exit: {early_result.output}")
|
|
392
|
+
return ExecutionContext(early_result=early_result)
|
|
393
|
+
|
|
394
|
+
files = result.get("files", [])
|
|
395
|
+
timeout = result.get("timeout", DEFAULT_TIMEOUT)
|
|
396
|
+
logger.debug(f"[{self.name}] Ready: {len(files)} files, timeout={timeout}s")
|
|
387
397
|
|
|
388
398
|
return ExecutionContext(
|
|
389
|
-
files=
|
|
399
|
+
files=files,
|
|
390
400
|
rel_files=result.get("rel_files", []),
|
|
391
401
|
cwd=result.get("cwd"),
|
|
392
|
-
timeout=
|
|
402
|
+
timeout=timeout,
|
|
393
403
|
)
|
|
394
404
|
|
|
395
405
|
def _get_executable_command(self, tool_name: str) -> list[str]:
|
|
@@ -12,6 +12,8 @@ import sys
|
|
|
12
12
|
import threading
|
|
13
13
|
from typing import TYPE_CHECKING
|
|
14
14
|
|
|
15
|
+
from loguru import logger
|
|
16
|
+
|
|
15
17
|
if TYPE_CHECKING:
|
|
16
18
|
from collections.abc import Callable
|
|
17
19
|
|
|
@@ -138,6 +140,9 @@ def run_subprocess(
|
|
|
138
140
|
"""
|
|
139
141
|
validate_subprocess_command(cmd)
|
|
140
142
|
|
|
143
|
+
cmd_str = " ".join(cmd[:5]) + ("..." if len(cmd) > 5 else "")
|
|
144
|
+
logger.debug(f"Running subprocess: {cmd_str} (timeout={timeout}s, cwd={cwd})")
|
|
145
|
+
|
|
141
146
|
try:
|
|
142
147
|
result = subprocess.run( # nosec B603 - args list, shell=False
|
|
143
148
|
cmd,
|
|
@@ -147,8 +152,18 @@ def run_subprocess(
|
|
|
147
152
|
cwd=cwd,
|
|
148
153
|
env=env,
|
|
149
154
|
)
|
|
155
|
+
|
|
156
|
+
if result.returncode != 0:
|
|
157
|
+
stderr_preview = (result.stderr or "")[:500]
|
|
158
|
+
if stderr_preview:
|
|
159
|
+
logger.debug(
|
|
160
|
+
f"Subprocess {cmd[0]} exited with code {result.returncode}, "
|
|
161
|
+
f"stderr: {stderr_preview}",
|
|
162
|
+
)
|
|
163
|
+
|
|
150
164
|
return result.returncode == 0, result.stdout + result.stderr
|
|
151
165
|
except subprocess.TimeoutExpired as e:
|
|
166
|
+
logger.warning(f"Subprocess {cmd[0]} timed out after {timeout}s")
|
|
152
167
|
# Preserve partial output from the original exception
|
|
153
168
|
partial_output = ""
|
|
154
169
|
if e.output:
|
|
@@ -170,6 +185,9 @@ def run_subprocess(
|
|
|
170
185
|
output=partial_output,
|
|
171
186
|
) from e
|
|
172
187
|
except FileNotFoundError as e:
|
|
188
|
+
logger.warning(
|
|
189
|
+
f"Command not found: {cmd[0]}. Ensure it is installed and in PATH.",
|
|
190
|
+
)
|
|
173
191
|
raise FileNotFoundError(
|
|
174
192
|
f"Command not found: {cmd[0]}. "
|
|
175
193
|
f"Please ensure it is installed and in your PATH.",
|
|
@@ -207,6 +225,11 @@ def run_subprocess_streaming(
|
|
|
207
225
|
"""
|
|
208
226
|
validate_subprocess_command(cmd)
|
|
209
227
|
|
|
228
|
+
cmd_str = " ".join(cmd[:5]) + ("..." if len(cmd) > 5 else "")
|
|
229
|
+
logger.debug(
|
|
230
|
+
f"Running subprocess (streaming): {cmd_str} (timeout={timeout}s, cwd={cwd})",
|
|
231
|
+
)
|
|
232
|
+
|
|
210
233
|
try:
|
|
211
234
|
# Use Popen for streaming output # nosec B603
|
|
212
235
|
process = subprocess.Popen(
|
|
@@ -237,6 +260,9 @@ def run_subprocess_streaming(
|
|
|
237
260
|
|
|
238
261
|
if reader_thread.is_alive():
|
|
239
262
|
# Timeout occurred during reading - kill the process
|
|
263
|
+
logger.warning(
|
|
264
|
+
f"Subprocess {cmd[0]} timed out after {timeout}s (reading output)",
|
|
265
|
+
)
|
|
240
266
|
process.kill()
|
|
241
267
|
# Brief timeout for cleanup; ignore if process doesn't die cleanly
|
|
242
268
|
with contextlib.suppress(subprocess.TimeoutExpired):
|
|
@@ -251,6 +277,9 @@ def run_subprocess_streaming(
|
|
|
251
277
|
try:
|
|
252
278
|
returncode = process.wait(timeout=timeout)
|
|
253
279
|
except subprocess.TimeoutExpired as e:
|
|
280
|
+
logger.warning(
|
|
281
|
+
f"Subprocess {cmd[0]} timed out after {timeout}s (during wait)",
|
|
282
|
+
)
|
|
254
283
|
process.kill()
|
|
255
284
|
process.wait(timeout=1.0)
|
|
256
285
|
raise subprocess.TimeoutExpired(
|
|
@@ -258,9 +287,21 @@ def run_subprocess_streaming(
|
|
|
258
287
|
timeout=timeout,
|
|
259
288
|
output="\n".join(output_lines),
|
|
260
289
|
) from e
|
|
290
|
+
|
|
291
|
+
if returncode != 0:
|
|
292
|
+
output_preview = "\n".join(output_lines)[:500]
|
|
293
|
+
if output_preview:
|
|
294
|
+
logger.debug(
|
|
295
|
+
f"Subprocess {cmd[0]} exited with code {returncode}, "
|
|
296
|
+
f"output: {output_preview}",
|
|
297
|
+
)
|
|
298
|
+
|
|
261
299
|
return returncode == 0, "\n".join(output_lines)
|
|
262
300
|
|
|
263
301
|
except FileNotFoundError as e:
|
|
302
|
+
logger.warning(
|
|
303
|
+
f"Command not found: {cmd[0]}. Ensure it is installed and in PATH.",
|
|
304
|
+
)
|
|
264
305
|
raise FileNotFoundError(
|
|
265
306
|
f"Command not found: {cmd[0]}. "
|
|
266
307
|
f"Please ensure it is installed and in your PATH.",
|
|
@@ -318,6 +318,7 @@ class BanditPlugin(BaseToolPlugin):
|
|
|
318
318
|
return ctx.early_result # type: ignore[return-value]
|
|
319
319
|
|
|
320
320
|
cmd: list[str] = self._build_check_command(files=ctx.rel_files)
|
|
321
|
+
logger.debug(f"[bandit] Running: {' '.join(cmd[:10])}... (cwd={ctx.cwd})")
|
|
321
322
|
|
|
322
323
|
output: str
|
|
323
324
|
execution_failure: bool = False
|
|
@@ -303,7 +303,7 @@ class MypyPlugin(BaseToolPlugin):
|
|
|
303
303
|
issues_count=0,
|
|
304
304
|
)
|
|
305
305
|
|
|
306
|
-
logger.debug("
|
|
306
|
+
logger.debug("[mypy] Discovered {} python file(s)", len(ctx.files))
|
|
307
307
|
|
|
308
308
|
# Set config file if discovered
|
|
309
309
|
if not self.options.get("config_file") and config_path:
|
|
@@ -314,7 +314,7 @@ class MypyPlugin(BaseToolPlugin):
|
|
|
314
314
|
)
|
|
315
315
|
|
|
316
316
|
cmd = self._build_command(files=ctx.rel_files)
|
|
317
|
-
logger.debug("Running
|
|
317
|
+
logger.debug("[mypy] Running with cwd={} and cmd={}", ctx.cwd, cmd)
|
|
318
318
|
|
|
319
319
|
try:
|
|
320
320
|
success, output = self._run_subprocess(
|
|
@@ -125,10 +125,12 @@ def execute_ruff_check(
|
|
|
125
125
|
)
|
|
126
126
|
|
|
127
127
|
# Debug logging for CI diagnostics
|
|
128
|
-
logger.debug(f"ruff check command: {' '.join(cmd)}")
|
|
129
|
-
logger.debug(f"ruff check success: {success_lint}")
|
|
128
|
+
logger.debug(f"[ruff] check command: {' '.join(cmd)}")
|
|
129
|
+
logger.debug(f"[ruff] check success: {success_lint}")
|
|
130
130
|
if not success_lint:
|
|
131
|
-
|
|
131
|
+
# Log full output to debug file only - raw JSON output is parsed and
|
|
132
|
+
# formatted into tables, so no need to show it in console warnings
|
|
133
|
+
logger.debug(f"[ruff] check full output:\n{output_lint}")
|
|
132
134
|
|
|
133
135
|
lint_issues = parse_ruff_output(output=output_lint)
|
|
134
136
|
lint_issues_count: int = len(lint_issues)
|
|
@@ -167,12 +169,12 @@ def execute_ruff_check(
|
|
|
167
169
|
)
|
|
168
170
|
|
|
169
171
|
# Debug logging for CI diagnostics
|
|
170
|
-
logger.debug(f"ruff format --check command: {' '.join(format_cmd)}")
|
|
171
|
-
logger.debug(f"ruff format --check success: {success_format}")
|
|
172
|
+
logger.debug(f"[ruff] format --check command: {' '.join(format_cmd)}")
|
|
173
|
+
logger.debug(f"[ruff] format --check success: {success_format}")
|
|
172
174
|
if not success_format:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
)
|
|
175
|
+
# Log full output to debug file only - output is parsed and
|
|
176
|
+
# formatted into tables, so no need to show it in console warnings
|
|
177
|
+
logger.debug(f"[ruff] format check full output:\n{output_format}")
|
|
176
178
|
|
|
177
179
|
format_files = parse_ruff_format_check_output(output=output_format)
|
|
178
180
|
# Normalize files to absolute paths to keep behavior consistent with
|