lintro 0.13.1__tar.gz → 0.13.2__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 (212) hide show
  1. {lintro-0.13.1/lintro.egg-info → lintro-0.13.2}/PKG-INFO +5 -3
  2. {lintro-0.13.1 → lintro-0.13.2}/README.md +3 -1
  3. {lintro-0.13.1 → lintro-0.13.2}/assets/images/coverage-badge.svg +2 -2
  4. {lintro-0.13.1 → lintro-0.13.2}/lintro/__init__.py +1 -1
  5. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/__init__.py +1 -1
  6. {lintro-0.13.1 → lintro-0.13.2/lintro.egg-info}/PKG-INFO +5 -3
  7. {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/SOURCES.txt +2 -0
  8. {lintro-0.13.1 → lintro-0.13.2}/pyproject.toml +2 -2
  9. lintro-0.13.2/tests/integration/test_built_package.py +112 -0
  10. lintro-0.13.2/tests/unit/test_package_imports.py +150 -0
  11. {lintro-0.13.1 → lintro-0.13.2}/LICENSE +0 -0
  12. {lintro-0.13.1 → lintro-0.13.2}/MANIFEST.in +0 -0
  13. {lintro-0.13.1 → lintro-0.13.2}/assets/images/lintro.png +0 -0
  14. {lintro-0.13.1 → lintro-0.13.2}/docs/README.md +0 -0
  15. {lintro-0.13.1 → lintro-0.13.2}/docs/configuration.md +0 -0
  16. {lintro-0.13.1 → lintro-0.13.2}/docs/contributing.md +0 -0
  17. {lintro-0.13.1 → lintro-0.13.2}/docs/coverage-setup.md +0 -0
  18. {lintro-0.13.1 → lintro-0.13.2}/docs/docker.md +0 -0
  19. {lintro-0.13.1 → lintro-0.13.2}/docs/getting-started.md +0 -0
  20. {lintro-0.13.1 → lintro-0.13.2}/docs/github-integration.md +0 -0
  21. {lintro-0.13.1 → lintro-0.13.2}/docs/lintro-self-use.md +0 -0
  22. {lintro-0.13.1 → lintro-0.13.2}/docs/security/assurance.md +0 -0
  23. {lintro-0.13.1 → lintro-0.13.2}/docs/security/requirements.md +0 -0
  24. {lintro-0.13.1 → lintro-0.13.2}/docs/style-guide.md +0 -0
  25. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/README.md +0 -0
  26. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/actionlint-analysis.md +0 -0
  27. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/bandit-analysis.md +0 -0
  28. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/black-analysis.md +0 -0
  29. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/darglint-analysis.md +0 -0
  30. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/hadolint-analysis.md +0 -0
  31. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/prettier-analysis.md +0 -0
  32. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/ruff-analysis.md +0 -0
  33. {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/yamllint-analysis.md +0 -0
  34. {lintro-0.13.1 → lintro-0.13.2}/lintro/__main__.py +0 -0
  35. {lintro-0.13.1 → lintro-0.13.2}/lintro/ascii-art/fail.txt +0 -0
  36. {lintro-0.13.1 → lintro-0.13.2}/lintro/ascii-art/success.txt +0 -0
  37. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli.py +0 -0
  38. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/__init__.py +0 -0
  39. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/__init__.py +0 -0
  40. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/check.py +0 -0
  41. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/format.py +0 -0
  42. {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/list_tools.py +0 -0
  43. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/__init__.py +0 -0
  44. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/action.py +0 -0
  45. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/darglint_strictness.py +0 -0
  46. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/group_by.py +0 -0
  47. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/hadolint_enums.py +0 -0
  48. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/output_format.py +0 -0
  49. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/tool_name.py +0 -0
  50. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/tool_type.py +0 -0
  51. {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/yamllint_format.py +0 -0
  52. {lintro-0.13.1 → lintro-0.13.2}/lintro/exceptions/__init__.py +0 -0
  53. {lintro-0.13.1 → lintro-0.13.2}/lintro/exceptions/errors.py +0 -0
  54. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/__init__.py +0 -0
  55. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/__init__.py +0 -0
  56. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/output_style.py +0 -0
  57. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/table_descriptor.py +0 -0
  58. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/__init__.py +0 -0
  59. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/csv.py +0 -0
  60. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/grid.py +0 -0
  61. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/html.py +0 -0
  62. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/json.py +0 -0
  63. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/markdown.py +0 -0
  64. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/plain.py +0 -0
  65. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/__init__.py +0 -0
  66. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/actionlint_formatter.py +0 -0
  67. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/bandit_formatter.py +0 -0
  68. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/black_formatter.py +0 -0
  69. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/darglint_formatter.py +0 -0
  70. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/hadolint_formatter.py +0 -0
  71. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/prettier_formatter.py +0 -0
  72. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/ruff_formatter.py +0 -0
  73. {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/yamllint_formatter.py +0 -0
  74. {lintro-0.13.1 → lintro-0.13.2}/lintro/models/__init__.py +0 -0
  75. {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/__init__.py +0 -0
  76. {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool.py +0 -0
  77. {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool_config.py +0 -0
  78. {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool_result.py +0 -0
  79. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/__init__.py +0 -0
  80. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
  81. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
  82. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/black/black_issue.py +0 -0
  83. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/black/black_parser.py +0 -0
  84. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/__init__.py +0 -0
  85. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/darglint_issue.py +0 -0
  86. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/darglint_parser.py +0 -0
  87. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/__init__.py +0 -0
  88. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
  89. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
  90. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/__init__.py +0 -0
  91. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/prettier_issue.py +0 -0
  92. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/prettier_parser.py +0 -0
  93. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/__init__.py +0 -0
  94. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/ruff_issue.py +0 -0
  95. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/ruff_parser.py +0 -0
  96. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/__init__.py +0 -0
  97. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
  98. {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
  99. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/__init__.py +0 -0
  100. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/__init__.py +0 -0
  101. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/tool_base.py +0 -0
  102. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/tool_manager.py +0 -0
  103. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/__init__.py +0 -0
  104. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_actionlint.py +0 -0
  105. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_bandit.py +0 -0
  106. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_black.py +0 -0
  107. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_darglint.py +0 -0
  108. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_hadolint.py +0 -0
  109. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_prettier.py +0 -0
  110. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_ruff.py +0 -0
  111. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_yamllint.py +0 -0
  112. {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/tool_enum.py +0 -0
  113. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/__init__.py +0 -0
  114. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/ascii_normalize_cli.py +0 -0
  115. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/config.py +0 -0
  116. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/console_logger.py +0 -0
  117. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/formatting.py +0 -0
  118. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/output_manager.py +0 -0
  119. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/path_utils.py +0 -0
  120. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/tool_executor.py +0 -0
  121. {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/tool_utils.py +0 -0
  122. {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/dependency_links.txt +0 -0
  123. {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/entry_points.txt +0 -0
  124. {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/requires.txt +0 -0
  125. {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/top_level.txt +0 -0
  126. {lintro-0.13.1 → lintro-0.13.2}/setup.cfg +0 -0
  127. {lintro-0.13.1 → lintro-0.13.2}/test_samples/Dockerfile.violations +0 -0
  128. {lintro-0.13.1 → lintro-0.13.2}/test_samples/actionlint_violations.yml +0 -0
  129. {lintro-0.13.1 → lintro-0.13.2}/test_samples/bandit_violations.py +0 -0
  130. {lintro-0.13.1 → lintro-0.13.2}/test_samples/darglint_violations.py +0 -0
  131. {lintro-0.13.1 → lintro-0.13.2}/test_samples/prettier_violations.js +0 -0
  132. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_annotations_violations.py +0 -0
  133. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_black_e501_wrappable.py +0 -0
  134. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_bugbear_violations.py +0 -0
  135. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_c4_comprehensions_violations.py +0 -0
  136. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_clean.py +0 -0
  137. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_naming_violations.py +0 -0
  138. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_sim_simplify_violations.py +0 -0
  139. {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_violations.py +0 -0
  140. {lintro-0.13.1 → lintro-0.13.2}/test_samples/yaml_violations.yml +0 -0
  141. {lintro-0.13.1 → lintro-0.13.2}/tests/__init__.py +0 -0
  142. {lintro-0.13.1 → lintro-0.13.2}/tests/cli/__init__.py +0 -0
  143. {lintro-0.13.1 → lintro-0.13.2}/tests/cli/conftest.py +0 -0
  144. {lintro-0.13.1 → lintro-0.13.2}/tests/cli/test_cli.py +0 -0
  145. {lintro-0.13.1 → lintro-0.13.2}/tests/conftest.py +0 -0
  146. {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/__init__.py +0 -0
  147. {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/conftest.py +0 -0
  148. {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/test_formatters.py +0 -0
  149. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/__init__.py +0 -0
  150. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/conftest.py +0 -0
  151. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_actionlint_integration.py +0 -0
  152. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_bandit_integration.py +0 -0
  153. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_darglint_integration.py +0 -0
  154. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_hadolint_integration.py +0 -0
  155. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_prettier_integration.py +0 -0
  156. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_additional_coverage.py +0 -0
  157. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_annotations.py +0 -0
  158. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_black_policy.py +0 -0
  159. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_bugbear.py +0 -0
  160. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_integration.py +0 -0
  161. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_naming.py +0 -0
  162. {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_yamllint_integration.py +0 -0
  163. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/__init__.py +0 -0
  164. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_ci_post_pr_comment.py +0 -0
  165. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
  166. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_extract_version.py +0 -0
  167. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
  168. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_github_comment_utilities.py +0 -0
  169. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_script_environment.py +0 -0
  170. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_semantic_release_compute_next.py +0 -0
  171. {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_shell_scripts.py +0 -0
  172. {lintro-0.13.1 → lintro-0.13.2}/tests/test_documentation.py +0 -0
  173. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/__init__.py +0 -0
  174. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ascii_normalize.py +0 -0
  175. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_command_building.py +0 -0
  176. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_config_hydration.py +0 -0
  177. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_formatter_mapping.py +0 -0
  178. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_parsing.py +0 -0
  179. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_formatter.py +0 -0
  180. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_parser.py +0 -0
  181. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_tool.py +0 -0
  182. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_tool_more.py +0 -0
  183. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_commands.py +0 -0
  184. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_commands_more.py +0 -0
  185. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_programmatic.py +0 -0
  186. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_compatibility_ruff_black.py +0 -0
  187. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_config_loader.py +0 -0
  188. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_config_loader_more.py +0 -0
  189. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_console_logger.py +0 -0
  190. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_console_logger_more.py +0 -0
  191. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_enums_and_normalizers.py +0 -0
  192. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_exceptions.py +0 -0
  193. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_formatters_tables.py +0 -0
  194. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_output_manager_reports.py +0 -0
  195. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_parsers_actionlint.py +0 -0
  196. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ruff_parser_additional.py +0 -0
  197. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ruff_parser_more.py +0 -0
  198. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_subprocess_validator.py +0 -0
  199. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_base_subprocess.py +0 -0
  200. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor.py +0 -0
  201. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_fmt_exclusion.py +0 -0
  202. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_more.py +0 -0
  203. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_post_checks.py +0 -0
  204. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_manager.py +0 -0
  205. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils.py +0 -0
  206. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils_fallbacks.py +0 -0
  207. {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils_more.py +0 -0
  208. {lintro-0.13.1 → lintro-0.13.2}/tests/utils/__init__.py +0 -0
  209. {lintro-0.13.1 → lintro-0.13.2}/tests/utils/conftest.py +0 -0
  210. {lintro-0.13.1 → lintro-0.13.2}/tests/utils/test_formatting.py +0 -0
  211. {lintro-0.13.1 → lintro-0.13.2}/tests/utils/test_output_manager.py +0 -0
  212. {lintro-0.13.1 → lintro-0.13.2}/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.13.1
3
+ Version: 0.13.2
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
@@ -36,7 +36,7 @@ Classifier: Programming Language :: Python :: 3.13
36
36
  Classifier: Topic :: Software Development :: Quality Assurance
37
37
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
38
38
  Classifier: Topic :: Utilities
39
- Requires-Python: ==3.13.7
39
+ Requires-Python: >=3.13
40
40
  Description-Content-Type: text/markdown
41
41
  License-File: LICENSE
42
42
  Requires-Dist: click==8.1.8
@@ -169,8 +169,10 @@ grype sbom:main-*-py-lintro-sbom.spdx-2.3.json
169
169
 
170
170
  #### From PyPI (Recommended)
171
171
 
172
+ ⚠️ **Important**: Versions prior to 0.13.2 contain a circular import bug that prevents installation as a dependency. Please use version 0.13.2 or later.
173
+
172
174
  ```bash
173
- pip install lintro
175
+ pip install lintro>=0.13.2
174
176
  ```
175
177
 
176
178
  #### Development Installation
@@ -95,8 +95,10 @@ grype sbom:main-*-py-lintro-sbom.spdx-2.3.json
95
95
 
96
96
  #### From PyPI (Recommended)
97
97
 
98
+ ⚠️ **Important**: Versions prior to 0.13.2 contain a circular import bug that prevents installation as a dependency. Please use version 0.13.2 or later.
99
+
98
100
  ```bash
99
- pip install lintro
101
+ pip install lintro>=0.13.2
100
102
  ```
101
103
 
102
104
  #### Development Installation
@@ -15,7 +15,7 @@
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">84.8%</text>
19
+ <text x="800" y="140" transform="scale(.1)" textLength="260">84.8%</text>
20
20
  </g>
21
21
  </svg>
@@ -1,3 +1,3 @@
1
1
  """Lintro - A unified CLI core for code formatting, linting, and quality assurance."""
2
2
 
3
- __version__ = "0.13.1"
3
+ __version__ = "0.13.2"
@@ -1,6 +1,6 @@
1
1
  """Parser modules for Lintro tools."""
2
2
 
3
- from lintro.parsers import (
3
+ from . import (
4
4
  actionlint,
5
5
  bandit,
6
6
  darglint,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lintro
3
- Version: 0.13.1
3
+ Version: 0.13.2
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
@@ -36,7 +36,7 @@ Classifier: Programming Language :: Python :: 3.13
36
36
  Classifier: Topic :: Software Development :: Quality Assurance
37
37
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
38
38
  Classifier: Topic :: Utilities
39
- Requires-Python: ==3.13.7
39
+ Requires-Python: >=3.13
40
40
  Description-Content-Type: text/markdown
41
41
  License-File: LICENSE
42
42
  Requires-Dist: click==8.1.8
@@ -169,8 +169,10 @@ grype sbom:main-*-py-lintro-sbom.spdx-2.3.json
169
169
 
170
170
  #### From PyPI (Recommended)
171
171
 
172
+ ⚠️ **Important**: Versions prior to 0.13.2 contain a circular import bug that prevents installation as a dependency. Please use version 0.13.2 or later.
173
+
172
174
  ```bash
173
- pip install lintro
175
+ pip install lintro>=0.13.2
174
176
  ```
175
177
 
176
178
  #### Development Installation
@@ -147,6 +147,7 @@ tests/integration/__init__.py
147
147
  tests/integration/conftest.py
148
148
  tests/integration/test_actionlint_integration.py
149
149
  tests/integration/test_bandit_integration.py
150
+ tests/integration/test_built_package.py
150
151
  tests/integration/test_darglint_integration.py
151
152
  tests/integration/test_hadolint_integration.py
152
153
  tests/integration/test_prettier_integration.py
@@ -188,6 +189,7 @@ tests/unit/test_enums_and_normalizers.py
188
189
  tests/unit/test_exceptions.py
189
190
  tests/unit/test_formatters_tables.py
190
191
  tests/unit/test_output_manager_reports.py
192
+ tests/unit/test_package_imports.py
191
193
  tests/unit/test_parsers_actionlint.py
192
194
  tests/unit/test_ruff_parser_additional.py
193
195
  tests/unit/test_ruff_parser_more.py
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "lintro"
7
- version = "0.13.1"
7
+ version = "0.13.2"
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",]
11
- requires-python = "==3.13.7"
11
+ requires-python = ">=3.13"
12
12
  dependencies = [ "click==8.1.8", "coverage-badge==1.1.2", "darglint==1.8.1", "loguru==0.7.3", "tabulate==0.9.0", "yamllint==1.37.1", "httpx==0.28.1", "toml==0.10.2", "defusedxml==0.7.1",]
13
13
  [[project.authors]]
14
14
  name = "TurboCoder13"
@@ -0,0 +1,112 @@
1
+ """Integration test for built package installation.
2
+
3
+ This module tests that lintro can be installed as a built wheel distribution
4
+ and imported successfully, catching circular import issues that only manifest
5
+ when the package is installed (not in editable mode).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import subprocess
11
+ import sys
12
+ import tempfile
13
+ from pathlib import Path
14
+
15
+ import pytest
16
+ from assertpy import assert_that
17
+
18
+
19
+ @pytest.mark.slow
20
+ def test_built_wheel_imports() -> None:
21
+ """Test that lintro can be built and imported as a wheel.
22
+
23
+ This test:
24
+ 1. Builds lintro as a wheel
25
+ 2. Installs it in a fresh virtual environment
26
+ 3. Attempts to import critical modules
27
+ 4. Verifies no circular import errors occur
28
+
29
+ This catches issues that only manifest when lintro is installed as a
30
+ dependency (built distribution) rather than in editable mode.
31
+ """
32
+ project_root = Path(__file__).parent.parent.parent
33
+
34
+ with tempfile.TemporaryDirectory() as tmpdir:
35
+ tmpdir_path = Path(tmpdir)
36
+ venv_path = tmpdir_path / "test_venv"
37
+ dist_dir = tmpdir_path / "dist"
38
+
39
+ # Step 1: Build the wheel
40
+ build_result = subprocess.run(
41
+ ["uv", "build", "--out-dir", str(dist_dir)],
42
+ cwd=str(project_root),
43
+ capture_output=True,
44
+ text=True,
45
+ timeout=60,
46
+ )
47
+ assert_that(build_result.returncode).is_equal_to(0)
48
+ assert_that(dist_dir.exists()).is_true()
49
+
50
+ # Find the built wheel
51
+ wheels = list(dist_dir.glob("*.whl"))
52
+ assert_that(wheels).is_not_empty()
53
+ wheel_path = wheels[0]
54
+
55
+ # Step 2: Create a fresh virtual environment
56
+ venv_result = subprocess.run(
57
+ [sys.executable, "-m", "venv", str(venv_path)],
58
+ capture_output=True,
59
+ text=True,
60
+ timeout=30,
61
+ )
62
+ assert_that(venv_result.returncode).is_equal_to(0)
63
+
64
+ # Determine the Python executable in the venv
65
+ if sys.platform == "win32":
66
+ python_exe = venv_path / "Scripts" / "python.exe"
67
+ else:
68
+ python_exe = venv_path / "bin" / "python"
69
+
70
+ assert_that(python_exe.exists()).is_true()
71
+
72
+ # Step 3: Install the wheel in the venv
73
+ install_result = subprocess.run(
74
+ [str(python_exe), "-m", "pip", "install", str(wheel_path)],
75
+ capture_output=True,
76
+ text=True,
77
+ timeout=60,
78
+ )
79
+ assert_that(install_result.returncode).is_equal_to(0)
80
+
81
+ # Step 4: Test importing lintro modules (this is where circular imports fail)
82
+ test_imports = [
83
+ "import lintro",
84
+ "import lintro.parsers",
85
+ "from lintro.parsers import bandit",
86
+ "from lintro.parsers.actionlint.actionlint_parser import parse_actionlint_output", # noqa: E501
87
+ "from lintro.tools.implementations.tool_actionlint import ActionlintTool",
88
+ "from lintro.cli import cli",
89
+ ]
90
+
91
+ for import_statement in test_imports:
92
+ import_result = subprocess.run(
93
+ [str(python_exe), "-c", import_statement],
94
+ capture_output=True,
95
+ text=True,
96
+ timeout=10,
97
+ )
98
+ assert_that(import_result.returncode).described_as(
99
+ f"Import failed: {import_statement}\n"
100
+ f"stdout: {import_result.stdout}\n"
101
+ f"stderr: {import_result.stderr}",
102
+ ).is_equal_to(0)
103
+
104
+ # Step 5: Test that lintro CLI works
105
+ cli_result = subprocess.run(
106
+ [str(python_exe), "-m", "lintro", "--version"],
107
+ capture_output=True,
108
+ text=True,
109
+ timeout=10,
110
+ )
111
+ assert_that(cli_result.returncode).is_equal_to(0)
112
+ assert_that(cli_result.stdout).contains("lintro")
@@ -0,0 +1,150 @@
1
+ """Tests for package-level imports to prevent circular dependencies.
2
+
3
+ This module tests that lintro can be imported as it would be when installed
4
+ as a dependency in another project, preventing circular import issues.
5
+
6
+ Note: These tests may not catch all circular import issues when running from
7
+ source (editable install), as the issue primarily manifests when the package
8
+ is installed as a built distribution. However, these tests serve as:
9
+ 1. Documentation of expected import patterns
10
+ 2. Basic smoke tests for package structure
11
+ 3. Regression prevention for obvious import issues
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+
17
+ def test_main_package_import() -> None:
18
+ """Test that the main lintro package can be imported."""
19
+ import lintro
20
+
21
+ assert lintro is not None
22
+
23
+
24
+ def test_parsers_package_import() -> None:
25
+ """Test that lintro.parsers package can be imported without circular deps."""
26
+ import lintro.parsers
27
+
28
+ assert lintro.parsers is not None
29
+
30
+
31
+ def test_parsers_submodules_accessible() -> None:
32
+ """Test that all parser submodules are accessible via the parsers package."""
33
+ import lintro.parsers
34
+
35
+ # Verify all expected submodules are available
36
+ assert hasattr(lintro.parsers, "actionlint")
37
+ assert hasattr(lintro.parsers, "bandit")
38
+ assert hasattr(lintro.parsers, "darglint")
39
+ assert hasattr(lintro.parsers, "hadolint")
40
+ assert hasattr(lintro.parsers, "prettier")
41
+ assert hasattr(lintro.parsers, "ruff")
42
+ assert hasattr(lintro.parsers, "yamllint")
43
+
44
+
45
+ def test_parser_submodule_direct_imports() -> None:
46
+ """Test that parser submodules can be imported directly."""
47
+ from lintro.parsers import (
48
+ actionlint,
49
+ bandit,
50
+ darglint,
51
+ hadolint,
52
+ prettier,
53
+ ruff,
54
+ yamllint,
55
+ )
56
+
57
+ assert actionlint is not None
58
+ assert bandit is not None
59
+ assert darglint is not None
60
+ assert hadolint is not None
61
+ assert prettier is not None
62
+ assert ruff is not None
63
+ assert yamllint is not None
64
+
65
+
66
+ def test_parser_functions_importable() -> None:
67
+ """Test that parser functions can be imported from submodules.
68
+
69
+ This simulates the pattern used in tool implementations where specific
70
+ parser functions are imported directly.
71
+ """
72
+ from lintro.parsers.actionlint.actionlint_parser import parse_actionlint_output
73
+ from lintro.parsers.bandit.bandit_parser import parse_bandit_output
74
+ from lintro.parsers.darglint.darglint_parser import parse_darglint_output
75
+ from lintro.parsers.hadolint.hadolint_parser import parse_hadolint_output
76
+ from lintro.parsers.prettier.prettier_parser import parse_prettier_output
77
+ from lintro.parsers.ruff.ruff_parser import parse_ruff_output
78
+ from lintro.parsers.yamllint.yamllint_parser import parse_yamllint_output
79
+
80
+ assert parse_actionlint_output is not None
81
+ assert parse_bandit_output is not None
82
+ assert parse_darglint_output is not None
83
+ assert parse_hadolint_output is not None
84
+ assert parse_prettier_output is not None
85
+ assert parse_ruff_output is not None
86
+ assert parse_yamllint_output is not None
87
+
88
+
89
+ def test_tools_import_chain() -> None:
90
+ """Test the full import chain from tools to parsers.
91
+
92
+ This simulates what happens when lintro is used as a CLI or library,
93
+ ensuring the tool -> parser import chain works without circular deps.
94
+ """
95
+ from lintro.tools.implementations.tool_actionlint import ActionlintTool
96
+
97
+ tool = ActionlintTool()
98
+ assert tool is not None
99
+ assert tool.name == "actionlint"
100
+
101
+
102
+ def test_cli_import_chain() -> None:
103
+ """Test that the CLI can be imported (triggers full package initialization)."""
104
+ from lintro.cli import cli
105
+
106
+ assert cli is not None
107
+
108
+
109
+ def test_formatters_package_import() -> None:
110
+ """Test that formatters package imports work correctly."""
111
+ import lintro.formatters
112
+
113
+ assert lintro.formatters is not None
114
+
115
+
116
+ def test_enums_package_import() -> None:
117
+ """Test that enums package imports work correctly."""
118
+ import lintro.enums
119
+
120
+ assert lintro.enums is not None
121
+
122
+
123
+ def test_models_package_import() -> None:
124
+ """Test that models package imports work correctly."""
125
+ import lintro.models
126
+
127
+ assert lintro.models is not None
128
+
129
+
130
+ def test_utils_package_import() -> None:
131
+ """Test that utils package imports work correctly."""
132
+ import lintro.utils
133
+
134
+ assert lintro.utils is not None
135
+
136
+
137
+ def test_cross_package_imports() -> None:
138
+ """Test imports that cross multiple package boundaries.
139
+
140
+ This is the most realistic test for how lintro would be used as a
141
+ dependency, where multiple packages are imported in various orders.
142
+ """
143
+ # Import in various orders to catch potential circular deps
144
+ from lintro.formatters.tools.bandit_formatter import BanditTableDescriptor
145
+ from lintro.parsers import bandit
146
+ from lintro.tools.implementations.tool_bandit import BanditTool
147
+
148
+ assert bandit is not None
149
+ assert BanditTool is not None
150
+ assert BanditTableDescriptor is not None
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