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.
Files changed (618) hide show
  1. {lintro-0.23.1/lintro.egg-info → lintro-0.24.3}/PKG-INFO +3 -1
  2. lintro-0.24.3/docs/debugging.md +172 -0
  3. {lintro-0.23.1 → lintro-0.24.3}/lintro/__init__.py +1 -1
  4. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/config_loader.py +7 -2
  5. lintro-0.24.3/lintro/enums/display_column.py +35 -0
  6. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/__init__.py +2 -3
  7. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/formatter.py +18 -54
  8. lintro-0.24.3/lintro/parsers/ruff/ruff_format_issue.py +24 -0
  9. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/base.py +13 -3
  10. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/execution_preparation.py +3 -0
  11. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/file_discovery.py +3 -0
  12. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/subprocess_executor.py +41 -0
  13. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/bandit.py +1 -0
  14. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/mypy.py +2 -2
  15. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/check.py +10 -8
  16. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/native_parsers.py +48 -16
  17. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/manager.py +6 -0
  18. {lintro-0.23.1 → lintro-0.24.3/lintro.egg-info}/PKG-INFO +3 -1
  19. {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/SOURCES.txt +6 -0
  20. {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/requires.txt +2 -0
  21. {lintro-0.23.1 → lintro-0.24.3}/pyproject.toml +3 -1
  22. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loader.py +65 -0
  23. lintro-0.24.3/tests/unit/formatters/test_format_issues.py +443 -0
  24. lintro-0.24.3/tests/unit/plugins/base/test_subprocess_streaming.py +163 -0
  25. lintro-0.24.3/tests/unit/tools/ruff/check/test_output_truncation.py +156 -0
  26. lintro-0.24.3/tests/unit/utils/test_native_parsers.py +186 -0
  27. {lintro-0.23.1 → lintro-0.24.3}/tests/utils/test_output_manager.py +41 -0
  28. lintro-0.23.1/lintro/parsers/ruff/ruff_format_issue.py +0 -18
  29. {lintro-0.23.1 → lintro-0.24.3}/LICENSE +0 -0
  30. {lintro-0.23.1 → lintro-0.24.3}/MANIFEST.in +0 -0
  31. {lintro-0.23.1 → lintro-0.24.3}/README.md +0 -0
  32. {lintro-0.23.1 → lintro-0.24.3}/assets/images/coverage-badge.svg +0 -0
  33. {lintro-0.23.1 → lintro-0.24.3}/assets/images/lintro.png +0 -0
  34. {lintro-0.23.1 → lintro-0.24.3}/docs/README.md +0 -0
  35. {lintro-0.23.1 → lintro-0.24.3}/docs/SHELL-SCRIPT-STYLE-GUIDE.md +0 -0
  36. {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/ARCHITECTURE.md +0 -0
  37. {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/README.md +0 -0
  38. {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/ROADMAP.md +0 -0
  39. {lintro-0.23.1 → lintro-0.24.3}/docs/architecture/VISION.md +0 -0
  40. {lintro-0.23.1 → lintro-0.24.3}/docs/configuration.md +0 -0
  41. {lintro-0.23.1 → lintro-0.24.3}/docs/contributing.md +0 -0
  42. {lintro-0.23.1 → lintro-0.24.3}/docs/docker.md +0 -0
  43. {lintro-0.23.1 → lintro-0.24.3}/docs/getting-started.md +0 -0
  44. {lintro-0.23.1 → lintro-0.24.3}/docs/github-integration.md +0 -0
  45. {lintro-0.23.1 → lintro-0.24.3}/docs/lintro-self-use.md +0 -0
  46. {lintro-0.23.1 → lintro-0.24.3}/docs/plugins.md +0 -0
  47. {lintro-0.23.1 → lintro-0.24.3}/docs/security/assurance.md +0 -0
  48. {lintro-0.23.1 → lintro-0.24.3}/docs/security/requirements.md +0 -0
  49. {lintro-0.23.1 → lintro-0.24.3}/docs/style-guide.md +0 -0
  50. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/README.md +0 -0
  51. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/actionlint-analysis.md +0 -0
  52. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/bandit-analysis.md +0 -0
  53. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/biome-analysis.md +0 -0
  54. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/black-analysis.md +0 -0
  55. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/clippy-analysis.md +0 -0
  56. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/darglint-analysis.md +0 -0
  57. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/hadolint-analysis.md +0 -0
  58. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/markdownlint-analysis.md +0 -0
  59. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/mypy-analysis.md +0 -0
  60. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/prettier-analysis.md +0 -0
  61. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/pytest-analysis.md +0 -0
  62. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/ruff-analysis.md +0 -0
  63. {lintro-0.23.1 → lintro-0.24.3}/docs/tool-analysis/yamllint-analysis.md +0 -0
  64. {lintro-0.23.1 → lintro-0.24.3}/docs/troubleshooting.md +0 -0
  65. {lintro-0.23.1 → lintro-0.24.3}/lintro/__main__.py +0 -0
  66. {lintro-0.23.1 → lintro-0.24.3}/lintro/ascii-art/fail.txt +0 -0
  67. {lintro-0.23.1 → lintro-0.24.3}/lintro/ascii-art/success.txt +0 -0
  68. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli.py +0 -0
  69. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/__init__.py +0 -0
  70. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/command_chainer.py +0 -0
  71. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/__init__.py +0 -0
  72. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/check.py +0 -0
  73. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/config.py +0 -0
  74. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/format.py +0 -0
  75. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/init.py +0 -0
  76. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/list_tools.py +0 -0
  77. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/test.py +0 -0
  78. {lintro-0.23.1 → lintro-0.24.3}/lintro/cli_utils/commands/versions.py +0 -0
  79. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/__init__.py +0 -0
  80. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/enforce_config.py +0 -0
  81. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/execution_config.py +0 -0
  82. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/lintro_config.py +0 -0
  83. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/tool_config.py +0 -0
  84. {lintro-0.23.1 → lintro-0.24.3}/lintro/config/tool_config_generator.py +0 -0
  85. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/__init__.py +0 -0
  86. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/action.py +0 -0
  87. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/bandit_levels.py +0 -0
  88. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/boolean_string.py +0 -0
  89. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/config_format.py +0 -0
  90. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/config_key.py +0 -0
  91. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/darglint_strictness.py +0 -0
  92. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/env_bool.py +0 -0
  93. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/git_command.py +0 -0
  94. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/git_ref.py +0 -0
  95. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/group_by.py +0 -0
  96. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/hadolint_enums.py +0 -0
  97. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/hyphenated_str_enum.py +0 -0
  98. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/output_format.py +0 -0
  99. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/pytest_enums.py +0 -0
  100. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/severity_level.py +0 -0
  101. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_name.py +0 -0
  102. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_option_key.py +0 -0
  103. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_order.py +0 -0
  104. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tool_type.py +0 -0
  105. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/tools_value.py +0 -0
  106. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/uppercase_str_enum.py +0 -0
  107. {lintro-0.23.1 → lintro-0.24.3}/lintro/enums/yamllint_format.py +0 -0
  108. {lintro-0.23.1 → lintro-0.24.3}/lintro/exceptions/__init__.py +0 -0
  109. {lintro-0.23.1 → lintro-0.24.3}/lintro/exceptions/errors.py +0 -0
  110. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/core/__init__.py +0 -0
  111. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/core/format_registry.py +0 -0
  112. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/__init__.py +0 -0
  113. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/csv.py +0 -0
  114. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/grid.py +0 -0
  115. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/html.py +0 -0
  116. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/json.py +0 -0
  117. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/markdown.py +0 -0
  118. {lintro-0.23.1 → lintro-0.24.3}/lintro/formatters/styles/plain.py +0 -0
  119. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/__init__.py +0 -0
  120. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/__init__.py +0 -0
  121. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/base_tool_options.py +0 -0
  122. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/black_options.py +0 -0
  123. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/prettier_options.py +0 -0
  124. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/pytest_options.py +0 -0
  125. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/ruff_options.py +0 -0
  126. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/tool_result.py +0 -0
  127. {lintro-0.23.1 → lintro-0.24.3}/lintro/models/core/yamllint_options.py +0 -0
  128. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/__init__.py +0 -0
  129. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/__init__.py +0 -0
  130. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
  131. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
  132. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/__init__.py +0 -0
  133. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/bandit_issue.py +0 -0
  134. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/bandit/bandit_parser.py +0 -0
  135. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/base_issue.py +0 -0
  136. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/base_parser.py +0 -0
  137. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/__init__.py +0 -0
  138. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/biome_issue.py +0 -0
  139. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/biome/biome_parser.py +0 -0
  140. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/__init__.py +0 -0
  141. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/black_issue.py +0 -0
  142. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/black/black_parser.py +0 -0
  143. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/__init__.py +0 -0
  144. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/clippy_issue.py +0 -0
  145. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/clippy/clippy_parser.py +0 -0
  146. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/__init__.py +0 -0
  147. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/darglint_issue.py +0 -0
  148. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/darglint/darglint_parser.py +0 -0
  149. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/__init__.py +0 -0
  150. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
  151. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
  152. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/__init__.py +0 -0
  153. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/markdownlint_issue.py +0 -0
  154. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/markdownlint/markdownlint_parser.py +0 -0
  155. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/__init__.py +0 -0
  156. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/mypy_issue.py +0 -0
  157. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/mypy/mypy_parser.py +0 -0
  158. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/__init__.py +0 -0
  159. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/prettier_issue.py +0 -0
  160. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/prettier/prettier_parser.py +0 -0
  161. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/__init__.py +0 -0
  162. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/format_parsers.py +0 -0
  163. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/models.py +0 -0
  164. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/pytest_issue.py +0 -0
  165. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/pytest_parser.py +0 -0
  166. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/pytest/summary_extractor.py +0 -0
  167. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/__init__.py +0 -0
  168. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/ruff_issue.py +0 -0
  169. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/ruff/ruff_parser.py +0 -0
  170. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/streaming.py +0 -0
  171. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/__init__.py +0 -0
  172. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
  173. {lintro-0.23.1 → lintro-0.24.3}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
  174. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/__init__.py +0 -0
  175. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/discovery.py +0 -0
  176. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/protocol.py +0 -0
  177. {lintro-0.23.1 → lintro-0.24.3}/lintro/plugins/registry.py +0 -0
  178. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/__init__.py +0 -0
  179. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/__init__.py +0 -0
  180. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/command_builders.py +0 -0
  181. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/config_injection.py +0 -0
  182. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/line_length_checker.py +0 -0
  183. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/option_spec.py +0 -0
  184. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/option_validators.py +0 -0
  185. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/runtime_discovery.py +0 -0
  186. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/timeout_utils.py +0 -0
  187. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/tool_manager.py +0 -0
  188. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_checking.py +0 -0
  189. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_parsing.py +0 -0
  190. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/core/version_requirements.py +0 -0
  191. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/__init__.py +0 -0
  192. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/actionlint.py +0 -0
  193. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/biome.py +0 -0
  194. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/black.py +0 -0
  195. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/clippy.py +0 -0
  196. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/darglint.py +0 -0
  197. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/hadolint.py +0 -0
  198. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/markdownlint.py +0 -0
  199. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/prettier.py +0 -0
  200. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/pytest.py +0 -0
  201. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/ruff.py +0 -0
  202. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/definitions/yamllint.py +0 -0
  203. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/__init__.py +0 -0
  204. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/__init__.py +0 -0
  205. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/collection.py +0 -0
  206. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/coverage_processor.py +0 -0
  207. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/formatters.py +0 -0
  208. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/markers.py +0 -0
  209. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/output.py +0 -0
  210. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/output_parsers.py +0 -0
  211. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_command_builder.py +0 -0
  212. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_config.py +0 -0
  213. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_error_handler.py +0 -0
  214. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_executor.py +0 -0
  215. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_handlers.py +0 -0
  216. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_option_validators.py +0 -0
  217. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_output_processor.py +0 -0
  218. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/pytest_result_processor.py +0 -0
  219. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/pytest/test_analytics.py +0 -0
  220. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/__init__.py +0 -0
  221. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/commands.py +0 -0
  222. {lintro-0.23.1 → lintro-0.24.3}/lintro/tools/implementations/ruff/fix.py +0 -0
  223. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/__init__.py +0 -0
  224. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/ascii_normalize_cli.py +0 -0
  225. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/async_tool_executor.py +0 -0
  226. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config.py +0 -0
  227. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_constants.py +0 -0
  228. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_priority.py +0 -0
  229. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_reporting.py +0 -0
  230. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/config_validation.py +0 -0
  231. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/__init__.py +0 -0
  232. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/constants.py +0 -0
  233. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/console/logger.py +0 -0
  234. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/display_helpers.py +0 -0
  235. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/__init__.py +0 -0
  236. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/exit_codes.py +0 -0
  237. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/parallel_executor.py +0 -0
  238. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/execution/tool_configuration.py +0 -0
  239. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/file_cache.py +0 -0
  240. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/formatting.py +0 -0
  241. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/json_output.py +0 -0
  242. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/logger_setup.py +0 -0
  243. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/__init__.py +0 -0
  244. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/constants.py +0 -0
  245. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/file_writer.py +0 -0
  246. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/helpers.py +0 -0
  247. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/parser_registration.py +0 -0
  248. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/output/parser_registry.py +0 -0
  249. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/path_filtering.py +0 -0
  250. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/path_utils.py +0 -0
  251. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/post_checks.py +0 -0
  252. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/result_formatters.py +0 -0
  253. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/streaming_output.py +0 -0
  254. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/summary_tables.py +0 -0
  255. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_config_info.py +0 -0
  256. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_executor.py +0 -0
  257. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_options.py +0 -0
  258. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/tool_utils.py +0 -0
  259. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/unified_config.py +0 -0
  260. {lintro-0.23.1 → lintro-0.24.3}/lintro/utils/unified_config_manager.py +0 -0
  261. {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/dependency_links.txt +0 -0
  262. {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/entry_points.txt +0 -0
  263. {lintro-0.23.1 → lintro-0.24.3}/lintro.egg-info/top_level.txt +0 -0
  264. {lintro-0.23.1 → lintro-0.24.3}/setup.cfg +0 -0
  265. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/docker/Dockerfile.violations +0 -0
  266. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/github_actions/actionlint_violations.yml +0 -0
  267. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/config/yaml/yaml_violations.yml +0 -0
  268. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/javascript/biome/biome_violations.js +0 -0
  269. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/javascript/prettier/prettier_violations.js +0 -0
  270. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/bandit/bandit_violations.py +0 -0
  271. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/darglint/darglint_violations.py +0 -0
  272. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/mypy/mypy_violations.py +0 -0
  273. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/pytest/pytest_clean.py +0 -0
  274. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/pytest/pytest_failures.py +0 -0
  275. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_annotations_violations.py +0 -0
  276. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_black_e501_wrappable.py +0 -0
  277. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_bugbear_violations.py +0 -0
  278. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_c4_comprehensions_violations.py +0 -0
  279. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_clean.py +0 -0
  280. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_e501_f401_violations.py +0 -0
  281. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_naming_violations.py +0 -0
  282. {lintro-0.23.1 → lintro-0.24.3}/test_samples/tools/python/ruff/ruff_sim_simplify_violations.py +0 -0
  283. {lintro-0.23.1 → lintro-0.24.3}/tests/__init__.py +0 -0
  284. {lintro-0.23.1 → lintro-0.24.3}/tests/cli/__init__.py +0 -0
  285. {lintro-0.23.1 → lintro-0.24.3}/tests/cli/conftest.py +0 -0
  286. {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_cli.py +0 -0
  287. {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_config_command.py +0 -0
  288. {lintro-0.23.1 → lintro-0.24.3}/tests/cli/test_init_command.py +0 -0
  289. {lintro-0.23.1 → lintro-0.24.3}/tests/config/__init__.py +0 -0
  290. {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_config_loader.py +0 -0
  291. {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_init_command.py +0 -0
  292. {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_lintro_config.py +0 -0
  293. {lintro-0.23.1 → lintro-0.24.3}/tests/config/test_tool_config_generator.py +0 -0
  294. {lintro-0.23.1 → lintro-0.24.3}/tests/conftest.py +0 -0
  295. {lintro-0.23.1 → lintro-0.24.3}/tests/constants.py +0 -0
  296. {lintro-0.23.1 → lintro-0.24.3}/tests/formatters/__init__.py +0 -0
  297. {lintro-0.23.1 → lintro-0.24.3}/tests/formatters/test_formatters.py +0 -0
  298. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/__init__.py +0 -0
  299. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/conftest.py +0 -0
  300. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_actionlint_integration.py +0 -0
  301. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_bandit_integration.py +0 -0
  302. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_built_package.py +0 -0
  303. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_darglint_integration.py +0 -0
  304. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_markdownlint_integration.py +0 -0
  305. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_mypy_integration.py +0 -0
  306. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/test_parallel_execution.py +0 -0
  307. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/__init__.py +0 -0
  308. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_bandit_integration.py +0 -0
  309. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_black_integration.py +0 -0
  310. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_mypy_integration.py +0 -0
  311. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_prettier_integration.py +0 -0
  312. {lintro-0.23.1 → lintro-0.24.3}/tests/integration/tools/test_ruff_integration.py +0 -0
  313. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/__init__.py +0 -0
  314. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/conftest.py +0 -0
  315. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_ci_post_pr_comment.py +0 -0
  316. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
  317. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_extract_version.py +0 -0
  318. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
  319. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities.py +0 -0
  320. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_encode.py +0 -0
  321. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_extract.py +0 -0
  322. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_github_comment_utilities_find.py +0 -0
  323. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_semantic_release_compute_next.py +0 -0
  324. {lintro-0.23.1 → lintro-0.24.3}/tests/scripts/test_shell_scripts.py +0 -0
  325. {lintro-0.23.1 → lintro-0.24.3}/tests/test_documentation.py +0 -0
  326. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/__init__.py +0 -0
  327. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/__init__.py +0 -0
  328. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/conftest.py +0 -0
  329. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_check_command.py +0 -0
  330. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli.py +0 -0
  331. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_commands.py +0 -0
  332. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_commands_more.py +0 -0
  333. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_lintro_group.py +0 -0
  334. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_cli_programmatic.py +0 -0
  335. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli/test_format_command.py +0 -0
  336. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/__init__.py +0 -0
  337. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/__init__.py +0 -0
  338. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/conftest.py +0 -0
  339. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_execute.py +0 -0
  340. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_group_commands.py +0 -0
  341. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_init.py +0 -0
  342. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_integration.py +0 -0
  343. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_normalize_args.py +0 -0
  344. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/command_chainer/test_should_chain.py +0 -0
  345. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/cli_utils/commands/test_format.py +0 -0
  346. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/compatibility/conftest.py +0 -0
  347. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/compatibility/test_compatibility_ruff_black.py +0 -0
  348. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/conftest.py +0 -0
  349. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_compatibility.py +0 -0
  350. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loader_more.py +0 -0
  351. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_loaders.py +0 -0
  352. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_config_tool_specific.py +0 -0
  353. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_enforce_config.py +0 -0
  354. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_execution_config.py +0 -0
  355. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_lintro_config.py +0 -0
  356. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/config/test_unified_config.py +0 -0
  357. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/conftest.py +0 -0
  358. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/core/conftest.py +0 -0
  359. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/core/test_version_requirements.py +0 -0
  360. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/__init__.py +0 -0
  361. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_bandit_levels.py +0 -0
  362. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_base.py +0 -0
  363. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_enum_normalizers.py +0 -0
  364. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_output_format.py +0 -0
  365. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/enums/test_tool_name.py +0 -0
  366. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/exceptions/conftest.py +0 -0
  367. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/exceptions/test_exceptions.py +0 -0
  368. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/__init__.py +0 -0
  369. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/conftest.py +0 -0
  370. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/__init__.py +0 -0
  371. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/conftest.py +0 -0
  372. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_csv.py +0 -0
  373. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_html.py +0 -0
  374. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_json.py +0 -0
  375. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_markdown.py +0 -0
  376. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_plain.py +0 -0
  377. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_common.py +0 -0
  378. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_csv.py +0 -0
  379. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_grid.py +0 -0
  380. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_html.py +0 -0
  381. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_json.py +0 -0
  382. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_markdown.py +0 -0
  383. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/styles/test_style_plain.py +0 -0
  384. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/formatters/test_format_registry.py +0 -0
  385. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/conftest.py +0 -0
  386. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/test_console_logger.py +0 -0
  387. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/logging/test_console_logger_more.py +0 -0
  388. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/output/conftest.py +0 -0
  389. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/output/test_output_manager_reports.py +0 -0
  390. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/__init__.py +0 -0
  391. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_continuation_lines.py +0 -0
  392. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_extract_fields.py +0 -0
  393. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_safe_parse.py +0 -0
  394. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_strip_ansi.py +0 -0
  395. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/base_parser/test_validate_fields.py +0 -0
  396. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/conftest.py +0 -0
  397. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/pytest/test_pytest_parser.py +0 -0
  398. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/__init__.py +0 -0
  399. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/conftest.py +0 -0
  400. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_collect.py +0 -0
  401. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_json_array.py +0 -0
  402. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_json_lines.py +0 -0
  403. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_parser_class.py +0 -0
  404. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/streaming/test_text_lines.py +0 -0
  405. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_actionlint_parser.py +0 -0
  406. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_bandit_parser.py +0 -0
  407. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_base_issue.py +0 -0
  408. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_base_parser.py +0 -0
  409. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_biome_parser.py +0 -0
  410. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_black_parser.py +0 -0
  411. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_clippy_parser.py +0 -0
  412. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_darglint_parser.py +0 -0
  413. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_hadolint_parser.py +0 -0
  414. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_markdownlint_parser.py +0 -0
  415. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_mypy_parser.py +0 -0
  416. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_prettier_parser.py +0 -0
  417. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_ruff_parser_additional.py +0 -0
  418. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_ruff_parser_more.py +0 -0
  419. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/parsers/test_yamllint_parser.py +0 -0
  420. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/__init__.py +0 -0
  421. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/conftest.py +0 -0
  422. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_execution.py +0 -0
  423. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_options.py +0 -0
  424. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/base/test_subprocess.py +0 -0
  425. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/conftest.py +0 -0
  426. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_base_plugin_config.py +0 -0
  427. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_discovery.py +0 -0
  428. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/plugins/test_registry.py +0 -0
  429. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/conftest.py +0 -0
  430. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_cli_commands.py +0 -0
  431. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_cli_options.py +0 -0
  432. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_handlers.py +0 -0
  433. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/pytest/test_pytest_programmatic_api.py +0 -0
  434. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/__init__.py +0 -0
  435. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/conftest.py +0 -0
  436. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_json_edge_cases.py +0 -0
  437. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_path_traversal.py +0 -0
  438. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/security/test_subprocess_injection.py +0 -0
  439. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/assertions/__init__.py +0 -0
  440. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/assertions/conftest.py +0 -0
  441. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/base/conftest.py +0 -0
  442. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/__init__.py +0 -0
  443. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/conftest.py +0 -0
  444. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_check_method.py +0 -0
  445. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_default_options.py +0 -0
  446. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_fix_method.py +0 -0
  447. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_set_options.py +0 -0
  448. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/biome/test_timeout_handling.py +0 -0
  449. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/conftest.py +0 -0
  450. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/__init__.py +0 -0
  451. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/conftest.py +0 -0
  452. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_command_builders.py +0 -0
  453. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_line_length_checker.py +0 -0
  454. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_option_spec.py +0 -0
  455. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_option_validators.py +0 -0
  456. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_runtime_discovery.py +0 -0
  457. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_tool_options_spec.py +0 -0
  458. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/core/test_version_checking.py +0 -0
  459. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/darglint/__init__.py +0 -0
  460. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/darglint/test_darglint_plugin.py +0 -0
  461. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/conftest.py +0 -0
  462. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor.py +0 -0
  463. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_fmt_exclusion.py +0 -0
  464. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_more.py +0 -0
  465. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_post_checks.py +0 -0
  466. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/executor/test_tool_executor_pytest.py +0 -0
  467. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/__init__.py +0 -0
  468. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/conftest.py +0 -0
  469. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/test_execution.py +0 -0
  470. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/hadolint/test_options.py +0 -0
  471. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/manager/conftest.py +0 -0
  472. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/manager/test_tool_manager.py +0 -0
  473. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/mypy/test_mypy_plugin.py +0 -0
  474. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/__init__.py +0 -0
  475. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/conftest.py +0 -0
  476. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_check_method.py +0 -0
  477. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_config_discovery.py +0 -0
  478. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_default_options.py +0 -0
  479. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_fix_method.py +0 -0
  480. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_output_parsing.py +0 -0
  481. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_set_options.py +0 -0
  482. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/prettier/test_timeout_handling.py +0 -0
  483. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/__init__.py +0 -0
  484. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/conftest.py +0 -0
  485. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_check_method.py +0 -0
  486. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_configuration.py +0 -0
  487. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_json_parsing.py +0 -0
  488. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_junit_parsing.py +0 -0
  489. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_output_parsing.py +0 -0
  490. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_output_processing.py +0 -0
  491. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_handlers.py +0 -0
  492. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_issue.py +0 -0
  493. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_pytest_output_processor.py +0 -0
  494. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_result_processor.py +0 -0
  495. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_set_options.py +0 -0
  496. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_text_parsing.py +0 -0
  497. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/pytest_tool/test_validators.py +0 -0
  498. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/__init__.py +0 -0
  499. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/__init__.py +0 -0
  500. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/conftest.py +0 -0
  501. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_config_detection.py +0 -0
  502. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_error_handling.py +0 -0
  503. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_format_normalization.py +0 -0
  504. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_json_parsing.py +0 -0
  505. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_no_issues.py +0 -0
  506. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_output_format.py +0 -0
  507. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_path_filtering.py +0 -0
  508. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_real_plugin.py +0 -0
  509. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_timeout.py +0 -0
  510. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/check/test_with_issues.py +0 -0
  511. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/conftest.py +0 -0
  512. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/__init__.py +0 -0
  513. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/conftest.py +0 -0
  514. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_combined_issues.py +0 -0
  515. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_config.py +0 -0
  516. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_edge_cases.py +0 -0
  517. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_format_option.py +0 -0
  518. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_no_files.py +0 -0
  519. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_real_plugin.py +0 -0
  520. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_successful_fix.py +0 -0
  521. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_temporary_option.py +0 -0
  522. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_timeout.py +0 -0
  523. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_unsafe_fixes.py +0 -0
  524. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/ruff/fix/test_version_check.py +0 -0
  525. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_common_behaviors.py +0 -0
  526. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_edge_cases.py +0 -0
  527. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_helpers.py +0 -0
  528. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_plugin_definitions.py +0 -0
  529. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/tools/test_tool_definitions.py +0 -0
  530. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/__init__.py +0 -0
  531. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/__init__.py +0 -0
  532. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/conftest.py +0 -0
  533. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_callbacks.py +0 -0
  534. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_exceptions.py +0 -0
  535. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_init.py +0 -0
  536. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_parallel_batches.py +0 -0
  537. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_run_tool_async.py +0 -0
  538. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_run_tools_parallel.py +0 -0
  539. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/async_tool_executor/test_shutdown.py +0 -0
  540. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/__init__.py +0 -0
  541. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/conftest.py +0 -0
  542. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/test_manager_configuration.py +0 -0
  543. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/config/test_manager_core.py +0 -0
  544. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/conftest.py +0 -0
  545. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/conftest.py +0 -0
  546. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/__init__.py +0 -0
  547. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/test_delegation.py +0 -0
  548. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/summary/test_execution_summary.py +0 -0
  549. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_headers.py +0 -0
  550. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_initialization.py +0 -0
  551. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_levels.py +0 -0
  552. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_metadata.py +0 -0
  553. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_output_methods.py +0 -0
  554. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/console/test_logger_results.py +0 -0
  555. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/__init__.py +0 -0
  556. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/conftest.py +0 -0
  557. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_biome_config.py +0 -0
  558. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_config_constants.py +0 -0
  559. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_json_config.py +0 -0
  560. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_jsonc_comments.py +0 -0
  561. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_markdownlint_config.py +0 -0
  562. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_prettier_config.py +0 -0
  563. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_pyproject_tools.py +0 -0
  564. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/native_parsers/test_yamllint_config.py +0 -0
  565. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/__init__.py +0 -0
  566. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/conftest.py +0 -0
  567. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_common.py +0 -0
  568. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_csv.py +0 -0
  569. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_format.py +0 -0
  570. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_html.py +0 -0
  571. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_json.py +0 -0
  572. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_markdown.py +0 -0
  573. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_file_writer_plain.py +0 -0
  574. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/output/test_helpers.py +0 -0
  575. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/__init__.py +0 -0
  576. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/conftest.py +0 -0
  577. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_action_normalization.py +0 -0
  578. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_fix_action.py +0 -0
  579. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_fixable_hints.py +0 -0
  580. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_generic_output.py +0 -0
  581. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_output_display.py +0 -0
  582. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_pytest_output.py +0 -0
  583. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/result_formatters/test_ruff_formatting.py +0 -0
  584. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/__init__.py +0 -0
  585. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/test_display.py +0 -0
  586. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/summary/test_safe_cast.py +0 -0
  587. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_ascii_normalize.py +0 -0
  588. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_ascii_normalize_cli.py +0 -0
  589. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_config_reporting.py +0 -0
  590. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_console_output_writer.py +0 -0
  591. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_display_helpers.py +0 -0
  592. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_display_helpers_fallback.py +0 -0
  593. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_enums_and_normalizers.py +0 -0
  594. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_file_cache.py +0 -0
  595. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_logger_setup.py +0 -0
  596. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_output_writers.py +0 -0
  597. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_parser_registry.py +0 -0
  598. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_path_filtering.py +0 -0
  599. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_path_utils.py +0 -0
  600. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_streaming_output.py +0 -0
  601. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_timeout_utils.py +0 -0
  602. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_tool_config_info.py +0 -0
  603. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/test_tool_utils.py +0 -0
  604. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/__init__.py +0 -0
  605. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/conftest.py +0 -0
  606. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_config_summary.py +0 -0
  607. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_consistency.py +0 -0
  608. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_constants.py +0 -0
  609. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_dataclasses.py +0 -0
  610. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_enums.py +0 -0
  611. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_injectable.py +0 -0
  612. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_line_length.py +0 -0
  613. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_nested_value.py +0 -0
  614. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_ordered_tools.py +0 -0
  615. {lintro-0.23.1 → lintro-0.24.3}/tests/unit/utils/unified_config/test_tool_priority.py +0 -0
  616. {lintro-0.23.1 → lintro-0.24.3}/tests/utils/__init__.py +0 -0
  617. {lintro-0.23.1 → lintro-0.24.3}/tests/utils/test_formatting.py +0 -0
  618. {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.23.1
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
@@ -1,3 +1,3 @@
1
1
  """Lintro - A unified CLI core for code formatting, linting, and quality assurance."""
2
2
 
3
- __version__ = "0.23.1"
3
+ __version__ = "0.24.3"
@@ -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 (OSError, tomllib.TOMLDecodeError) as e:
116
- logger.debug(f"Failed to load pyproject.toml: {e}")
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
- "EXTENDED_COLUMNS",
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
- if TYPE_CHECKING:
30
- pass
31
-
32
-
33
- # Standard columns for display (basic)
34
- STANDARD_COLUMNS = ["File", "Line", "Col", "Code", "Message"]
35
-
36
- # Extended columns including severity and fixable status
37
- EXTENDED_COLUMNS = ["File", "Line", "Col", "Code", "Severity", "Fixable", "Message"]
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[str] | None = None,
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 defaults.
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 = column_key_map.get(col, col.lower())
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[str] | None = None,
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
- return ExecutionContext(early_result=result["early_result"])
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=result.get("files", []),
399
+ files=files,
390
400
  rel_files=result.get("rel_files", []),
391
401
  cwd=result.get("cwd"),
392
- timeout=result.get("timeout", DEFAULT_TIMEOUT),
402
+ timeout=timeout,
393
403
  )
394
404
 
395
405
  def _get_executable_command(self, tool_name: str) -> list[str]:
@@ -194,6 +194,9 @@ def prepare_execution(
194
194
  definition.default_timeout,
195
195
  )
196
196
 
197
+ logger.debug(
198
+ f"Prepared execution: {len(files)} files, cwd={cwd}, timeout={timeout}s",
199
+ )
197
200
  return {
198
201
  "files": files,
199
202
  "rel_files": rel_files,
@@ -105,6 +105,9 @@ def discover_files(
105
105
  )
106
106
  progress.update(task, description=f"Found {len(files)} files")
107
107
 
108
+ logger.debug(
109
+ f"File discovery: {len(files)} files matching {definition.file_patterns}",
110
+ )
108
111
  return files
109
112
 
110
113
 
@@ -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("Mypy discovered {} python file(s)", len(ctx.files))
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 mypy with cwd={} and cmd={}", ctx.cwd, cmd)
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
- logger.warning(f"ruff check failed with output:\n{output_lint[:2000]}")
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
- logger.warning(
174
- f"ruff format check failed with output:\n{output_format[:2000]}",
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