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.
- {lintro-0.6.1/lintro.egg-info → lintro-0.6.3}/PKG-INFO +5 -3
- {lintro-0.6.1 → lintro-0.6.3}/README.md +2 -0
- {lintro-0.6.1 → lintro-0.6.3}/assets/images/coverage-badge.svg +3 -3
- {lintro-0.6.1 → lintro-0.6.3}/docs/contributing.md +13 -0
- lintro-0.6.3/docs/security/assurance.md +27 -0
- lintro-0.6.3/docs/security/requirements.md +42 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/__init__.py +1 -1
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_prettier.py +7 -1
- {lintro-0.6.1 → lintro-0.6.3/lintro.egg-info}/PKG-INFO +5 -3
- {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/SOURCES.txt +2 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/requires.txt +2 -2
- {lintro-0.6.1 → lintro-0.6.3}/pyproject.toml +4 -4
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_prettier_integration.py +32 -0
- {lintro-0.6.1 → lintro-0.6.3}/LICENSE +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/MANIFEST.in +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/assets/images/lintro.png +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/README.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/configuration.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/coverage-setup.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/docker.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/getting-started.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/github-integration.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/lintro-self-use.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/style-guide.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/README.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/actionlint-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/bandit-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/black-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/darglint-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/hadolint-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/prettier-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/ruff-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/docs/tool-analysis/yamllint-analysis.md +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/__main__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/ascii-art/fail.txt +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/ascii-art/success.txt +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/check.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/format.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/cli_utils/commands/list_tools.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/action.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/darglint_strictness.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/group_by.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/hadolint_enums.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/output_format.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/tool_name.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/tool_type.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/enums/yamllint_format.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/exceptions/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/exceptions/errors.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/output_style.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/core/table_descriptor.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/csv.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/grid.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/html.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/json.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/markdown.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/styles/plain.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/actionlint_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/bandit_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/black_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/darglint_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/hadolint_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/prettier_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/ruff_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/formatters/tools/yamllint_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/models/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool_config.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/models/core/tool_result.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/actionlint_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/actionlint/actionlint_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/black/black_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/black/black_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/darglint_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/darglint/darglint_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/hadolint_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/hadolint/hadolint_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/prettier_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/prettier/prettier_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/ruff_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/ruff/ruff_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/yamllint_issue.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/parsers/yamllint/yamllint_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/tool_base.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/core/tool_manager.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_actionlint.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_bandit.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_black.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_darglint.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_hadolint.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_ruff.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/implementations/tool_yamllint.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/tools/tool_enum.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/ascii_normalize_cli.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/config.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/console_logger.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/formatting.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/output_manager.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/path_utils.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/tool_executor.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro/utils/tool_utils.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/dependency_links.txt +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/entry_points.txt +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/lintro.egg-info/top_level.txt +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/setup.cfg +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/Dockerfile.violations +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/actionlint_violations.yml +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/bandit_violations.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/darglint_violations.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/prettier_violations.js +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_black_e501_wrappable.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_clean.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/ruff_violations.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/test_samples/yaml_violations.yml +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/cli/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/cli/conftest.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/cli/test_cli.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/conftest.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/conftest.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/formatters/test_formatters.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/conftest.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_actionlint_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_bandit_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_darglint_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_hadolint_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_ruff_black_policy.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_ruff_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/integration/test_yamllint_integration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_delete_previous_lintro_comments.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_extract_version.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_ghcr_prune_untagged.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_script_environment.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_semantic_release_compute_next.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/scripts/test_shell_scripts.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/test_documentation.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ascii_normalize.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_command_building.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_config_hydration.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_formatter_mapping.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_bandit_parsing.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_formatter.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_parser.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_tool.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_black_tool_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_commands.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_commands_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_cli_programmatic.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_compatibility_ruff_black.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_config_loader.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_config_loader_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_console_logger.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_console_logger_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_enums_and_normalizers.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_exceptions.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_formatters_tables.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_output_manager_reports.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_parsers_actionlint.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ruff_parser_additional.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_ruff_parser_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_fmt_exclusion.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_executor_post_checks.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_manager.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils_fallbacks.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/unit/test_tool_utils_more.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/utils/__init__.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/utils/conftest.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/utils/test_formatting.py +0 -0
- {lintro-0.6.1 → lintro-0.6.3}/tests/utils/test_output_manager.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
[](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
|
|
94
94
|
[](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
|
|
95
95
|
|
|
96
|
+
[](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
|
[](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
|
|
20
20
|
[](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
|
|
21
21
|
|
|
22
|
+
[](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="#
|
|
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">
|
|
19
|
-
<text x="800" y="140" transform="scale(.1)" textLength="260">
|
|
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)
|
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
[](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
|
|
94
94
|
[](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
|
|
95
95
|
|
|
96
|
+
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
29
|
-
test = [ "pytest==8.4.2", "pytest-cov==6.
|
|
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
|
|
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
|
|
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
|