pyfltr 3.22.0__tar.gz → 3.22.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.
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/agents/tool-compat-checker.md +3 -3
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/targets.md +3 -3
- {pyfltr-3.22.0 → pyfltr-3.22.2}/PKG-INFO +1 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/development/architecture.md +28 -4
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/configuration-tools.md +9 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/custom-commands.md +2 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/recommended.md +3 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_server.py +0 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/pipeline.py +10 -11
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/core_.py +16 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/dispatcher.py +1 -8
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/glab.py +1 -2
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/linter_fix.py +1 -2
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/runner.py +6 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/stage_runner.py +46 -2
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/subproject_loop.py +2 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/textlint_fix.py +16 -7
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/base.py +1 -6
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/prettier.py +3 -4
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/ruff.py +1 -2
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/vitest.py +2 -3
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/config.py +5 -7
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/validation.py +11 -6
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/common.py +1 -1
- pyfltr-3.22.2/pyfltr/parsing/entry.py +129 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/pytest.py +5 -5
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/tools.py +21 -22
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/paths.py +34 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/archive.py +100 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/cache.py +1 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/only_failed.py +1 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/retry.py +7 -6
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/tools.py +3 -3
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/mcp_server_test.py +0 -1
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/runner_test.py +14 -0
- pyfltr-3.22.2/tests/command/stage_runner_test.py +282 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/textlint_fix_test.py +57 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/config/config_test.py +4 -107
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/conftest.py +77 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/parser_registration_test.py +1 -1
- pyfltr-3.22.2/tests/integration/pipeline_config_files_warning_test.py +154 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_monorepo_test.py +50 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/status_consistency_test.py +53 -4
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/entry_test.py +69 -4
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/paths_test.py +43 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/archive_test.py +107 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/only_failed_test.py +40 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/retry_test.py +9 -9
- pyfltr-3.22.0/pyfltr/parsing/entry.py +0 -100
- pyfltr-3.22.0/tests/command/stage_runner_test.py +0 -112
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/grep-replace/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/implementation-test-constraints/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/output-format/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/pyfltr-add-tool/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/ssot/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/tool-resolution/SKILL.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/agents/error-parser-reviewer.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/dogfooding.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/order.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/subprocess.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.editorconfig +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.editorconfig-checker.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitattributes +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/audit.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/ci.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/docker-build.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/docs.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/release.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitignore +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitlab-ci.yml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitmessage +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.markdownlint-cli2.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.npmrc +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.pre-commit-config.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.python-version +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.textlintignore +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.textlintrc.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.vscode/extensions.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.vscode/settings.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/.yamllint.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/AGENTS.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/LICENSE +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/Makefile +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/README.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/cliff.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docker/Dockerfile +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/.markdownlint-cli2.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/development/development.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/configuration.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/getting-started.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/grep-replace.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/index.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/recommended-nonpython.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/troubleshooting.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/usage.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/index.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/mise.lock +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/mise.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/mkdocs.yml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/__main__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/command_info.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/command_selection.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/config_subcmd.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/grep_replace_common.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/grep_subcmd.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/main.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_models.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_transport.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_worker.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/output_format.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/overrides.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/parser.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/replace_subcmd.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/runs.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/shell_completion.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/subproject_config.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/__main__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/check.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/cli.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/words.txt +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/words_allow.txt +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/cache_policy.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/completion.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/env.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/executor.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/lychee.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/mise.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/only_failed.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/precommit.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/precommit_guidance.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/process.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/slow_tests.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/snapshot.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/structured_output.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/subprojects.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/targets.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/tool_parallelism.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/tool_resolution.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/editing.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/model.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/operations.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/presets.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/selection.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/diagnostics.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/adaptive.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/history.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/jsonl_records.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/matcher.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/operations.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/preview.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/replacer.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/scanner.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/text_render.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/transaction.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/types.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/link_checks.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/auxiliary.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/code_quality.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/diagnostics.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/formatters.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/github_annotations.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/jsonl.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/logging_.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/positions.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/render.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/sarif.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/ui.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/rule_urls.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/run_options.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/retention.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/runs.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/exclude_fence.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/fences.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/warnings_.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/check_distribution.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/check_doc_codeblocks.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/distribution_probe.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/command_info_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/command_selection_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/grep_subcmd_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/main_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/mcp_transport_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/pipeline_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/replace_subcmd_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/runs_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/shell_completion_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/check_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/cli_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/cache_policy_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/completion_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/conftest.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/core_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/dispatcher_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/env_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/executor_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/glab_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/linter_fix_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/mise_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/only_failed_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/precommit_guidance_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/precommit_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/process_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/runner_helpers.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/slow_tests_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/subproject_loop_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/subprojects_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/targets_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/tool_parallelism_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/tool_resolution_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/base_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/prettier_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/ruff_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/vitest_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/config/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/execution_request_helper.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/adaptive_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/history_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/matcher_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/preview_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/scanner_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/check_doc_codeblocks_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/cli_option_reference_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/documentation_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/external_paths_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/layers_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/llmstxt_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/lychee_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/module_imports_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/only_failed_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/output_format_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_always_targets_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_fast_targets_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/precommit_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/relative_work_dir_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/replace_failure_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/smoke_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/test_placement_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/code_quality_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/diagnostics_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/github_annotations_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/jsonl_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/positions_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/sarif_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/ui_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/common_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/pytest_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/tools_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/rule_urls_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/.editorconfig +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/.github/workflows/ci.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/Dockerfile +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.sh +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.txt +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/.github/workflows/pinned.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/.github/workflows/unpinned.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/.pre-commit-config.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/sample.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/.pre-commit-config.yaml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/sample.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/package.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/sample.md +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/eslint.config.js +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/package.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/sample.test.ts +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/sample.ts +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/tsconfig.json +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/uv_sort_workspace/pyproject.toml +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/cache_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/text/__init__.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/text/exclude_fence_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/warnings_test.py +0 -0
- {pyfltr-3.22.0 → pyfltr-3.22.2}/uv.lock +0 -0
|
@@ -16,8 +16,8 @@ pyfltrの対応ツールがバージョンアップで挙動を変えていな
|
|
|
16
16
|
pyfltrは各ツールのバージョン追従が必要なため、差分の確認を定期的に行う。
|
|
17
17
|
対応ツールの集合は `pyfltr/tools.py` の `BUILTIN_COMMANDS` を典拠とする。
|
|
18
18
|
チェック対象は`BUILTIN_COMMANDS`の各`CommandInfo`にある`defaults`の引数と、
|
|
19
|
-
`diagnostic_pattern`、`parser`、`
|
|
20
|
-
関数パーサーは`pyfltr/parsing/tools.py`等の登録先を読み、`
|
|
19
|
+
`diagnostic_pattern`、`parser`、`path_resolving_parser`が参照する解析処理。
|
|
20
|
+
関数パーサーは`pyfltr/parsing/tools.py`等の登録先を読み、`path_resolving_parser`には解析境界のパス変換関数が渡ることも確認する。
|
|
21
21
|
|
|
22
22
|
## 入力
|
|
23
23
|
|
|
@@ -57,7 +57,7 @@ pyfltrは各ツールのバージョン追従が必要なため、差分の確
|
|
|
57
57
|
|
|
58
58
|
- JSON Lines全体を保存し、`header`レコード(`{"kind": "header", "run_id": "..."}`形式)の`run_id`を記録する。`head`等で先頭行だけを読むパイプは使わない
|
|
59
59
|
- `uv run pyfltr show-run <run_id> --commands=<tool> --output --output-format=text`へ記録済みrun IDを明示し、JSON Linesへラップされていない生出力を取得する。`latest`は使わない
|
|
60
|
-
- 出力が対象`CommandInfo.diagnostic_pattern`、`parser`、`
|
|
60
|
+
- 出力が対象`CommandInfo.diagnostic_pattern`、`parser`、`path_resolving_parser`の登録済み解析処理に対応するか比較する
|
|
61
61
|
- 必須グループ(`file`、`line`、`message`)が正常に取得されるか確認
|
|
62
62
|
|
|
63
63
|
5. 報告
|
|
@@ -67,10 +67,10 @@ paths:
|
|
|
67
67
|
外部パス専用の追加実行を行ったうえで結果を`CommandResult.merge`で集約する。
|
|
68
68
|
除外対象ツールでは外部パスを破棄して警告のみ発行する。
|
|
69
69
|
|
|
70
|
-
`CommandInfo.config_files
|
|
70
|
+
`CommandInfo.config_files`は設定不在時の警告とキャッシュキー算出に専用で、
|
|
71
71
|
`--config`注入候補(`config_inject_candidates`)とは責務を分離する。
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
設定不在時の警告は実行パイプラインが実行対象の確定後に今回の実行対象だけを判定し、
|
|
73
|
+
起点cwd直下のみを判定対象とする。サブプロジェクトのディレクトリでは判定しない。
|
|
74
74
|
`config_inject_candidates`の解決も起点cwd直下を基準とするため、
|
|
75
75
|
サブプロジェクトのディレクトリを基準にした不在判定は誤検知になる。
|
|
76
76
|
|
|
@@ -20,6 +20,12 @@ TUI/非TUIの分岐はこの関数の内側で行い、パイプライン共通
|
|
|
20
20
|
各ステージの結果は`CommandResult`に集約され、ステージ完了ごとに`archive_hook`へ渡される。
|
|
21
21
|
ステージ間の中断(`--fail-fast`時の打ち切りなど)は`stage_runner`の共通ヘルパーで吸収する。
|
|
22
22
|
|
|
23
|
+
fixステージの結果は同じツールの通常ステージと重複するため、成功時は最終結果へ含めず保存だけを行う。
|
|
24
|
+
fixステージが失敗した場合は、同じツールの通常ステージの結果(成功・スキップを含む)へ失敗と出力を統合した1件を
|
|
25
|
+
最終結果とし、表示・終了コード・`retry_command`・アーカイブへ同じ結果を渡す。
|
|
26
|
+
`--fail-fast`で停止する場合もfixステージの失敗を記録し、同じツールのスキップ結果を重ねない。
|
|
27
|
+
通常ステージの成功でfixステージの失敗が消えると、修正処理の失敗が利用者へ届かないためである。
|
|
28
|
+
|
|
23
29
|
## 層順とサブパッケージの責務 {#modules}
|
|
24
30
|
|
|
25
31
|
依存は次の下位から上位への7層に整理する。同じ層または下位だけをimportし、
|
|
@@ -234,6 +240,22 @@ python-runnerへ委譲せず`uvx <bin>`で別環境へ解決する。
|
|
|
234
240
|
- 出力スキーマは現行を維持する(JSONL・SARIF・archive・MCP読み取り系APIでサブプロジェクト
|
|
235
241
|
識別フィールドを新設しない)。サブプロジェクト境界をまたぐ実行結果は `CommandResult.merge` で
|
|
236
242
|
1件に集約し、人間向け `output` には `# subproject: <相対パス>` の区切り行のみ挿入する
|
|
243
|
+
- 診断の`file`は解析境界(`pyfltr.parsing.entry.parse_errors`)で起点相対へ揃え、統合時には付け替えない。
|
|
244
|
+
通常・fix・2段階などの各実行処理は`ExecutionRequest.parse_errors`を通じてツールの実行cwd(`path_base`)と実行起点(`start_cwd`)を渡し、
|
|
245
|
+
`pyfltr.paths.to_start_relative`が相対パスを実行cwd基準で絶対化してから起点相対へ変換する。
|
|
246
|
+
起点外を指すパスは`../`相対を含めて`/`区切りの絶対パスで返し、対象集合が保持する外部パスと同じ表現に揃える。
|
|
247
|
+
各パーサーはツール出力のパスを区切りの統一だけで返し、基準変換を持たない。
|
|
248
|
+
診断メッセージにもパスを埋め込むaridは`CommandInfo.path_resolving_parser`として同じ変換関数を受け取る。
|
|
249
|
+
一時ファイルから元ファイルへの付け替え(`file_path_remap`)は変換の後に適用し、付け替え後の値は再変換しない。
|
|
250
|
+
`--only-failed`と`retry_command`は起点相対の対象集合と診断の`file`を文字列で突合するため、
|
|
251
|
+
基準が子プロジェクト相対のまま残ると失敗ファイルを選べない
|
|
252
|
+
- 診断を起点相対へ揃える前の版が保存したpytestのアーカイブは、子プロジェクト相対の診断を持つ。
|
|
253
|
+
`ArchiveStore.read_tool_diagnostics`は保存済み生出力の`# subproject:`区間ごとに解析をやり直し、
|
|
254
|
+
`file`・行・メッセージが一致する区間が1件だけの診断を起点相対へ補正して返す。
|
|
255
|
+
区間を一意に決められない診断は変えず、保存ファイルも書き換えない。
|
|
256
|
+
新しい版はrunの`meta.json`へ`diagnostic_paths: start-relative`を書き、このキーを持たないrunだけを補正の対象にする。
|
|
257
|
+
新しい版のrunを補正すると、起点直下の診断を同じ位置・メッセージを持つ子の診断と取り違えるためである。
|
|
258
|
+
診断のbasenameや末尾一致で所属を推測する案は、子プロジェクト間で同じ相対名を持つファイルを誤選択するため採らない
|
|
237
259
|
- `subprocess.Popen` へのcwd切り替えは引数渡しのみで実現する。`os.chdir()` を
|
|
238
260
|
サブプロジェクトループで使うとプロセスcwdが並列実行中の他ツールへ干渉するため、
|
|
239
261
|
cwd依存処理(mise・git・ファイル走査・snapshot等)は明示引数で起点cwdを取得する形に統一する
|
|
@@ -404,7 +426,7 @@ CLI JSONLはシェルしか使えない消費側向けの代替手段として
|
|
|
404
426
|
対象はJSON Lines出力・CLIテキスト出力・CLIのJSON出力・MCPツール応答・SARIF・Code Quality・
|
|
405
427
|
GitHub Annotationsの各出力で返すファイルパスである。
|
|
406
428
|
除外対象や欠落対象として警告へ載せるパスも含む。
|
|
407
|
-
生成時は`pyfltr.paths.normalize_separators
|
|
429
|
+
生成時は`pyfltr.paths.normalize_separators`・`pyfltr.paths.to_cwd_relative`・`pyfltr.paths.to_start_relative`のいずれかを経由する。
|
|
408
430
|
公開値を`str()`で直接文字列化しない。
|
|
409
431
|
pyfltr自身が実装するツール(`colloquial-check`など)の標準出力に含めるファイル位置も、
|
|
410
432
|
生成時点で同じ正規化を経由する。これらのツールの生標準出力は`show-run --commands <name> --output`と
|
|
@@ -736,6 +758,8 @@ subparsersを`required=True`で必須化し、引数なし実行時のフォー
|
|
|
736
758
|
|
|
737
759
|
アーカイブの保存キーはツール名固定のため、同一ツール名のfixステージと通常ステージは
|
|
738
760
|
通常ステージで上書きされる。
|
|
761
|
+
fixステージが失敗した場合は通常ステージの結果へ統合した1件を保存するため、
|
|
762
|
+
`show-run`からfixステージの失敗と出力を取得できる(本書「実行パイプライン」を参照)。
|
|
739
763
|
`show-run`は各ツールの最終保存結果のみを参照可能で、ステージ別保存への拡張は対象外とする。
|
|
740
764
|
|
|
741
765
|
run_id解決は完全一致に加えて前方一致と`latest`エイリアスを許容する。
|
|
@@ -856,9 +880,9 @@ worker方式は起動費用を持つが、共有状態を分離し、子孫を
|
|
|
856
880
|
プロセスグローバルなcwdに干渉しないため、`ThreadPoolExecutor`によるツールの並列実行や
|
|
857
881
|
MCPクライアントからの並行ツール呼び出しでも実行起点を呼び出し単位で維持できる。
|
|
858
882
|
|
|
859
|
-
|
|
860
|
-
`pyfltr.paths.to_cwd_relative()`はプロセスのcwd
|
|
861
|
-
|
|
883
|
+
診断のファイルパスは解析境界で`start_cwd`(`work_dir`)を基準に相対化する(本書「モノレポ対応」を参照)。
|
|
884
|
+
`pyfltr.paths.to_cwd_relative()`はプロセスのcwdだけを相対化の基準とするため、
|
|
885
|
+
診断以外でこの関数を経由する値は`work_dir`指定時に絶対パスで返る場合がある。
|
|
862
886
|
|
|
863
887
|
#### `run_pipeline()`戻り値
|
|
864
888
|
|
|
@@ -411,6 +411,15 @@ fix段では、pyfltrはtextlintを2段階で実行する(fix適用 → lint
|
|
|
411
411
|
`--format` ペアを自動除去するためクラッシュしない。
|
|
412
412
|
`--format` 指定は `textlint-lint-args`(lintモード専用)に書くことを推奨する。
|
|
413
413
|
|
|
414
|
+
`textlint-args`へ`--cache`を書くと、lint段と後段のlintチェックはtextlintのキャッシュを使う。
|
|
415
|
+
fixステップでは、pyfltrが起動コマンドの末尾へ`--no-cache`を加えてキャッシュを無効化する。
|
|
416
|
+
textlintはキャッシュに一致したファイルを修正しようとすると例外で終了する場合があるためである。
|
|
417
|
+
`command-info textlint`の`fix_commandline`にも同じ引数が現れる。
|
|
418
|
+
|
|
419
|
+
fixステップが失敗した場合(終了コード1の例外を含む)は、後段のlintチェックが成功しても
|
|
420
|
+
textlintを`failed`として扱い、fixステップの出力を結果へ残す。
|
|
421
|
+
`show-run`やMCPの`show_run_output`でfixステップの出力を確認できる。
|
|
422
|
+
|
|
414
423
|
### prettier の 2 段階実行
|
|
415
424
|
|
|
416
425
|
`prettier`は`--check`(読み取り専用)と`--write`(書き込み)が排他のため、pyfltrは2段階で実行する。
|
|
@@ -43,7 +43,8 @@ fast = true
|
|
|
43
43
|
- `pass-filenames`: ファイル引数をコマンドに渡すか否か(省略時は`true`)。
|
|
44
44
|
プロジェクト全体を一括チェックするツールでは`false`に設定する
|
|
45
45
|
- `config-files`: このコマンドの設定ファイル候補のリスト(省略時は空)。globパターン可。
|
|
46
|
-
|
|
46
|
+
有効化したコマンドを実行するときに、どれもプロジェクトルート直下に見つからないとpyfltrが警告を発行する(ツール自体は実行する)。
|
|
47
|
+
`--commands`などで実行対象から外したコマンドは判定しない。
|
|
47
48
|
pre-commit・prekなどの「設定ファイル無しでは機能しないツール」の設定不備を可視化する用途。
|
|
48
49
|
判定はモノレポでも起点cwd直下のみを対象とし、サブプロジェクトのディレクトリでは行わない
|
|
49
50
|
- `severity`: `"error"`(既定)または`"warning"`。
|
|
@@ -735,6 +735,9 @@ textlint-lint-args = ["--format", "compact"]
|
|
|
735
735
|
pyfltrはfix段の起動コマンドから`--format`ペアを自動除去するため。
|
|
736
736
|
ただし新規設定では`textlint-lint-args`に書くことを推奨する。
|
|
737
737
|
|
|
738
|
+
lint段を高速化するために`textlint-args`へ`--cache`を設定してよい。
|
|
739
|
+
pyfltrはfix段の起動コマンドへ`--no-cache`を加えるため、自動修正ではtextlintのキャッシュを使わない。
|
|
740
|
+
|
|
738
741
|
## 呼び出し方の使い分け {#calling-style}
|
|
739
742
|
|
|
740
743
|
状況に応じて`pyfltr`の呼び出し方を以下のいずれかから選ぶ。
|
|
@@ -410,7 +410,6 @@ async def tool_run(
|
|
|
410
410
|
commands_list,
|
|
411
411
|
config,
|
|
412
412
|
start_cwd=base,
|
|
413
|
-
original_cwd=str(work_dir_path) if work_dir_path is not None else None,
|
|
414
413
|
original_sys_args=args.retry_arguments(for_mcp=True),
|
|
415
414
|
force_text_on_stderr=True,
|
|
416
415
|
jsonl_warnings_reach_consumer=False,
|
|
@@ -38,6 +38,7 @@ import pyfltr.command.targets
|
|
|
38
38
|
import pyfltr.config.config
|
|
39
39
|
import pyfltr.config.model
|
|
40
40
|
import pyfltr.config.selection
|
|
41
|
+
import pyfltr.config.validation
|
|
41
42
|
import pyfltr.output.formatters
|
|
42
43
|
import pyfltr.output.jsonl
|
|
43
44
|
import pyfltr.output.logging_
|
|
@@ -248,7 +249,7 @@ def _make_attach_retry_command(
|
|
|
248
249
|
*,
|
|
249
250
|
retry_args_template: list[str],
|
|
250
251
|
launcher_prefix: list[str],
|
|
251
|
-
|
|
252
|
+
target_base_cwd: str,
|
|
252
253
|
) -> typing.Callable[[pyfltr.command.core_.CommandResult], None]:
|
|
253
254
|
"""retry_command付与フックを生成する。
|
|
254
255
|
|
|
@@ -261,7 +262,7 @@ def _make_attach_retry_command(
|
|
|
261
262
|
result,
|
|
262
263
|
retry_args_template=retry_args_template,
|
|
263
264
|
launcher_prefix=launcher_prefix,
|
|
264
|
-
|
|
265
|
+
target_base_cwd=target_base_cwd,
|
|
265
266
|
)
|
|
266
267
|
|
|
267
268
|
return _hook
|
|
@@ -295,8 +296,9 @@ def run_commands_with_cli(
|
|
|
295
296
|
JSONL stdoutモードでのストリーミング出力に使用する。
|
|
296
297
|
|
|
297
298
|
`archive_hook`が指定されている場合、各コマンド完了時に実行アーカイブへ書き込む。
|
|
298
|
-
fixステージの結果はsummary
|
|
299
|
-
|
|
299
|
+
成功したfixステージの結果はsummaryに含めず、アーカイブへの保存だけを行う。
|
|
300
|
+
失敗したfixステージの結果は同じツールの通常ステージの結果へ統合して
|
|
301
|
+
summary・`on_result`・アーカイブへ渡す(`pyfltr.command.stage_runner.run_stages`を参照)。
|
|
300
302
|
|
|
301
303
|
`base_ctx`はパイプライン全体で不変のコンテキスト(config・all_files・cache_store・
|
|
302
304
|
cache_run_idを含む)。各コマンド実行前に`ExecutionContext`を組み立てて渡す。
|
|
@@ -389,7 +391,6 @@ def run_pipeline(
|
|
|
389
391
|
config: pyfltr.config.model.Config,
|
|
390
392
|
*,
|
|
391
393
|
start_cwd: pathlib.Path | None = None,
|
|
392
|
-
original_cwd: str | None = None,
|
|
393
394
|
original_sys_args: list[str] | None = None,
|
|
394
395
|
force_text_on_stderr: bool = False,
|
|
395
396
|
jsonl_warnings_reach_consumer: bool = True,
|
|
@@ -402,7 +403,6 @@ def run_pipeline(
|
|
|
402
403
|
commands,
|
|
403
404
|
config,
|
|
404
405
|
start_cwd=start_cwd,
|
|
405
|
-
original_cwd=original_cwd,
|
|
406
406
|
original_sys_args=original_sys_args,
|
|
407
407
|
force_text_on_stderr=force_text_on_stderr,
|
|
408
408
|
jsonl_warnings_reach_consumer=jsonl_warnings_reach_consumer,
|
|
@@ -412,7 +412,6 @@ def run_pipeline(
|
|
|
412
412
|
commands,
|
|
413
413
|
config,
|
|
414
414
|
start_cwd=start_cwd,
|
|
415
|
-
original_cwd=original_cwd,
|
|
416
415
|
original_sys_args=original_sys_args,
|
|
417
416
|
force_text_on_stderr=force_text_on_stderr,
|
|
418
417
|
jsonl_warnings_reach_consumer=jsonl_warnings_reach_consumer,
|
|
@@ -425,7 +424,6 @@ def _run_pipeline(
|
|
|
425
424
|
config: pyfltr.config.model.Config,
|
|
426
425
|
*,
|
|
427
426
|
start_cwd: pathlib.Path | None = None,
|
|
428
|
-
original_cwd: str | None = None,
|
|
429
427
|
original_sys_args: list[str] | None = None,
|
|
430
428
|
force_text_on_stderr: bool = False,
|
|
431
429
|
jsonl_warnings_reach_consumer: bool = True,
|
|
@@ -470,7 +468,6 @@ def _run_pipeline(
|
|
|
470
468
|
if isinstance(prepared, PipelineOutcome):
|
|
471
469
|
return prepared
|
|
472
470
|
|
|
473
|
-
effective_cwd = original_cwd if original_cwd is not None else os.getcwd()
|
|
474
471
|
effective_sys_args = list(original_sys_args) if original_sys_args is not None else list(sys.argv[1:])
|
|
475
472
|
launcher_prefix = pyfltr.state.retry.detect_launcher_prefix()
|
|
476
473
|
retry_args_template = pyfltr.state.retry.build_retry_args_template(effective_sys_args)
|
|
@@ -481,7 +478,8 @@ def _run_pipeline(
|
|
|
481
478
|
attach_retry_command = _make_attach_retry_command(
|
|
482
479
|
retry_args_template=retry_args_template,
|
|
483
480
|
launcher_prefix=launcher_prefix,
|
|
484
|
-
|
|
481
|
+
# 対象ファイルは実行起点相対で保持されるため、起動時のcwdではなく実行起点を基準に絶対化する。
|
|
482
|
+
target_base_cwd=str(start_cwd_path),
|
|
485
483
|
)
|
|
486
484
|
base_ctx = _prepare_execution_context(config, prepared, start_cwd_path, cache_store, run_id)
|
|
487
485
|
ctx = _prepare_run_output(
|
|
@@ -867,6 +865,8 @@ def _prepare_execution_targets(
|
|
|
867
865
|
commands = _add_subproject_fast_pytest(commands, args, config, subproject_configs)
|
|
868
866
|
requested_commands = list(commands)
|
|
869
867
|
commands = [c for c in commands if pyfltr.config.selection.is_command_enabled_anywhere(c, config, subproject_configs)]
|
|
868
|
+
# 設定ファイル欠落の警告は確定した実行対象だけを判定する(未選択コマンドの警告を返さない)。
|
|
869
|
+
pyfltr.config.validation.warn_config_files(config, start_cwd_path, commands)
|
|
870
870
|
unmet: list[str] = []
|
|
871
871
|
if getattr(args, "commands", None) is not None:
|
|
872
872
|
unmet = pyfltr.cli.command_selection.compute_unmet_commands(
|
|
@@ -1314,7 +1314,6 @@ def run_impl(
|
|
|
1314
1314
|
commands,
|
|
1315
1315
|
config,
|
|
1316
1316
|
start_cwd=options.work_dir if options.work_dir is not None else pathlib.Path(original_cwd),
|
|
1317
|
-
original_cwd=original_cwd,
|
|
1318
1317
|
original_sys_args=options.retry_arguments(),
|
|
1319
1318
|
)
|
|
1320
1319
|
return outcome.exit_code
|
|
@@ -10,6 +10,7 @@ import pyfltr.command.slow_tests
|
|
|
10
10
|
import pyfltr.config.config
|
|
11
11
|
import pyfltr.config.model
|
|
12
12
|
import pyfltr.diagnostics
|
|
13
|
+
import pyfltr.parsing.entry
|
|
13
14
|
import pyfltr.tools
|
|
14
15
|
|
|
15
16
|
FAILED_STATUSES: frozenset[str] = frozenset({"failed", "resolution_failed"})
|
|
@@ -26,7 +27,6 @@ if typing.TYPE_CHECKING:
|
|
|
26
27
|
import pyfltr.command.only_failed
|
|
27
28
|
import pyfltr.command.process
|
|
28
29
|
import pyfltr.command.subprojects
|
|
29
|
-
import pyfltr.parsing.entry
|
|
30
30
|
|
|
31
31
|
Subproject = pyfltr.command.subprojects.Subproject
|
|
32
32
|
|
|
@@ -711,6 +711,21 @@ class ExecutionRequest:
|
|
|
711
711
|
"""同じ実行設定のOOM再試行条件を返す。"""
|
|
712
712
|
return pyfltr.config.model.resolve_retry_kwargs(self.ctx.config.values)
|
|
713
713
|
|
|
714
|
+
def parse_errors(self, output: str, error_pattern: str | None) -> "list[pyfltr.diagnostics.ErrorLocation]":
|
|
715
|
+
"""実行cwdと実行起点を基準にしてツール出力を診断へ変換する。
|
|
716
|
+
|
|
717
|
+
各実行経路(通常・fix・2段階・個別実行モジュール)が同じパス基準を
|
|
718
|
+
`pyfltr.parsing.entry.parse_errors`へ渡すための入口である。
|
|
719
|
+
"""
|
|
720
|
+
return pyfltr.parsing.entry.parse_errors(
|
|
721
|
+
self.command,
|
|
722
|
+
output,
|
|
723
|
+
error_pattern,
|
|
724
|
+
file_path_remap=self.params.file_path_remap,
|
|
725
|
+
path_base=self.cwd,
|
|
726
|
+
start_cwd=self.ctx.base.start_cwd,
|
|
727
|
+
)
|
|
728
|
+
|
|
714
729
|
|
|
715
730
|
def overall_status(results: "typing.Iterable[CommandResult]") -> typing.Literal["SUCCESS", "FORMATTED", "FAILED"]:
|
|
716
731
|
"""失敗、書き換え、成功の優先順で実行全体の状態を決める。"""
|
|
@@ -32,7 +32,6 @@ import pyfltr.command.vitest
|
|
|
32
32
|
import pyfltr.config.config
|
|
33
33
|
import pyfltr.config.model
|
|
34
34
|
import pyfltr.config.selection
|
|
35
|
-
import pyfltr.parsing.entry
|
|
36
35
|
import pyfltr.parsing.pytest
|
|
37
36
|
import pyfltr.paths
|
|
38
37
|
import pyfltr.run_options
|
|
@@ -486,13 +485,7 @@ def _run_plain_command(request: pyfltr.command.core_.ExecutionRequest) -> pyfltr
|
|
|
486
485
|
|
|
487
486
|
output = proc.stdout.strip()
|
|
488
487
|
elapsed = time.perf_counter() - request.start_time
|
|
489
|
-
errors =
|
|
490
|
-
request.command,
|
|
491
|
-
output,
|
|
492
|
-
request.params.command_info.error_pattern,
|
|
493
|
-
file_path_remap=request.params.file_path_remap,
|
|
494
|
-
path_base=request.cwd,
|
|
495
|
-
)
|
|
488
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
496
489
|
# pytestは設定ファイル競合をヘッダー1行で通知するだけで終了コードへ反映しない。
|
|
497
490
|
# 拾わないと設定が適用されないまま完走した実行を成功として報告してしまう。
|
|
498
491
|
slow_tests: list[pyfltr.command.slow_tests.SlowTest] = []
|
|
@@ -9,7 +9,6 @@ import pyfltr.command.core_
|
|
|
9
9
|
import pyfltr.command.process
|
|
10
10
|
import pyfltr.config.config
|
|
11
11
|
import pyfltr.config.model
|
|
12
|
-
import pyfltr.parsing.entry
|
|
13
12
|
import pyfltr.tools
|
|
14
13
|
import pyfltr.warnings_
|
|
15
14
|
from pyfltr.command.core_ import CommandResult
|
|
@@ -76,7 +75,7 @@ def execute_glab_ci_lint(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
|
|
|
76
75
|
elapsed=elapsed,
|
|
77
76
|
)
|
|
78
77
|
|
|
79
|
-
errors =
|
|
78
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
80
79
|
result = CommandResult.from_run(
|
|
81
80
|
command=request.command,
|
|
82
81
|
command_info=request.params.command_info,
|
|
@@ -6,7 +6,6 @@ import pyfltr.command.core_
|
|
|
6
6
|
import pyfltr.command.process
|
|
7
7
|
import pyfltr.config.config
|
|
8
8
|
import pyfltr.config.model
|
|
9
|
-
import pyfltr.parsing.entry
|
|
10
9
|
from pyfltr.command.core_ import CommandResult
|
|
11
10
|
from pyfltr.command.snapshot import changed_files, snapshot_file_digests
|
|
12
11
|
|
|
@@ -46,7 +45,7 @@ def execute_linter_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfltr
|
|
|
46
45
|
else:
|
|
47
46
|
result_command_type = "linter"
|
|
48
47
|
|
|
49
|
-
errors =
|
|
48
|
+
errors = request.parse_errors(output, None)
|
|
50
49
|
|
|
51
50
|
result = CommandResult.from_run(
|
|
52
51
|
command=request.command,
|
|
@@ -973,7 +973,8 @@ def build_invocation_argv(
|
|
|
973
973
|
`commandline_prefix` 側(`{command}-path` 由来)の展開は `build_commandline` で済ませている。
|
|
974
974
|
|
|
975
975
|
textlintのfix段は `execute_textlint_fix` のStep1と同じ規則
|
|
976
|
-
(`--format` ペアを除去したargs + fix-args
|
|
976
|
+
(`--format` ペアを除去したargs + fix-args + additional_args + `--no-cache`、
|
|
977
|
+
auto_args / 構造化出力引数なし)を適用する。
|
|
977
978
|
実行本体(`_prepare_execution_params` / `execute_textlint_fix`)と
|
|
978
979
|
`command-info` 表示の双方から本ヘルパーへ集約することで、組み立て規則の重複定義を避ける。
|
|
979
980
|
"""
|
|
@@ -983,6 +984,9 @@ def build_invocation_argv(
|
|
|
983
984
|
# textlintのfix Step1はfixer-formatterがcompact系をサポートしないため、
|
|
984
985
|
# ユーザー指定の `--format` ペアを一律で除去したうえでfix-argsを結合する特殊経路。
|
|
985
986
|
# auto_args・構造化出力引数も適用しない(fixer出力の解析は本ステップでは行わないため)。
|
|
987
|
+
# 末尾の`--no-cache`は修正段だけtextlintのキャッシュを無効化する。textlint 15.8.0はキャッシュヒット時に
|
|
988
|
+
# 修正後の本文を持たない結果を修正処理へ渡して例外終了するため、利用者が通常lint向けに`--cache`を
|
|
989
|
+
# 設定していても修正段では使わない。後勝ちで適用されるよう利用者引数の結合後に置き、通常段の引数は変えない。
|
|
986
990
|
if fix_stage and command == "textlint":
|
|
987
991
|
fix_args: list[str] = expanduser_args(list(pyfltr.config.model.command_setting(config.values, command, "fix-args", [])))
|
|
988
992
|
return [
|
|
@@ -990,6 +994,7 @@ def build_invocation_argv(
|
|
|
990
994
|
*_strip_format_option(user_args),
|
|
991
995
|
*fix_args,
|
|
992
996
|
*extra,
|
|
997
|
+
"--no-cache",
|
|
993
998
|
]
|
|
994
999
|
|
|
995
1000
|
fix_args_value: list[str] | None = None
|
|
@@ -76,7 +76,13 @@ def run_stages(
|
|
|
76
76
|
callbacks: StageCallbacks | None = None,
|
|
77
77
|
results: list[pyfltr.command.core_.CommandResult] | None = None,
|
|
78
78
|
) -> list[pyfltr.command.core_.CommandResult]:
|
|
79
|
-
"""fix、直列formatter、LPT順の並列lint・testを共通の制御で実行する。
|
|
79
|
+
"""fix、直列formatter、LPT順の並列lint・testを共通の制御で実行する。
|
|
80
|
+
|
|
81
|
+
fix段の結果は通常段の結果と同じツールの実行であり、成功時は保存だけを行い最終結果へ含めない。
|
|
82
|
+
fix段が失敗した場合は、同じツールの通常段の結果(成功・スキップを含む)へ失敗と出力を統合した
|
|
83
|
+
1件を最終結果とし、`collected`・`on_result`・`archive`へ同じ結果を渡す。
|
|
84
|
+
fail-fastで停止する場合もfix段の失敗結果を記録し、同じツールのスキップ結果を重ねない。
|
|
85
|
+
"""
|
|
80
86
|
hooks = callbacks if callbacks is not None else StageCallbacks()
|
|
81
87
|
collected = results if results is not None else []
|
|
82
88
|
config = base_ctx.config
|
|
@@ -92,9 +98,15 @@ def run_stages(
|
|
|
92
98
|
if hooks.archive is not None and not result.cached:
|
|
93
99
|
hooks.archive(result)
|
|
94
100
|
|
|
101
|
+
# fix段で失敗したツールの結果。通常段の結果を記録するときに統合する。
|
|
102
|
+
fix_failures: dict[str, pyfltr.command.core_.CommandResult] = {}
|
|
103
|
+
|
|
95
104
|
def record(result: pyfltr.command.core_.CommandResult, stage: str) -> None:
|
|
96
105
|
if hooks.replace_result is not None:
|
|
97
106
|
result = hooks.replace_result(result, stage)
|
|
107
|
+
fix_failure = fix_failures.pop(result.command, None)
|
|
108
|
+
if fix_failure is not None:
|
|
109
|
+
result = merge_fix_failure(fix_failure, result)
|
|
98
110
|
collected.append(result)
|
|
99
111
|
archive(result)
|
|
100
112
|
if hooks.on_result is not None:
|
|
@@ -108,16 +120,26 @@ def run_stages(
|
|
|
108
120
|
if hooks.on_skipped is not None:
|
|
109
121
|
hooks.on_skipped(command)
|
|
110
122
|
|
|
123
|
+
def flush_fix_failures() -> None:
|
|
124
|
+
# 通常段の対象に含まれないツールのfix段失敗も最終結果へ残す。
|
|
125
|
+
for command in list(fix_failures):
|
|
126
|
+
record(make_skipped_result(command, config, reason=""), "skipped")
|
|
127
|
+
|
|
111
128
|
for command in fixers:
|
|
112
129
|
result = execute(command, True)
|
|
113
|
-
|
|
130
|
+
if result.failed:
|
|
131
|
+
fix_failures[command] = result
|
|
132
|
+
else:
|
|
133
|
+
archive(result)
|
|
114
134
|
if hooks.is_interrupted():
|
|
115
135
|
if hooks.on_interrupted is not None:
|
|
116
136
|
hooks.on_interrupted(command)
|
|
117
137
|
skip([*formatters, *parallel])
|
|
138
|
+
flush_fix_failures()
|
|
118
139
|
return collected
|
|
119
140
|
if fail_fast and result.failed:
|
|
120
141
|
skip([*formatters, *parallel])
|
|
142
|
+
flush_fix_failures()
|
|
121
143
|
return collected
|
|
122
144
|
|
|
123
145
|
for index, command in enumerate(formatters):
|
|
@@ -148,4 +170,26 @@ def run_stages(
|
|
|
148
170
|
cancel_pending_futures(future_to_command, aborted_commands)
|
|
149
171
|
if aborted_commands:
|
|
150
172
|
skip(list(aborted_commands))
|
|
173
|
+
flush_fix_failures()
|
|
151
174
|
return collected
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def merge_fix_failure(
|
|
178
|
+
fix_result: pyfltr.command.core_.CommandResult,
|
|
179
|
+
result: pyfltr.command.core_.CommandResult,
|
|
180
|
+
) -> pyfltr.command.core_.CommandResult:
|
|
181
|
+
"""fix段の失敗を同じツールの通常段の結果へ統合する。
|
|
182
|
+
|
|
183
|
+
状態と終了コードは`CommandResult.merge`の規則で集約し、fix段の失敗を保持する。
|
|
184
|
+
再実行コマンドなど通常段で確定した値は通常段の結果から引き継ぐため、通常段を先頭にして集約する。
|
|
185
|
+
出力は実行順にfix段、通常段の順で連結する。対象件数は同じ対象を2段で数えないよう通常段の値を使う。
|
|
186
|
+
通常段が診断を出力した場合は通常段の診断だけを使う。fix段の診断は修正後の残存違反であり、通常段の診断と重複するためである。
|
|
187
|
+
通常段が診断を出力しなかった場合(スキップや診断0件)はfix段の診断を残し、失敗を指すファイルと位置を保持する。
|
|
188
|
+
"""
|
|
189
|
+
fix_part = dataclasses.replace(fix_result, errors=[]) if result.errors else fix_result
|
|
190
|
+
merged = pyfltr.command.core_.CommandResult.merge([result, fix_part])
|
|
191
|
+
return dataclasses.replace(
|
|
192
|
+
merged,
|
|
193
|
+
output="\n".join(output for output in (fix_result.output, result.output) if output),
|
|
194
|
+
files=result.files or fix_result.files,
|
|
195
|
+
)
|
|
@@ -103,6 +103,8 @@ def run_subproject_loop(
|
|
|
103
103
|
実行順が非決定になっても報告順を変えないよう、`relative` の昇順で並べてから集約する。
|
|
104
104
|
|
|
105
105
|
結果は `CommandResult.merge` で集約する(1件のみならそのまま返す)。
|
|
106
|
+
各結果の診断の`file`は解析時点(`ExecutionRequest.parse_errors`)で起点相対へ変換済みのため、
|
|
107
|
+
集約時にパスを付け替えない。
|
|
106
108
|
いずれのサブプロジェクトでも実行されず、設定による無効スキップが発生したか起点でも無効な場合は、
|
|
107
109
|
起点cwdでの全ファイル誤実行を避けて skipped 結果を返す。
|
|
108
110
|
全件ファイル0件かつ起点で有効なときのみ通常経路の0件結果を返す(`dispatch_fn` 経由)。
|
|
@@ -9,7 +9,6 @@ import pyfltr.command.core_
|
|
|
9
9
|
import pyfltr.command.process
|
|
10
10
|
import pyfltr.config.config
|
|
11
11
|
import pyfltr.config.model
|
|
12
|
-
import pyfltr.parsing.entry
|
|
13
12
|
import pyfltr.paths
|
|
14
13
|
import pyfltr.tools
|
|
15
14
|
from pyfltr.command.core_ import CommandResult
|
|
@@ -40,16 +39,22 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
|
|
|
40
39
|
|
|
41
40
|
Step1: fix適用
|
|
42
41
|
commandline_prefix + (textlint-argsから--formatペアを除去) + fix-args
|
|
43
|
-
+ additional_args + targets
|
|
42
|
+
+ additional_args + `--no-cache` + targets
|
|
43
|
+
(textlintのキャッシュヒット結果は修正後の本文を持たず修正処理が例外終了するため、
|
|
44
|
+
修正段だけキャッシュを無効化する。通常lint段は利用者のキャッシュ指定を保つ)
|
|
44
45
|
|
|
45
46
|
Step2: lintチェック (残存違反を取得)
|
|
46
47
|
commandline_prefix + textlint-args + textlint-lint-args + additional_args + targets
|
|
47
48
|
|
|
48
49
|
ステータス判定:
|
|
49
|
-
|
|
50
|
+
- いずれかのステップがrc>=2 (致命的エラー) → failed
|
|
50
51
|
- Step2 rc != 0 (残存違反あり) → failed (Errorsタブに反映される)
|
|
51
|
-
- Step2 rc == 0
|
|
52
|
-
|
|
52
|
+
- Step1 rc != 0かつStep2 rc == 0 → failed (returncodeはStep1の値)。
|
|
53
|
+
textlintの終了1は残存違反に加えて予期しない例外も表し、修正段に違反が残れば
|
|
54
|
+
Step2も非0になるため、この組合せは修正処理の失敗を示す
|
|
55
|
+
- いずれもrc == 0かつStep1で内容ハッシュに変化あり → formatted
|
|
56
|
+
- いずれもrc == 0かつ変化なし → succeeded
|
|
57
|
+
修正段とlint段の出力はいずれも`output`へ保持する。
|
|
53
58
|
|
|
54
59
|
textlint --fixは残存違反がなくても対象ファイルを書き戻すことがあり、
|
|
55
60
|
mtimeベースの比較では偽陽性になる。このため内容ハッシュ
|
|
@@ -91,7 +96,7 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
|
|
|
91
96
|
|
|
92
97
|
step1_proc = pyfltr.command.process.run_process(dataclasses.replace(request, verbose=False), step1_commandline)
|
|
93
98
|
step1_rc = step1_proc.returncode
|
|
94
|
-
# rc
|
|
99
|
+
# rc>=2は致命的エラー扱い。rc=1はStep2の結果と併せて判定する(docstringのステータス判定を参照)
|
|
95
100
|
step1_fatal = step1_rc >= 2
|
|
96
101
|
digests_after_step1 = snapshot_file_digests(request.params.targets, base_cwd=request.ctx.base.start_cwd)
|
|
97
102
|
step1_changed = digests_after_step1 != digests_before
|
|
@@ -127,7 +132,7 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
|
|
|
127
132
|
elapsed = time.perf_counter() - request.start_time
|
|
128
133
|
|
|
129
134
|
# Step2出力から残存違反をパースする
|
|
130
|
-
errors =
|
|
135
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
131
136
|
|
|
132
137
|
# ステータス判定
|
|
133
138
|
timeout_exceeded = step1_proc.timeout_exceeded or step2_proc.timeout_exceeded
|
|
@@ -139,6 +144,10 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
|
|
|
139
144
|
step_failed = True
|
|
140
145
|
returncode = step2_rc
|
|
141
146
|
result_command_type = "linter"
|
|
147
|
+
elif step1_rc != 0:
|
|
148
|
+
step_failed = True
|
|
149
|
+
returncode = step1_rc
|
|
150
|
+
result_command_type = "linter"
|
|
142
151
|
elif step1_changed:
|
|
143
152
|
# fix適用済み、残存違反なし → formatted扱いにする
|
|
144
153
|
step_failed = False
|
|
@@ -17,7 +17,6 @@ import pyfltr.command.process
|
|
|
17
17
|
import pyfltr.command.runner
|
|
18
18
|
import pyfltr.config.config
|
|
19
19
|
import pyfltr.config.model
|
|
20
|
-
import pyfltr.parsing.entry
|
|
21
20
|
import pyfltr.paths
|
|
22
21
|
import pyfltr.tools
|
|
23
22
|
from pyfltr.command.core_ import CommandResult
|
|
@@ -218,11 +217,7 @@ def _run_fix_mode(
|
|
|
218
217
|
formatter_failed = False
|
|
219
218
|
returncode = 0
|
|
220
219
|
|
|
221
|
-
errors = (
|
|
222
|
-
pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
|
|
223
|
-
if parse_errors
|
|
224
|
-
else []
|
|
225
|
-
)
|
|
220
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern) if parse_errors else []
|
|
226
221
|
|
|
227
222
|
resolved_type = (
|
|
228
223
|
command_type_override(formatter_failed, returncode)
|
|
@@ -7,7 +7,6 @@ import pyfltr.command.core_
|
|
|
7
7
|
import pyfltr.command.process
|
|
8
8
|
import pyfltr.config.config
|
|
9
9
|
import pyfltr.config.model
|
|
10
|
-
import pyfltr.parsing.entry
|
|
11
10
|
import pyfltr.tools
|
|
12
11
|
from pyfltr.command.core_ import CommandResult
|
|
13
12
|
from pyfltr.command.snapshot import changed_files, snapshot_file_digests
|
|
@@ -89,7 +88,7 @@ def _run_prettier_check_then_write(
|
|
|
89
88
|
if step1_rc == 0:
|
|
90
89
|
output = step1_proc.stdout.strip()
|
|
91
90
|
elapsed = time.perf_counter() - request.start_time
|
|
92
|
-
errors =
|
|
91
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
93
92
|
return CommandResult.from_run(
|
|
94
93
|
command=request.command,
|
|
95
94
|
command_info=request.params.command_info,
|
|
@@ -108,7 +107,7 @@ def _run_prettier_check_then_write(
|
|
|
108
107
|
# timeout超過は同じハングが再現する確率が高く、検証時間を浪費するためStep2を実行しない。
|
|
109
108
|
output = step1_proc.stdout.strip()
|
|
110
109
|
elapsed = time.perf_counter() - request.start_time
|
|
111
|
-
errors =
|
|
110
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
112
111
|
return CommandResult.from_run(
|
|
113
112
|
command=request.command,
|
|
114
113
|
command_info=request.params.command_info,
|
|
@@ -137,7 +136,7 @@ def _run_prettier_check_then_write(
|
|
|
137
136
|
formatter_failed = True
|
|
138
137
|
returncode = step2_rc
|
|
139
138
|
|
|
140
|
-
errors =
|
|
139
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
141
140
|
result = CommandResult.from_run(
|
|
142
141
|
command=request.command,
|
|
143
142
|
command_info=request.params.command_info,
|
|
@@ -8,7 +8,6 @@ import pyfltr.command.process
|
|
|
8
8
|
import pyfltr.command.runner
|
|
9
9
|
import pyfltr.config.config
|
|
10
10
|
import pyfltr.config.model
|
|
11
|
-
import pyfltr.parsing.entry
|
|
12
11
|
import pyfltr.tools
|
|
13
12
|
from pyfltr.command.core_ import CommandResult
|
|
14
13
|
from pyfltr.command.snapshot import changed_files, snapshot_file_digests
|
|
@@ -78,7 +77,7 @@ def _run_ruff_two_step(request: pyfltr.command.core_.ExecutionRequest, *, check_
|
|
|
78
77
|
else:
|
|
79
78
|
returncode = 0
|
|
80
79
|
|
|
81
|
-
errors =
|
|
80
|
+
errors = request.parse_errors(output, request.params.command_info.error_pattern)
|
|
82
81
|
|
|
83
82
|
# commandlineは代表として「最後に実行したステップ」(= ruff format)を格納。
|
|
84
83
|
# 両ステップ分のcommandlineはverbose出力で確認可能。
|