lintro 0.6.1__tar.gz → 0.6.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.

Potentially problematic release.


This version of lintro might be problematic. Click here for more details.

Files changed (197) hide show
  1. {lintro-0.6.1/lintro.egg-info → lintro-0.6.3}/PKG-INFO +5 -3
  2. {lintro-0.6.1 → lintro-0.6.3}/README.md +2 -0
  3. {lintro-0.6.1 → lintro-0.6.3}/assets/images/coverage-badge.svg +3 -3
  4. {lintro-0.6.1 → lintro-0.6.3}/docs/contributing.md +13 -0
  5. lintro-0.6.3/docs/security/assurance.md +27 -0
  6. lintro-0.6.3/docs/security/requirements.md +42 -0
  7. {lintro-0.6.1 → lintro-0.6.3}/lintro/__init__.py +1 -1
  8. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_prettier.py +7 -1
  9. {lintro-0.6.1 → lintro-0.6.3/lintro.egg-info}/PKG-INFO +5 -3
  10. {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/SOURCES.txt +2 -0
  11. {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/requires.txt +2 -2
  12. {lintro-0.6.1 → lintro-0.6.3}/pyproject.toml +4 -4
  13. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_prettier_integration.py +32 -0
  14. {lintro-0.6.1 → lintro-0.6.3}/LICENSE +0 -0
  15. {lintro-0.6.1 → lintro-0.6.3}/MANIFEST.in +0 -0
  16. {lintro-0.6.1 → lintro-0.6.3}/assets/images/lintro.png +0 -0
  17. {lintro-0.6.1 → lintro-0.6.3}/docs/README.md +0 -0
  18. {lintro-0.6.1 → lintro-0.6.3}/docs/configuration.md +0 -0
  19. {lintro-0.6.1 → lintro-0.6.3}/docs/coverage-setup.md +0 -0
  20. {lintro-0.6.1 → lintro-0.6.3}/docs/docker.md +0 -0
  21. {lintro-0.6.1 → lintro-0.6.3}/docs/getting-started.md +0 -0
  22. {lintro-0.6.1 → lintro-0.6.3}/docs/github-integration.md +0 -0
  23. {lintro-0.6.1 → lintro-0.6.3}/docs/lintro-self-use.md +0 -0
  24. {lintro-0.6.1 → lintro-0.6.3}/docs/style-guide.md +0 -0
  25. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/README.md +0 -0
  26. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/actionlint-analysis.md +0 -0
  27. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/bandit-analysis.md +0 -0
  28. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/black-analysis.md +0 -0
  29. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/darglint-analysis.md +0 -0
  30. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/hadolint-analysis.md +0 -0
  31. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/prettier-analysis.md +0 -0
  32. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/ruff-analysis.md +0 -0
  33. {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/yamllint-analysis.md +0 -0
  34. {lintro-0.6.1 → lintro-0.6.3}/lintro/__main__.py +0 -0
  35. {lintro-0.6.1 → lintro-0.6.3}/lintro/ascii-art/fail.txt +0 -0
  36. {lintro-0.6.1 → lintro-0.6.3}/lintro/ascii-art/success.txt +0 -0
  37. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli.py +0 -0
  38. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/__init__.py +0 -0
  39. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/__init__.py +0 -0
  40. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/check.py +0 -0
  41. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/format.py +0 -0
  42. {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/list_tools.py +0 -0
  43. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/__init__.py +0 -0
  44. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/action.py +0 -0
  45. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/darglint_strictness.py +0 -0
  46. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/group_by.py +0 -0
  47. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/hadolint_enums.py +0 -0
  48. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/output_format.py +0 -0
  49. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/tool_name.py +0 -0
  50. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/tool_type.py +0 -0
  51. {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/yamllint_format.py +0 -0
  52. {lintro-0.6.1 → lintro-0.6.3}/lintro/exceptions/__init__.py +0 -0
  53. {lintro-0.6.1 → lintro-0.6.3}/lintro/exceptions/errors.py +0 -0
  54. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/__init__.py +0 -0
  55. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/__init__.py +0 -0
  56. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/output_style.py +0 -0
  57. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/table_descriptor.py +0 -0
  58. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/__init__.py +0 -0
  59. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/csv.py +0 -0
  60. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/grid.py +0 -0
  61. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/html.py +0 -0
  62. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/json.py +0 -0
  63. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/markdown.py +0 -0
  64. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/plain.py +0 -0
  65. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/__init__.py +0 -0
  66. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/actionlint_formatter.py +0 -0
  67. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/bandit_formatter.py +0 -0
  68. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/black_formatter.py +0 -0
  69. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/darglint_formatter.py +0 -0
  70. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/hadolint_formatter.py +0 -0
  71. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/prettier_formatter.py +0 -0
  72. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/ruff_formatter.py +0 -0
  73. {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/yamllint_formatter.py +0 -0
  74. {lintro-0.6.1 → lintro-0.6.3}/lintro/models/__init__.py +0 -0
  75. {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/__init__.py +0 -0
  76. {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool.py +0 -0
  77. {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool_config.py +0 -0
  78. {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool_result.py +0 -0
  79. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/__init__.py +0 -0
  80. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/__init__.py +0 -0
  81. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
  82. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
  83. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/black/black_issue.py +0 -0
  84. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/black/black_parser.py +0 -0
  85. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/__init__.py +0 -0
  86. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/darglint_issue.py +0 -0
  87. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/darglint_parser.py +0 -0
  88. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/__init__.py +0 -0
  89. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
  90. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
  91. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/__init__.py +0 -0
  92. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/prettier_issue.py +0 -0
  93. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/prettier_parser.py +0 -0
  94. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/__init__.py +0 -0
  95. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/ruff_issue.py +0 -0
  96. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/ruff_parser.py +0 -0
  97. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/__init__.py +0 -0
  98. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
  99. {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
  100. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/__init__.py +0 -0
  101. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/__init__.py +0 -0
  102. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/tool_base.py +0 -0
  103. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/tool_manager.py +0 -0
  104. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/__init__.py +0 -0
  105. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_actionlint.py +0 -0
  106. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_bandit.py +0 -0
  107. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_black.py +0 -0
  108. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_darglint.py +0 -0
  109. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_hadolint.py +0 -0
  110. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_ruff.py +0 -0
  111. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_yamllint.py +0 -0
  112. {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/tool_enum.py +0 -0
  113. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/__init__.py +0 -0
  114. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/ascii_normalize_cli.py +0 -0
  115. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/config.py +0 -0
  116. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/console_logger.py +0 -0
  117. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/formatting.py +0 -0
  118. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/output_manager.py +0 -0
  119. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/path_utils.py +0 -0
  120. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/tool_executor.py +0 -0
  121. {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/tool_utils.py +0 -0
  122. {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/dependency_links.txt +0 -0
  123. {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/entry_points.txt +0 -0
  124. {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/top_level.txt +0 -0
  125. {lintro-0.6.1 → lintro-0.6.3}/setup.cfg +0 -0
  126. {lintro-0.6.1 → lintro-0.6.3}/test_samples/Dockerfile.violations +0 -0
  127. {lintro-0.6.1 → lintro-0.6.3}/test_samples/actionlint_violations.yml +0 -0
  128. {lintro-0.6.1 → lintro-0.6.3}/test_samples/bandit_violations.py +0 -0
  129. {lintro-0.6.1 → lintro-0.6.3}/test_samples/darglint_violations.py +0 -0
  130. {lintro-0.6.1 → lintro-0.6.3}/test_samples/prettier_violations.js +0 -0
  131. {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_black_e501_wrappable.py +0 -0
  132. {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_clean.py +0 -0
  133. {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_violations.py +0 -0
  134. {lintro-0.6.1 → lintro-0.6.3}/test_samples/yaml_violations.yml +0 -0
  135. {lintro-0.6.1 → lintro-0.6.3}/tests/__init__.py +0 -0
  136. {lintro-0.6.1 → lintro-0.6.3}/tests/cli/__init__.py +0 -0
  137. {lintro-0.6.1 → lintro-0.6.3}/tests/cli/conftest.py +0 -0
  138. {lintro-0.6.1 → lintro-0.6.3}/tests/cli/test_cli.py +0 -0
  139. {lintro-0.6.1 → lintro-0.6.3}/tests/conftest.py +0 -0
  140. {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/__init__.py +0 -0
  141. {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/conftest.py +0 -0
  142. {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/test_formatters.py +0 -0
  143. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/__init__.py +0 -0
  144. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/conftest.py +0 -0
  145. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_actionlint_integration.py +0 -0
  146. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_bandit_integration.py +0 -0
  147. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_darglint_integration.py +0 -0
  148. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_hadolint_integration.py +0 -0
  149. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_ruff_black_policy.py +0 -0
  150. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_ruff_integration.py +0 -0
  151. {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_yamllint_integration.py +0 -0
  152. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/__init__.py +0 -0
  153. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
  154. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_extract_version.py +0 -0
  155. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
  156. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_script_environment.py +0 -0
  157. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_semantic_release_compute_next.py +0 -0
  158. {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_shell_scripts.py +0 -0
  159. {lintro-0.6.1 → lintro-0.6.3}/tests/test_documentation.py +0 -0
  160. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/__init__.py +0 -0
  161. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ascii_normalize.py +0 -0
  162. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_command_building.py +0 -0
  163. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_config_hydration.py +0 -0
  164. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_formatter_mapping.py +0 -0
  165. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_parsing.py +0 -0
  166. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_formatter.py +0 -0
  167. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_parser.py +0 -0
  168. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_tool.py +0 -0
  169. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_tool_more.py +0 -0
  170. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_commands.py +0 -0
  171. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_commands_more.py +0 -0
  172. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_programmatic.py +0 -0
  173. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_compatibility_ruff_black.py +0 -0
  174. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_config_loader.py +0 -0
  175. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_config_loader_more.py +0 -0
  176. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_console_logger.py +0 -0
  177. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_console_logger_more.py +0 -0
  178. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_enums_and_normalizers.py +0 -0
  179. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_exceptions.py +0 -0
  180. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_formatters_tables.py +0 -0
  181. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_output_manager_reports.py +0 -0
  182. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_parsers_actionlint.py +0 -0
  183. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ruff_parser_additional.py +0 -0
  184. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ruff_parser_more.py +0 -0
  185. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor.py +0 -0
  186. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_fmt_exclusion.py +0 -0
  187. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_more.py +0 -0
  188. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_post_checks.py +0 -0
  189. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_manager.py +0 -0
  190. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils.py +0 -0
  191. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils_fallbacks.py +0 -0
  192. {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils_more.py +0 -0
  193. {lintro-0.6.1 → lintro-0.6.3}/tests/utils/__init__.py +0 -0
  194. {lintro-0.6.1 → lintro-0.6.3}/tests/utils/conftest.py +0 -0
  195. {lintro-0.6.1 → lintro-0.6.3}/tests/utils/test_formatting.py +0 -0
  196. {lintro-0.6.1 → lintro-0.6.3}/tests/utils/test_output_manager.py +0 -0
  197. {lintro-0.6.1 → lintro-0.6.3}/tests/utils/test_path_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lintro
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: A unified CLI tool for code formatting, linting, and quality assurance
5
5
  Author-email: TurboCoder13 <turbocoder13@gmail.com>
6
6
  License: MIT License
@@ -50,7 +50,7 @@ Requires-Dist: toml==0.10.2
50
50
  Requires-Dist: defusedxml==0.7.1
51
51
  Provides-Extra: dev
52
52
  Requires-Dist: pytest==8.4.2; extra == "dev"
53
- Requires-Dist: pytest-cov==6.2.1; extra == "dev"
53
+ Requires-Dist: pytest-cov==6.3.0; extra == "dev"
54
54
  Requires-Dist: pytest-mock==3.15.0; extra == "dev"
55
55
  Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
56
56
  Requires-Dist: tox==4.30.1; extra == "dev"
@@ -63,7 +63,7 @@ Requires-Dist: assertpy==1.1; extra == "dev"
63
63
  Requires-Dist: httpx==0.28.1; extra == "dev"
64
64
  Provides-Extra: test
65
65
  Requires-Dist: pytest==8.4.2; extra == "test"
66
- Requires-Dist: pytest-cov==6.2.1; extra == "test"
66
+ Requires-Dist: pytest-cov==6.3.0; extra == "test"
67
67
  Requires-Dist: pytest-mock==3.15.0; extra == "test"
68
68
  Requires-Dist: pytest-xdist==3.8.0; extra == "test"
69
69
  Requires-Dist: assertpy==1.1; extra == "test"
@@ -93,6 +93,8 @@ Lintro is a unified command-line interface that brings together multiple code qu
93
93
  [![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)
94
94
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
95
95
 
96
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
97
+
96
98
  ### Why Lintro?
97
99
 
98
100
  - **🚀 Unified Interface**: One command to run all your linting and formatting tools
@@ -19,6 +19,8 @@ Lintro is a unified command-line interface that brings together multiple code qu
19
19
  [![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)
20
20
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
21
21
 
22
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
23
+
22
24
  ### Why Lintro?
23
25
 
24
26
  - **🚀 Unified Interface**: One command to run all your linting and formatting tools
@@ -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="#4c1" d="M63 0h36v20H63z"/>
12
+ <path fill="#e05d44" 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">82.0%</text>
19
- <text x="800" y="140" transform="scale(.1)" textLength="260">82.0%</text>
18
+ <text x="800" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="260">83.7%</text>
19
+ <text x="800" y="140" transform="scale(.1)" textLength="260">83.7%</text>
20
20
  </g>
21
21
  </svg>
@@ -53,6 +53,19 @@ Notes:
53
53
  - If work is ambiguous (e.g., a large refactor), explicitly signal with `!` or a `BREAKING CHANGE:` footer.
54
54
  - The PR title validator (`.github/workflows/semantic-pr-title.yml`) enforces the format before merge.
55
55
 
56
+ ## Developer Certificate of Origin (required)
57
+
58
+ All contributions must be signed off under the Developer Certificate of
59
+ Origin (DCO). Use `git commit -s` (or `--signoff`) so your commit message
60
+ contains a line like:
61
+
62
+ ```
63
+ Signed-off-by: Your Name <your.email@example.com>
64
+ ```
65
+
66
+ See `DCO.md` for details. Pull requests without DCO sign-offs will be asked
67
+ to amend commits before merge.
68
+
56
69
  ## Quick Start
57
70
 
58
71
  1. Clone the repository:
@@ -0,0 +1,27 @@
1
+ # Security Assurance (Overview)
2
+
3
+ This assurance note explains how `py-lintro` meets its documented security requirements and provides pointers to evidence.
4
+
5
+ ## Requirements Coverage
6
+
7
+ - Governance and Roles — see `GOVERNANCE.md`
8
+ - Contribution Integrity — DCO sign-offs required; see `DCO.md` and CI checks
9
+ - Responsible Disclosure — see `SECURITY.md`
10
+ - Branch Protection — enforced via Allstar (`.allstar/branch_protection.yaml`)
11
+ - Dependency Hygiene — Renovate, Dependency Review CI, `uv.lock`
12
+ - Static/SAST — Ruff, Bandit, CodeQL; policy checks for workflows (Actionlint)
13
+ - Container and Dockerfile — Hadolint
14
+ - Documentation and Versioning — `README.md`, `CHANGELOG.md`, semantic releases
15
+
16
+ ## Evidence Pointers
17
+
18
+ - CI Workflows: `.github/workflows/*.yml`
19
+ - Allstar Policy: `.allstar/branch_protection.yaml`
20
+ - Scorecard: badge in `README.md`
21
+ - Coverage: `coverage.xml` and README badge
22
+
23
+ ## Continuous Improvement
24
+
25
+ - Periodic updates via Renovate
26
+ - Automated analyses (Scorecard, CodeQL)
27
+ - Maintainer reviews for all changes
@@ -0,0 +1,42 @@
1
+ # Security Requirements
2
+
3
+ This document summarizes security requirements adopted by `py-lintro` to support OpenSSF Best Practices (Silver).
4
+
5
+ ## Project and Process
6
+
7
+ - FLOSS license (MIT) and public repository
8
+ - Governance documented in `GOVERNANCE.md`
9
+ - Responsible disclosure process in `SECURITY.md`
10
+ - DCO required for contributions (`DCO.md`), enforced via commit sign-offs
11
+
12
+ ## Source Integrity and Branch Protection
13
+
14
+ - All changes land via PR with maintainer review
15
+ - Branch protection enforced on `main` (no force pushes; required reviews; admins included)
16
+
17
+ ## Dependencies and Supply Chain
18
+
19
+ - Dependencies managed via `pyproject.toml` and `uv.lock`
20
+ - Automated dependency updates (Renovate) with CI validation
21
+ - Dependency Review workflow enabled in CI
22
+
23
+ ## Static and Policy Analysis
24
+
25
+ - Linting/formatting: Ruff, Black, Prettier, Yamllint, Hadolint, Actionlint
26
+ - Security linting: Bandit; GitHub CodeQL configured
27
+ - OpenSSF Scorecard monitored
28
+
29
+ ## Build and Release
30
+
31
+ - CI builds, tests, and coverage for PRs and `main`
32
+ - Semantic versioning; signed release artifacts published via CI using OIDC
33
+
34
+ ## Testing and Coverage
35
+
36
+ - Automated test suite with ~84% statement coverage
37
+ - New code requires tests and coverage reporting
38
+
39
+ ## Secure Defaults
40
+
41
+ - No execution of untrusted code
42
+ - Docker image and scripts follow hardening practices (pinned actions, validated inputs)
@@ -1,3 +1,3 @@
1
1
  """Lintro - A unified CLI core for code formatting, linting, and quality assurance."""
2
2
 
3
- __version__ = "0.6.1"
3
+ __version__ = "0.6.3"
@@ -142,11 +142,14 @@ class PrettierTool(BaseTool):
142
142
  # so the unified logger prints a single, consistent success line.
143
143
  if success:
144
144
  output = None
145
- return Tool.to_result(
145
+
146
+ # Return full ToolResult so table rendering can use parsed issues
147
+ return ToolResult(
146
148
  name=self.name,
147
149
  success=success,
148
150
  output=output,
149
151
  issues_count=issues_count,
152
+ issues=issues,
150
153
  )
151
154
 
152
155
  def fix(
@@ -264,6 +267,9 @@ class PrettierTool(BaseTool):
264
267
  output=final_output,
265
268
  # For fix operations, issues_count represents remaining for summaries
266
269
  issues_count=remaining_count,
270
+ # Provide issues so formatters can render tables. Use initial issues
271
+ # (auto-fixable set) for display; fall back to remaining when none.
272
+ issues=(initial_issues if initial_issues else remaining_issues),
267
273
  initial_issues_count=initial_count,
268
274
  fixed_issues_count=fixed_count,
269
275
  remaining_issues_count=remaining_count,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lintro
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: A unified CLI tool for code formatting, linting, and quality assurance
5
5
  Author-email: TurboCoder13 <turbocoder13@gmail.com>
6
6
  License: MIT License
@@ -50,7 +50,7 @@ Requires-Dist: toml==0.10.2
50
50
  Requires-Dist: defusedxml==0.7.1
51
51
  Provides-Extra: dev
52
52
  Requires-Dist: pytest==8.4.2; extra == "dev"
53
- Requires-Dist: pytest-cov==6.2.1; extra == "dev"
53
+ Requires-Dist: pytest-cov==6.3.0; extra == "dev"
54
54
  Requires-Dist: pytest-mock==3.15.0; extra == "dev"
55
55
  Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
56
56
  Requires-Dist: tox==4.30.1; extra == "dev"
@@ -63,7 +63,7 @@ Requires-Dist: assertpy==1.1; extra == "dev"
63
63
  Requires-Dist: httpx==0.28.1; extra == "dev"
64
64
  Provides-Extra: test
65
65
  Requires-Dist: pytest==8.4.2; extra == "test"
66
- Requires-Dist: pytest-cov==6.2.1; extra == "test"
66
+ Requires-Dist: pytest-cov==6.3.0; extra == "test"
67
67
  Requires-Dist: pytest-mock==3.15.0; extra == "test"
68
68
  Requires-Dist: pytest-xdist==3.8.0; extra == "test"
69
69
  Requires-Dist: assertpy==1.1; extra == "test"
@@ -93,6 +93,8 @@ Lintro is a unified command-line interface that brings together multiple code qu
93
93
  [![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)
94
94
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
95
95
 
96
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
97
+
96
98
  ### Why Lintro?
97
99
 
98
100
  - **🚀 Unified Interface**: One command to run all your linting and formatting tools
@@ -13,6 +13,8 @@ docs/getting-started.md
13
13
  docs/github-integration.md
14
14
  docs/lintro-self-use.md
15
15
  docs/style-guide.md
16
+ docs/security/assurance.md
17
+ docs/security/requirements.md
16
18
  docs/tool-analysis/README.md
17
19
  docs/tool-analysis/actionlint-analysis.md
18
20
  docs/tool-analysis/bandit-analysis.md
@@ -10,7 +10,7 @@ defusedxml==0.7.1
10
10
 
11
11
  [dev]
12
12
  pytest==8.4.2
13
- pytest-cov==6.2.1
13
+ pytest-cov==6.3.0
14
14
  pytest-mock==3.15.0
15
15
  pytest-xdist==3.8.0
16
16
  tox==4.30.1
@@ -24,7 +24,7 @@ httpx==0.28.1
24
24
 
25
25
  [test]
26
26
  pytest==8.4.2
27
- pytest-cov==6.2.1
27
+ pytest-cov==6.3.0
28
28
  pytest-mock==3.15.0
29
29
  pytest-xdist==3.8.0
30
30
  assertpy==1.1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "lintro"
7
- version = "0.6.1"
7
+ version = "0.6.3"
8
8
  description = "A unified CLI tool for code formatting, linting, and quality assurance"
9
9
  keywords = [ "linting", "formatting", "code-quality", "cli", "python", "javascript", "yaml", "docker",]
10
10
  classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities",]
@@ -15,7 +15,7 @@ name = "TurboCoder13"
15
15
  email = "turbocoder13@gmail.com"
16
16
 
17
17
  [dependency-groups]
18
- dev = [ "build==1.3.0", "pytest==8.4.2", "pytest-cov==6.2.1", "pytest-xdist==3.8.0", "twine==6.2.0", "assertpy==1.1",]
18
+ dev = [ "build==1.3.0", "pytest==8.4.2", "pytest-cov==6.3.0", "pytest-xdist==3.8.0", "twine==6.2.0", "assertpy==1.1",]
19
19
 
20
20
  [project.license]
21
21
  file = "LICENSE"
@@ -25,8 +25,8 @@ file = "README.md"
25
25
  content-type = "text/markdown"
26
26
 
27
27
  [project.optional-dependencies]
28
- dev = [ "pytest==8.4.2", "pytest-cov==6.2.1", "pytest-mock==3.15.0", "pytest-xdist==3.8.0", "tox==4.30.1", "allure-pytest==2.15.0", "ruff", "mypy", "coverage-badge==1.1.2", "python-semantic-release==10.3.2", "assertpy==1.1", "httpx==0.28.1",]
29
- test = [ "pytest==8.4.2", "pytest-cov==6.2.1", "pytest-mock==3.15.0", "pytest-xdist==3.8.0", "assertpy==1.1",]
28
+ dev = [ "pytest==8.4.2", "pytest-cov==6.3.0", "pytest-mock==3.15.0", "pytest-xdist==3.8.0", "tox==4.30.1", "allure-pytest==2.15.0", "ruff", "mypy", "coverage-badge==1.1.2", "python-semantic-release==10.3.2", "assertpy==1.1", "httpx==0.28.1",]
29
+ test = [ "pytest==8.4.2", "pytest-cov==6.3.0", "pytest-mock==3.15.0", "pytest-xdist==3.8.0", "assertpy==1.1",]
30
30
  typing = [ "types-setuptools==80.9.0.20250822", "types-tabulate==0.9.0.20241207",]
31
31
 
32
32
  [project.scripts]
@@ -8,6 +8,7 @@ from loguru import logger
8
8
 
9
9
  from lintro.parsers.prettier.prettier_parser import parse_prettier_output
10
10
  from lintro.tools.implementations.tool_prettier import PrettierTool
11
+ from lintro.utils.tool_utils import format_tool_output
11
12
 
12
13
  logger.remove()
13
14
  logger.add(lambda msg: print(msg, end=""), level="INFO")
@@ -167,3 +168,34 @@ def test_prettier_output_consistency_direct_vs_lintro(temp_prettier_file):
167
168
  f"Issue count mismatch: CLI={direct_issues}, Lintro={result.issues_count}\n"
168
169
  f"CLI Output:\n{direct_output}\nLintro Output:\n{result.output}"
169
170
  )
171
+
172
+
173
+ def test_prettier_fix_sets_issues_for_table(temp_prettier_file):
174
+ """PrettierTool.fix should populate issues for table rendering.
175
+
176
+ Args:
177
+ temp_prettier_file: Pytest fixture providing a temporary file with violations.
178
+ """
179
+ tool = PrettierTool()
180
+ tool.set_options()
181
+
182
+ # Ensure there are initial issues
183
+ pre_result = tool.check([str(temp_prettier_file)])
184
+ assert pre_result.issues_count > 0
185
+
186
+ # Run fix and assert issues are provided for table formatting
187
+ fix_result = tool.fix([str(temp_prettier_file)])
188
+ assert fix_result.success is True
189
+ assert fix_result.remaining_issues_count == 0
190
+ assert fix_result.issues is not None
191
+ assert len(fix_result.issues) == pre_result.issues_count
192
+
193
+ # Verify that formatted output renders a table section for auto-fixables
194
+ formatted = format_tool_output(
195
+ tool_name="prettier",
196
+ output=fix_result.output or "",
197
+ group_by="auto",
198
+ output_format="grid",
199
+ issues=fix_result.issues,
200
+ )
201
+ assert "Auto-fixable issues" in formatted or formatted
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes