lintro 0.13.0__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 (720) hide show
  1. lintro-0.24.3/PKG-INFO +289 -0
  2. lintro-0.24.3/README.md +205 -0
  3. {lintro-0.13.0 → lintro-0.24.3}/assets/images/coverage-badge.svg +3 -3
  4. {lintro-0.13.0 → lintro-0.24.3}/docs/README.md +80 -33
  5. lintro-0.24.3/docs/SHELL-SCRIPT-STYLE-GUIDE.md +431 -0
  6. lintro-0.24.3/docs/architecture/ARCHITECTURE.md +570 -0
  7. lintro-0.24.3/docs/architecture/README.md +58 -0
  8. lintro-0.24.3/docs/architecture/ROADMAP.md +478 -0
  9. lintro-0.24.3/docs/architecture/VISION.md +271 -0
  10. {lintro-0.13.0 → lintro-0.24.3}/docs/configuration.md +432 -43
  11. {lintro-0.13.0 → lintro-0.24.3}/docs/contributing.md +122 -32
  12. lintro-0.24.3/docs/debugging.md +172 -0
  13. {lintro-0.13.0 → lintro-0.24.3}/docs/docker.md +11 -4
  14. {lintro-0.13.0 → lintro-0.24.3}/docs/getting-started.md +98 -8
  15. {lintro-0.13.0 → lintro-0.24.3}/docs/github-integration.md +34 -20
  16. {lintro-0.13.0 → lintro-0.24.3}/docs/lintro-self-use.md +3 -1
  17. lintro-0.24.3/docs/plugins.md +220 -0
  18. {lintro-0.13.0 → lintro-0.24.3}/docs/security/assurance.md +9 -4
  19. {lintro-0.13.0 → lintro-0.24.3}/docs/security/requirements.md +4 -2
  20. {lintro-0.13.0 → lintro-0.24.3}/docs/style-guide.md +172 -72
  21. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/README.md +47 -4
  22. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/actionlint-analysis.md +2 -2
  23. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/bandit-analysis.md +6 -6
  24. lintro-0.24.3/docs/tool-analysis/biome-analysis.md +211 -0
  25. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/black-analysis.md +11 -12
  26. lintro-0.24.3/docs/tool-analysis/clippy-analysis.md +66 -0
  27. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/darglint-analysis.md +18 -11
  28. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/hadolint-analysis.md +24 -14
  29. lintro-0.24.3/docs/tool-analysis/markdownlint-analysis.md +79 -0
  30. lintro-0.24.3/docs/tool-analysis/mypy-analysis.md +82 -0
  31. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/prettier-analysis.md +26 -11
  32. lintro-0.24.3/docs/tool-analysis/pytest-analysis.md +564 -0
  33. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/ruff-analysis.md +34 -23
  34. {lintro-0.13.0 → lintro-0.24.3}/docs/tool-analysis/yamllint-analysis.md +12 -8
  35. lintro-0.24.3/docs/troubleshooting.md +168 -0
  36. {lintro-0.13.0 → lintro-0.24.3}/lintro/__init__.py +1 -1
  37. lintro-0.24.3/lintro/cli.py +201 -0
  38. lintro-0.24.3/lintro/cli_utils/command_chainer.py +223 -0
  39. lintro-0.24.3/lintro/cli_utils/commands/__init__.py +15 -0
  40. {lintro-0.13.0 → lintro-0.24.3}/lintro/cli_utils/commands/check.py +66 -27
  41. lintro-0.24.3/lintro/cli_utils/commands/config.py +393 -0
  42. {lintro-0.13.0 → lintro-0.24.3}/lintro/cli_utils/commands/format.py +54 -15
  43. lintro-0.24.3/lintro/cli_utils/commands/init.py +348 -0
  44. lintro-0.24.3/lintro/cli_utils/commands/list_tools.py +300 -0
  45. lintro-0.24.3/lintro/cli_utils/commands/test.py +306 -0
  46. lintro-0.24.3/lintro/cli_utils/commands/versions.py +105 -0
  47. lintro-0.24.3/lintro/config/__init__.py +51 -0
  48. lintro-0.24.3/lintro/config/config_loader.py +418 -0
  49. lintro-0.24.3/lintro/config/enforce_config.py +22 -0
  50. lintro-0.24.3/lintro/config/execution_config.py +38 -0
  51. lintro-0.24.3/lintro/config/lintro_config.py +120 -0
  52. lintro-0.24.3/lintro/config/tool_config.py +22 -0
  53. lintro-0.24.3/lintro/config/tool_config_generator.py +364 -0
  54. lintro-0.24.3/lintro/enums/action.py +57 -0
  55. lintro-0.24.3/lintro/enums/bandit_levels.py +82 -0
  56. lintro-0.24.3/lintro/enums/boolean_string.py +15 -0
  57. lintro-0.24.3/lintro/enums/config_format.py +41 -0
  58. lintro-0.24.3/lintro/enums/config_key.py +14 -0
  59. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/darglint_strictness.py +6 -1
  60. lintro-0.24.3/lintro/enums/display_column.py +35 -0
  61. lintro-0.24.3/lintro/enums/env_bool.py +13 -0
  62. lintro-0.24.3/lintro/enums/git_command.py +16 -0
  63. lintro-0.24.3/lintro/enums/git_ref.py +14 -0
  64. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/group_by.py +4 -1
  65. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/hadolint_enums.py +11 -2
  66. lintro-0.24.3/lintro/enums/hyphenated_str_enum.py +49 -0
  67. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/output_format.py +4 -2
  68. lintro-0.24.3/lintro/enums/pytest_enums.py +130 -0
  69. lintro-0.24.3/lintro/enums/severity_level.py +44 -0
  70. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/tool_name.py +15 -3
  71. lintro-0.24.3/lintro/enums/tool_option_key.py +14 -0
  72. lintro-0.24.3/lintro/enums/tool_order.py +43 -0
  73. lintro-0.24.3/lintro/enums/tool_type.py +62 -0
  74. lintro-0.24.3/lintro/enums/tools_value.py +39 -0
  75. lintro-0.24.3/lintro/enums/uppercase_str_enum.py +45 -0
  76. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/yamllint_format.py +6 -1
  77. lintro-0.24.3/lintro/exceptions/errors.py +35 -0
  78. lintro-0.24.3/lintro/formatters/__init__.py +30 -0
  79. lintro-0.24.3/lintro/formatters/core/__init__.py +22 -0
  80. lintro-0.24.3/lintro/formatters/core/format_registry.py +178 -0
  81. lintro-0.24.3/lintro/formatters/formatter.py +237 -0
  82. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/csv.py +5 -1
  83. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/grid.py +5 -1
  84. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/html.py +5 -1
  85. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/json.py +7 -8
  86. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/markdown.py +5 -1
  87. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/plain.py +5 -1
  88. lintro-0.24.3/lintro/models/core/__init__.py +17 -0
  89. lintro-0.24.3/lintro/models/core/base_tool_options.py +18 -0
  90. lintro-0.24.3/lintro/models/core/black_options.py +22 -0
  91. lintro-0.24.3/lintro/models/core/prettier_options.py +38 -0
  92. lintro-0.24.3/lintro/models/core/pytest_options.py +50 -0
  93. lintro-0.24.3/lintro/models/core/ruff_options.py +38 -0
  94. lintro-0.24.3/lintro/models/core/tool_result.py +70 -0
  95. lintro-0.24.3/lintro/models/core/yamllint_options.py +18 -0
  96. lintro-0.24.3/lintro/parsers/__init__.py +102 -0
  97. lintro-0.24.3/lintro/parsers/actionlint/__init__.py +6 -0
  98. lintro-0.24.3/lintro/parsers/actionlint/actionlint_issue.py +24 -0
  99. lintro-0.24.3/lintro/parsers/bandit/__init__.py +6 -0
  100. lintro-0.24.3/lintro/parsers/bandit/bandit_issue.py +60 -0
  101. lintro-0.24.3/lintro/parsers/bandit/bandit_parser.py +106 -0
  102. lintro-0.24.3/lintro/parsers/base_issue.py +88 -0
  103. lintro-0.24.3/lintro/parsers/base_parser.py +295 -0
  104. lintro-0.24.3/lintro/parsers/biome/__init__.py +6 -0
  105. lintro-0.24.3/lintro/parsers/biome/biome_issue.py +24 -0
  106. lintro-0.24.3/lintro/parsers/biome/biome_parser.py +174 -0
  107. lintro-0.24.3/lintro/parsers/black/__init__.py +6 -0
  108. lintro-0.24.3/lintro/parsers/black/black_issue.py +30 -0
  109. lintro-0.24.3/lintro/parsers/black/black_parser.py +106 -0
  110. lintro-0.24.3/lintro/parsers/clippy/__init__.py +6 -0
  111. lintro-0.24.3/lintro/parsers/clippy/clippy_issue.py +30 -0
  112. lintro-0.24.3/lintro/parsers/clippy/clippy_parser.py +138 -0
  113. lintro-0.24.3/lintro/parsers/darglint/__init__.py +6 -0
  114. lintro-0.24.3/lintro/parsers/darglint/darglint_issue.py +16 -0
  115. {lintro-0.13.0 → lintro-0.24.3}/lintro/parsers/darglint/darglint_parser.py +24 -13
  116. lintro-0.24.3/lintro/parsers/hadolint/__init__.py +31 -0
  117. lintro-0.24.3/lintro/parsers/hadolint/hadolint_issue.py +25 -0
  118. {lintro-0.13.0 → lintro-0.24.3}/lintro/parsers/hadolint/hadolint_parser.py +1 -1
  119. lintro-0.24.3/lintro/parsers/markdownlint/__init__.py +6 -0
  120. lintro-0.24.3/lintro/parsers/markdownlint/markdownlint_issue.py +17 -0
  121. lintro-0.24.3/lintro/parsers/markdownlint/markdownlint_parser.py +119 -0
  122. lintro-0.24.3/lintro/parsers/mypy/__init__.py +6 -0
  123. lintro-0.24.3/lintro/parsers/mypy/mypy_issue.py +47 -0
  124. lintro-0.24.3/lintro/parsers/mypy/mypy_parser.py +134 -0
  125. lintro-0.24.3/lintro/parsers/prettier/__init__.py +6 -0
  126. {lintro-0.13.0 → lintro-0.24.3}/lintro/parsers/prettier/prettier_issue.py +6 -10
  127. lintro-0.24.3/lintro/parsers/prettier/prettier_parser.py +65 -0
  128. lintro-0.24.3/lintro/parsers/pytest/__init__.py +17 -0
  129. lintro-0.24.3/lintro/parsers/pytest/format_parsers.py +397 -0
  130. lintro-0.24.3/lintro/parsers/pytest/models.py +33 -0
  131. lintro-0.24.3/lintro/parsers/pytest/pytest_issue.py +31 -0
  132. lintro-0.24.3/lintro/parsers/pytest/pytest_parser.py +58 -0
  133. lintro-0.24.3/lintro/parsers/pytest/summary_extractor.py +84 -0
  134. lintro-0.24.3/lintro/parsers/ruff/__init__.py +15 -0
  135. lintro-0.24.3/lintro/parsers/ruff/ruff_format_issue.py +24 -0
  136. lintro-0.24.3/lintro/parsers/ruff/ruff_issue.py +26 -0
  137. lintro-0.24.3/lintro/parsers/ruff/ruff_parser.py +213 -0
  138. lintro-0.24.3/lintro/parsers/streaming.py +314 -0
  139. lintro-0.24.3/lintro/parsers/yamllint/__init__.py +6 -0
  140. lintro-0.24.3/lintro/parsers/yamllint/yamllint_issue.py +26 -0
  141. lintro-0.24.3/lintro/parsers/yamllint/yamllint_parser.py +93 -0
  142. lintro-0.24.3/lintro/plugins/__init__.py +57 -0
  143. lintro-0.24.3/lintro/plugins/base.py +494 -0
  144. lintro-0.24.3/lintro/plugins/discovery.py +190 -0
  145. lintro-0.24.3/lintro/plugins/execution_preparation.py +309 -0
  146. lintro-0.24.3/lintro/plugins/file_discovery.py +160 -0
  147. lintro-0.24.3/lintro/plugins/protocol.py +144 -0
  148. lintro-0.24.3/lintro/plugins/registry.py +245 -0
  149. lintro-0.24.3/lintro/plugins/subprocess_executor.py +308 -0
  150. lintro-0.24.3/lintro/tools/__init__.py +22 -0
  151. lintro-0.24.3/lintro/tools/core/command_builders.py +452 -0
  152. lintro-0.24.3/lintro/tools/core/config_injection.py +163 -0
  153. lintro-0.24.3/lintro/tools/core/line_length_checker.py +166 -0
  154. lintro-0.24.3/lintro/tools/core/option_spec.py +394 -0
  155. lintro-0.24.3/lintro/tools/core/option_validators.py +133 -0
  156. lintro-0.24.3/lintro/tools/core/runtime_discovery.py +295 -0
  157. lintro-0.24.3/lintro/tools/core/timeout_utils.py +126 -0
  158. lintro-0.24.3/lintro/tools/core/tool_manager.py +207 -0
  159. lintro-0.24.3/lintro/tools/core/version_checking.py +300 -0
  160. lintro-0.24.3/lintro/tools/core/version_parsing.py +313 -0
  161. lintro-0.24.3/lintro/tools/core/version_requirements.py +78 -0
  162. lintro-0.24.3/lintro/tools/definitions/__init__.py +31 -0
  163. lintro-0.24.3/lintro/tools/definitions/actionlint.py +222 -0
  164. lintro-0.24.3/lintro/tools/definitions/bandit.py +398 -0
  165. lintro-0.24.3/lintro/tools/definitions/biome.py +361 -0
  166. lintro-0.24.3/lintro/tools/definitions/black.py +396 -0
  167. lintro-0.24.3/lintro/tools/definitions/clippy.py +372 -0
  168. lintro-0.24.3/lintro/tools/definitions/darglint.py +435 -0
  169. lintro-0.24.3/lintro/tools/definitions/hadolint.py +319 -0
  170. lintro-0.24.3/lintro/tools/definitions/markdownlint.py +324 -0
  171. lintro-0.24.3/lintro/tools/definitions/mypy.py +372 -0
  172. lintro-0.24.3/lintro/tools/definitions/prettier.py +529 -0
  173. lintro-0.24.3/lintro/tools/definitions/pytest.py +365 -0
  174. lintro-0.24.3/lintro/tools/definitions/ruff.py +212 -0
  175. lintro-0.24.3/lintro/tools/definitions/yamllint.py +481 -0
  176. lintro-0.24.3/lintro/tools/implementations/__init__.py +28 -0
  177. lintro-0.24.3/lintro/tools/implementations/pytest/__init__.py +16 -0
  178. lintro-0.24.3/lintro/tools/implementations/pytest/collection.py +266 -0
  179. lintro-0.24.3/lintro/tools/implementations/pytest/coverage_processor.py +142 -0
  180. lintro-0.24.3/lintro/tools/implementations/pytest/formatters.py +314 -0
  181. lintro-0.24.3/lintro/tools/implementations/pytest/markers.py +188 -0
  182. lintro-0.24.3/lintro/tools/implementations/pytest/output.py +219 -0
  183. lintro-0.24.3/lintro/tools/implementations/pytest/output_parsers.py +149 -0
  184. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_command_builder.py +336 -0
  185. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_config.py +193 -0
  186. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_error_handler.py +128 -0
  187. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_executor.py +139 -0
  188. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_handlers.py +385 -0
  189. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_option_validators.py +215 -0
  190. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_output_processor.py +57 -0
  191. lintro-0.24.3/lintro/tools/implementations/pytest/pytest_result_processor.py +111 -0
  192. lintro-0.24.3/lintro/tools/implementations/pytest/test_analytics.py +150 -0
  193. lintro-0.24.3/lintro/tools/implementations/ruff/__init__.py +18 -0
  194. lintro-0.24.3/lintro/tools/implementations/ruff/check.py +215 -0
  195. lintro-0.24.3/lintro/tools/implementations/ruff/commands.py +174 -0
  196. lintro-0.24.3/lintro/tools/implementations/ruff/fix.py +349 -0
  197. {lintro-0.13.0 → lintro-0.24.3}/lintro/utils/ascii_normalize_cli.py +2 -2
  198. lintro-0.24.3/lintro/utils/async_tool_executor.py +247 -0
  199. lintro-0.24.3/lintro/utils/config.py +349 -0
  200. lintro-0.24.3/lintro/utils/config_constants.py +108 -0
  201. lintro-0.24.3/lintro/utils/config_priority.py +202 -0
  202. lintro-0.24.3/lintro/utils/config_reporting.py +102 -0
  203. lintro-0.24.3/lintro/utils/config_validation.py +113 -0
  204. lintro-0.24.3/lintro/utils/console/__init__.py +56 -0
  205. lintro-0.24.3/lintro/utils/console/constants.py +83 -0
  206. lintro-0.24.3/lintro/utils/console/logger.py +443 -0
  207. lintro-0.24.3/lintro/utils/display_helpers.py +136 -0
  208. lintro-0.24.3/lintro/utils/execution/__init__.py +33 -0
  209. lintro-0.24.3/lintro/utils/execution/exit_codes.py +84 -0
  210. lintro-0.24.3/lintro/utils/execution/parallel_executor.py +159 -0
  211. lintro-0.24.3/lintro/utils/execution/tool_configuration.py +186 -0
  212. lintro-0.24.3/lintro/utils/file_cache.py +235 -0
  213. lintro-0.24.3/lintro/utils/json_output.py +59 -0
  214. lintro-0.24.3/lintro/utils/logger_setup.py +57 -0
  215. lintro-0.24.3/lintro/utils/native_parsers.py +318 -0
  216. lintro-0.24.3/lintro/utils/output/__init__.py +36 -0
  217. lintro-0.24.3/lintro/utils/output/constants.py +8 -0
  218. lintro-0.24.3/lintro/utils/output/file_writer.py +268 -0
  219. lintro-0.24.3/lintro/utils/output/helpers.py +48 -0
  220. lintro-0.13.0/lintro/utils/output_manager.py → lintro-0.24.3/lintro/utils/output/manager.py +52 -61
  221. lintro-0.24.3/lintro/utils/output/parser_registration.py +199 -0
  222. lintro-0.24.3/lintro/utils/output/parser_registry.py +126 -0
  223. lintro-0.24.3/lintro/utils/path_filtering.py +205 -0
  224. lintro-0.24.3/lintro/utils/path_utils.py +174 -0
  225. lintro-0.24.3/lintro/utils/post_checks.py +212 -0
  226. lintro-0.24.3/lintro/utils/result_formatters.py +341 -0
  227. lintro-0.24.3/lintro/utils/streaming_output.py +262 -0
  228. lintro-0.24.3/lintro/utils/summary_tables.py +310 -0
  229. lintro-0.24.3/lintro/utils/tool_config_info.py +13 -0
  230. lintro-0.24.3/lintro/utils/tool_executor.py +415 -0
  231. lintro-0.24.3/lintro/utils/tool_options.py +91 -0
  232. lintro-0.24.3/lintro/utils/tool_utils.py +33 -0
  233. lintro-0.24.3/lintro/utils/unified_config.py +82 -0
  234. lintro-0.24.3/lintro/utils/unified_config_manager.py +173 -0
  235. lintro-0.24.3/lintro.egg-info/PKG-INFO +289 -0
  236. lintro-0.24.3/lintro.egg-info/SOURCES.txt +615 -0
  237. {lintro-0.13.0 → lintro-0.24.3}/lintro.egg-info/requires.txt +15 -7
  238. lintro-0.24.3/pyproject.toml +351 -0
  239. lintro-0.24.3/test_samples/tools/config/yaml/yaml_violations.yml +23 -0
  240. lintro-0.24.3/test_samples/tools/javascript/biome/biome_violations.js +16 -0
  241. lintro-0.24.3/test_samples/tools/javascript/prettier/prettier_violations.js +43 -0
  242. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/bandit}/bandit_violations.py +1 -2
  243. lintro-0.24.3/test_samples/tools/python/mypy/mypy_violations.py +3 -0
  244. lintro-0.24.3/test_samples/tools/python/pytest/pytest_clean.py +192 -0
  245. lintro-0.24.3/test_samples/tools/python/pytest/pytest_failures.py +132 -0
  246. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_annotations_violations.py +2 -2
  247. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_black_e501_wrappable.py +2 -3
  248. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_bugbear_violations.py +3 -7
  249. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_c4_comprehensions_violations.py +49 -51
  250. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_clean.py +1 -0
  251. lintro-0.13.0/test_samples/ruff_violations.py → lintro-0.24.3/test_samples/tools/python/ruff/ruff_e501_f401_violations.py +13 -2
  252. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_naming_violations.py +0 -2
  253. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/ruff}/ruff_sim_simplify_violations.py +107 -325
  254. {lintro-0.13.0 → lintro-0.24.3}/tests/cli/conftest.py +3 -3
  255. lintro-0.24.3/tests/cli/test_cli.py +136 -0
  256. lintro-0.24.3/tests/cli/test_config_command.py +256 -0
  257. lintro-0.24.3/tests/cli/test_init_command.py +114 -0
  258. lintro-0.24.3/tests/config/__init__.py +1 -0
  259. lintro-0.24.3/tests/config/test_config_loader.py +226 -0
  260. lintro-0.24.3/tests/config/test_init_command.py +173 -0
  261. lintro-0.24.3/tests/config/test_lintro_config.py +115 -0
  262. lintro-0.24.3/tests/config/test_tool_config_generator.py +115 -0
  263. lintro-0.24.3/tests/conftest.py +102 -0
  264. lintro-0.24.3/tests/constants.py +52 -0
  265. lintro-0.24.3/tests/formatters/test_formatters.py +109 -0
  266. lintro-0.24.3/tests/integration/conftest.py +114 -0
  267. {lintro-0.13.0 → lintro-0.24.3}/tests/integration/test_actionlint_integration.py +11 -8
  268. {lintro-0.13.0 → lintro-0.24.3}/tests/integration/test_bandit_integration.py +10 -6
  269. lintro-0.24.3/tests/integration/test_built_package.py +112 -0
  270. {lintro-0.13.0 → lintro-0.24.3}/tests/integration/test_darglint_integration.py +42 -32
  271. lintro-0.24.3/tests/integration/test_markdownlint_integration.py +159 -0
  272. lintro-0.24.3/tests/integration/test_mypy_integration.py +144 -0
  273. lintro-0.24.3/tests/integration/test_parallel_execution.py +225 -0
  274. lintro-0.24.3/tests/integration/tools/__init__.py +1 -0
  275. lintro-0.24.3/tests/integration/tools/test_bandit_integration.py +238 -0
  276. lintro-0.24.3/tests/integration/tools/test_black_integration.py +281 -0
  277. lintro-0.24.3/tests/integration/tools/test_mypy_integration.py +228 -0
  278. lintro-0.24.3/tests/integration/tools/test_prettier_integration.py +289 -0
  279. lintro-0.24.3/tests/integration/tools/test_ruff_integration.py +453 -0
  280. lintro-0.24.3/tests/scripts/conftest.py +43 -0
  281. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/test_ci_post_pr_comment.py +6 -2
  282. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/test_delete_previous_lintro_comments.py +22 -10
  283. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/test_extract_version.py +5 -4
  284. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/test_ghcr_prune_untagged.py +45 -26
  285. lintro-0.24.3/tests/scripts/test_github_comment_utilities.py +20 -0
  286. lintro-0.24.3/tests/scripts/test_github_comment_utilities_encode.py +195 -0
  287. lintro-0.24.3/tests/scripts/test_github_comment_utilities_extract.py +172 -0
  288. lintro-0.24.3/tests/scripts/test_github_comment_utilities_find.py +204 -0
  289. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/test_semantic_release_compute_next.py +16 -15
  290. lintro-0.24.3/tests/scripts/test_shell_scripts.py +30 -0
  291. lintro-0.24.3/tests/test_documentation.py +181 -0
  292. lintro-0.24.3/tests/unit/cli/__init__.py +0 -0
  293. lintro-0.24.3/tests/unit/cli/conftest.py +96 -0
  294. lintro-0.24.3/tests/unit/cli/test_check_command.py +383 -0
  295. lintro-0.24.3/tests/unit/cli/test_cli.py +291 -0
  296. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/cli}/test_cli_commands_more.py +14 -10
  297. lintro-0.24.3/tests/unit/cli/test_cli_lintro_group.py +280 -0
  298. lintro-0.24.3/tests/unit/cli/test_cli_programmatic.py +138 -0
  299. lintro-0.24.3/tests/unit/cli/test_format_command.py +490 -0
  300. lintro-0.24.3/tests/unit/cli_utils/__init__.py +1 -0
  301. lintro-0.24.3/tests/unit/cli_utils/command_chainer/__init__.py +1 -0
  302. lintro-0.24.3/tests/unit/cli_utils/command_chainer/conftest.py +57 -0
  303. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_execute.py +206 -0
  304. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_group_commands.py +73 -0
  305. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_init.py +62 -0
  306. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_integration.py +46 -0
  307. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_normalize_args.py +73 -0
  308. lintro-0.24.3/tests/unit/cli_utils/command_chainer/test_should_chain.py +63 -0
  309. lintro-0.24.3/tests/unit/cli_utils/commands/test_format.py +251 -0
  310. lintro-0.24.3/tests/unit/compatibility/conftest.py +7 -0
  311. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/compatibility}/test_compatibility_ruff_black.py +90 -33
  312. lintro-0.24.3/tests/unit/config/conftest.py +52 -0
  313. lintro-0.24.3/tests/unit/config/test_config_compatibility.py +71 -0
  314. lintro-0.24.3/tests/unit/config/test_config_loader.py +141 -0
  315. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/config}/test_config_loader_more.py +14 -2
  316. lintro-0.24.3/tests/unit/config/test_config_loaders.py +382 -0
  317. lintro-0.24.3/tests/unit/config/test_config_tool_specific.py +238 -0
  318. lintro-0.24.3/tests/unit/config/test_enforce_config.py +63 -0
  319. lintro-0.24.3/tests/unit/config/test_execution_config.py +119 -0
  320. lintro-0.24.3/tests/unit/config/test_lintro_config.py +158 -0
  321. lintro-0.24.3/tests/unit/config/test_unified_config.py +114 -0
  322. lintro-0.24.3/tests/unit/conftest.py +144 -0
  323. lintro-0.24.3/tests/unit/core/conftest.py +9 -0
  324. lintro-0.24.3/tests/unit/core/test_version_requirements.py +303 -0
  325. lintro-0.24.3/tests/unit/enums/__init__.py +1 -0
  326. lintro-0.24.3/tests/unit/enums/test_bandit_levels.py +109 -0
  327. lintro-0.24.3/tests/unit/enums/test_base.py +87 -0
  328. lintro-0.24.3/tests/unit/enums/test_enum_normalizers.py +214 -0
  329. lintro-0.24.3/tests/unit/enums/test_output_format.py +63 -0
  330. lintro-0.24.3/tests/unit/enums/test_tool_name.py +69 -0
  331. lintro-0.24.3/tests/unit/exceptions/conftest.py +7 -0
  332. lintro-0.24.3/tests/unit/exceptions/test_exceptions.py +128 -0
  333. lintro-0.24.3/tests/unit/formatters/__init__.py +3 -0
  334. {lintro-0.13.0/tests → lintro-0.24.3/tests/unit}/formatters/conftest.py +6 -21
  335. lintro-0.24.3/tests/unit/formatters/styles/__init__.py +3 -0
  336. lintro-0.24.3/tests/unit/formatters/styles/conftest.py +89 -0
  337. lintro-0.24.3/tests/unit/formatters/styles/test_csv.py +100 -0
  338. lintro-0.24.3/tests/unit/formatters/styles/test_html.py +101 -0
  339. lintro-0.24.3/tests/unit/formatters/styles/test_json.py +127 -0
  340. lintro-0.24.3/tests/unit/formatters/styles/test_markdown.py +104 -0
  341. lintro-0.24.3/tests/unit/formatters/styles/test_plain.py +119 -0
  342. lintro-0.24.3/tests/unit/formatters/styles/test_style_common.py +47 -0
  343. lintro-0.24.3/tests/unit/formatters/styles/test_style_csv.py +63 -0
  344. lintro-0.24.3/tests/unit/formatters/styles/test_style_grid.py +64 -0
  345. lintro-0.24.3/tests/unit/formatters/styles/test_style_html.py +76 -0
  346. lintro-0.24.3/tests/unit/formatters/styles/test_style_json.py +140 -0
  347. lintro-0.24.3/tests/unit/formatters/styles/test_style_markdown.py +66 -0
  348. lintro-0.24.3/tests/unit/formatters/styles/test_style_plain.py +64 -0
  349. lintro-0.24.3/tests/unit/formatters/test_format_issues.py +443 -0
  350. lintro-0.24.3/tests/unit/formatters/test_format_registry.py +190 -0
  351. lintro-0.24.3/tests/unit/logging/conftest.py +7 -0
  352. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/logging}/test_console_logger.py +14 -10
  353. lintro-0.24.3/tests/unit/logging/test_console_logger_more.py +138 -0
  354. lintro-0.24.3/tests/unit/output/conftest.py +7 -0
  355. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/output}/test_output_manager_reports.py +7 -3
  356. lintro-0.24.3/tests/unit/parsers/base_parser/__init__.py +1 -0
  357. lintro-0.24.3/tests/unit/parsers/base_parser/test_continuation_lines.py +67 -0
  358. lintro-0.24.3/tests/unit/parsers/base_parser/test_extract_fields.py +132 -0
  359. lintro-0.24.3/tests/unit/parsers/base_parser/test_safe_parse.py +82 -0
  360. lintro-0.24.3/tests/unit/parsers/base_parser/test_strip_ansi.py +41 -0
  361. lintro-0.24.3/tests/unit/parsers/base_parser/test_validate_fields.py +82 -0
  362. lintro-0.24.3/tests/unit/parsers/conftest.py +68 -0
  363. lintro-0.24.3/tests/unit/parsers/pytest/test_pytest_parser.py +394 -0
  364. lintro-0.24.3/tests/unit/parsers/streaming/__init__.py +1 -0
  365. lintro-0.24.3/tests/unit/parsers/streaming/conftest.py +71 -0
  366. lintro-0.24.3/tests/unit/parsers/streaming/test_collect.py +40 -0
  367. lintro-0.24.3/tests/unit/parsers/streaming/test_json_array.py +83 -0
  368. lintro-0.24.3/tests/unit/parsers/streaming/test_json_lines.py +140 -0
  369. lintro-0.24.3/tests/unit/parsers/streaming/test_parser_class.py +84 -0
  370. lintro-0.24.3/tests/unit/parsers/streaming/test_text_lines.py +86 -0
  371. lintro-0.13.0/tests/unit/test_bandit_parsing.py → lintro-0.24.3/tests/unit/parsers/test_bandit_parser.py +58 -16
  372. lintro-0.24.3/tests/unit/parsers/test_base_issue.py +165 -0
  373. lintro-0.24.3/tests/unit/parsers/test_base_parser.py +359 -0
  374. lintro-0.24.3/tests/unit/parsers/test_biome_parser.py +214 -0
  375. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/parsers}/test_black_parser.py +8 -6
  376. lintro-0.24.3/tests/unit/parsers/test_clippy_parser.py +115 -0
  377. lintro-0.24.3/tests/unit/parsers/test_darglint_parser.py +113 -0
  378. lintro-0.24.3/tests/unit/parsers/test_hadolint_parser.py +175 -0
  379. lintro-0.24.3/tests/unit/parsers/test_markdownlint_parser.py +139 -0
  380. lintro-0.24.3/tests/unit/parsers/test_mypy_parser.py +151 -0
  381. lintro-0.24.3/tests/unit/parsers/test_prettier_parser.py +96 -0
  382. lintro-0.24.3/tests/unit/parsers/test_ruff_parser_additional.py +127 -0
  383. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/parsers}/test_ruff_parser_more.py +2 -2
  384. lintro-0.24.3/tests/unit/parsers/test_yamllint_parser.py +106 -0
  385. lintro-0.24.3/tests/unit/plugins/base/__init__.py +1 -0
  386. lintro-0.24.3/tests/unit/plugins/base/conftest.py +44 -0
  387. lintro-0.24.3/tests/unit/plugins/base/test_execution.py +407 -0
  388. lintro-0.24.3/tests/unit/plugins/base/test_options.py +182 -0
  389. lintro-0.24.3/tests/unit/plugins/base/test_subprocess.py +245 -0
  390. lintro-0.24.3/tests/unit/plugins/base/test_subprocess_streaming.py +163 -0
  391. lintro-0.24.3/tests/unit/plugins/conftest.py +151 -0
  392. lintro-0.24.3/tests/unit/plugins/test_base_plugin_config.py +336 -0
  393. lintro-0.24.3/tests/unit/plugins/test_discovery.py +229 -0
  394. lintro-0.24.3/tests/unit/plugins/test_registry.py +423 -0
  395. lintro-0.24.3/tests/unit/pytest/conftest.py +7 -0
  396. lintro-0.24.3/tests/unit/pytest/test_pytest_cli_commands.py +205 -0
  397. lintro-0.24.3/tests/unit/pytest/test_pytest_cli_options.py +148 -0
  398. lintro-0.24.3/tests/unit/pytest/test_pytest_handlers.py +550 -0
  399. lintro-0.24.3/tests/unit/pytest/test_pytest_programmatic_api.py +254 -0
  400. lintro-0.24.3/tests/unit/security/__init__.py +1 -0
  401. lintro-0.24.3/tests/unit/security/conftest.py +23 -0
  402. lintro-0.24.3/tests/unit/security/test_json_edge_cases.py +309 -0
  403. lintro-0.24.3/tests/unit/security/test_path_traversal.py +316 -0
  404. lintro-0.24.3/tests/unit/security/test_subprocess_injection.py +225 -0
  405. lintro-0.24.3/tests/unit/tools/assertions/__init__.py +3 -0
  406. lintro-0.24.3/tests/unit/tools/assertions/conftest.py +104 -0
  407. lintro-0.24.3/tests/unit/tools/base/conftest.py +7 -0
  408. lintro-0.24.3/tests/unit/tools/biome/__init__.py +1 -0
  409. lintro-0.24.3/tests/unit/tools/biome/conftest.py +17 -0
  410. lintro-0.24.3/tests/unit/tools/biome/test_check_method.py +68 -0
  411. lintro-0.24.3/tests/unit/tools/biome/test_default_options.py +44 -0
  412. lintro-0.24.3/tests/unit/tools/biome/test_fix_method.py +241 -0
  413. lintro-0.24.3/tests/unit/tools/biome/test_set_options.py +72 -0
  414. lintro-0.24.3/tests/unit/tools/biome/test_timeout_handling.py +104 -0
  415. lintro-0.24.3/tests/unit/tools/conftest.py +287 -0
  416. lintro-0.24.3/tests/unit/tools/core/__init__.py +1 -0
  417. lintro-0.24.3/tests/unit/tools/core/conftest.py +32 -0
  418. lintro-0.24.3/tests/unit/tools/core/test_command_builders.py +267 -0
  419. lintro-0.24.3/tests/unit/tools/core/test_line_length_checker.py +308 -0
  420. lintro-0.24.3/tests/unit/tools/core/test_option_spec.py +121 -0
  421. lintro-0.24.3/tests/unit/tools/core/test_option_validators.py +348 -0
  422. lintro-0.24.3/tests/unit/tools/core/test_runtime_discovery.py +228 -0
  423. lintro-0.24.3/tests/unit/tools/core/test_tool_options_spec.py +107 -0
  424. lintro-0.24.3/tests/unit/tools/core/test_version_checking.py +355 -0
  425. lintro-0.24.3/tests/unit/tools/darglint/__init__.py +1 -0
  426. lintro-0.24.3/tests/unit/tools/darglint/test_darglint_plugin.py +502 -0
  427. lintro-0.24.3/tests/unit/tools/executor/conftest.py +10 -0
  428. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/tools/executor}/test_tool_executor.py +116 -162
  429. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/tools/executor}/test_tool_executor_fmt_exclusion.py +5 -5
  430. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/tools/executor}/test_tool_executor_more.py +153 -81
  431. lintro-0.24.3/tests/unit/tools/executor/test_tool_executor_post_checks.py +215 -0
  432. lintro-0.24.3/tests/unit/tools/executor/test_tool_executor_pytest.py +317 -0
  433. lintro-0.24.3/tests/unit/tools/hadolint/__init__.py +1 -0
  434. lintro-0.24.3/tests/unit/tools/hadolint/conftest.py +17 -0
  435. lintro-0.24.3/tests/unit/tools/hadolint/test_execution.py +173 -0
  436. lintro-0.24.3/tests/unit/tools/hadolint/test_options.py +295 -0
  437. lintro-0.24.3/tests/unit/tools/manager/conftest.py +7 -0
  438. lintro-0.24.3/tests/unit/tools/manager/test_tool_manager.py +159 -0
  439. lintro-0.24.3/tests/unit/tools/mypy/test_mypy_plugin.py +197 -0
  440. lintro-0.24.3/tests/unit/tools/prettier/__init__.py +1 -0
  441. lintro-0.24.3/tests/unit/tools/prettier/conftest.py +17 -0
  442. lintro-0.24.3/tests/unit/tools/prettier/test_check_method.py +3 -0
  443. lintro-0.24.3/tests/unit/tools/prettier/test_config_discovery.py +81 -0
  444. lintro-0.24.3/tests/unit/tools/prettier/test_default_options.py +52 -0
  445. lintro-0.24.3/tests/unit/tools/prettier/test_fix_method.py +159 -0
  446. lintro-0.24.3/tests/unit/tools/prettier/test_output_parsing.py +50 -0
  447. lintro-0.24.3/tests/unit/tools/prettier/test_set_options.py +83 -0
  448. lintro-0.24.3/tests/unit/tools/prettier/test_timeout_handling.py +87 -0
  449. lintro-0.24.3/tests/unit/tools/pytest_tool/__init__.py +1 -0
  450. lintro-0.24.3/tests/unit/tools/pytest_tool/conftest.py +406 -0
  451. lintro-0.24.3/tests/unit/tools/pytest_tool/test_check_method.py +191 -0
  452. lintro-0.24.3/tests/unit/tools/pytest_tool/test_configuration.py +97 -0
  453. lintro-0.24.3/tests/unit/tools/pytest_tool/test_json_parsing.py +64 -0
  454. lintro-0.24.3/tests/unit/tools/pytest_tool/test_junit_parsing.py +57 -0
  455. lintro-0.24.3/tests/unit/tools/pytest_tool/test_output_parsing.py +107 -0
  456. lintro-0.24.3/tests/unit/tools/pytest_tool/test_output_processing.py +158 -0
  457. lintro-0.24.3/tests/unit/tools/pytest_tool/test_pytest_handlers.py +320 -0
  458. lintro-0.24.3/tests/unit/tools/pytest_tool/test_pytest_issue.py +39 -0
  459. lintro-0.24.3/tests/unit/tools/pytest_tool/test_pytest_output_processor.py +94 -0
  460. lintro-0.24.3/tests/unit/tools/pytest_tool/test_result_processor.py +126 -0
  461. lintro-0.24.3/tests/unit/tools/pytest_tool/test_set_options.py +135 -0
  462. lintro-0.24.3/tests/unit/tools/pytest_tool/test_text_parsing.py +42 -0
  463. lintro-0.24.3/tests/unit/tools/pytest_tool/test_validators.py +48 -0
  464. lintro-0.24.3/tests/unit/tools/ruff/__init__.py +1 -0
  465. lintro-0.24.3/tests/unit/tools/ruff/check/__init__.py +1 -0
  466. lintro-0.24.3/tests/unit/tools/ruff/check/conftest.py +4 -0
  467. lintro-0.24.3/tests/unit/tools/ruff/check/test_config_detection.py +85 -0
  468. lintro-0.24.3/tests/unit/tools/ruff/check/test_error_handling.py +135 -0
  469. lintro-0.24.3/tests/unit/tools/ruff/check/test_format_normalization.py +55 -0
  470. lintro-0.24.3/tests/unit/tools/ruff/check/test_json_parsing.py +136 -0
  471. lintro-0.24.3/tests/unit/tools/ruff/check/test_no_issues.py +108 -0
  472. lintro-0.24.3/tests/unit/tools/ruff/check/test_output_format.py +72 -0
  473. lintro-0.24.3/tests/unit/tools/ruff/check/test_output_truncation.py +156 -0
  474. lintro-0.24.3/tests/unit/tools/ruff/check/test_path_filtering.py +213 -0
  475. lintro-0.24.3/tests/unit/tools/ruff/check/test_real_plugin.py +52 -0
  476. lintro-0.24.3/tests/unit/tools/ruff/check/test_timeout.py +51 -0
  477. lintro-0.24.3/tests/unit/tools/ruff/check/test_with_issues.py +166 -0
  478. lintro-0.24.3/tests/unit/tools/ruff/conftest.py +154 -0
  479. lintro-0.24.3/tests/unit/tools/ruff/fix/__init__.py +1 -0
  480. lintro-0.24.3/tests/unit/tools/ruff/fix/conftest.py +4 -0
  481. lintro-0.24.3/tests/unit/tools/ruff/fix/test_combined_issues.py +91 -0
  482. lintro-0.24.3/tests/unit/tools/ruff/fix/test_config.py +35 -0
  483. lintro-0.24.3/tests/unit/tools/ruff/fix/test_edge_cases.py +117 -0
  484. lintro-0.24.3/tests/unit/tools/ruff/fix/test_format_option.py +98 -0
  485. lintro-0.24.3/tests/unit/tools/ruff/fix/test_no_files.py +49 -0
  486. lintro-0.24.3/tests/unit/tools/ruff/fix/test_real_plugin.py +65 -0
  487. lintro-0.24.3/tests/unit/tools/ruff/fix/test_successful_fix.py +106 -0
  488. lintro-0.24.3/tests/unit/tools/ruff/fix/test_temporary_option.py +79 -0
  489. lintro-0.24.3/tests/unit/tools/ruff/fix/test_timeout.py +177 -0
  490. lintro-0.24.3/tests/unit/tools/ruff/fix/test_unsafe_fixes.py +76 -0
  491. lintro-0.24.3/tests/unit/tools/ruff/fix/test_version_check.py +29 -0
  492. lintro-0.24.3/tests/unit/tools/test_common_behaviors.py +504 -0
  493. lintro-0.24.3/tests/unit/tools/test_edge_cases.py +350 -0
  494. lintro-0.24.3/tests/unit/tools/test_helpers.py +327 -0
  495. lintro-0.24.3/tests/unit/tools/test_plugin_definitions.py +453 -0
  496. lintro-0.24.3/tests/unit/tools/test_tool_definitions.py +418 -0
  497. lintro-0.24.3/tests/unit/utils/__init__.py +1 -0
  498. lintro-0.24.3/tests/unit/utils/async_tool_executor/__init__.py +1 -0
  499. lintro-0.24.3/tests/unit/utils/async_tool_executor/conftest.py +121 -0
  500. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_callbacks.py +100 -0
  501. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_exceptions.py +51 -0
  502. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_init.py +32 -0
  503. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_parallel_batches.py +164 -0
  504. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_run_tool_async.py +137 -0
  505. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_run_tools_parallel.py +190 -0
  506. lintro-0.24.3/tests/unit/utils/async_tool_executor/test_shutdown.py +28 -0
  507. lintro-0.24.3/tests/unit/utils/config/__init__.py +1 -0
  508. lintro-0.24.3/tests/unit/utils/config/conftest.py +65 -0
  509. lintro-0.24.3/tests/unit/utils/config/test_manager_configuration.py +420 -0
  510. lintro-0.24.3/tests/unit/utils/config/test_manager_core.py +337 -0
  511. lintro-0.24.3/tests/unit/utils/conftest.py +128 -0
  512. lintro-0.24.3/tests/unit/utils/console/conftest.py +39 -0
  513. lintro-0.24.3/tests/unit/utils/console/summary/__init__.py +1 -0
  514. lintro-0.24.3/tests/unit/utils/console/summary/test_delegation.py +364 -0
  515. lintro-0.24.3/tests/unit/utils/console/summary/test_execution_summary.py +353 -0
  516. lintro-0.24.3/tests/unit/utils/console/test_logger_headers.py +123 -0
  517. lintro-0.24.3/tests/unit/utils/console/test_logger_initialization.py +36 -0
  518. lintro-0.24.3/tests/unit/utils/console/test_logger_levels.py +129 -0
  519. lintro-0.24.3/tests/unit/utils/console/test_logger_metadata.py +140 -0
  520. lintro-0.24.3/tests/unit/utils/console/test_logger_output_methods.py +149 -0
  521. lintro-0.24.3/tests/unit/utils/console/test_logger_results.py +111 -0
  522. lintro-0.24.3/tests/unit/utils/native_parsers/__init__.py +1 -0
  523. lintro-0.24.3/tests/unit/utils/native_parsers/conftest.py +36 -0
  524. lintro-0.24.3/tests/unit/utils/native_parsers/test_biome_config.py +78 -0
  525. lintro-0.24.3/tests/unit/utils/native_parsers/test_config_constants.py +45 -0
  526. lintro-0.24.3/tests/unit/utils/native_parsers/test_json_config.py +109 -0
  527. lintro-0.24.3/tests/unit/utils/native_parsers/test_jsonc_comments.py +189 -0
  528. lintro-0.24.3/tests/unit/utils/native_parsers/test_markdownlint_config.py +130 -0
  529. lintro-0.24.3/tests/unit/utils/native_parsers/test_prettier_config.py +94 -0
  530. lintro-0.24.3/tests/unit/utils/native_parsers/test_pyproject_tools.py +66 -0
  531. lintro-0.24.3/tests/unit/utils/native_parsers/test_yamllint_config.py +89 -0
  532. lintro-0.24.3/tests/unit/utils/output/__init__.py +3 -0
  533. lintro-0.24.3/tests/unit/utils/output/conftest.py +102 -0
  534. lintro-0.24.3/tests/unit/utils/output/test_file_writer_common.py +47 -0
  535. lintro-0.24.3/tests/unit/utils/output/test_file_writer_csv.py +83 -0
  536. lintro-0.24.3/tests/unit/utils/output/test_file_writer_format.py +265 -0
  537. lintro-0.24.3/tests/unit/utils/output/test_file_writer_html.py +118 -0
  538. lintro-0.24.3/tests/unit/utils/output/test_file_writer_json.py +92 -0
  539. lintro-0.24.3/tests/unit/utils/output/test_file_writer_markdown.py +115 -0
  540. lintro-0.24.3/tests/unit/utils/output/test_file_writer_plain.py +78 -0
  541. lintro-0.24.3/tests/unit/utils/output/test_helpers.py +135 -0
  542. lintro-0.24.3/tests/unit/utils/result_formatters/__init__.py +1 -0
  543. lintro-0.24.3/tests/unit/utils/result_formatters/conftest.py +32 -0
  544. lintro-0.24.3/tests/unit/utils/result_formatters/test_action_normalization.py +87 -0
  545. lintro-0.24.3/tests/unit/utils/result_formatters/test_fix_action.py +165 -0
  546. lintro-0.24.3/tests/unit/utils/result_formatters/test_fixable_hints.py +151 -0
  547. lintro-0.24.3/tests/unit/utils/result_formatters/test_generic_output.py +139 -0
  548. lintro-0.24.3/tests/unit/utils/result_formatters/test_output_display.py +96 -0
  549. lintro-0.24.3/tests/unit/utils/result_formatters/test_pytest_output.py +176 -0
  550. lintro-0.24.3/tests/unit/utils/result_formatters/test_ruff_formatting.py +114 -0
  551. lintro-0.24.3/tests/unit/utils/summary/__init__.py +1 -0
  552. lintro-0.24.3/tests/unit/utils/summary/test_display.py +403 -0
  553. lintro-0.24.3/tests/unit/utils/summary/test_safe_cast.py +119 -0
  554. lintro-0.24.3/tests/unit/utils/test_ascii_normalize_cli.py +202 -0
  555. lintro-0.24.3/tests/unit/utils/test_config_reporting.py +359 -0
  556. lintro-0.24.3/tests/unit/utils/test_console_output_writer.py +245 -0
  557. lintro-0.24.3/tests/unit/utils/test_display_helpers.py +354 -0
  558. lintro-0.24.3/tests/unit/utils/test_display_helpers_fallback.py +312 -0
  559. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/utils}/test_enums_and_normalizers.py +40 -0
  560. lintro-0.24.3/tests/unit/utils/test_file_cache.py +194 -0
  561. lintro-0.24.3/tests/unit/utils/test_logger_setup.py +152 -0
  562. lintro-0.24.3/tests/unit/utils/test_native_parsers.py +186 -0
  563. lintro-0.24.3/tests/unit/utils/test_output_writers.py +393 -0
  564. lintro-0.24.3/tests/unit/utils/test_parser_registry.py +232 -0
  565. lintro-0.24.3/tests/unit/utils/test_path_filtering.py +297 -0
  566. lintro-0.24.3/tests/unit/utils/test_path_utils.py +232 -0
  567. lintro-0.24.3/tests/unit/utils/test_streaming_output.py +389 -0
  568. lintro-0.24.3/tests/unit/utils/test_timeout_utils.py +139 -0
  569. lintro-0.24.3/tests/unit/utils/test_tool_config_info.py +20 -0
  570. lintro-0.24.3/tests/unit/utils/test_tool_utils.py +44 -0
  571. lintro-0.24.3/tests/unit/utils/unified_config/__init__.py +1 -0
  572. lintro-0.24.3/tests/unit/utils/unified_config/conftest.py +47 -0
  573. lintro-0.24.3/tests/unit/utils/unified_config/test_config_summary.py +90 -0
  574. lintro-0.24.3/tests/unit/utils/unified_config/test_consistency.py +55 -0
  575. lintro-0.24.3/tests/unit/utils/unified_config/test_constants.py +77 -0
  576. lintro-0.24.3/tests/unit/utils/unified_config/test_dataclasses.py +47 -0
  577. lintro-0.24.3/tests/unit/utils/unified_config/test_enums.py +36 -0
  578. lintro-0.24.3/tests/unit/utils/unified_config/test_injectable.py +46 -0
  579. lintro-0.24.3/tests/unit/utils/unified_config/test_line_length.py +109 -0
  580. lintro-0.24.3/tests/unit/utils/unified_config/test_nested_value.py +65 -0
  581. lintro-0.24.3/tests/unit/utils/unified_config/test_ordered_tools.py +57 -0
  582. lintro-0.24.3/tests/unit/utils/unified_config/test_tool_priority.py +82 -0
  583. {lintro-0.13.0 → lintro-0.24.3}/tests/utils/test_output_manager.py +59 -12
  584. {lintro-0.13.0 → lintro-0.24.3}/tests/utils/test_path_utils.py +6 -1
  585. lintro-0.13.0/PKG-INFO +0 -385
  586. lintro-0.13.0/README.md +0 -311
  587. lintro-0.13.0/docs/coverage-setup.md +0 -42
  588. lintro-0.13.0/lintro/cli.py +0 -76
  589. lintro-0.13.0/lintro/cli_utils/commands/__init__.py +0 -7
  590. lintro-0.13.0/lintro/cli_utils/commands/list_tools.py +0 -114
  591. lintro-0.13.0/lintro/enums/action.py +0 -29
  592. lintro-0.13.0/lintro/enums/tool_type.py +0 -27
  593. lintro-0.13.0/lintro/exceptions/errors.py +0 -15
  594. lintro-0.13.0/lintro/formatters/__init__.py +0 -1
  595. lintro-0.13.0/lintro/formatters/core/__init__.py +0 -1
  596. lintro-0.13.0/lintro/formatters/core/output_style.py +0 -32
  597. lintro-0.13.0/lintro/formatters/core/table_descriptor.py +0 -32
  598. lintro-0.13.0/lintro/formatters/tools/__init__.py +0 -47
  599. lintro-0.13.0/lintro/formatters/tools/actionlint_formatter.py +0 -82
  600. lintro-0.13.0/lintro/formatters/tools/bandit_formatter.py +0 -100
  601. lintro-0.13.0/lintro/formatters/tools/black_formatter.py +0 -70
  602. lintro-0.13.0/lintro/formatters/tools/darglint_formatter.py +0 -89
  603. lintro-0.13.0/lintro/formatters/tools/hadolint_formatter.py +0 -97
  604. lintro-0.13.0/lintro/formatters/tools/prettier_formatter.py +0 -91
  605. lintro-0.13.0/lintro/formatters/tools/ruff_formatter.py +0 -137
  606. lintro-0.13.0/lintro/formatters/tools/yamllint_formatter.py +0 -100
  607. lintro-0.13.0/lintro/models/core/__init__.py +0 -1
  608. lintro-0.13.0/lintro/models/core/tool.py +0 -104
  609. lintro-0.13.0/lintro/models/core/tool_config.py +0 -27
  610. lintro-0.13.0/lintro/models/core/tool_result.py +0 -39
  611. lintro-0.13.0/lintro/parsers/__init__.py +0 -21
  612. lintro-0.13.0/lintro/parsers/actionlint/__init__.py +0 -1
  613. lintro-0.13.0/lintro/parsers/actionlint/actionlint_issue.py +0 -24
  614. lintro-0.13.0/lintro/parsers/black/black_issue.py +0 -22
  615. lintro-0.13.0/lintro/parsers/black/black_parser.py +0 -90
  616. lintro-0.13.0/lintro/parsers/darglint/__init__.py +0 -1
  617. lintro-0.13.0/lintro/parsers/darglint/darglint_issue.py +0 -20
  618. lintro-0.13.0/lintro/parsers/hadolint/__init__.py +0 -1
  619. lintro-0.13.0/lintro/parsers/hadolint/hadolint_issue.py +0 -24
  620. lintro-0.13.0/lintro/parsers/prettier/__init__.py +0 -1
  621. lintro-0.13.0/lintro/parsers/prettier/prettier_parser.py +0 -60
  622. lintro-0.13.0/lintro/parsers/ruff/__init__.py +0 -1
  623. lintro-0.13.0/lintro/parsers/ruff/ruff_issue.py +0 -43
  624. lintro-0.13.0/lintro/parsers/ruff/ruff_parser.py +0 -144
  625. lintro-0.13.0/lintro/parsers/yamllint/__init__.py +0 -1
  626. lintro-0.13.0/lintro/parsers/yamllint/yamllint_issue.py +0 -24
  627. lintro-0.13.0/lintro/parsers/yamllint/yamllint_parser.py +0 -68
  628. lintro-0.13.0/lintro/tools/__init__.py +0 -44
  629. lintro-0.13.0/lintro/tools/core/tool_base.py +0 -378
  630. lintro-0.13.0/lintro/tools/core/tool_manager.py +0 -167
  631. lintro-0.13.0/lintro/tools/implementations/__init__.py +0 -1
  632. lintro-0.13.0/lintro/tools/implementations/tool_actionlint.py +0 -151
  633. lintro-0.13.0/lintro/tools/implementations/tool_bandit.py +0 -436
  634. lintro-0.13.0/lintro/tools/implementations/tool_black.py +0 -261
  635. lintro-0.13.0/lintro/tools/implementations/tool_darglint.py +0 -247
  636. lintro-0.13.0/lintro/tools/implementations/tool_hadolint.py +0 -302
  637. lintro-0.13.0/lintro/tools/implementations/tool_prettier.py +0 -276
  638. lintro-0.13.0/lintro/tools/implementations/tool_ruff.py +0 -657
  639. lintro-0.13.0/lintro/tools/implementations/tool_yamllint.py +0 -240
  640. lintro-0.13.0/lintro/tools/tool_enum.py +0 -25
  641. lintro-0.13.0/lintro/utils/config.py +0 -55
  642. lintro-0.13.0/lintro/utils/console_logger.py +0 -847
  643. lintro-0.13.0/lintro/utils/path_utils.py +0 -41
  644. lintro-0.13.0/lintro/utils/tool_executor.py +0 -652
  645. lintro-0.13.0/lintro/utils/tool_utils.py +0 -452
  646. lintro-0.13.0/lintro.egg-info/PKG-INFO +0 -385
  647. lintro-0.13.0/lintro.egg-info/SOURCES.txt +0 -208
  648. lintro-0.13.0/pyproject.toml +0 -85
  649. lintro-0.13.0/test_samples/prettier_violations.js +0 -46
  650. lintro-0.13.0/test_samples/yaml_violations.yml +0 -42
  651. lintro-0.13.0/tests/cli/test_cli.py +0 -95
  652. lintro-0.13.0/tests/conftest.py +0 -110
  653. lintro-0.13.0/tests/formatters/test_formatters.py +0 -179
  654. lintro-0.13.0/tests/integration/conftest.py +0 -61
  655. lintro-0.13.0/tests/integration/test_hadolint_integration.py +0 -269
  656. lintro-0.13.0/tests/integration/test_prettier_integration.py +0 -209
  657. lintro-0.13.0/tests/integration/test_ruff_additional_coverage.py +0 -477
  658. lintro-0.13.0/tests/integration/test_ruff_annotations.py +0 -78
  659. lintro-0.13.0/tests/integration/test_ruff_black_policy.py +0 -84
  660. lintro-0.13.0/tests/integration/test_ruff_bugbear.py +0 -165
  661. lintro-0.13.0/tests/integration/test_ruff_integration.py +0 -567
  662. lintro-0.13.0/tests/integration/test_ruff_naming.py +0 -31
  663. lintro-0.13.0/tests/integration/test_yamllint_integration.py +0 -298
  664. lintro-0.13.0/tests/scripts/test_github_comment_utilities.py +0 -433
  665. lintro-0.13.0/tests/scripts/test_script_environment.py +0 -621
  666. lintro-0.13.0/tests/scripts/test_shell_scripts.py +0 -541
  667. lintro-0.13.0/tests/test_documentation.py +0 -371
  668. lintro-0.13.0/tests/unit/test_bandit_command_building.py +0 -51
  669. lintro-0.13.0/tests/unit/test_bandit_config_hydration.py +0 -47
  670. lintro-0.13.0/tests/unit/test_bandit_formatter_mapping.py +0 -41
  671. lintro-0.13.0/tests/unit/test_black_formatter.py +0 -43
  672. lintro-0.13.0/tests/unit/test_black_tool.py +0 -262
  673. lintro-0.13.0/tests/unit/test_black_tool_more.py +0 -48
  674. lintro-0.13.0/tests/unit/test_cli_programmatic.py +0 -90
  675. lintro-0.13.0/tests/unit/test_config_loader.py +0 -60
  676. lintro-0.13.0/tests/unit/test_console_logger_more.py +0 -44
  677. lintro-0.13.0/tests/unit/test_exceptions.py +0 -24
  678. lintro-0.13.0/tests/unit/test_formatters_tables.py +0 -158
  679. lintro-0.13.0/tests/unit/test_ruff_parser_additional.py +0 -32
  680. lintro-0.13.0/tests/unit/test_subprocess_validator.py +0 -80
  681. lintro-0.13.0/tests/unit/test_tool_base_subprocess.py +0 -94
  682. lintro-0.13.0/tests/unit/test_tool_executor_post_checks.py +0 -256
  683. lintro-0.13.0/tests/unit/test_tool_manager.py +0 -64
  684. lintro-0.13.0/tests/unit/test_tool_utils.py +0 -88
  685. lintro-0.13.0/tests/unit/test_tool_utils_fallbacks.py +0 -36
  686. lintro-0.13.0/tests/unit/test_tool_utils_more.py +0 -94
  687. lintro-0.13.0/tests/utils/conftest.py +0 -42
  688. {lintro-0.13.0 → lintro-0.24.3}/LICENSE +0 -0
  689. {lintro-0.13.0 → lintro-0.24.3}/MANIFEST.in +0 -0
  690. {lintro-0.13.0 → lintro-0.24.3}/assets/images/lintro.png +0 -0
  691. {lintro-0.13.0 → lintro-0.24.3}/lintro/__main__.py +0 -0
  692. {lintro-0.13.0 → lintro-0.24.3}/lintro/ascii-art/fail.txt +0 -0
  693. {lintro-0.13.0 → lintro-0.24.3}/lintro/ascii-art/success.txt +0 -0
  694. {lintro-0.13.0 → lintro-0.24.3}/lintro/cli_utils/__init__.py +0 -0
  695. {lintro-0.13.0 → lintro-0.24.3}/lintro/enums/__init__.py +0 -0
  696. {lintro-0.13.0 → lintro-0.24.3}/lintro/exceptions/__init__.py +0 -0
  697. {lintro-0.13.0 → lintro-0.24.3}/lintro/formatters/styles/__init__.py +0 -0
  698. {lintro-0.13.0 → lintro-0.24.3}/lintro/models/__init__.py +0 -0
  699. {lintro-0.13.0 → lintro-0.24.3}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
  700. {lintro-0.13.0 → lintro-0.24.3}/lintro/tools/core/__init__.py +0 -0
  701. {lintro-0.13.0 → lintro-0.24.3}/lintro/utils/__init__.py +0 -0
  702. {lintro-0.13.0 → lintro-0.24.3}/lintro/utils/formatting.py +0 -0
  703. {lintro-0.13.0 → lintro-0.24.3}/lintro.egg-info/dependency_links.txt +0 -0
  704. {lintro-0.13.0 → lintro-0.24.3}/lintro.egg-info/entry_points.txt +0 -0
  705. {lintro-0.13.0 → lintro-0.24.3}/lintro.egg-info/top_level.txt +0 -0
  706. {lintro-0.13.0 → lintro-0.24.3}/setup.cfg +0 -0
  707. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/config/docker}/Dockerfile.violations +0 -0
  708. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/config/github_actions}/actionlint_violations.yml +0 -0
  709. {lintro-0.13.0/test_samples → lintro-0.24.3/test_samples/tools/python/darglint}/darglint_violations.py +0 -0
  710. {lintro-0.13.0 → lintro-0.24.3}/tests/__init__.py +0 -0
  711. {lintro-0.13.0 → lintro-0.24.3}/tests/cli/__init__.py +0 -0
  712. {lintro-0.13.0 → lintro-0.24.3}/tests/formatters/__init__.py +0 -0
  713. {lintro-0.13.0 → lintro-0.24.3}/tests/integration/__init__.py +0 -0
  714. {lintro-0.13.0 → lintro-0.24.3}/tests/scripts/__init__.py +0 -0
  715. {lintro-0.13.0 → lintro-0.24.3}/tests/unit/__init__.py +0 -0
  716. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/cli}/test_cli_commands.py +0 -0
  717. /lintro-0.13.0/tests/unit/test_parsers_actionlint.py → /lintro-0.24.3/tests/unit/parsers/test_actionlint_parser.py +0 -0
  718. {lintro-0.13.0/tests/unit → lintro-0.24.3/tests/unit/utils}/test_ascii_normalize.py +0 -0
  719. {lintro-0.13.0 → lintro-0.24.3}/tests/utils/__init__.py +0 -0
  720. {lintro-0.13.0 → lintro-0.24.3}/tests/utils/test_formatting.py +0 -0
lintro-0.24.3/PKG-INFO ADDED
@@ -0,0 +1,289 @@
1
+ Metadata-Version: 2.4
2
+ Name: lintro
3
+ Version: 0.24.3
4
+ Summary: A unified CLI tool for code formatting, linting, and quality assurance
5
+ Author-email: TurboCoder13 <turbocoder13@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2024 TurboCoder13
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/TurboCoder13/py-lintro
28
+ Project-URL: Documentation, https://github.com/TurboCoder13/py-lintro/docs
29
+ Project-URL: Source, https://github.com/TurboCoder13/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: darglint==1.8.1
47
+ Requires-Dist: loguru==0.7.3
48
+ Requires-Dist: packaging>=24.0
49
+ Requires-Dist: pathspec>=0.12.0
50
+ Requires-Dist: pydantic>=2.10.0
51
+ Requires-Dist: rich>=14.0.0
52
+ Requires-Dist: tabulate==0.9.0
53
+ Requires-Dist: yamllint==1.37.1
54
+ Requires-Dist: httpx==0.28.1
55
+ Requires-Dist: defusedxml==0.7.1
56
+ Requires-Dist: ruff>=0.14.0
57
+ Requires-Dist: black>=25.0.0
58
+ Requires-Dist: bandit>=1.8.0
59
+ Requires-Dist: mypy>=1.14.1
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.32.0; 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
+ Dynamic: license-file
84
+
85
+ # Lintro
86
+
87
+ <!-- markdownlint-disable MD033 MD013 -->
88
+ <img src="https://raw.githubusercontent.com/TurboCoder13/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;">
89
+ <!-- markdownlint-enable MD033 MD013 -->
90
+
91
+ A comprehensive CLI tool that unifies various code formatting, linting, and quality
92
+ assurance tools under a single command-line interface.
93
+
94
+ <!-- Badges: Build & Quality -->
95
+
96
+ [![Tests](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/test-and-coverage.yml?label=tests&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain)
97
+ [![CI](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/ci-lintro-analysis.yml?label=ci&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/ci-lintro-analysis.yml?query=branch%3Amain)
98
+ [![Docker](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/docker-build-publish.yml?label=docker&logo=docker&branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain)
99
+ [![Coverage](https://codecov.io/gh/TurboCoder13/py-lintro/branch/main/graph/badge.svg)](https://codecov.io/gh/TurboCoder13/py-lintro)
100
+
101
+ <!-- Badges: Releases -->
102
+
103
+ [![Release](https://img.shields.io/github/v/release/TurboCoder13/py-lintro?label=release)](https://github.com/TurboCoder13/py-lintro/releases/latest)
104
+ [![PyPI](https://img.shields.io/pypi/v/lintro?label=pypi)](https://pypi.org/project/lintro/)
105
+ [![Python](https://img.shields.io/badge/python-3.11+-blue)](https://www.python.org/downloads/)
106
+ [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
107
+
108
+ <!-- Badges: Security & Supply Chain -->
109
+
110
+ [![CodeQL](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
111
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
112
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
113
+ [![SBOM](https://img.shields.io/badge/SBOM-CycloneDX-brightgreen)](docs/security/assurance.md)
114
+ [![SBOM Status](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/sbom-on-main.yml?label=sbom&branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/sbom-on-main.yml?query=branch%3Amain)
115
+
116
+ ## 🚀 Quick Start
117
+
118
+ ```bash
119
+ pip install lintro # Install
120
+ lintro check . # Find issues
121
+ lintro format . # Fix issues
122
+ lintro check --output-format grid # Beautiful output
123
+ ```
124
+
125
+ <!-- TODO: Add screenshot of grid output -->
126
+
127
+ ## ✨ Why Lintro?
128
+
129
+ - **🎯 Unified Interface** - One command for all your linting and formatting tools
130
+ - **📊 Consistent Output** - Beautiful, standardized output formats across all tools
131
+ - **🔧 Auto-fixing** - Automatically fix issues where possible
132
+ - **🐳 Docker Ready** - Run in isolated containers for consistent environments
133
+ - **📈 Rich Reporting** - Multiple formats: grid, JSON, HTML, CSV, Markdown
134
+ - **⚡ Fast** - Optimized parallel execution
135
+
136
+ ## 🔌 Works With Your Existing Configs
137
+
138
+ Lintro respects your native tool configurations. If you have a `.prettierrc`,
139
+ `pyproject.toml [tool.ruff]`, or `.yamllint`, Lintro uses them automatically - no
140
+ migration required.
141
+
142
+ - **Native configs are detected** - Your existing `.prettierrc`, `.eslintrc`, etc. work
143
+ as-is
144
+ - **Enforce settings override consistently** - Set `line_length: 88` once, applied
145
+ everywhere
146
+ - **Fallback defaults when needed** - Tools without native configs use sensible defaults
147
+
148
+ See the [Configuration Guide](docs/configuration.md) for details on the 4-tier config
149
+ system.
150
+
151
+ ## 🛠️ Supported Tools
152
+
153
+ <!-- markdownlint-disable MD013 MD060 -->
154
+
155
+ | Tool | Language | Auto-fix |
156
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | -------- |
157
+ | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | ✅ |
158
+ | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | ✅ |
159
+ | [![Mypy](https://img.shields.io/badge/Mypy-type%20checking-2d50a5?logo=python&logoColor=white)](https://mypy-lang.org/) | 🐍 Python | - |
160
+ | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
161
+ | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | ✅ |
162
+ | [![Biome](https://img.shields.io/badge/Biome-lint-60A5FA?logo=biome&logoColor=white)](https://biomejs.dev/) | 🟨 JS/TS · 🧾 JSON/CSS | ✅ |
163
+ | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
164
+ | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
165
+ | [![Actionlint](https://img.shields.io/badge/Actionlint-lint-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Actions | - |
166
+ | [![Markdownlint](https://img.shields.io/badge/Markdownlint--cli2-lint-000000?logo=markdown&logoColor=white)](https://github.com/DavidAnson/markdownlint-cli2) | 📝 Markdown | - |
167
+ | [![Clippy](https://img.shields.io/badge/Clippy-lint-000000?logo=rust&logoColor=white)](https://github.com/rust-lang/rust-clippy) | 🦀 Rust | ✅ |
168
+ | [![Darglint](https://img.shields.io/badge/Darglint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/terrencepreilly/darglint) | 🐍 Python | - |
169
+
170
+ <!-- markdownlint-enable MD013 MD060 -->
171
+
172
+ ## 📋 Requirements
173
+
174
+ ### Python Version
175
+
176
+ **Python 3.11+** is required. Lintro uses modern Python features not available in older
177
+ versions.
178
+
179
+ ### Bundled Tools
180
+
181
+ These Python tools are automatically installed with Lintro:
182
+
183
+ - **Ruff** - Fast Python linter and formatter
184
+ - **Black** - Python code formatter
185
+ - **Bandit** - Python security linter
186
+ - **Mypy** - Python static type checker
187
+ - **Yamllint** - YAML linter
188
+ - **Darglint** - Python docstring linter
189
+
190
+ ### Optional External Tools
191
+
192
+ For full functionality, install these additional tools:
193
+
194
+ - **Prettier** - `npm install -g prettier`
195
+ - **Markdownlint-cli2** - `npm install -g markdownlint-cli2`
196
+ - **Hadolint** - [GitHub Releases](https://github.com/hadolint/hadolint/releases)
197
+ - **Actionlint** - [GitHub Releases](https://github.com/rhysd/actionlint/releases)
198
+
199
+ Check all tool versions with: `lintro list-tools`
200
+
201
+ ## 📦 Installation
202
+
203
+ ```bash
204
+ # PyPI (recommended)
205
+ pip install lintro
206
+
207
+ # Homebrew (macOS binary)
208
+ brew tap TurboCoder13/tap && brew install lintro-bin
209
+
210
+ # Docker (includes all tools)
211
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check
212
+ ```
213
+
214
+ See [Getting Started](docs/getting-started.md) for detailed installation options.
215
+
216
+ ## 💻 Usage
217
+
218
+ ```bash
219
+ # Check all files
220
+ lintro check .
221
+
222
+ # Auto-fix issues
223
+ lintro format .
224
+
225
+ # Grid output with grouping
226
+ lintro check --output-format grid --group-by file
227
+
228
+ # Run specific tools
229
+ lintro check --tools ruff,prettier,mypy
230
+
231
+ # Exclude directories
232
+ lintro check --exclude "node_modules,dist,venv"
233
+
234
+ # List available tools
235
+ lintro list-tools
236
+ ```
237
+
238
+ ### 🐳 Docker
239
+
240
+ ```bash
241
+ # Run from GHCR
242
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check
243
+
244
+ # With formatting
245
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check --output-format grid
246
+ ```
247
+
248
+ ## 📚 Documentation
249
+
250
+ | Guide | Description |
251
+ | ------------------------------------------------ | --------------------------------------- |
252
+ | [Getting Started](docs/getting-started.md) | Installation, first steps, requirements |
253
+ | [Configuration](docs/configuration.md) | Tool configuration, options, presets |
254
+ | [Docker Usage](docs/docker.md) | Containerized development |
255
+ | [GitHub Integration](docs/github-integration.md) | CI/CD setup, workflows |
256
+ | [Contributing](docs/contributing.md) | Development guide, adding tools |
257
+ | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
258
+
259
+ **Advanced:** [Tool Analysis](docs/tool-analysis/) | [Architecture](docs/architecture/)
260
+ | [Security](docs/security/)
261
+
262
+ ## 🔨 Development
263
+
264
+ ```bash
265
+ # Clone and install
266
+ git clone https://github.com/TurboCoder13/py-lintro.git
267
+ cd py-lintro
268
+ uv sync --dev
269
+
270
+ # Run tests
271
+ ./scripts/local/run-tests.sh
272
+
273
+ # Run lintro on itself
274
+ ./scripts/local/local-lintro.sh check --output-format grid
275
+ ```
276
+
277
+ ## 🤝 Community
278
+
279
+ - 🐛
280
+ [Bug Reports](https://github.com/TurboCoder13/py-lintro/issues/new?template=bug_report.md)
281
+ - 💡
282
+ [Feature Requests](https://github.com/TurboCoder13/py-lintro/issues/new?template=feature_request.md)
283
+ - ❓
284
+ [Questions](https://github.com/TurboCoder13/py-lintro/issues/new?template=question.md)
285
+ - 📖 [Contributing Guide](docs/contributing.md)
286
+
287
+ ## 📄 License
288
+
289
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,205 @@
1
+ # Lintro
2
+
3
+ <!-- markdownlint-disable MD033 MD013 -->
4
+ <img src="https://raw.githubusercontent.com/TurboCoder13/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/TurboCoder13/py-lintro/test-and-coverage.yml?label=tests&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain)
13
+ [![CI](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/ci-lintro-analysis.yml?label=ci&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/ci-lintro-analysis.yml?query=branch%3Amain)
14
+ [![Docker](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/docker-build-publish.yml?label=docker&logo=docker&branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain)
15
+ [![Coverage](https://codecov.io/gh/TurboCoder13/py-lintro/branch/main/graph/badge.svg)](https://codecov.io/gh/TurboCoder13/py-lintro)
16
+
17
+ <!-- Badges: Releases -->
18
+
19
+ [![Release](https://img.shields.io/github/v/release/TurboCoder13/py-lintro?label=release)](https://github.com/TurboCoder13/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/TurboCoder13/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
27
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/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/TurboCoder13/py-lintro/sbom-on-main.yml?label=sbom&branch=main)](https://github.com/TurboCoder13/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
+ | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | ✅ |
74
+ | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | ✅ |
75
+ | [![Mypy](https://img.shields.io/badge/Mypy-type%20checking-2d50a5?logo=python&logoColor=white)](https://mypy-lang.org/) | 🐍 Python | - |
76
+ | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
77
+ | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | ✅ |
78
+ | [![Biome](https://img.shields.io/badge/Biome-lint-60A5FA?logo=biome&logoColor=white)](https://biomejs.dev/) | 🟨 JS/TS · 🧾 JSON/CSS | ✅ |
79
+ | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
80
+ | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
81
+ | [![Actionlint](https://img.shields.io/badge/Actionlint-lint-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Actions | - |
82
+ | [![Markdownlint](https://img.shields.io/badge/Markdownlint--cli2-lint-000000?logo=markdown&logoColor=white)](https://github.com/DavidAnson/markdownlint-cli2) | 📝 Markdown | - |
83
+ | [![Clippy](https://img.shields.io/badge/Clippy-lint-000000?logo=rust&logoColor=white)](https://github.com/rust-lang/rust-clippy) | 🦀 Rust | ✅ |
84
+ | [![Darglint](https://img.shields.io/badge/Darglint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/terrencepreilly/darglint) | 🐍 Python | - |
85
+
86
+ <!-- markdownlint-enable MD013 MD060 -->
87
+
88
+ ## 📋 Requirements
89
+
90
+ ### Python Version
91
+
92
+ **Python 3.11+** is required. Lintro uses modern Python features not available in older
93
+ versions.
94
+
95
+ ### Bundled Tools
96
+
97
+ These Python tools are automatically installed with Lintro:
98
+
99
+ - **Ruff** - Fast Python linter and formatter
100
+ - **Black** - Python code formatter
101
+ - **Bandit** - Python security linter
102
+ - **Mypy** - Python static type checker
103
+ - **Yamllint** - YAML linter
104
+ - **Darglint** - Python docstring linter
105
+
106
+ ### Optional External Tools
107
+
108
+ For full functionality, install these additional tools:
109
+
110
+ - **Prettier** - `npm install -g prettier`
111
+ - **Markdownlint-cli2** - `npm install -g markdownlint-cli2`
112
+ - **Hadolint** - [GitHub Releases](https://github.com/hadolint/hadolint/releases)
113
+ - **Actionlint** - [GitHub Releases](https://github.com/rhysd/actionlint/releases)
114
+
115
+ Check all tool versions with: `lintro list-tools`
116
+
117
+ ## 📦 Installation
118
+
119
+ ```bash
120
+ # PyPI (recommended)
121
+ pip install lintro
122
+
123
+ # Homebrew (macOS binary)
124
+ brew tap TurboCoder13/tap && brew install lintro-bin
125
+
126
+ # Docker (includes all tools)
127
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check
128
+ ```
129
+
130
+ See [Getting Started](docs/getting-started.md) for detailed installation options.
131
+
132
+ ## 💻 Usage
133
+
134
+ ```bash
135
+ # Check all files
136
+ lintro check .
137
+
138
+ # Auto-fix issues
139
+ lintro format .
140
+
141
+ # Grid output with grouping
142
+ lintro check --output-format grid --group-by file
143
+
144
+ # Run specific tools
145
+ lintro check --tools ruff,prettier,mypy
146
+
147
+ # Exclude directories
148
+ lintro check --exclude "node_modules,dist,venv"
149
+
150
+ # List available tools
151
+ lintro list-tools
152
+ ```
153
+
154
+ ### 🐳 Docker
155
+
156
+ ```bash
157
+ # Run from GHCR
158
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check
159
+
160
+ # With formatting
161
+ docker run --rm -v $(pwd):/code ghcr.io/turbocoder13/py-lintro:latest check --output-format grid
162
+ ```
163
+
164
+ ## 📚 Documentation
165
+
166
+ | Guide | Description |
167
+ | ------------------------------------------------ | --------------------------------------- |
168
+ | [Getting Started](docs/getting-started.md) | Installation, first steps, requirements |
169
+ | [Configuration](docs/configuration.md) | Tool configuration, options, presets |
170
+ | [Docker Usage](docs/docker.md) | Containerized development |
171
+ | [GitHub Integration](docs/github-integration.md) | CI/CD setup, workflows |
172
+ | [Contributing](docs/contributing.md) | Development guide, adding tools |
173
+ | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
174
+
175
+ **Advanced:** [Tool Analysis](docs/tool-analysis/) | [Architecture](docs/architecture/)
176
+ | [Security](docs/security/)
177
+
178
+ ## 🔨 Development
179
+
180
+ ```bash
181
+ # Clone and install
182
+ git clone https://github.com/TurboCoder13/py-lintro.git
183
+ cd py-lintro
184
+ uv sync --dev
185
+
186
+ # Run tests
187
+ ./scripts/local/run-tests.sh
188
+
189
+ # Run lintro on itself
190
+ ./scripts/local/local-lintro.sh check --output-format grid
191
+ ```
192
+
193
+ ## 🤝 Community
194
+
195
+ - 🐛
196
+ [Bug Reports](https://github.com/TurboCoder13/py-lintro/issues/new?template=bug_report.md)
197
+ - 💡
198
+ [Feature Requests](https://github.com/TurboCoder13/py-lintro/issues/new?template=feature_request.md)
199
+ - ❓
200
+ [Questions](https://github.com/TurboCoder13/py-lintro/issues/new?template=question.md)
201
+ - 📖 [Contributing Guide](docs/contributing.md)
202
+
203
+ ## 📄 License
204
+
205
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -9,13 +9,13 @@
9
9
  </clipPath>
10
10
  <g clip-path="url(#a)">
11
11
  <path fill="#555" d="M0 0h63v20H0z"/>
12
- <path fill="#e05d44" d="M63 0h36v20H63z"/>
12
+ <path fill="#4c1" d="M63 0h36v20H63z"/>
13
13
  <path fill="url(#b)" d="M0 0h99v20H0z"/>
14
14
  </g>
15
15
  <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
16
16
  <text x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">coverage</text>
17
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">84.2%</text>
19
- <text x="800" y="140" transform="scale(.1)" textLength="260">84.2%</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
20
  </g>
21
21
  </svg>