lintro 0.42.5__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 (774) hide show
  1. lintro-0.42.5/LICENSE +21 -0
  2. lintro-0.42.5/MANIFEST.in +17 -0
  3. lintro-0.42.5/PKG-INFO +313 -0
  4. lintro-0.42.5/README.md +226 -0
  5. lintro-0.42.5/assets/images/coverage-badge.svg +21 -0
  6. lintro-0.42.5/assets/images/lintro.png +0 -0
  7. lintro-0.42.5/docs/README.md +244 -0
  8. lintro-0.42.5/docs/SHELL-SCRIPT-STYLE-GUIDE.md +431 -0
  9. lintro-0.42.5/docs/architecture/ARCHITECTURE.md +570 -0
  10. lintro-0.42.5/docs/architecture/README.md +58 -0
  11. lintro-0.42.5/docs/architecture/ROADMAP.md +471 -0
  12. lintro-0.42.5/docs/architecture/VISION.md +271 -0
  13. lintro-0.42.5/docs/configuration.md +1738 -0
  14. lintro-0.42.5/docs/contributing.md +247 -0
  15. lintro-0.42.5/docs/debugging.md +172 -0
  16. lintro-0.42.5/docs/docker.md +387 -0
  17. lintro-0.42.5/docs/getting-started.md +564 -0
  18. lintro-0.42.5/docs/github-integration.md +520 -0
  19. lintro-0.42.5/docs/lintro-self-use.md +133 -0
  20. lintro-0.42.5/docs/plugins.md +220 -0
  21. lintro-0.42.5/docs/security/assurance.md +84 -0
  22. lintro-0.42.5/docs/security/requirements.md +44 -0
  23. lintro-0.42.5/docs/style-guide.md +555 -0
  24. lintro-0.42.5/docs/tool-analysis/README.md +189 -0
  25. lintro-0.42.5/docs/tool-analysis/actionlint-analysis.md +68 -0
  26. lintro-0.42.5/docs/tool-analysis/bandit-analysis.md +76 -0
  27. lintro-0.42.5/docs/tool-analysis/black-analysis.md +110 -0
  28. lintro-0.42.5/docs/tool-analysis/clippy-analysis.md +66 -0
  29. lintro-0.42.5/docs/tool-analysis/hadolint-analysis.md +249 -0
  30. lintro-0.42.5/docs/tool-analysis/markdownlint-analysis.md +79 -0
  31. lintro-0.42.5/docs/tool-analysis/mypy-analysis.md +82 -0
  32. lintro-0.42.5/docs/tool-analysis/oxc-analysis.md +393 -0
  33. lintro-0.42.5/docs/tool-analysis/prettier-analysis.md +139 -0
  34. lintro-0.42.5/docs/tool-analysis/pydoclint-analysis.md +280 -0
  35. lintro-0.42.5/docs/tool-analysis/pytest-analysis.md +564 -0
  36. lintro-0.42.5/docs/tool-analysis/ruff-analysis.md +273 -0
  37. lintro-0.42.5/docs/tool-analysis/tsc-analysis.md +159 -0
  38. lintro-0.42.5/docs/tool-analysis/yamllint-analysis.md +232 -0
  39. lintro-0.42.5/docs/troubleshooting.md +168 -0
  40. lintro-0.42.5/lintro/__init__.py +3 -0
  41. lintro-0.42.5/lintro/__main__.py +6 -0
  42. lintro-0.42.5/lintro/_tool_versions.py +180 -0
  43. lintro-0.42.5/lintro/ascii-art/fail.txt +404 -0
  44. lintro-0.42.5/lintro/ascii-art/success.txt +484 -0
  45. lintro-0.42.5/lintro/cli.py +212 -0
  46. lintro-0.42.5/lintro/cli_utils/__init__.py +7 -0
  47. lintro-0.42.5/lintro/cli_utils/command_chainer.py +223 -0
  48. lintro-0.42.5/lintro/cli_utils/commands/__init__.py +15 -0
  49. lintro-0.42.5/lintro/cli_utils/commands/check.py +247 -0
  50. lintro-0.42.5/lintro/cli_utils/commands/config.py +386 -0
  51. lintro-0.42.5/lintro/cli_utils/commands/doctor.py +263 -0
  52. lintro-0.42.5/lintro/cli_utils/commands/format.py +206 -0
  53. lintro-0.42.5/lintro/cli_utils/commands/init.py +292 -0
  54. lintro-0.42.5/lintro/cli_utils/commands/list_tools.py +300 -0
  55. lintro-0.42.5/lintro/cli_utils/commands/test.py +325 -0
  56. lintro-0.42.5/lintro/cli_utils/commands/versions.py +105 -0
  57. lintro-0.42.5/lintro/config/__init__.py +51 -0
  58. lintro-0.42.5/lintro/config/config_loader.py +415 -0
  59. lintro-0.42.5/lintro/config/enforce_config.py +23 -0
  60. lintro-0.42.5/lintro/config/execution_config.py +39 -0
  61. lintro-0.42.5/lintro/config/lintro_config.py +121 -0
  62. lintro-0.42.5/lintro/config/tool_config.py +23 -0
  63. lintro-0.42.5/lintro/config/tool_config_generator.py +414 -0
  64. lintro-0.42.5/lintro/enums/__init__.py +1 -0
  65. lintro-0.42.5/lintro/enums/action.py +57 -0
  66. lintro-0.42.5/lintro/enums/bandit_levels.py +82 -0
  67. lintro-0.42.5/lintro/enums/boolean_string.py +15 -0
  68. lintro-0.42.5/lintro/enums/config_format.py +41 -0
  69. lintro-0.42.5/lintro/enums/config_key.py +14 -0
  70. lintro-0.42.5/lintro/enums/display_column.py +35 -0
  71. lintro-0.42.5/lintro/enums/env_bool.py +13 -0
  72. lintro-0.42.5/lintro/enums/git_command.py +16 -0
  73. lintro-0.42.5/lintro/enums/git_ref.py +14 -0
  74. lintro-0.42.5/lintro/enums/group_by.py +34 -0
  75. lintro-0.42.5/lintro/enums/hadolint_enums.py +77 -0
  76. lintro-0.42.5/lintro/enums/hyphenated_str_enum.py +49 -0
  77. lintro-0.42.5/lintro/enums/output_format.py +42 -0
  78. lintro-0.42.5/lintro/enums/pydoclint_style.py +37 -0
  79. lintro-0.42.5/lintro/enums/pytest_enums.py +130 -0
  80. lintro-0.42.5/lintro/enums/semgrep_enums.py +36 -0
  81. lintro-0.42.5/lintro/enums/severity_level.py +44 -0
  82. lintro-0.42.5/lintro/enums/tool_name.py +58 -0
  83. lintro-0.42.5/lintro/enums/tool_option_key.py +14 -0
  84. lintro-0.42.5/lintro/enums/tool_order.py +43 -0
  85. lintro-0.42.5/lintro/enums/tool_type.py +60 -0
  86. lintro-0.42.5/lintro/enums/tools_value.py +39 -0
  87. lintro-0.42.5/lintro/enums/uppercase_str_enum.py +45 -0
  88. lintro-0.42.5/lintro/enums/yamllint_format.py +38 -0
  89. lintro-0.42.5/lintro/exceptions/__init__.py +1 -0
  90. lintro-0.42.5/lintro/exceptions/errors.py +35 -0
  91. lintro-0.42.5/lintro/formatters/__init__.py +30 -0
  92. lintro-0.42.5/lintro/formatters/core/__init__.py +22 -0
  93. lintro-0.42.5/lintro/formatters/core/format_registry.py +178 -0
  94. lintro-0.42.5/lintro/formatters/formatter.py +237 -0
  95. lintro-0.42.5/lintro/formatters/styles/__init__.py +17 -0
  96. lintro-0.42.5/lintro/formatters/styles/csv.py +47 -0
  97. lintro-0.42.5/lintro/formatters/styles/grid.py +97 -0
  98. lintro-0.42.5/lintro/formatters/styles/html.py +54 -0
  99. lintro-0.42.5/lintro/formatters/styles/json.py +62 -0
  100. lintro-0.42.5/lintro/formatters/styles/markdown.py +47 -0
  101. lintro-0.42.5/lintro/formatters/styles/plain.py +45 -0
  102. lintro-0.42.5/lintro/models/__init__.py +1 -0
  103. lintro-0.42.5/lintro/models/core/__init__.py +15 -0
  104. lintro-0.42.5/lintro/models/core/base_tool_options.py +18 -0
  105. lintro-0.42.5/lintro/models/core/black_options.py +22 -0
  106. lintro-0.42.5/lintro/models/core/prettier_options.py +38 -0
  107. lintro-0.42.5/lintro/models/core/pytest_options.py +50 -0
  108. lintro-0.42.5/lintro/models/core/ruff_options.py +38 -0
  109. lintro-0.42.5/lintro/models/core/tool_result.py +70 -0
  110. lintro-0.42.5/lintro/models/core/yamllint_options.py +18 -0
  111. lintro-0.42.5/lintro/parsers/__init__.py +100 -0
  112. lintro-0.42.5/lintro/parsers/actionlint/__init__.py +6 -0
  113. lintro-0.42.5/lintro/parsers/actionlint/actionlint_issue.py +25 -0
  114. lintro-0.42.5/lintro/parsers/actionlint/actionlint_parser.py +67 -0
  115. lintro-0.42.5/lintro/parsers/bandit/__init__.py +6 -0
  116. lintro-0.42.5/lintro/parsers/bandit/bandit_issue.py +61 -0
  117. lintro-0.42.5/lintro/parsers/bandit/bandit_parser.py +106 -0
  118. lintro-0.42.5/lintro/parsers/base_issue.py +86 -0
  119. lintro-0.42.5/lintro/parsers/base_parser.py +295 -0
  120. lintro-0.42.5/lintro/parsers/black/__init__.py +6 -0
  121. lintro-0.42.5/lintro/parsers/black/black_issue.py +30 -0
  122. lintro-0.42.5/lintro/parsers/black/black_parser.py +106 -0
  123. lintro-0.42.5/lintro/parsers/cargo_audit/__init__.py +1 -0
  124. lintro-0.42.5/lintro/parsers/cargo_audit/cargo_audit_issue.py +56 -0
  125. lintro-0.42.5/lintro/parsers/cargo_audit/cargo_audit_parser.py +174 -0
  126. lintro-0.42.5/lintro/parsers/clippy/__init__.py +6 -0
  127. lintro-0.42.5/lintro/parsers/clippy/clippy_issue.py +31 -0
  128. lintro-0.42.5/lintro/parsers/clippy/clippy_parser.py +138 -0
  129. lintro-0.42.5/lintro/parsers/gitleaks/__init__.py +6 -0
  130. lintro-0.42.5/lintro/parsers/gitleaks/gitleaks_issue.py +70 -0
  131. lintro-0.42.5/lintro/parsers/gitleaks/gitleaks_parser.py +177 -0
  132. lintro-0.42.5/lintro/parsers/hadolint/__init__.py +31 -0
  133. lintro-0.42.5/lintro/parsers/hadolint/hadolint_issue.py +25 -0
  134. lintro-0.42.5/lintro/parsers/hadolint/hadolint_parser.py +65 -0
  135. lintro-0.42.5/lintro/parsers/markdownlint/__init__.py +6 -0
  136. lintro-0.42.5/lintro/parsers/markdownlint/markdownlint_issue.py +16 -0
  137. lintro-0.42.5/lintro/parsers/markdownlint/markdownlint_parser.py +119 -0
  138. lintro-0.42.5/lintro/parsers/mypy/__init__.py +6 -0
  139. lintro-0.42.5/lintro/parsers/mypy/mypy_issue.py +47 -0
  140. lintro-0.42.5/lintro/parsers/mypy/mypy_parser.py +134 -0
  141. lintro-0.42.5/lintro/parsers/oxfmt/__init__.py +6 -0
  142. lintro-0.42.5/lintro/parsers/oxfmt/oxfmt_issue.py +16 -0
  143. lintro-0.42.5/lintro/parsers/oxfmt/oxfmt_parser.py +100 -0
  144. lintro-0.42.5/lintro/parsers/oxlint/__init__.py +6 -0
  145. lintro-0.42.5/lintro/parsers/oxlint/oxlint_issue.py +22 -0
  146. lintro-0.42.5/lintro/parsers/oxlint/oxlint_parser.py +114 -0
  147. lintro-0.42.5/lintro/parsers/prettier/__init__.py +6 -0
  148. lintro-0.42.5/lintro/parsers/prettier/prettier_issue.py +16 -0
  149. lintro-0.42.5/lintro/parsers/prettier/prettier_parser.py +65 -0
  150. lintro-0.42.5/lintro/parsers/pydoclint/__init__.py +10 -0
  151. lintro-0.42.5/lintro/parsers/pydoclint/pydoclint_issue.py +25 -0
  152. lintro-0.42.5/lintro/parsers/pydoclint/pydoclint_parser.py +105 -0
  153. lintro-0.42.5/lintro/parsers/pytest/__init__.py +17 -0
  154. lintro-0.42.5/lintro/parsers/pytest/format_parsers.py +397 -0
  155. lintro-0.42.5/lintro/parsers/pytest/models.py +33 -0
  156. lintro-0.42.5/lintro/parsers/pytest/pytest_issue.py +32 -0
  157. lintro-0.42.5/lintro/parsers/pytest/pytest_parser.py +58 -0
  158. lintro-0.42.5/lintro/parsers/pytest/summary_extractor.py +84 -0
  159. lintro-0.42.5/lintro/parsers/ruff/__init__.py +15 -0
  160. lintro-0.42.5/lintro/parsers/ruff/ruff_format_issue.py +23 -0
  161. lintro-0.42.5/lintro/parsers/ruff/ruff_issue.py +26 -0
  162. lintro-0.42.5/lintro/parsers/ruff/ruff_parser.py +213 -0
  163. lintro-0.42.5/lintro/parsers/rustfmt/__init__.py +1 -0
  164. lintro-0.42.5/lintro/parsers/rustfmt/rustfmt_issue.py +27 -0
  165. lintro-0.42.5/lintro/parsers/rustfmt/rustfmt_parser.py +87 -0
  166. lintro-0.42.5/lintro/parsers/semgrep/__init__.py +6 -0
  167. lintro-0.42.5/lintro/parsers/semgrep/semgrep_issue.py +61 -0
  168. lintro-0.42.5/lintro/parsers/semgrep/semgrep_parser.py +138 -0
  169. lintro-0.42.5/lintro/parsers/shellcheck/__init__.py +10 -0
  170. lintro-0.42.5/lintro/parsers/shellcheck/shellcheck_issue.py +45 -0
  171. lintro-0.42.5/lintro/parsers/shellcheck/shellcheck_parser.py +112 -0
  172. lintro-0.42.5/lintro/parsers/shfmt/__init__.py +10 -0
  173. lintro-0.42.5/lintro/parsers/shfmt/shfmt_issue.py +31 -0
  174. lintro-0.42.5/lintro/parsers/shfmt/shfmt_parser.py +127 -0
  175. lintro-0.42.5/lintro/parsers/sqlfluff/__init__.py +6 -0
  176. lintro-0.42.5/lintro/parsers/sqlfluff/sqlfluff_issue.py +31 -0
  177. lintro-0.42.5/lintro/parsers/sqlfluff/sqlfluff_parser.py +126 -0
  178. lintro-0.42.5/lintro/parsers/streaming.py +322 -0
  179. lintro-0.42.5/lintro/parsers/taplo/__init__.py +11 -0
  180. lintro-0.42.5/lintro/parsers/taplo/taplo_issue.py +31 -0
  181. lintro-0.42.5/lintro/parsers/taplo/taplo_parser.py +120 -0
  182. lintro-0.42.5/lintro/parsers/tsc/__init__.py +6 -0
  183. lintro-0.42.5/lintro/parsers/tsc/tsc_issue.py +42 -0
  184. lintro-0.42.5/lintro/parsers/tsc/tsc_parser.py +90 -0
  185. lintro-0.42.5/lintro/parsers/yamllint/__init__.py +6 -0
  186. lintro-0.42.5/lintro/parsers/yamllint/yamllint_issue.py +27 -0
  187. lintro-0.42.5/lintro/parsers/yamllint/yamllint_parser.py +93 -0
  188. lintro-0.42.5/lintro/plugins/__init__.py +60 -0
  189. lintro-0.42.5/lintro/plugins/base.py +571 -0
  190. lintro-0.42.5/lintro/plugins/discovery.py +191 -0
  191. lintro-0.42.5/lintro/plugins/execution_preparation.py +309 -0
  192. lintro-0.42.5/lintro/plugins/file_discovery.py +160 -0
  193. lintro-0.42.5/lintro/plugins/file_processor.py +144 -0
  194. lintro-0.42.5/lintro/plugins/protocol.py +150 -0
  195. lintro-0.42.5/lintro/plugins/registry.py +240 -0
  196. lintro-0.42.5/lintro/plugins/subprocess_executor.py +321 -0
  197. lintro-0.42.5/lintro/tools/__init__.py +22 -0
  198. lintro-0.42.5/lintro/tools/core/__init__.py +1 -0
  199. lintro-0.42.5/lintro/tools/core/command_builders.py +510 -0
  200. lintro-0.42.5/lintro/tools/core/config_injection.py +163 -0
  201. lintro-0.42.5/lintro/tools/core/line_length_checker.py +166 -0
  202. lintro-0.42.5/lintro/tools/core/option_spec.py +394 -0
  203. lintro-0.42.5/lintro/tools/core/option_validators.py +133 -0
  204. lintro-0.42.5/lintro/tools/core/runtime_discovery.py +293 -0
  205. lintro-0.42.5/lintro/tools/core/timeout_utils.py +126 -0
  206. lintro-0.42.5/lintro/tools/core/tool_manager.py +207 -0
  207. lintro-0.42.5/lintro/tools/core/version_checking.py +172 -0
  208. lintro-0.42.5/lintro/tools/core/version_parsing.py +321 -0
  209. lintro-0.42.5/lintro/tools/core/version_requirements.py +86 -0
  210. lintro-0.42.5/lintro/tools/definitions/__init__.py +31 -0
  211. lintro-0.42.5/lintro/tools/definitions/actionlint.py +227 -0
  212. lintro-0.42.5/lintro/tools/definitions/bandit.py +414 -0
  213. lintro-0.42.5/lintro/tools/definitions/black.py +396 -0
  214. lintro-0.42.5/lintro/tools/definitions/cargo_audit.py +188 -0
  215. lintro-0.42.5/lintro/tools/definitions/clippy.py +386 -0
  216. lintro-0.42.5/lintro/tools/definitions/gitleaks.py +302 -0
  217. lintro-0.42.5/lintro/tools/definitions/hadolint.py +282 -0
  218. lintro-0.42.5/lintro/tools/definitions/markdownlint.py +329 -0
  219. lintro-0.42.5/lintro/tools/definitions/mypy.py +375 -0
  220. lintro-0.42.5/lintro/tools/definitions/oxfmt.py +425 -0
  221. lintro-0.42.5/lintro/tools/definitions/oxlint.py +471 -0
  222. lintro-0.42.5/lintro/tools/definitions/prettier.py +529 -0
  223. lintro-0.42.5/lintro/tools/definitions/pydoclint.py +159 -0
  224. lintro-0.42.5/lintro/tools/definitions/pytest.py +370 -0
  225. lintro-0.42.5/lintro/tools/definitions/ruff.py +212 -0
  226. lintro-0.42.5/lintro/tools/definitions/rustfmt.py +374 -0
  227. lintro-0.42.5/lintro/tools/definitions/semgrep.py +348 -0
  228. lintro-0.42.5/lintro/tools/definitions/shellcheck.py +261 -0
  229. lintro-0.42.5/lintro/tools/definitions/shfmt.py +414 -0
  230. lintro-0.42.5/lintro/tools/definitions/sqlfluff.py +324 -0
  231. lintro-0.42.5/lintro/tools/definitions/taplo.py +414 -0
  232. lintro-0.42.5/lintro/tools/definitions/tsc.py +424 -0
  233. lintro-0.42.5/lintro/tools/definitions/yamllint.py +501 -0
  234. lintro-0.42.5/lintro/tools/implementations/__init__.py +28 -0
  235. lintro-0.42.5/lintro/tools/implementations/pytest/__init__.py +16 -0
  236. lintro-0.42.5/lintro/tools/implementations/pytest/collection.py +266 -0
  237. lintro-0.42.5/lintro/tools/implementations/pytest/coverage_processor.py +142 -0
  238. lintro-0.42.5/lintro/tools/implementations/pytest/formatters.py +314 -0
  239. lintro-0.42.5/lintro/tools/implementations/pytest/markers.py +188 -0
  240. lintro-0.42.5/lintro/tools/implementations/pytest/output.py +219 -0
  241. lintro-0.42.5/lintro/tools/implementations/pytest/output_parsers.py +149 -0
  242. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_command_builder.py +336 -0
  243. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_config.py +193 -0
  244. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_error_handler.py +128 -0
  245. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_executor.py +139 -0
  246. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_handlers.py +385 -0
  247. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_option_validators.py +215 -0
  248. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_output_processor.py +57 -0
  249. lintro-0.42.5/lintro/tools/implementations/pytest/pytest_result_processor.py +111 -0
  250. lintro-0.42.5/lintro/tools/implementations/pytest/test_analytics.py +150 -0
  251. lintro-0.42.5/lintro/tools/implementations/ruff/__init__.py +18 -0
  252. lintro-0.42.5/lintro/tools/implementations/ruff/check.py +215 -0
  253. lintro-0.42.5/lintro/tools/implementations/ruff/commands.py +174 -0
  254. lintro-0.42.5/lintro/tools/implementations/ruff/fix.py +349 -0
  255. lintro-0.42.5/lintro/utils/__init__.py +1 -0
  256. lintro-0.42.5/lintro/utils/ascii_normalize_cli.py +91 -0
  257. lintro-0.42.5/lintro/utils/async_tool_executor.py +247 -0
  258. lintro-0.42.5/lintro/utils/config.py +348 -0
  259. lintro-0.42.5/lintro/utils/config_constants.py +105 -0
  260. lintro-0.42.5/lintro/utils/config_priority.py +202 -0
  261. lintro-0.42.5/lintro/utils/config_reporting.py +102 -0
  262. lintro-0.42.5/lintro/utils/config_validation.py +111 -0
  263. lintro-0.42.5/lintro/utils/console/__init__.py +56 -0
  264. lintro-0.42.5/lintro/utils/console/constants.py +84 -0
  265. lintro-0.42.5/lintro/utils/console/logger.py +443 -0
  266. lintro-0.42.5/lintro/utils/display_helpers.py +136 -0
  267. lintro-0.42.5/lintro/utils/execution/__init__.py +33 -0
  268. lintro-0.42.5/lintro/utils/execution/exit_codes.py +84 -0
  269. lintro-0.42.5/lintro/utils/execution/parallel_executor.py +159 -0
  270. lintro-0.42.5/lintro/utils/execution/tool_configuration.py +201 -0
  271. lintro-0.42.5/lintro/utils/file_cache.py +246 -0
  272. lintro-0.42.5/lintro/utils/formatting.py +175 -0
  273. lintro-0.42.5/lintro/utils/json_output.py +59 -0
  274. lintro-0.42.5/lintro/utils/logger_setup.py +57 -0
  275. lintro-0.42.5/lintro/utils/native_parsers.py +377 -0
  276. lintro-0.42.5/lintro/utils/output/__init__.py +36 -0
  277. lintro-0.42.5/lintro/utils/output/constants.py +8 -0
  278. lintro-0.42.5/lintro/utils/output/file_writer.py +277 -0
  279. lintro-0.42.5/lintro/utils/output/helpers.py +48 -0
  280. lintro-0.42.5/lintro/utils/output/manager.py +292 -0
  281. lintro-0.42.5/lintro/utils/output/parser_registration.py +165 -0
  282. lintro-0.42.5/lintro/utils/output/parser_registry.py +126 -0
  283. lintro-0.42.5/lintro/utils/path_filtering.py +205 -0
  284. lintro-0.42.5/lintro/utils/path_utils.py +174 -0
  285. lintro-0.42.5/lintro/utils/post_checks.py +212 -0
  286. lintro-0.42.5/lintro/utils/result_formatters.py +341 -0
  287. lintro-0.42.5/lintro/utils/streaming_output.py +262 -0
  288. lintro-0.42.5/lintro/utils/summary_tables.py +324 -0
  289. lintro-0.42.5/lintro/utils/tool_config_info.py +13 -0
  290. lintro-0.42.5/lintro/utils/tool_executor.py +415 -0
  291. lintro-0.42.5/lintro/utils/tool_options.py +91 -0
  292. lintro-0.42.5/lintro/utils/tool_utils.py +33 -0
  293. lintro-0.42.5/lintro/utils/unified_config.py +82 -0
  294. lintro-0.42.5/lintro/utils/unified_config_manager.py +173 -0
  295. lintro-0.42.5/lintro.egg-info/PKG-INFO +313 -0
  296. lintro-0.42.5/lintro.egg-info/SOURCES.txt +772 -0
  297. lintro-0.42.5/lintro.egg-info/dependency_links.txt +1 -0
  298. lintro-0.42.5/lintro.egg-info/entry_points.txt +2 -0
  299. lintro-0.42.5/lintro.egg-info/requires.txt +46 -0
  300. lintro-0.42.5/lintro.egg-info/top_level.txt +1 -0
  301. lintro-0.42.5/pyproject.toml +300 -0
  302. lintro-0.42.5/setup.cfg +4 -0
  303. lintro-0.42.5/test_samples/tools/config/docker/Dockerfile.violations +38 -0
  304. lintro-0.42.5/test_samples/tools/config/github_actions/actionlint_violations.yml +9 -0
  305. lintro-0.42.5/test_samples/tools/config/yaml/yaml_violations.yml +20 -0
  306. lintro-0.42.5/test_samples/tools/javascript/oxfmt/oxfmt_clean.js +6 -0
  307. lintro-0.42.5/test_samples/tools/javascript/oxfmt/oxfmt_violations.js +4 -0
  308. lintro-0.42.5/test_samples/tools/javascript/oxlint/oxlint_clean.js +9 -0
  309. lintro-0.42.5/test_samples/tools/javascript/oxlint/oxlint_violations.js +19 -0
  310. lintro-0.42.5/test_samples/tools/javascript/prettier/prettier_violations.js +43 -0
  311. lintro-0.42.5/test_samples/tools/python/bandit/bandit_violations.py +42 -0
  312. lintro-0.42.5/test_samples/tools/python/mypy/mypy_violations.py +3 -0
  313. lintro-0.42.5/test_samples/tools/python/pydoclint/pydoclint_violations.py +145 -0
  314. lintro-0.42.5/test_samples/tools/python/pytest/pytest_clean.py +192 -0
  315. lintro-0.42.5/test_samples/tools/python/pytest/pytest_failures.py +132 -0
  316. lintro-0.42.5/test_samples/tools/python/ruff/ruff_annotations_violations.py +53 -0
  317. lintro-0.42.5/test_samples/tools/python/ruff/ruff_black_e501_wrappable.py +7 -0
  318. lintro-0.42.5/test_samples/tools/python/ruff/ruff_bugbear_violations.py +239 -0
  319. lintro-0.42.5/test_samples/tools/python/ruff/ruff_c4_comprehensions_violations.py +805 -0
  320. lintro-0.42.5/test_samples/tools/python/ruff/ruff_clean.py +15 -0
  321. lintro-0.42.5/test_samples/tools/python/ruff/ruff_e501_f401_violations.py +40 -0
  322. lintro-0.42.5/test_samples/tools/python/ruff/ruff_naming_violations.py +24 -0
  323. lintro-0.42.5/test_samples/tools/python/ruff/ruff_sim_simplify_violations.py +936 -0
  324. lintro-0.42.5/test_samples/tools/python/semgrep/semgrep_violations.py +93 -0
  325. lintro-0.42.5/test_samples/tools/security/gitleaks/gitleaks_clean.py +30 -0
  326. lintro-0.42.5/test_samples/tools/security/gitleaks/gitleaks_violations.py +18 -0
  327. lintro-0.42.5/tests/__init__.py +1 -0
  328. lintro-0.42.5/tests/cli/__init__.py +1 -0
  329. lintro-0.42.5/tests/cli/conftest.py +41 -0
  330. lintro-0.42.5/tests/cli/test_cli.py +136 -0
  331. lintro-0.42.5/tests/cli/test_config_command.py +256 -0
  332. lintro-0.42.5/tests/cli/test_init_command.py +110 -0
  333. lintro-0.42.5/tests/config/__init__.py +1 -0
  334. lintro-0.42.5/tests/config/test_config_loader.py +226 -0
  335. lintro-0.42.5/tests/config/test_init_command.py +173 -0
  336. lintro-0.42.5/tests/config/test_lintro_config.py +115 -0
  337. lintro-0.42.5/tests/config/test_tool_config_generator.py +336 -0
  338. lintro-0.42.5/tests/conftest.py +102 -0
  339. lintro-0.42.5/tests/constants.py +51 -0
  340. lintro-0.42.5/tests/formatters/__init__.py +1 -0
  341. lintro-0.42.5/tests/formatters/test_formatters.py +109 -0
  342. lintro-0.42.5/tests/integration/__init__.py +1 -0
  343. lintro-0.42.5/tests/integration/conftest.py +114 -0
  344. lintro-0.42.5/tests/integration/test_actionlint_integration.py +90 -0
  345. lintro-0.42.5/tests/integration/test_bandit_integration.py +54 -0
  346. lintro-0.42.5/tests/integration/test_built_package.py +112 -0
  347. lintro-0.42.5/tests/integration/test_markdownlint_integration.py +159 -0
  348. lintro-0.42.5/tests/integration/test_mypy_integration.py +144 -0
  349. lintro-0.42.5/tests/integration/test_parallel_execution.py +225 -0
  350. lintro-0.42.5/tests/integration/test_pydoclint_integration.py +198 -0
  351. lintro-0.42.5/tests/integration/tools/__init__.py +1 -0
  352. lintro-0.42.5/tests/integration/tools/gitleaks/__init__.py +1 -0
  353. lintro-0.42.5/tests/integration/tools/gitleaks/conftest.py +61 -0
  354. lintro-0.42.5/tests/integration/tools/gitleaks/test_check.py +83 -0
  355. lintro-0.42.5/tests/integration/tools/gitleaks/test_definition.py +69 -0
  356. lintro-0.42.5/tests/integration/tools/gitleaks/test_options.py +59 -0
  357. lintro-0.42.5/tests/integration/tools/shellcheck/__init__.py +1 -0
  358. lintro-0.42.5/tests/integration/tools/shellcheck/conftest.py +76 -0
  359. lintro-0.42.5/tests/integration/tools/shellcheck/test_check.py +135 -0
  360. lintro-0.42.5/tests/integration/tools/shellcheck/test_definition.py +73 -0
  361. lintro-0.42.5/tests/integration/tools/shellcheck/test_options.py +152 -0
  362. lintro-0.42.5/tests/integration/tools/test_bandit_integration.py +238 -0
  363. lintro-0.42.5/tests/integration/tools/test_black_integration.py +281 -0
  364. lintro-0.42.5/tests/integration/tools/test_mypy_integration.py +228 -0
  365. lintro-0.42.5/tests/integration/tools/test_oxfmt_integration.py +511 -0
  366. lintro-0.42.5/tests/integration/tools/test_oxlint_integration.py +544 -0
  367. lintro-0.42.5/tests/integration/tools/test_prettier_integration.py +219 -0
  368. lintro-0.42.5/tests/integration/tools/test_ruff_integration.py +453 -0
  369. lintro-0.42.5/tests/integration/tools/test_rustfmt_integration.py +463 -0
  370. lintro-0.42.5/tests/integration/tools/test_semgrep_integration.py +260 -0
  371. lintro-0.42.5/tests/integration/tools/test_shfmt_integration.py +424 -0
  372. lintro-0.42.5/tests/integration/tools/test_sqlfluff_integration.py +294 -0
  373. lintro-0.42.5/tests/integration/tools/test_taplo_integration.py +283 -0
  374. lintro-0.42.5/tests/integration/tools/test_yamllint_integration.py +321 -0
  375. lintro-0.42.5/tests/integration/tools/tsc/__init__.py +0 -0
  376. lintro-0.42.5/tests/integration/tools/tsc/conftest.py +86 -0
  377. lintro-0.42.5/tests/integration/tools/tsc/test_check.py +249 -0
  378. lintro-0.42.5/tests/scripts/__init__.py +1 -0
  379. lintro-0.42.5/tests/scripts/conftest.py +44 -0
  380. lintro-0.42.5/tests/scripts/test_ci_post_pr_comment.py +341 -0
  381. lintro-0.42.5/tests/scripts/test_coverage_pipeline_integration.py +192 -0
  382. lintro-0.42.5/tests/scripts/test_delete_previous_lintro_comments.py +106 -0
  383. lintro-0.42.5/tests/scripts/test_extract_test_summary.py +218 -0
  384. lintro-0.42.5/tests/scripts/test_extract_version.py +54 -0
  385. lintro-0.42.5/tests/scripts/test_ghcr_prune_untagged.py +299 -0
  386. lintro-0.42.5/tests/scripts/test_github_comment_utilities.py +20 -0
  387. lintro-0.42.5/tests/scripts/test_github_comment_utilities_encode.py +195 -0
  388. lintro-0.42.5/tests/scripts/test_github_comment_utilities_extract.py +172 -0
  389. lintro-0.42.5/tests/scripts/test_github_comment_utilities_find.py +204 -0
  390. lintro-0.42.5/tests/scripts/test_merge_pr_comment.py +354 -0
  391. lintro-0.42.5/tests/scripts/test_semantic_release_compute_next.py +141 -0
  392. lintro-0.42.5/tests/scripts/test_shell_scripts.py +30 -0
  393. lintro-0.42.5/tests/test_documentation.py +181 -0
  394. lintro-0.42.5/tests/unit/__init__.py +1 -0
  395. lintro-0.42.5/tests/unit/cli/__init__.py +0 -0
  396. lintro-0.42.5/tests/unit/cli/conftest.py +96 -0
  397. lintro-0.42.5/tests/unit/cli/test_check_command.py +383 -0
  398. lintro-0.42.5/tests/unit/cli/test_cli.py +291 -0
  399. lintro-0.42.5/tests/unit/cli/test_cli_commands.py +21 -0
  400. lintro-0.42.5/tests/unit/cli/test_cli_commands_more.py +67 -0
  401. lintro-0.42.5/tests/unit/cli/test_cli_lintro_group.py +280 -0
  402. lintro-0.42.5/tests/unit/cli/test_cli_programmatic.py +138 -0
  403. lintro-0.42.5/tests/unit/cli/test_format_command.py +490 -0
  404. lintro-0.42.5/tests/unit/cli_utils/__init__.py +1 -0
  405. lintro-0.42.5/tests/unit/cli_utils/command_chainer/__init__.py +1 -0
  406. lintro-0.42.5/tests/unit/cli_utils/command_chainer/conftest.py +57 -0
  407. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_execute.py +206 -0
  408. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_group_commands.py +73 -0
  409. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_init.py +62 -0
  410. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_integration.py +46 -0
  411. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_normalize_args.py +73 -0
  412. lintro-0.42.5/tests/unit/cli_utils/command_chainer/test_should_chain.py +63 -0
  413. lintro-0.42.5/tests/unit/cli_utils/commands/test_format.py +251 -0
  414. lintro-0.42.5/tests/unit/compatibility/conftest.py +7 -0
  415. lintro-0.42.5/tests/unit/compatibility/test_compatibility_ruff_black.py +265 -0
  416. lintro-0.42.5/tests/unit/config/conftest.py +52 -0
  417. lintro-0.42.5/tests/unit/config/test_config_compatibility.py +71 -0
  418. lintro-0.42.5/tests/unit/config/test_config_loader.py +141 -0
  419. lintro-0.42.5/tests/unit/config/test_config_loader_more.py +44 -0
  420. lintro-0.42.5/tests/unit/config/test_config_loaders.py +382 -0
  421. lintro-0.42.5/tests/unit/config/test_config_tool_specific.py +230 -0
  422. lintro-0.42.5/tests/unit/config/test_enforce_config.py +63 -0
  423. lintro-0.42.5/tests/unit/config/test_execution_config.py +119 -0
  424. lintro-0.42.5/tests/unit/config/test_lintro_config.py +158 -0
  425. lintro-0.42.5/tests/unit/config/test_unified_config.py +112 -0
  426. lintro-0.42.5/tests/unit/conftest.py +144 -0
  427. lintro-0.42.5/tests/unit/core/conftest.py +9 -0
  428. lintro-0.42.5/tests/unit/core/test_version_requirements.py +394 -0
  429. lintro-0.42.5/tests/unit/enums/__init__.py +1 -0
  430. lintro-0.42.5/tests/unit/enums/test_bandit_levels.py +109 -0
  431. lintro-0.42.5/tests/unit/enums/test_base.py +87 -0
  432. lintro-0.42.5/tests/unit/enums/test_enum_normalizers.py +227 -0
  433. lintro-0.42.5/tests/unit/enums/test_output_format.py +63 -0
  434. lintro-0.42.5/tests/unit/enums/test_tool_name.py +66 -0
  435. lintro-0.42.5/tests/unit/exceptions/conftest.py +7 -0
  436. lintro-0.42.5/tests/unit/exceptions/test_exceptions.py +124 -0
  437. lintro-0.42.5/tests/unit/formatters/__init__.py +3 -0
  438. lintro-0.42.5/tests/unit/formatters/conftest.py +45 -0
  439. lintro-0.42.5/tests/unit/formatters/styles/__init__.py +3 -0
  440. lintro-0.42.5/tests/unit/formatters/styles/conftest.py +89 -0
  441. lintro-0.42.5/tests/unit/formatters/styles/test_csv.py +100 -0
  442. lintro-0.42.5/tests/unit/formatters/styles/test_html.py +101 -0
  443. lintro-0.42.5/tests/unit/formatters/styles/test_json.py +127 -0
  444. lintro-0.42.5/tests/unit/formatters/styles/test_markdown.py +104 -0
  445. lintro-0.42.5/tests/unit/formatters/styles/test_plain.py +119 -0
  446. lintro-0.42.5/tests/unit/formatters/styles/test_style_common.py +47 -0
  447. lintro-0.42.5/tests/unit/formatters/styles/test_style_csv.py +63 -0
  448. lintro-0.42.5/tests/unit/formatters/styles/test_style_grid.py +64 -0
  449. lintro-0.42.5/tests/unit/formatters/styles/test_style_html.py +76 -0
  450. lintro-0.42.5/tests/unit/formatters/styles/test_style_json.py +140 -0
  451. lintro-0.42.5/tests/unit/formatters/styles/test_style_markdown.py +66 -0
  452. lintro-0.42.5/tests/unit/formatters/styles/test_style_plain.py +64 -0
  453. lintro-0.42.5/tests/unit/formatters/test_format_issues.py +433 -0
  454. lintro-0.42.5/tests/unit/formatters/test_format_registry.py +190 -0
  455. lintro-0.42.5/tests/unit/logging/conftest.py +7 -0
  456. lintro-0.42.5/tests/unit/logging/test_console_logger.py +128 -0
  457. lintro-0.42.5/tests/unit/logging/test_console_logger_more.py +138 -0
  458. lintro-0.42.5/tests/unit/output/conftest.py +7 -0
  459. lintro-0.42.5/tests/unit/output/test_output_manager_reports.py +69 -0
  460. lintro-0.42.5/tests/unit/parsers/base_parser/__init__.py +1 -0
  461. lintro-0.42.5/tests/unit/parsers/base_parser/test_continuation_lines.py +67 -0
  462. lintro-0.42.5/tests/unit/parsers/base_parser/test_extract_fields.py +132 -0
  463. lintro-0.42.5/tests/unit/parsers/base_parser/test_safe_parse.py +82 -0
  464. lintro-0.42.5/tests/unit/parsers/base_parser/test_strip_ansi.py +41 -0
  465. lintro-0.42.5/tests/unit/parsers/base_parser/test_validate_fields.py +82 -0
  466. lintro-0.42.5/tests/unit/parsers/conftest.py +68 -0
  467. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/__init__.py +1 -0
  468. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/test_edge_cases.py +73 -0
  469. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/test_field_parsing.py +117 -0
  470. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/test_issue_model.py +43 -0
  471. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/test_plugin_parsing.py +169 -0
  472. lintro-0.42.5/tests/unit/parsers/gitleaks_parser/test_valid_output.py +89 -0
  473. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/__init__.py +1 -0
  474. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/conftest.py +54 -0
  475. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/test_edge_cases.py +120 -0
  476. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/test_field_extraction.py +111 -0
  477. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/test_invalid_input.py +64 -0
  478. lintro-0.42.5/tests/unit/parsers/pydoclint_parser/test_issue_model.py +70 -0
  479. lintro-0.42.5/tests/unit/parsers/pytest/test_pytest_parser.py +394 -0
  480. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/__init__.py +1 -0
  481. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/conftest.py +59 -0
  482. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/test_edge_cases.py +97 -0
  483. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/test_field_extraction.py +85 -0
  484. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/test_invalid_input.py +47 -0
  485. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/test_issue_model.py +34 -0
  486. lintro-0.42.5/tests/unit/parsers/shellcheck_parser/test_multiple_issues.py +65 -0
  487. lintro-0.42.5/tests/unit/parsers/streaming/__init__.py +1 -0
  488. lintro-0.42.5/tests/unit/parsers/streaming/conftest.py +71 -0
  489. lintro-0.42.5/tests/unit/parsers/streaming/test_collect.py +40 -0
  490. lintro-0.42.5/tests/unit/parsers/streaming/test_json_array.py +83 -0
  491. lintro-0.42.5/tests/unit/parsers/streaming/test_json_lines.py +140 -0
  492. lintro-0.42.5/tests/unit/parsers/streaming/test_parser_class.py +84 -0
  493. lintro-0.42.5/tests/unit/parsers/streaming/test_text_lines.py +86 -0
  494. lintro-0.42.5/tests/unit/parsers/test_actionlint_parser.py +31 -0
  495. lintro-0.42.5/tests/unit/parsers/test_bandit_parser.py +263 -0
  496. lintro-0.42.5/tests/unit/parsers/test_base_issue.py +165 -0
  497. lintro-0.42.5/tests/unit/parsers/test_base_parser.py +359 -0
  498. lintro-0.42.5/tests/unit/parsers/test_black_parser.py +36 -0
  499. lintro-0.42.5/tests/unit/parsers/test_cargo_audit_parser.py +224 -0
  500. lintro-0.42.5/tests/unit/parsers/test_clippy_parser.py +115 -0
  501. lintro-0.42.5/tests/unit/parsers/test_hadolint_parser.py +175 -0
  502. lintro-0.42.5/tests/unit/parsers/test_markdownlint_parser.py +139 -0
  503. lintro-0.42.5/tests/unit/parsers/test_mypy_parser.py +151 -0
  504. lintro-0.42.5/tests/unit/parsers/test_oxfmt_parser.py +183 -0
  505. lintro-0.42.5/tests/unit/parsers/test_oxlint_parser.py +284 -0
  506. lintro-0.42.5/tests/unit/parsers/test_prettier_parser.py +96 -0
  507. lintro-0.42.5/tests/unit/parsers/test_ruff_parser_additional.py +127 -0
  508. lintro-0.42.5/tests/unit/parsers/test_ruff_parser_more.py +63 -0
  509. lintro-0.42.5/tests/unit/parsers/test_rustfmt_parser.py +121 -0
  510. lintro-0.42.5/tests/unit/parsers/test_semgrep_parser.py +416 -0
  511. lintro-0.42.5/tests/unit/parsers/test_shfmt_parser.py +270 -0
  512. lintro-0.42.5/tests/unit/parsers/test_sqlfluff_parser.py +402 -0
  513. lintro-0.42.5/tests/unit/parsers/test_taplo_parser.py +323 -0
  514. lintro-0.42.5/tests/unit/parsers/test_tsc_parser.py +154 -0
  515. lintro-0.42.5/tests/unit/parsers/test_yamllint_parser.py +106 -0
  516. lintro-0.42.5/tests/unit/plugins/base/__init__.py +1 -0
  517. lintro-0.42.5/tests/unit/plugins/base/conftest.py +44 -0
  518. lintro-0.42.5/tests/unit/plugins/base/test_execution.py +442 -0
  519. lintro-0.42.5/tests/unit/plugins/base/test_options.py +182 -0
  520. lintro-0.42.5/tests/unit/plugins/base/test_subprocess.py +262 -0
  521. lintro-0.42.5/tests/unit/plugins/base/test_subprocess_streaming.py +163 -0
  522. lintro-0.42.5/tests/unit/plugins/conftest.py +151 -0
  523. lintro-0.42.5/tests/unit/plugins/test_base_plugin_config.py +336 -0
  524. lintro-0.42.5/tests/unit/plugins/test_discovery.py +229 -0
  525. lintro-0.42.5/tests/unit/plugins/test_file_processor.py +331 -0
  526. lintro-0.42.5/tests/unit/plugins/test_registry.py +423 -0
  527. lintro-0.42.5/tests/unit/pytest/conftest.py +7 -0
  528. lintro-0.42.5/tests/unit/pytest/test_pytest_cli_commands.py +205 -0
  529. lintro-0.42.5/tests/unit/pytest/test_pytest_cli_options.py +148 -0
  530. lintro-0.42.5/tests/unit/pytest/test_pytest_handlers.py +550 -0
  531. lintro-0.42.5/tests/unit/pytest/test_pytest_programmatic_api.py +254 -0
  532. lintro-0.42.5/tests/unit/security/__init__.py +1 -0
  533. lintro-0.42.5/tests/unit/security/conftest.py +23 -0
  534. lintro-0.42.5/tests/unit/security/test_json_edge_cases.py +309 -0
  535. lintro-0.42.5/tests/unit/security/test_path_traversal.py +316 -0
  536. lintro-0.42.5/tests/unit/security/test_subprocess_injection.py +260 -0
  537. lintro-0.42.5/tests/unit/tools/assertions/__init__.py +3 -0
  538. lintro-0.42.5/tests/unit/tools/assertions/conftest.py +104 -0
  539. lintro-0.42.5/tests/unit/tools/base/conftest.py +7 -0
  540. lintro-0.42.5/tests/unit/tools/cargo_audit/__init__.py +1 -0
  541. lintro-0.42.5/tests/unit/tools/cargo_audit/test_cargo_audit_plugin.py +285 -0
  542. lintro-0.42.5/tests/unit/tools/conftest.py +283 -0
  543. lintro-0.42.5/tests/unit/tools/core/__init__.py +1 -0
  544. lintro-0.42.5/tests/unit/tools/core/conftest.py +32 -0
  545. lintro-0.42.5/tests/unit/tools/core/test_command_builders.py +314 -0
  546. lintro-0.42.5/tests/unit/tools/core/test_line_length_checker.py +308 -0
  547. lintro-0.42.5/tests/unit/tools/core/test_option_spec.py +121 -0
  548. lintro-0.42.5/tests/unit/tools/core/test_option_validators.py +348 -0
  549. lintro-0.42.5/tests/unit/tools/core/test_runtime_discovery.py +228 -0
  550. lintro-0.42.5/tests/unit/tools/core/test_tool_options_spec.py +107 -0
  551. lintro-0.42.5/tests/unit/tools/core/test_version_checking.py +123 -0
  552. lintro-0.42.5/tests/unit/tools/executor/conftest.py +10 -0
  553. lintro-0.42.5/tests/unit/tools/executor/test_tool_configuration_enabled.py +387 -0
  554. lintro-0.42.5/tests/unit/tools/executor/test_tool_executor.py +401 -0
  555. lintro-0.42.5/tests/unit/tools/executor/test_tool_executor_fmt_exclusion.py +24 -0
  556. lintro-0.42.5/tests/unit/tools/executor/test_tool_executor_more.py +473 -0
  557. lintro-0.42.5/tests/unit/tools/executor/test_tool_executor_post_checks.py +215 -0
  558. lintro-0.42.5/tests/unit/tools/executor/test_tool_executor_pytest.py +317 -0
  559. lintro-0.42.5/tests/unit/tools/gitleaks/__init__.py +1 -0
  560. lintro-0.42.5/tests/unit/tools/gitleaks/conftest.py +24 -0
  561. lintro-0.42.5/tests/unit/tools/gitleaks/test_error_handling.py +77 -0
  562. lintro-0.42.5/tests/unit/tools/gitleaks/test_execution.py +112 -0
  563. lintro-0.42.5/tests/unit/tools/gitleaks/test_options.py +279 -0
  564. lintro-0.42.5/tests/unit/tools/hadolint/__init__.py +1 -0
  565. lintro-0.42.5/tests/unit/tools/hadolint/conftest.py +17 -0
  566. lintro-0.42.5/tests/unit/tools/hadolint/test_execution.py +173 -0
  567. lintro-0.42.5/tests/unit/tools/hadolint/test_options.py +295 -0
  568. lintro-0.42.5/tests/unit/tools/manager/conftest.py +7 -0
  569. lintro-0.42.5/tests/unit/tools/manager/test_tool_manager.py +155 -0
  570. lintro-0.42.5/tests/unit/tools/mypy/test_mypy_plugin.py +197 -0
  571. lintro-0.42.5/tests/unit/tools/oxfmt/__init__.py +1 -0
  572. lintro-0.42.5/tests/unit/tools/oxfmt/conftest.py +24 -0
  573. lintro-0.42.5/tests/unit/tools/oxfmt/test_check_method.py +191 -0
  574. lintro-0.42.5/tests/unit/tools/oxfmt/test_default_options.py +150 -0
  575. lintro-0.42.5/tests/unit/tools/oxfmt/test_fix_method.py +304 -0
  576. lintro-0.42.5/tests/unit/tools/oxfmt/test_set_options.py +135 -0
  577. lintro-0.42.5/tests/unit/tools/oxlint/__init__.py +1 -0
  578. lintro-0.42.5/tests/unit/tools/oxlint/conftest.py +17 -0
  579. lintro-0.42.5/tests/unit/tools/oxlint/test_check_method.py +167 -0
  580. lintro-0.42.5/tests/unit/tools/oxlint/test_default_options.py +57 -0
  581. lintro-0.42.5/tests/unit/tools/oxlint/test_fix_method.py +512 -0
  582. lintro-0.42.5/tests/unit/tools/oxlint/test_set_options.py +239 -0
  583. lintro-0.42.5/tests/unit/tools/prettier/__init__.py +1 -0
  584. lintro-0.42.5/tests/unit/tools/prettier/conftest.py +17 -0
  585. lintro-0.42.5/tests/unit/tools/prettier/test_check_method.py +3 -0
  586. lintro-0.42.5/tests/unit/tools/prettier/test_config_discovery.py +81 -0
  587. lintro-0.42.5/tests/unit/tools/prettier/test_default_options.py +52 -0
  588. lintro-0.42.5/tests/unit/tools/prettier/test_fix_method.py +159 -0
  589. lintro-0.42.5/tests/unit/tools/prettier/test_output_parsing.py +50 -0
  590. lintro-0.42.5/tests/unit/tools/prettier/test_set_options.py +83 -0
  591. lintro-0.42.5/tests/unit/tools/prettier/test_timeout_handling.py +87 -0
  592. lintro-0.42.5/tests/unit/tools/pydoclint/__init__.py +1 -0
  593. lintro-0.42.5/tests/unit/tools/pydoclint/conftest.py +13 -0
  594. lintro-0.42.5/tests/unit/tools/pydoclint/test_build_command.py +46 -0
  595. lintro-0.42.5/tests/unit/tools/pydoclint/test_check_method.py +123 -0
  596. lintro-0.42.5/tests/unit/tools/pydoclint/test_config_initialization.py +31 -0
  597. lintro-0.42.5/tests/unit/tools/pydoclint/test_default_options.py +39 -0
  598. lintro-0.42.5/tests/unit/tools/pydoclint/test_fix_method.py +26 -0
  599. lintro-0.42.5/tests/unit/tools/pydoclint/test_set_options.py +31 -0
  600. lintro-0.42.5/tests/unit/tools/pytest_tool/__init__.py +1 -0
  601. lintro-0.42.5/tests/unit/tools/pytest_tool/conftest.py +406 -0
  602. lintro-0.42.5/tests/unit/tools/pytest_tool/test_check_method.py +191 -0
  603. lintro-0.42.5/tests/unit/tools/pytest_tool/test_configuration.py +97 -0
  604. lintro-0.42.5/tests/unit/tools/pytest_tool/test_json_parsing.py +64 -0
  605. lintro-0.42.5/tests/unit/tools/pytest_tool/test_junit_parsing.py +57 -0
  606. lintro-0.42.5/tests/unit/tools/pytest_tool/test_output_parsing.py +107 -0
  607. lintro-0.42.5/tests/unit/tools/pytest_tool/test_output_processing.py +158 -0
  608. lintro-0.42.5/tests/unit/tools/pytest_tool/test_pytest_handlers.py +320 -0
  609. lintro-0.42.5/tests/unit/tools/pytest_tool/test_pytest_issue.py +39 -0
  610. lintro-0.42.5/tests/unit/tools/pytest_tool/test_pytest_output_processor.py +94 -0
  611. lintro-0.42.5/tests/unit/tools/pytest_tool/test_result_processor.py +126 -0
  612. lintro-0.42.5/tests/unit/tools/pytest_tool/test_set_options.py +135 -0
  613. lintro-0.42.5/tests/unit/tools/pytest_tool/test_text_parsing.py +42 -0
  614. lintro-0.42.5/tests/unit/tools/pytest_tool/test_validators.py +48 -0
  615. lintro-0.42.5/tests/unit/tools/ruff/__init__.py +1 -0
  616. lintro-0.42.5/tests/unit/tools/ruff/check/__init__.py +1 -0
  617. lintro-0.42.5/tests/unit/tools/ruff/check/conftest.py +4 -0
  618. lintro-0.42.5/tests/unit/tools/ruff/check/test_config_detection.py +85 -0
  619. lintro-0.42.5/tests/unit/tools/ruff/check/test_error_handling.py +135 -0
  620. lintro-0.42.5/tests/unit/tools/ruff/check/test_format_normalization.py +55 -0
  621. lintro-0.42.5/tests/unit/tools/ruff/check/test_json_parsing.py +136 -0
  622. lintro-0.42.5/tests/unit/tools/ruff/check/test_no_issues.py +108 -0
  623. lintro-0.42.5/tests/unit/tools/ruff/check/test_output_format.py +72 -0
  624. lintro-0.42.5/tests/unit/tools/ruff/check/test_output_truncation.py +156 -0
  625. lintro-0.42.5/tests/unit/tools/ruff/check/test_path_filtering.py +213 -0
  626. lintro-0.42.5/tests/unit/tools/ruff/check/test_real_plugin.py +52 -0
  627. lintro-0.42.5/tests/unit/tools/ruff/check/test_timeout.py +51 -0
  628. lintro-0.42.5/tests/unit/tools/ruff/check/test_with_issues.py +166 -0
  629. lintro-0.42.5/tests/unit/tools/ruff/conftest.py +154 -0
  630. lintro-0.42.5/tests/unit/tools/ruff/fix/__init__.py +1 -0
  631. lintro-0.42.5/tests/unit/tools/ruff/fix/conftest.py +4 -0
  632. lintro-0.42.5/tests/unit/tools/ruff/fix/test_combined_issues.py +91 -0
  633. lintro-0.42.5/tests/unit/tools/ruff/fix/test_config.py +35 -0
  634. lintro-0.42.5/tests/unit/tools/ruff/fix/test_edge_cases.py +117 -0
  635. lintro-0.42.5/tests/unit/tools/ruff/fix/test_format_option.py +98 -0
  636. lintro-0.42.5/tests/unit/tools/ruff/fix/test_no_files.py +49 -0
  637. lintro-0.42.5/tests/unit/tools/ruff/fix/test_real_plugin.py +65 -0
  638. lintro-0.42.5/tests/unit/tools/ruff/fix/test_successful_fix.py +106 -0
  639. lintro-0.42.5/tests/unit/tools/ruff/fix/test_temporary_option.py +79 -0
  640. lintro-0.42.5/tests/unit/tools/ruff/fix/test_timeout.py +177 -0
  641. lintro-0.42.5/tests/unit/tools/ruff/fix/test_unsafe_fixes.py +76 -0
  642. lintro-0.42.5/tests/unit/tools/ruff/fix/test_version_check.py +29 -0
  643. lintro-0.42.5/tests/unit/tools/rustfmt/__init__.py +1 -0
  644. lintro-0.42.5/tests/unit/tools/rustfmt/conftest.py +23 -0
  645. lintro-0.42.5/tests/unit/tools/rustfmt/test_error_handling.py +247 -0
  646. lintro-0.42.5/tests/unit/tools/rustfmt/test_execution.py +254 -0
  647. lintro-0.42.5/tests/unit/tools/rustfmt/test_options.py +175 -0
  648. lintro-0.42.5/tests/unit/tools/semgrep/__init__.py +1 -0
  649. lintro-0.42.5/tests/unit/tools/semgrep/conftest.py +24 -0
  650. lintro-0.42.5/tests/unit/tools/semgrep/test_error_handling.py +238 -0
  651. lintro-0.42.5/tests/unit/tools/semgrep/test_execution.py +171 -0
  652. lintro-0.42.5/tests/unit/tools/semgrep/test_options.py +353 -0
  653. lintro-0.42.5/tests/unit/tools/shellcheck/__init__.py +1 -0
  654. lintro-0.42.5/tests/unit/tools/shellcheck/conftest.py +24 -0
  655. lintro-0.42.5/tests/unit/tools/shellcheck/test_error_handling.py +38 -0
  656. lintro-0.42.5/tests/unit/tools/shellcheck/test_execution.py +182 -0
  657. lintro-0.42.5/tests/unit/tools/shellcheck/test_options.py +282 -0
  658. lintro-0.42.5/tests/unit/tools/shfmt/__init__.py +1 -0
  659. lintro-0.42.5/tests/unit/tools/shfmt/conftest.py +23 -0
  660. lintro-0.42.5/tests/unit/tools/shfmt/test_error_handling.py +144 -0
  661. lintro-0.42.5/tests/unit/tools/shfmt/test_execution.py +205 -0
  662. lintro-0.42.5/tests/unit/tools/shfmt/test_options.py +307 -0
  663. lintro-0.42.5/tests/unit/tools/sqlfluff/__init__.py +1 -0
  664. lintro-0.42.5/tests/unit/tools/sqlfluff/conftest.py +27 -0
  665. lintro-0.42.5/tests/unit/tools/sqlfluff/test_error_handling.py +98 -0
  666. lintro-0.42.5/tests/unit/tools/sqlfluff/test_execution.py +171 -0
  667. lintro-0.42.5/tests/unit/tools/sqlfluff/test_options.py +385 -0
  668. lintro-0.42.5/tests/unit/tools/sqlfluff/test_output_parsing.py +134 -0
  669. lintro-0.42.5/tests/unit/tools/taplo/__init__.py +1 -0
  670. lintro-0.42.5/tests/unit/tools/taplo/conftest.py +23 -0
  671. lintro-0.42.5/tests/unit/tools/taplo/test_error_handling.py +128 -0
  672. lintro-0.42.5/tests/unit/tools/taplo/test_execution.py +286 -0
  673. lintro-0.42.5/tests/unit/tools/taplo/test_options.py +279 -0
  674. lintro-0.42.5/tests/unit/tools/test_common_behaviors.py +450 -0
  675. lintro-0.42.5/tests/unit/tools/test_edge_cases.py +350 -0
  676. lintro-0.42.5/tests/unit/tools/test_helpers.py +327 -0
  677. lintro-0.42.5/tests/unit/tools/test_plugin_definitions.py +421 -0
  678. lintro-0.42.5/tests/unit/tools/test_tool_definitions.py +333 -0
  679. lintro-0.42.5/tests/unit/tools/tsc/__init__.py +1 -0
  680. lintro-0.42.5/tests/unit/tools/tsc/conftest.py +6 -0
  681. lintro-0.42.5/tests/unit/tools/tsc/test_execution.py +171 -0
  682. lintro-0.42.5/tests/unit/tools/tsc/test_options.py +347 -0
  683. lintro-0.42.5/tests/unit/tools/tsc/test_tsc_plugin.py +236 -0
  684. lintro-0.42.5/tests/unit/utils/__init__.py +1 -0
  685. lintro-0.42.5/tests/unit/utils/async_tool_executor/__init__.py +1 -0
  686. lintro-0.42.5/tests/unit/utils/async_tool_executor/conftest.py +121 -0
  687. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_callbacks.py +100 -0
  688. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_exceptions.py +51 -0
  689. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_init.py +32 -0
  690. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_parallel_batches.py +164 -0
  691. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_run_tool_async.py +137 -0
  692. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_run_tools_parallel.py +190 -0
  693. lintro-0.42.5/tests/unit/utils/async_tool_executor/test_shutdown.py +28 -0
  694. lintro-0.42.5/tests/unit/utils/config/__init__.py +1 -0
  695. lintro-0.42.5/tests/unit/utils/config/conftest.py +65 -0
  696. lintro-0.42.5/tests/unit/utils/config/test_manager_configuration.py +420 -0
  697. lintro-0.42.5/tests/unit/utils/config/test_manager_core.py +337 -0
  698. lintro-0.42.5/tests/unit/utils/conftest.py +128 -0
  699. lintro-0.42.5/tests/unit/utils/console/conftest.py +39 -0
  700. lintro-0.42.5/tests/unit/utils/console/summary/__init__.py +1 -0
  701. lintro-0.42.5/tests/unit/utils/console/summary/test_delegation.py +364 -0
  702. lintro-0.42.5/tests/unit/utils/console/summary/test_execution_summary.py +353 -0
  703. lintro-0.42.5/tests/unit/utils/console/test_logger_headers.py +123 -0
  704. lintro-0.42.5/tests/unit/utils/console/test_logger_initialization.py +36 -0
  705. lintro-0.42.5/tests/unit/utils/console/test_logger_levels.py +129 -0
  706. lintro-0.42.5/tests/unit/utils/console/test_logger_metadata.py +140 -0
  707. lintro-0.42.5/tests/unit/utils/console/test_logger_output_methods.py +149 -0
  708. lintro-0.42.5/tests/unit/utils/console/test_logger_results.py +111 -0
  709. lintro-0.42.5/tests/unit/utils/native_parsers/__init__.py +1 -0
  710. lintro-0.42.5/tests/unit/utils/native_parsers/conftest.py +36 -0
  711. lintro-0.42.5/tests/unit/utils/native_parsers/test_config_constants.py +41 -0
  712. lintro-0.42.5/tests/unit/utils/native_parsers/test_json_config.py +109 -0
  713. lintro-0.42.5/tests/unit/utils/native_parsers/test_jsonc_comments.py +189 -0
  714. lintro-0.42.5/tests/unit/utils/native_parsers/test_markdownlint_config.py +130 -0
  715. lintro-0.42.5/tests/unit/utils/native_parsers/test_oxfmt_config.py +172 -0
  716. lintro-0.42.5/tests/unit/utils/native_parsers/test_oxlint_config.py +115 -0
  717. lintro-0.42.5/tests/unit/utils/native_parsers/test_pyproject_tools.py +66 -0
  718. lintro-0.42.5/tests/unit/utils/native_parsers/test_yamllint_config.py +89 -0
  719. lintro-0.42.5/tests/unit/utils/output/__init__.py +3 -0
  720. lintro-0.42.5/tests/unit/utils/output/conftest.py +102 -0
  721. lintro-0.42.5/tests/unit/utils/output/test_file_writer_common.py +47 -0
  722. lintro-0.42.5/tests/unit/utils/output/test_file_writer_csv.py +83 -0
  723. lintro-0.42.5/tests/unit/utils/output/test_file_writer_format.py +256 -0
  724. lintro-0.42.5/tests/unit/utils/output/test_file_writer_html.py +118 -0
  725. lintro-0.42.5/tests/unit/utils/output/test_file_writer_json.py +92 -0
  726. lintro-0.42.5/tests/unit/utils/output/test_file_writer_markdown.py +115 -0
  727. lintro-0.42.5/tests/unit/utils/output/test_file_writer_plain.py +78 -0
  728. lintro-0.42.5/tests/unit/utils/output/test_helpers.py +135 -0
  729. lintro-0.42.5/tests/unit/utils/result_formatters/__init__.py +1 -0
  730. lintro-0.42.5/tests/unit/utils/result_formatters/conftest.py +32 -0
  731. lintro-0.42.5/tests/unit/utils/result_formatters/test_action_normalization.py +87 -0
  732. lintro-0.42.5/tests/unit/utils/result_formatters/test_fix_action.py +165 -0
  733. lintro-0.42.5/tests/unit/utils/result_formatters/test_fixable_hints.py +151 -0
  734. lintro-0.42.5/tests/unit/utils/result_formatters/test_generic_output.py +139 -0
  735. lintro-0.42.5/tests/unit/utils/result_formatters/test_output_display.py +96 -0
  736. lintro-0.42.5/tests/unit/utils/result_formatters/test_pytest_output.py +176 -0
  737. lintro-0.42.5/tests/unit/utils/result_formatters/test_ruff_formatting.py +114 -0
  738. lintro-0.42.5/tests/unit/utils/summary/__init__.py +1 -0
  739. lintro-0.42.5/tests/unit/utils/summary/test_display.py +451 -0
  740. lintro-0.42.5/tests/unit/utils/summary/test_safe_cast.py +119 -0
  741. lintro-0.42.5/tests/unit/utils/test_ascii_normalize.py +43 -0
  742. lintro-0.42.5/tests/unit/utils/test_ascii_normalize_cli.py +202 -0
  743. lintro-0.42.5/tests/unit/utils/test_config_reporting.py +359 -0
  744. lintro-0.42.5/tests/unit/utils/test_console_output_writer.py +245 -0
  745. lintro-0.42.5/tests/unit/utils/test_display_helpers.py +354 -0
  746. lintro-0.42.5/tests/unit/utils/test_display_helpers_fallback.py +312 -0
  747. lintro-0.42.5/tests/unit/utils/test_enums_and_normalizers.py +98 -0
  748. lintro-0.42.5/tests/unit/utils/test_file_cache.py +236 -0
  749. lintro-0.42.5/tests/unit/utils/test_logger_setup.py +152 -0
  750. lintro-0.42.5/tests/unit/utils/test_native_parsers.py +131 -0
  751. lintro-0.42.5/tests/unit/utils/test_output_writers.py +393 -0
  752. lintro-0.42.5/tests/unit/utils/test_parser_registry.py +265 -0
  753. lintro-0.42.5/tests/unit/utils/test_path_filtering.py +297 -0
  754. lintro-0.42.5/tests/unit/utils/test_path_utils.py +232 -0
  755. lintro-0.42.5/tests/unit/utils/test_streaming_output.py +389 -0
  756. lintro-0.42.5/tests/unit/utils/test_timeout_utils.py +139 -0
  757. lintro-0.42.5/tests/unit/utils/test_tool_config_info.py +20 -0
  758. lintro-0.42.5/tests/unit/utils/test_tool_utils.py +44 -0
  759. lintro-0.42.5/tests/unit/utils/unified_config/__init__.py +1 -0
  760. lintro-0.42.5/tests/unit/utils/unified_config/conftest.py +47 -0
  761. lintro-0.42.5/tests/unit/utils/unified_config/test_config_summary.py +89 -0
  762. lintro-0.42.5/tests/unit/utils/unified_config/test_consistency.py +55 -0
  763. lintro-0.42.5/tests/unit/utils/unified_config/test_constants.py +74 -0
  764. lintro-0.42.5/tests/unit/utils/unified_config/test_dataclasses.py +47 -0
  765. lintro-0.42.5/tests/unit/utils/unified_config/test_enums.py +36 -0
  766. lintro-0.42.5/tests/unit/utils/unified_config/test_injectable.py +46 -0
  767. lintro-0.42.5/tests/unit/utils/unified_config/test_line_length.py +109 -0
  768. lintro-0.42.5/tests/unit/utils/unified_config/test_nested_value.py +65 -0
  769. lintro-0.42.5/tests/unit/utils/unified_config/test_ordered_tools.py +57 -0
  770. lintro-0.42.5/tests/unit/utils/unified_config/test_tool_priority.py +78 -0
  771. lintro-0.42.5/tests/utils/__init__.py +1 -0
  772. lintro-0.42.5/tests/utils/test_formatting.py +45 -0
  773. lintro-0.42.5/tests/utils/test_output_manager.py +213 -0
  774. lintro-0.42.5/tests/utils/test_path_utils.py +89 -0
lintro-0.42.5/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 lgtm-hq
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,17 @@
1
+ include LICENSE
2
+ include README.md
3
+ include pyproject.toml
4
+
5
+ # Include assets directory and its contents
6
+ recursive-include assets *
7
+ recursive-include lintro/ascii-art *
8
+
9
+ # Include any additional documentation
10
+ recursive-include docs *.md
11
+
12
+ # Include test files for development
13
+ recursive-include tests *.py
14
+ recursive-include test_samples *.py
15
+ recursive-include test_samples *.yml
16
+ recursive-include test_samples *.js
17
+ recursive-include test_samples Dockerfile.*
lintro-0.42.5/PKG-INFO ADDED
@@ -0,0 +1,313 @@
1
+ Metadata-Version: 2.4
2
+ Name: lintro
3
+ Version: 0.42.5
4
+ Summary: A unified CLI tool for code formatting, linting, and quality assurance
5
+ Author-email: lgtm-hq <turbocoder13@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2024 lgtm-hq
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+ Project-URL: Homepage, https://github.com/lgtm-hq/py-lintro
28
+ Project-URL: Documentation, https://github.com/lgtm-hq/py-lintro/docs
29
+ Project-URL: Source, https://github.com/lgtm-hq/py-lintro
30
+ Keywords: linting,formatting,code-quality,cli,python,javascript,yaml,docker
31
+ Classifier: Development Status :: 4 - Beta
32
+ Classifier: Intended Audience :: Developers
33
+ Classifier: Operating System :: OS Independent
34
+ Classifier: Programming Language :: Python :: 3
35
+ Classifier: Programming Language :: Python :: 3.11
36
+ Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Programming Language :: Python :: 3.13
38
+ Classifier: Topic :: Software Development :: Quality Assurance
39
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
40
+ Classifier: Topic :: Utilities
41
+ Requires-Python: >=3.11
42
+ Description-Content-Type: text/markdown
43
+ License-File: LICENSE
44
+ Requires-Dist: click==8.1.8
45
+ Requires-Dist: coverage-badge==1.1.2
46
+ Requires-Dist: loguru==0.7.3
47
+ Requires-Dist: packaging>=25.0
48
+ Requires-Dist: pathspec>=0.12.1
49
+ Requires-Dist: pydantic>=2.12.5
50
+ Requires-Dist: rich>=14.2.0
51
+ Requires-Dist: tabulate==0.9.0
52
+ Requires-Dist: yamllint==1.37.1
53
+ Requires-Dist: httpx==0.28.1
54
+ Requires-Dist: defusedxml==0.7.1
55
+ Requires-Dist: ruff>=0.14.10
56
+ Requires-Dist: black>=25.12.0
57
+ Requires-Dist: bandit>=1.9.2
58
+ Requires-Dist: mypy>=1.19.1
59
+ Requires-Dist: pydoclint>=0.8.3
60
+ Provides-Extra: dev
61
+ Requires-Dist: pytest==9.0.2; extra == "dev"
62
+ Requires-Dist: pytest-cov==7.0.0; extra == "dev"
63
+ Requires-Dist: pytest-mock==3.15.1; extra == "dev"
64
+ Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
65
+ Requires-Dist: pytest-sugar==1.1.1; extra == "dev"
66
+ Requires-Dist: tox==4.34.1; extra == "dev"
67
+ Requires-Dist: allure-pytest==2.15.3; extra == "dev"
68
+ Requires-Dist: ruff; extra == "dev"
69
+ Requires-Dist: mypy; extra == "dev"
70
+ Requires-Dist: coverage-badge==1.1.2; extra == "dev"
71
+ Requires-Dist: python-semantic-release==10.5.3; extra == "dev"
72
+ Requires-Dist: assertpy==1.1; extra == "dev"
73
+ Requires-Dist: httpx==0.28.1; extra == "dev"
74
+ Provides-Extra: test
75
+ Requires-Dist: pytest==9.0.2; extra == "test"
76
+ Requires-Dist: pytest-cov==7.0.0; extra == "test"
77
+ Requires-Dist: pytest-mock==3.15.1; extra == "test"
78
+ Requires-Dist: pytest-xdist==3.8.0; extra == "test"
79
+ Requires-Dist: assertpy==1.1; extra == "test"
80
+ Provides-Extra: typing
81
+ Requires-Dist: types-setuptools==80.9.0.20251223; extra == "typing"
82
+ Requires-Dist: types-tabulate==0.9.0.20241207; extra == "typing"
83
+ Provides-Extra: tools
84
+ Requires-Dist: semgrep>=1.85.0; extra == "tools"
85
+ Requires-Dist: sqlfluff>=4.0.0; extra == "tools"
86
+ Dynamic: license-file
87
+
88
+ # Lintro
89
+
90
+ <!-- markdownlint-disable MD033 MD013 -->
91
+ <img src="https://raw.githubusercontent.com/lgtm-hq/py-lintro/main/assets/images/lintro.png" alt="Lintro Logo" style="width:100%;max-width:800px;height:auto;display:block;margin:0 auto 24px auto;">
92
+ <!-- markdownlint-enable MD033 MD013 -->
93
+
94
+ A comprehensive CLI tool that unifies various code formatting, linting, and quality
95
+ assurance tools under a single command-line interface.
96
+
97
+ <!-- Badges: Build & Quality -->
98
+
99
+ [![Tests](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/test-and-coverage.yml?label=tests&branch=main&logo=githubactions&logoColor=white)](https://github.com/lgtm-hq/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain)
100
+ [![CI](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/ci-lintro-analysis.yml?label=ci&branch=main&logo=githubactions&logoColor=white)](https://github.com/lgtm-hq/py-lintro/actions/workflows/ci-lintro-analysis.yml?query=branch%3Amain)
101
+ [![Docker](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/docker-build-publish.yml?label=docker&logo=docker&branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain)
102
+ [![Coverage](https://codecov.io/gh/lgtm-hq/py-lintro/branch/main/graph/badge.svg)](https://codecov.io/gh/lgtm-hq/py-lintro)
103
+
104
+ <!-- Badges: Releases -->
105
+
106
+ [![Release](https://img.shields.io/github/v/release/lgtm-hq/py-lintro?label=release)](https://github.com/lgtm-hq/py-lintro/releases/latest)
107
+ [![PyPI](https://img.shields.io/pypi/v/lintro?label=pypi)](https://pypi.org/project/lintro/)
108
+ [![Python](https://img.shields.io/badge/python-3.11+-blue)](https://www.python.org/downloads/)
109
+ [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
110
+
111
+ <!-- Badges: Security & Supply Chain -->
112
+
113
+ [![CodeQL](https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
114
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/lgtm-hq/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/lgtm-hq/py-lintro)
115
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
116
+ [![SBOM](https://img.shields.io/badge/SBOM-CycloneDX-brightgreen)](docs/security/assurance.md)
117
+ [![SBOM Status](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/sbom-on-main.yml?label=sbom&branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/sbom-on-main.yml?query=branch%3Amain)
118
+
119
+ ## 🚀 Quick Start
120
+
121
+ ```bash
122
+ pip install lintro # Install
123
+ lintro check . # Find issues
124
+ lintro format . # Fix issues
125
+ lintro check --output-format grid # Beautiful output
126
+ ```
127
+
128
+ <!-- TODO: Add screenshot of grid output -->
129
+
130
+ ## ✨ Why Lintro?
131
+
132
+ - **🎯 Unified Interface** - One command for all your linting and formatting tools
133
+ - **📊 Consistent Output** - Beautiful, standardized output formats across all tools
134
+ - **🔧 Auto-fixing** - Automatically fix issues where possible
135
+ - **🐳 Docker Ready** - Run in isolated containers for consistent environments
136
+ - **📈 Rich Reporting** - Multiple formats: grid, JSON, HTML, CSV, Markdown
137
+ - **⚡ Fast** - Optimized parallel execution
138
+
139
+ ## 🔌 Works With Your Existing Configs
140
+
141
+ Lintro respects your native tool configurations. If you have a `.prettierrc`,
142
+ `pyproject.toml [tool.ruff]`, or `.yamllint`, Lintro uses them automatically - no
143
+ migration required.
144
+
145
+ - **Native configs are detected** - Your existing `.prettierrc`, `.eslintrc`, etc. work
146
+ as-is
147
+ - **Enforce settings override consistently** - Set `line_length: 88` once, applied
148
+ everywhere
149
+ - **Fallback defaults when needed** - Tools without native configs use sensible defaults
150
+
151
+ See the [Configuration Guide](docs/configuration.md) for details on the 4-tier config
152
+ system.
153
+
154
+ ## 🛠️ Supported Tools
155
+
156
+ <!-- markdownlint-disable MD013 MD060 -->
157
+
158
+ | Tool | Language | Auto-fix |
159
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -------- |
160
+ | [![Actionlint](https://img.shields.io/badge/Actionlint-lint-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Actions | - |
161
+ | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
162
+ | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | ✅ |
163
+ | [![Clippy](https://img.shields.io/badge/Clippy-lint-000000?logo=rust&logoColor=white)](https://github.com/rust-lang/rust-clippy) | 🦀 Rust | ✅ |
164
+ | [![Gitleaks](https://img.shields.io/badge/Gitleaks-secrets-dc2626?logo=git&logoColor=white)](https://gitleaks.io/) | 🔐 Secret Detection | - |
165
+ | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
166
+ | [![Markdownlint](https://img.shields.io/badge/Markdownlint--cli2-lint-000000?logo=markdown&logoColor=white)](https://github.com/DavidAnson/markdownlint-cli2) | 📝 Markdown | - |
167
+ | [![Mypy](https://img.shields.io/badge/Mypy-type%20checking-2d50a5?logo=python&logoColor=white)](https://mypy-lang.org/) | 🐍 Python | - |
168
+ | [![Oxfmt](https://img.shields.io/badge/Oxfmt-format-e05d44?logo=javascript&logoColor=white)](https://oxc.rs/) | 🟨 JS/TS | ✅ |
169
+ | [![Oxlint](https://img.shields.io/badge/Oxlint-lint-e05d44?logo=javascript&logoColor=white)](https://oxc.rs/) | 🟨 JS/TS | ✅ |
170
+ | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | ✅ |
171
+ | [![pydoclint](https://img.shields.io/badge/pydoclint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/jsh9/pydoclint) | 🐍 Python | - |
172
+ | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | ✅ |
173
+ | [![Semgrep](https://img.shields.io/badge/Semgrep-security-5b21b6?logo=semgrep&logoColor=white)](https://semgrep.dev/) | 🔒 Multi-language | - |
174
+ | [![ShellCheck](https://img.shields.io/badge/ShellCheck-lint-4EAA25?logo=gnubash&logoColor=white)](https://www.shellcheck.net/) | 🐚 Shell Scripts | - |
175
+ | [![shfmt](https://img.shields.io/badge/shfmt-format-4EAA25?logo=gnubash&logoColor=white)](https://github.com/mvdan/sh) | 🐚 Shell Scripts | ✅ |
176
+ | [![SQLFluff](https://img.shields.io/badge/SQLFluff-lint%2Bformat-4b5563?logo=database&logoColor=white)](https://sqlfluff.com/) | 🗃️ SQL | ✅ |
177
+ | [![Taplo](https://img.shields.io/badge/Taplo-lint%2Bformat-9b4dca?logo=toml&logoColor=white)](https://taplo.tamasfe.dev/) | 🧾 TOML | ✅ |
178
+ | [![TypeScript](https://img.shields.io/badge/TypeScript-type%20check-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) | 🟨 JS/TS | - |
179
+ | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
180
+
181
+ <!-- markdownlint-enable MD013 MD060 -->
182
+
183
+ ## 📋 Requirements
184
+
185
+ ### Python Version
186
+
187
+ **Python 3.11+** is required. Lintro uses modern Python features not available in older
188
+ versions.
189
+
190
+ ### Bundled Tools
191
+
192
+ These Python tools are automatically installed with Lintro:
193
+
194
+ - **Ruff** - Fast Python linter and formatter
195
+ - **Black** - Python code formatter
196
+ - **Bandit** - Python security linter
197
+ - **Mypy** - Python static type checker
198
+ - **Yamllint** - YAML linter
199
+ - **pydoclint** - Python docstring linter
200
+
201
+ ### Optional External Tools
202
+
203
+ For full functionality, install these additional tools:
204
+
205
+ - **Prettier** - `npm install -g prettier`
206
+ - **Markdownlint-cli2** - `npm install -g markdownlint-cli2`
207
+ - **Oxlint** - `bun add -g oxlint` or `npm install -g oxlint`
208
+ - **Oxfmt** - `bun add -g oxfmt` or `npm install -g oxfmt`
209
+ - **Hadolint** - [GitHub Releases](https://github.com/hadolint/hadolint/releases)
210
+ - **Actionlint** - [GitHub Releases](https://github.com/rhysd/actionlint/releases)
211
+ - **Semgrep** - `pipx install semgrep`, `pip install semgrep`, or `brew install semgrep`
212
+ - **Gitleaks** - `brew install gitleaks` or
213
+ [GitHub Releases](https://github.com/gitleaks/gitleaks/releases)
214
+ - **ShellCheck** - `brew install shellcheck` or
215
+ [GitHub Releases](https://github.com/koalaman/shellcheck/releases)
216
+ - **shfmt** - `brew install shfmt` or
217
+ [GitHub Releases](https://github.com/mvdan/sh/releases)
218
+ - **SQLFluff** - `pip install sqlfluff`
219
+ - **Taplo** - `brew install taplo` or
220
+ [GitHub Releases](https://github.com/tamasfe/taplo/releases)
221
+ - **TypeScript** - `brew install typescript`, `bun add -g typescript`, or
222
+ `npm install -g typescript`
223
+
224
+ Check all tool versions with: `lintro list-tools`
225
+
226
+ ## 📦 Installation
227
+
228
+ ```bash
229
+ # PyPI (recommended)
230
+ pip install lintro
231
+
232
+ # Homebrew (macOS binary)
233
+ brew tap lgtm-hq/tap && brew install lintro-bin
234
+
235
+ # Docker (includes all tools)
236
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check
237
+ ```
238
+
239
+ See [Getting Started](docs/getting-started.md) for detailed installation options.
240
+
241
+ ## 💻 Usage
242
+
243
+ ```bash
244
+ # Check all files
245
+ lintro check .
246
+
247
+ # Auto-fix issues
248
+ lintro format .
249
+
250
+ # Grid output with grouping
251
+ lintro check --output-format grid --group-by file
252
+
253
+ # Run specific tools
254
+ lintro check --tools ruff,prettier,mypy
255
+
256
+ # Exclude directories
257
+ lintro check --exclude "node_modules,dist,venv"
258
+
259
+ # List available tools
260
+ lintro list-tools
261
+ ```
262
+
263
+ ### 🐳 Docker
264
+
265
+ ```bash
266
+ # Run from GHCR
267
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check
268
+
269
+ # With formatting
270
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check --output-format grid
271
+ ```
272
+
273
+ ## 📚 Documentation
274
+
275
+ | Guide | Description |
276
+ | ------------------------------------------------ | --------------------------------------- |
277
+ | [Getting Started](docs/getting-started.md) | Installation, first steps, requirements |
278
+ | [Configuration](docs/configuration.md) | Tool configuration, options, presets |
279
+ | [Docker Usage](docs/docker.md) | Containerized development |
280
+ | [GitHub Integration](docs/github-integration.md) | CI/CD setup, workflows |
281
+ | [Contributing](docs/contributing.md) | Development guide, adding tools |
282
+ | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
283
+
284
+ **Advanced:** [Tool Analysis](docs/tool-analysis/) | [Architecture](docs/architecture/)
285
+ | [Security](docs/security/)
286
+
287
+ ## 🔨 Development
288
+
289
+ ```bash
290
+ # Clone and install
291
+ git clone https://github.com/lgtm-hq/py-lintro.git
292
+ cd py-lintro
293
+ uv sync --dev
294
+
295
+ # Run tests
296
+ ./scripts/local/run-tests.sh
297
+
298
+ # Run lintro on itself
299
+ ./scripts/local/local-lintro.sh check --output-format grid
300
+ ```
301
+
302
+ ## 🤝 Community
303
+
304
+ - 🐛
305
+ [Bug Reports](https://github.com/lgtm-hq/py-lintro/issues/new?template=bug_report.md)
306
+ - 💡
307
+ [Feature Requests](https://github.com/lgtm-hq/py-lintro/issues/new?template=feature_request.md)
308
+ - ❓ [Questions](https://github.com/lgtm-hq/py-lintro/issues/new?template=question.md)
309
+ - 📖 [Contributing Guide](docs/contributing.md)
310
+
311
+ ## 📄 License
312
+
313
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,226 @@
1
+ # Lintro
2
+
3
+ <!-- markdownlint-disable MD033 MD013 -->
4
+ <img src="https://raw.githubusercontent.com/lgtm-hq/py-lintro/main/assets/images/lintro.png" alt="Lintro Logo" style="width:100%;max-width:800px;height:auto;display:block;margin:0 auto 24px auto;">
5
+ <!-- markdownlint-enable MD033 MD013 -->
6
+
7
+ A comprehensive CLI tool that unifies various code formatting, linting, and quality
8
+ assurance tools under a single command-line interface.
9
+
10
+ <!-- Badges: Build & Quality -->
11
+
12
+ [![Tests](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/test-and-coverage.yml?label=tests&branch=main&logo=githubactions&logoColor=white)](https://github.com/lgtm-hq/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain)
13
+ [![CI](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/ci-lintro-analysis.yml?label=ci&branch=main&logo=githubactions&logoColor=white)](https://github.com/lgtm-hq/py-lintro/actions/workflows/ci-lintro-analysis.yml?query=branch%3Amain)
14
+ [![Docker](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/docker-build-publish.yml?label=docker&logo=docker&branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain)
15
+ [![Coverage](https://codecov.io/gh/lgtm-hq/py-lintro/branch/main/graph/badge.svg)](https://codecov.io/gh/lgtm-hq/py-lintro)
16
+
17
+ <!-- Badges: Releases -->
18
+
19
+ [![Release](https://img.shields.io/github/v/release/lgtm-hq/py-lintro?label=release)](https://github.com/lgtm-hq/py-lintro/releases/latest)
20
+ [![PyPI](https://img.shields.io/pypi/v/lintro?label=pypi)](https://pypi.org/project/lintro/)
21
+ [![Python](https://img.shields.io/badge/python-3.11+-blue)](https://www.python.org/downloads/)
22
+ [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
23
+
24
+ <!-- Badges: Security & Supply Chain -->
25
+
26
+ [![CodeQL](https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
27
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/lgtm-hq/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/lgtm-hq/py-lintro)
28
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
29
+ [![SBOM](https://img.shields.io/badge/SBOM-CycloneDX-brightgreen)](docs/security/assurance.md)
30
+ [![SBOM Status](https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/sbom-on-main.yml?label=sbom&branch=main)](https://github.com/lgtm-hq/py-lintro/actions/workflows/sbom-on-main.yml?query=branch%3Amain)
31
+
32
+ ## 🚀 Quick Start
33
+
34
+ ```bash
35
+ pip install lintro # Install
36
+ lintro check . # Find issues
37
+ lintro format . # Fix issues
38
+ lintro check --output-format grid # Beautiful output
39
+ ```
40
+
41
+ <!-- TODO: Add screenshot of grid output -->
42
+
43
+ ## ✨ Why Lintro?
44
+
45
+ - **🎯 Unified Interface** - One command for all your linting and formatting tools
46
+ - **📊 Consistent Output** - Beautiful, standardized output formats across all tools
47
+ - **🔧 Auto-fixing** - Automatically fix issues where possible
48
+ - **🐳 Docker Ready** - Run in isolated containers for consistent environments
49
+ - **📈 Rich Reporting** - Multiple formats: grid, JSON, HTML, CSV, Markdown
50
+ - **⚡ Fast** - Optimized parallel execution
51
+
52
+ ## 🔌 Works With Your Existing Configs
53
+
54
+ Lintro respects your native tool configurations. If you have a `.prettierrc`,
55
+ `pyproject.toml [tool.ruff]`, or `.yamllint`, Lintro uses them automatically - no
56
+ migration required.
57
+
58
+ - **Native configs are detected** - Your existing `.prettierrc`, `.eslintrc`, etc. work
59
+ as-is
60
+ - **Enforce settings override consistently** - Set `line_length: 88` once, applied
61
+ everywhere
62
+ - **Fallback defaults when needed** - Tools without native configs use sensible defaults
63
+
64
+ See the [Configuration Guide](docs/configuration.md) for details on the 4-tier config
65
+ system.
66
+
67
+ ## 🛠️ Supported Tools
68
+
69
+ <!-- markdownlint-disable MD013 MD060 -->
70
+
71
+ | Tool | Language | Auto-fix |
72
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -------- |
73
+ | [![Actionlint](https://img.shields.io/badge/Actionlint-lint-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Actions | - |
74
+ | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
75
+ | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | ✅ |
76
+ | [![Clippy](https://img.shields.io/badge/Clippy-lint-000000?logo=rust&logoColor=white)](https://github.com/rust-lang/rust-clippy) | 🦀 Rust | ✅ |
77
+ | [![Gitleaks](https://img.shields.io/badge/Gitleaks-secrets-dc2626?logo=git&logoColor=white)](https://gitleaks.io/) | 🔐 Secret Detection | - |
78
+ | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
79
+ | [![Markdownlint](https://img.shields.io/badge/Markdownlint--cli2-lint-000000?logo=markdown&logoColor=white)](https://github.com/DavidAnson/markdownlint-cli2) | 📝 Markdown | - |
80
+ | [![Mypy](https://img.shields.io/badge/Mypy-type%20checking-2d50a5?logo=python&logoColor=white)](https://mypy-lang.org/) | 🐍 Python | - |
81
+ | [![Oxfmt](https://img.shields.io/badge/Oxfmt-format-e05d44?logo=javascript&logoColor=white)](https://oxc.rs/) | 🟨 JS/TS | ✅ |
82
+ | [![Oxlint](https://img.shields.io/badge/Oxlint-lint-e05d44?logo=javascript&logoColor=white)](https://oxc.rs/) | 🟨 JS/TS | ✅ |
83
+ | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | ✅ |
84
+ | [![pydoclint](https://img.shields.io/badge/pydoclint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/jsh9/pydoclint) | 🐍 Python | - |
85
+ | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | ✅ |
86
+ | [![Semgrep](https://img.shields.io/badge/Semgrep-security-5b21b6?logo=semgrep&logoColor=white)](https://semgrep.dev/) | 🔒 Multi-language | - |
87
+ | [![ShellCheck](https://img.shields.io/badge/ShellCheck-lint-4EAA25?logo=gnubash&logoColor=white)](https://www.shellcheck.net/) | 🐚 Shell Scripts | - |
88
+ | [![shfmt](https://img.shields.io/badge/shfmt-format-4EAA25?logo=gnubash&logoColor=white)](https://github.com/mvdan/sh) | 🐚 Shell Scripts | ✅ |
89
+ | [![SQLFluff](https://img.shields.io/badge/SQLFluff-lint%2Bformat-4b5563?logo=database&logoColor=white)](https://sqlfluff.com/) | 🗃️ SQL | ✅ |
90
+ | [![Taplo](https://img.shields.io/badge/Taplo-lint%2Bformat-9b4dca?logo=toml&logoColor=white)](https://taplo.tamasfe.dev/) | 🧾 TOML | ✅ |
91
+ | [![TypeScript](https://img.shields.io/badge/TypeScript-type%20check-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) | 🟨 JS/TS | - |
92
+ | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
93
+
94
+ <!-- markdownlint-enable MD013 MD060 -->
95
+
96
+ ## 📋 Requirements
97
+
98
+ ### Python Version
99
+
100
+ **Python 3.11+** is required. Lintro uses modern Python features not available in older
101
+ versions.
102
+
103
+ ### Bundled Tools
104
+
105
+ These Python tools are automatically installed with Lintro:
106
+
107
+ - **Ruff** - Fast Python linter and formatter
108
+ - **Black** - Python code formatter
109
+ - **Bandit** - Python security linter
110
+ - **Mypy** - Python static type checker
111
+ - **Yamllint** - YAML linter
112
+ - **pydoclint** - Python docstring linter
113
+
114
+ ### Optional External Tools
115
+
116
+ For full functionality, install these additional tools:
117
+
118
+ - **Prettier** - `npm install -g prettier`
119
+ - **Markdownlint-cli2** - `npm install -g markdownlint-cli2`
120
+ - **Oxlint** - `bun add -g oxlint` or `npm install -g oxlint`
121
+ - **Oxfmt** - `bun add -g oxfmt` or `npm install -g oxfmt`
122
+ - **Hadolint** - [GitHub Releases](https://github.com/hadolint/hadolint/releases)
123
+ - **Actionlint** - [GitHub Releases](https://github.com/rhysd/actionlint/releases)
124
+ - **Semgrep** - `pipx install semgrep`, `pip install semgrep`, or `brew install semgrep`
125
+ - **Gitleaks** - `brew install gitleaks` or
126
+ [GitHub Releases](https://github.com/gitleaks/gitleaks/releases)
127
+ - **ShellCheck** - `brew install shellcheck` or
128
+ [GitHub Releases](https://github.com/koalaman/shellcheck/releases)
129
+ - **shfmt** - `brew install shfmt` or
130
+ [GitHub Releases](https://github.com/mvdan/sh/releases)
131
+ - **SQLFluff** - `pip install sqlfluff`
132
+ - **Taplo** - `brew install taplo` or
133
+ [GitHub Releases](https://github.com/tamasfe/taplo/releases)
134
+ - **TypeScript** - `brew install typescript`, `bun add -g typescript`, or
135
+ `npm install -g typescript`
136
+
137
+ Check all tool versions with: `lintro list-tools`
138
+
139
+ ## 📦 Installation
140
+
141
+ ```bash
142
+ # PyPI (recommended)
143
+ pip install lintro
144
+
145
+ # Homebrew (macOS binary)
146
+ brew tap lgtm-hq/tap && brew install lintro-bin
147
+
148
+ # Docker (includes all tools)
149
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check
150
+ ```
151
+
152
+ See [Getting Started](docs/getting-started.md) for detailed installation options.
153
+
154
+ ## 💻 Usage
155
+
156
+ ```bash
157
+ # Check all files
158
+ lintro check .
159
+
160
+ # Auto-fix issues
161
+ lintro format .
162
+
163
+ # Grid output with grouping
164
+ lintro check --output-format grid --group-by file
165
+
166
+ # Run specific tools
167
+ lintro check --tools ruff,prettier,mypy
168
+
169
+ # Exclude directories
170
+ lintro check --exclude "node_modules,dist,venv"
171
+
172
+ # List available tools
173
+ lintro list-tools
174
+ ```
175
+
176
+ ### 🐳 Docker
177
+
178
+ ```bash
179
+ # Run from GHCR
180
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check
181
+
182
+ # With formatting
183
+ docker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check --output-format grid
184
+ ```
185
+
186
+ ## 📚 Documentation
187
+
188
+ | Guide | Description |
189
+ | ------------------------------------------------ | --------------------------------------- |
190
+ | [Getting Started](docs/getting-started.md) | Installation, first steps, requirements |
191
+ | [Configuration](docs/configuration.md) | Tool configuration, options, presets |
192
+ | [Docker Usage](docs/docker.md) | Containerized development |
193
+ | [GitHub Integration](docs/github-integration.md) | CI/CD setup, workflows |
194
+ | [Contributing](docs/contributing.md) | Development guide, adding tools |
195
+ | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
196
+
197
+ **Advanced:** [Tool Analysis](docs/tool-analysis/) | [Architecture](docs/architecture/)
198
+ | [Security](docs/security/)
199
+
200
+ ## 🔨 Development
201
+
202
+ ```bash
203
+ # Clone and install
204
+ git clone https://github.com/lgtm-hq/py-lintro.git
205
+ cd py-lintro
206
+ uv sync --dev
207
+
208
+ # Run tests
209
+ ./scripts/local/run-tests.sh
210
+
211
+ # Run lintro on itself
212
+ ./scripts/local/local-lintro.sh check --output-format grid
213
+ ```
214
+
215
+ ## 🤝 Community
216
+
217
+ - 🐛
218
+ [Bug Reports](https://github.com/lgtm-hq/py-lintro/issues/new?template=bug_report.md)
219
+ - 💡
220
+ [Feature Requests](https://github.com/lgtm-hq/py-lintro/issues/new?template=feature_request.md)
221
+ - ❓ [Questions](https://github.com/lgtm-hq/py-lintro/issues/new?template=question.md)
222
+ - 📖 [Contributing Guide](docs/contributing.md)
223
+
224
+ ## 📄 License
225
+
226
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="99" height="20">
3
+ <linearGradient id="b" x2="0" y2="100%">
4
+ <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
5
+ <stop offset="1" stop-opacity=".1"/>
6
+ </linearGradient>
7
+ <clipPath id="a">
8
+ <rect width="99" height="20" rx="3" fill="#fff"/>
9
+ </clipPath>
10
+ <g clip-path="url(#a)">
11
+ <path fill="#555" d="M0 0h63v20H0z"/>
12
+ <path fill="#4c1" d="M63 0h36v20H63z"/>
13
+ <path fill="url(#b)" d="M0 0h99v20H0z"/>
14
+ </g>
15
+ <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
16
+ <text x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">coverage</text>
17
+ <text x="325" y="140" transform="scale(.1)" textLength="530">coverage</text>
18
+ <text x="800" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="260">86.7%</text>
19
+ <text x="800" y="140" transform="scale(.1)" textLength="260">86.7%</text>
20
+ </g>
21
+ </svg>
Binary file