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.
- {lintro-0.13.1/lintro.egg-info → lintro-0.13.2}/PKG-INFO +5 -3
- {lintro-0.13.1 → lintro-0.13.2}/README.md +3 -1
- {lintro-0.13.1 → lintro-0.13.2}/assets/images/coverage-badge.svg +2 -2
- {lintro-0.13.1 → lintro-0.13.2}/lintro/__init__.py +1 -1
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/__init__.py +1 -1
- {lintro-0.13.1 → lintro-0.13.2/lintro.egg-info}/PKG-INFO +5 -3
- {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/SOURCES.txt +2 -0
- {lintro-0.13.1 → lintro-0.13.2}/pyproject.toml +2 -2
- lintro-0.13.2/tests/integration/test_built_package.py +112 -0
- lintro-0.13.2/tests/unit/test_package_imports.py +150 -0
- {lintro-0.13.1 → lintro-0.13.2}/LICENSE +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/MANIFEST.in +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/assets/images/lintro.png +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/README.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/configuration.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/contributing.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/coverage-setup.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/docker.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/getting-started.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/github-integration.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/lintro-self-use.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/security/assurance.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/security/requirements.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/style-guide.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/README.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/actionlint-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/bandit-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/black-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/darglint-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/hadolint-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/prettier-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/ruff-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/docs/tool-analysis/yamllint-analysis.md +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/__main__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/ascii-art/fail.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/ascii-art/success.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/check.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/format.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/cli_utils/commands/list_tools.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/action.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/darglint_strictness.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/group_by.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/hadolint_enums.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/output_format.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/tool_name.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/tool_type.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/enums/yamllint_format.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/exceptions/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/exceptions/errors.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/output_style.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/core/table_descriptor.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/csv.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/grid.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/html.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/json.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/markdown.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/styles/plain.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/actionlint_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/bandit_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/black_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/darglint_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/hadolint_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/prettier_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/ruff_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/formatters/tools/yamllint_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/models/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool_config.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/models/core/tool_result.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/black/black_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/black/black_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/darglint_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/darglint/darglint_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/prettier_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/prettier/prettier_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/ruff_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/ruff/ruff_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/tool_base.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/core/tool_manager.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_actionlint.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_bandit.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_black.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_darglint.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_hadolint.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_prettier.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_ruff.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/implementations/tool_yamllint.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/tools/tool_enum.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/ascii_normalize_cli.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/config.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/console_logger.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/formatting.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/output_manager.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/path_utils.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/tool_executor.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro/utils/tool_utils.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/dependency_links.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/entry_points.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/requires.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/lintro.egg-info/top_level.txt +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/setup.cfg +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/Dockerfile.violations +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/actionlint_violations.yml +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/bandit_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/darglint_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/prettier_violations.js +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_annotations_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_black_e501_wrappable.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_bugbear_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_c4_comprehensions_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_clean.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_naming_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_sim_simplify_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/ruff_violations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/test_samples/yaml_violations.yml +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/cli/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/cli/conftest.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/cli/test_cli.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/conftest.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/conftest.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/formatters/test_formatters.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/conftest.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_actionlint_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_bandit_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_darglint_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_hadolint_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_prettier_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_additional_coverage.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_annotations.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_black_policy.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_bugbear.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_ruff_naming.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/integration/test_yamllint_integration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_ci_post_pr_comment.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_extract_version.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_github_comment_utilities.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_script_environment.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_semantic_release_compute_next.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/scripts/test_shell_scripts.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/test_documentation.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ascii_normalize.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_command_building.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_config_hydration.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_formatter_mapping.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_bandit_parsing.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_formatter.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_parser.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_tool.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_black_tool_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_commands.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_commands_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_cli_programmatic.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_compatibility_ruff_black.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_config_loader.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_config_loader_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_console_logger.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_console_logger_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_enums_and_normalizers.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_exceptions.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_formatters_tables.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_output_manager_reports.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_parsers_actionlint.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ruff_parser_additional.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_ruff_parser_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_subprocess_validator.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_base_subprocess.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_fmt_exclusion.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_executor_post_checks.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_manager.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils_fallbacks.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/unit/test_tool_utils_more.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/utils/__init__.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/utils/conftest.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/utils/test_formatting.py +0 -0
- {lintro-0.13.1 → lintro-0.13.2}/tests/utils/test_output_manager.py +0 -0
- {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.
|
|
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:
|
|
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.
|
|
19
|
-
<text x="800" y="140" transform="scale(.1)" textLength="260">84.
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lintro
|
|
3
|
-
Version: 0.13.
|
|
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:
|
|
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.
|
|
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 = "
|
|
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
|
|
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
|
|
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
|
|
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
|