python-delphi-lsp 3.2.2__tar.gz → 3.4.0__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.
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/MANIFEST.in +2 -0
- {python_delphi_lsp-3.2.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.4.0}/PKG-INFO +17 -2
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/README.md +16 -1
- python_delphi_lsp-3.4.0/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cache.py +197 -15
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cli.py +131 -20
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_context.py +774 -96
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_layers.py +473 -28
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_metrics.py +227 -15
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_relations.py +708 -27
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_wiki.py +165 -13
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_workspace.py +18 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_lexer.py +156 -39
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_parser.py +336 -48
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_tokens.py +4 -4
- python_delphi_lsp-3.4.0/delphi_lsp/incremental.py +1139 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lark_builder.py +6 -3
- python_delphi_lsp-3.4.0/delphi_lsp/lsp_server.py +6693 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/metrics.py +654 -75
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/navigation_cache.py +2 -2
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/nodes.py +93 -2
- python_delphi_lsp-3.4.0/delphi_lsp/parallel_outline.py +621 -0
- python_delphi_lsp-3.4.0/delphi_lsp/parse_artifacts.py +969 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/parser.py +21 -2
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/parser_backend.py +13 -2
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/preprocessor.py +28 -14
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_config.py +22 -4
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_indexer.py +31 -7
- python_delphi_lsp-3.4.0/delphi_lsp/response_cache.py +465 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/semantic.py +31 -21
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/semantic_builder.py +986 -114
- python_delphi_lsp-3.4.0/docs/release-3.3.0.md +93 -0
- python_delphi_lsp-3.4.0/docs/release-3.4.0.md +97 -0
- python_delphi_lsp-3.4.0/docs/superpowers/plans/2026-08-04-release-performance-unblock.md +384 -0
- python_delphi_lsp-3.4.0/docs/superpowers/specs/2026-08-04-release-performance-unblock-design.md +190 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/pyproject.toml +1 -1
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0/python_delphi_lsp.egg-info}/PKG-INFO +17 -2
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/SOURCES.txt +19 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/audit_delphi_language_features.py +1 -1
- python_delphi_lsp-3.4.0/scripts/benchmark_response_cache.py +222 -0
- python_delphi_lsp-3.4.0/scripts/outline_gap_detector.py +656 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cache.py +529 -1
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cli_content.py +178 -21
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_codebase.py +208 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_context.py +735 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_metrics.py +219 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_relations.py +1386 -45
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_wiki.py +128 -3
- python_delphi_lsp-3.4.0/tests/test_artifact_cache_cpu_smoke.py +116 -0
- python_delphi_lsp-3.4.0/tests/test_artifact_cache_integration.py +315 -0
- python_delphi_lsp-3.4.0/tests/test_delphiast_lexer.py +284 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_native_compatibility.py +54 -1
- python_delphi_lsp-3.4.0/tests/test_delphiast_parser_linearity.py +255 -0
- python_delphi_lsp-3.4.0/tests/test_incremental.py +296 -0
- python_delphi_lsp-3.4.0/tests/test_incremental_performance.py +58 -0
- python_delphi_lsp-3.4.0/tests/test_incremental_property.py +560 -0
- python_delphi_lsp-3.4.0/tests/test_lsp_features.py +948 -0
- python_delphi_lsp-3.4.0/tests/test_lsp_server.py +4005 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_lsp_support.py +62 -10
- python_delphi_lsp-3.4.0/tests/test_metrics.py +604 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_navigation_cache.py +5 -0
- python_delphi_lsp-3.4.0/tests/test_outline_gap_detector.py +469 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_package_metadata.py +22 -3
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parallel_outline.py +127 -2
- python_delphi_lsp-3.4.0/tests/test_parse_artifacts.py +230 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parser_backends.py +46 -1
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_preprocessor.py +40 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_indexer.py +75 -0
- python_delphi_lsp-3.4.0/tests/test_response_cache.py +329 -0
- python_delphi_lsp-3.4.0/tests/test_response_cache_benchmark.py +53 -0
- python_delphi_lsp-3.4.0/tests/test_semantic.py +987 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_throughput_scaling.py +23 -0
- python_delphi_lsp-3.2.2/delphi_lsp/_version.py +0 -1
- python_delphi_lsp-3.2.2/delphi_lsp/lsp_server.py +0 -2722
- python_delphi_lsp-3.2.2/delphi_lsp/parallel_outline.py +0 -316
- python_delphi_lsp-3.2.2/tests/test_delphiast_lexer.py +0 -122
- python_delphi_lsp-3.2.2/tests/test_lsp_features.py +0 -171
- python_delphi_lsp-3.2.2/tests/test_lsp_server.py +0 -901
- python_delphi_lsp-3.2.2/tests/test_metrics.py +0 -275
- python_delphi_lsp-3.2.2/tests/test_semantic.py +0 -283
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/LICENSE +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cpg_builder.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_templates.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lexical_scanner.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_discovery.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/py.typed +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/performance-delphi.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/performance-fpc.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-2.3.0.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-2.3.3.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.0.0.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.0.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.1.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.2.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.0.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.1.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.2.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/opencode.json +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_cpg.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_github_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_delphi_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/run_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/setup.cfg +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fpc_parse_quality.baseline.json +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cli_errors.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_worker.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphi_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_fpc_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parser.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_progress.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_config.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_discovery.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_vllm_start_script.py +0 -0
- {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_workspace.py +0 -0
|
@@ -12,12 +12,14 @@ include scripts/benchmark_fpc_corpus.py
|
|
|
12
12
|
include scripts/prepare_delphi_corpus.py
|
|
13
13
|
include scripts/benchmark_cpg.py
|
|
14
14
|
include scripts/benchmark_parallel_cache.py
|
|
15
|
+
include scripts/benchmark_response_cache.py
|
|
15
16
|
include scripts/bootstrap_vllm_opencode_test.py
|
|
16
17
|
include scripts/bootstrap_vllm_codebase_skill_test.py
|
|
17
18
|
include scripts/bootstrap_vllm_opencode_test.ps1
|
|
18
19
|
include scripts/bootstrap_vllm_opencode_test.sh
|
|
19
20
|
include scripts/generate_release_evidence.py
|
|
20
21
|
include scripts/generate_progress_pdf.py
|
|
22
|
+
include scripts/outline_gap_detector.py
|
|
21
23
|
include scripts/prepare_ornith_cache.py
|
|
22
24
|
include scripts/run_opencode_lsp_probe.py
|
|
23
25
|
include scripts/run_openrouter_github_e2e.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.0
|
|
4
4
|
Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
|
|
5
5
|
Author: Dark Light
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -45,7 +45,7 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
47
47
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
48
|
-
Version 3.
|
|
48
|
+
Version 3.4.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
49
49
|
|
|
50
50
|
## Install and quick start
|
|
51
51
|
|
|
@@ -417,6 +417,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
|
|
|
417
417
|
from 1 through 32 overrides the automatic CPU and memory caps but is still
|
|
418
418
|
limited by the number of tasks.
|
|
419
419
|
|
|
420
|
+
Standalone `view` and `index` commands cache their exact completed response
|
|
421
|
+
bytes under `.delphi-lsp/response-cache`. A strong content revision covers the
|
|
422
|
+
selected source, include, project, and configuration files, so any relevant
|
|
423
|
+
content change produces a miss. Records are content-addressed, owner-only,
|
|
424
|
+
atomically replaced, size-bounded, and never use pickle. Batch commands bypass
|
|
425
|
+
the older per-unit artifact shards; an unchanged request can therefore return
|
|
426
|
+
the validated response without rebuilding semantic models. To reproduce the
|
|
427
|
+
large-corpus cold/warm gate, run:
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
python scripts/benchmark_response_cache.py \
|
|
431
|
+
--fpc-root /path/to/fpc-corpus \
|
|
432
|
+
--delphi-root /path/to/delphi-corpus
|
|
433
|
+
```
|
|
434
|
+
|
|
420
435
|
Worker processes build compact, detached navigation shards and exit before
|
|
421
436
|
retained-cache accounting. Full semantic object graphs and source text are not
|
|
422
437
|
retained in the parent. Tokenized source documents are loaded only for source
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
4
4
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
5
|
-
Version 3.
|
|
5
|
+
Version 3.4.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
6
6
|
|
|
7
7
|
## Install and quick start
|
|
8
8
|
|
|
@@ -374,6 +374,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
|
|
|
374
374
|
from 1 through 32 overrides the automatic CPU and memory caps but is still
|
|
375
375
|
limited by the number of tasks.
|
|
376
376
|
|
|
377
|
+
Standalone `view` and `index` commands cache their exact completed response
|
|
378
|
+
bytes under `.delphi-lsp/response-cache`. A strong content revision covers the
|
|
379
|
+
selected source, include, project, and configuration files, so any relevant
|
|
380
|
+
content change produces a miss. Records are content-addressed, owner-only,
|
|
381
|
+
atomically replaced, size-bounded, and never use pickle. Batch commands bypass
|
|
382
|
+
the older per-unit artifact shards; an unchanged request can therefore return
|
|
383
|
+
the validated response without rebuilding semantic models. To reproduce the
|
|
384
|
+
large-corpus cold/warm gate, run:
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
python scripts/benchmark_response_cache.py \
|
|
388
|
+
--fpc-root /path/to/fpc-corpus \
|
|
389
|
+
--delphi-root /path/to/delphi-corpus
|
|
390
|
+
```
|
|
391
|
+
|
|
377
392
|
Worker processes build compact, detached navigation shards and exit before
|
|
378
393
|
retained-cache accounting. Full semantic object graphs and source text are not
|
|
379
394
|
retained in the parent. Tokenized source documents are loaded only for source
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.4.0"
|
|
@@ -8,6 +8,8 @@ import math
|
|
|
8
8
|
import os
|
|
9
9
|
import re
|
|
10
10
|
import secrets
|
|
11
|
+
import select
|
|
12
|
+
import signal
|
|
11
13
|
import socket
|
|
12
14
|
import stat
|
|
13
15
|
import subprocess
|
|
@@ -20,7 +22,7 @@ from concurrent.futures import ThreadPoolExecutor
|
|
|
20
22
|
from dataclasses import dataclass, fields, is_dataclass, replace
|
|
21
23
|
from functools import lru_cache
|
|
22
24
|
from pathlib import Path
|
|
23
|
-
from types import ModuleType
|
|
25
|
+
from types import FrameType, ModuleType
|
|
24
26
|
|
|
25
27
|
from watchfiles import watch
|
|
26
28
|
|
|
@@ -50,6 +52,9 @@ _START_LOCK_INCOMPLETE_GRACE_SECONDS = 1.0
|
|
|
50
52
|
_CACHE_REVISION_CHECK_INTERVAL_SECONDS = 3600.0
|
|
51
53
|
_WATCHER_READY_TIMEOUT_SECONDS = 1.0
|
|
52
54
|
_WATCHER_READY_POLL_MILLISECONDS = 50
|
|
55
|
+
_STOP_TIMEOUT_SECONDS = 15.0
|
|
56
|
+
_STOP_SIGNAL_DELAY_SECONDS = 3.0
|
|
57
|
+
_STOP_FORCE_TIMEOUT_SECONDS = 2.0
|
|
53
58
|
_WATCHED_SUFFIXES = frozenset(
|
|
54
59
|
{".pas", ".pp", ".inc", ".dpr", ".dpk", ".dproj", ".cfg"}
|
|
55
60
|
)
|
|
@@ -356,6 +361,54 @@ class CacheClientError(RuntimeError):
|
|
|
356
361
|
super().__init__(message)
|
|
357
362
|
|
|
358
363
|
|
|
364
|
+
class _RequestGuard:
|
|
365
|
+
def __init__(
|
|
366
|
+
self,
|
|
367
|
+
service: _CacheService,
|
|
368
|
+
connection: socket.socket,
|
|
369
|
+
*,
|
|
370
|
+
enforce_rss_budget: bool = True,
|
|
371
|
+
) -> None:
|
|
372
|
+
self._service = service
|
|
373
|
+
self._connection = connection
|
|
374
|
+
self._enforce_rss_budget = enforce_rss_budget
|
|
375
|
+
|
|
376
|
+
def check(self) -> None:
|
|
377
|
+
if self._service.shutdown.is_set():
|
|
378
|
+
raise CacheClientError(
|
|
379
|
+
"request_cancelled",
|
|
380
|
+
"Cache request was cancelled.",
|
|
381
|
+
)
|
|
382
|
+
try:
|
|
383
|
+
readable, _, _ = select.select(
|
|
384
|
+
(self._connection,),
|
|
385
|
+
(),
|
|
386
|
+
(),
|
|
387
|
+
0,
|
|
388
|
+
)
|
|
389
|
+
if readable and not self._connection.recv(1, socket.MSG_PEEK):
|
|
390
|
+
raise CacheClientError(
|
|
391
|
+
"client_disconnected",
|
|
392
|
+
"Cache client disconnected.",
|
|
393
|
+
)
|
|
394
|
+
except CacheClientError:
|
|
395
|
+
raise
|
|
396
|
+
except (OSError, ValueError) as error:
|
|
397
|
+
raise CacheClientError(
|
|
398
|
+
"client_disconnected",
|
|
399
|
+
"Cache client disconnected.",
|
|
400
|
+
) from error
|
|
401
|
+
if (
|
|
402
|
+
self._enforce_rss_budget
|
|
403
|
+
and self._service._measure_retained_bytes()
|
|
404
|
+
> self._service.metadata.max_memory_bytes
|
|
405
|
+
):
|
|
406
|
+
raise CacheClientError(
|
|
407
|
+
"memory_budget_exceeded",
|
|
408
|
+
"Cache request exceeded the configured retained-memory budget.",
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
|
|
359
412
|
def cache_metadata_path(root: str | Path) -> Path:
|
|
360
413
|
return Path(root).resolve() / ".delphi-lsp" / "agent-cache" / "daemon.json"
|
|
361
414
|
|
|
@@ -752,6 +805,8 @@ class _CacheService:
|
|
|
752
805
|
self.budget = CacheBudget(metadata.max_memory_bytes)
|
|
753
806
|
self.stats = CacheStats()
|
|
754
807
|
self.lock = threading.Lock()
|
|
808
|
+
self._request_state_lock = threading.Lock()
|
|
809
|
+
self._active_requests = 0
|
|
755
810
|
self.started = time.monotonic()
|
|
756
811
|
self.last_activity = self.started
|
|
757
812
|
self.cache_state = "warming"
|
|
@@ -803,11 +858,15 @@ class _CacheService:
|
|
|
803
858
|
context = self._initialize_context()
|
|
804
859
|
try:
|
|
805
860
|
self.last_revision = context.prewarm_navigation()
|
|
806
|
-
self.cache_state = "warm"
|
|
807
861
|
except AgentProtocolError as error:
|
|
808
862
|
if error.code != "project_required":
|
|
809
863
|
raise
|
|
810
|
-
|
|
864
|
+
prewarm_rss = current_process_rss_bytes()
|
|
865
|
+
if prewarm_rss > 0:
|
|
866
|
+
# Parsing can leave a high allocator RSS watermark even though the
|
|
867
|
+
# retained navigation data is already covered by its own estimate.
|
|
868
|
+
# Track only subsequent, otherwise unaccounted-for RSS growth.
|
|
869
|
+
self._rss_baseline_bytes = prewarm_rss
|
|
811
870
|
self._enforce_budget()
|
|
812
871
|
self.prewarm_seconds = time.monotonic() - started
|
|
813
872
|
self.stats.parallel_fallbacks = context.parallel_stats.fallbacks
|
|
@@ -836,7 +895,12 @@ class _CacheService:
|
|
|
836
895
|
)
|
|
837
896
|
self.prewarm_thread.start()
|
|
838
897
|
|
|
839
|
-
def request(
|
|
898
|
+
def request(
|
|
899
|
+
self,
|
|
900
|
+
request: dict[str, object],
|
|
901
|
+
*,
|
|
902
|
+
cancel_check: Callable[[], None] | None = None,
|
|
903
|
+
) -> CacheClientResponse:
|
|
840
904
|
action = request.get("action")
|
|
841
905
|
if action == "status":
|
|
842
906
|
warning = "" if request.get("_startup_probe") is True else self._consume_warning()
|
|
@@ -863,21 +927,69 @@ class _CacheService:
|
|
|
863
927
|
self.watcher_ready.wait(timeout=_WATCHER_READY_TIMEOUT_SECONDS)
|
|
864
928
|
if self.watcher_failed.is_set():
|
|
865
929
|
self.context.invalidate_revision_cache()
|
|
866
|
-
with self.
|
|
930
|
+
with self._request_state_lock:
|
|
931
|
+
self._active_requests += 1
|
|
932
|
+
lock_acquired = False
|
|
933
|
+
try:
|
|
934
|
+
while not self.lock.acquire(timeout=0.05):
|
|
935
|
+
if self.shutdown.is_set():
|
|
936
|
+
raise CacheClientError(
|
|
937
|
+
"request_cancelled",
|
|
938
|
+
"Cache request was cancelled.",
|
|
939
|
+
)
|
|
940
|
+
if cancel_check is not None:
|
|
941
|
+
cancel_check()
|
|
942
|
+
lock_acquired = True
|
|
943
|
+
if self.shutdown.is_set():
|
|
944
|
+
raise CacheClientError(
|
|
945
|
+
"request_cancelled",
|
|
946
|
+
"Cache request was cancelled.",
|
|
947
|
+
)
|
|
948
|
+
if cancel_check is not None:
|
|
949
|
+
cancel_check()
|
|
867
950
|
self.last_activity = time.monotonic()
|
|
868
951
|
before = self.last_revision
|
|
869
952
|
was_warm = self.context.navigation_cache_is_warm
|
|
953
|
+
request_aborted = False
|
|
870
954
|
try:
|
|
871
955
|
try:
|
|
872
|
-
|
|
956
|
+
handled = (
|
|
957
|
+
self.context.handle(request)
|
|
958
|
+
if cancel_check is None
|
|
959
|
+
else self.context.handle(
|
|
960
|
+
request,
|
|
961
|
+
cancel_check=cancel_check,
|
|
962
|
+
)
|
|
963
|
+
)
|
|
964
|
+
if self.shutdown.is_set():
|
|
965
|
+
raise CacheClientError(
|
|
966
|
+
"request_cancelled",
|
|
967
|
+
"Cache request was cancelled.",
|
|
968
|
+
)
|
|
969
|
+
if cancel_check is not None:
|
|
970
|
+
cancel_check()
|
|
971
|
+
response = handled.to_mapping()
|
|
972
|
+
except CacheClientError:
|
|
973
|
+
request_aborted = True
|
|
974
|
+
raise
|
|
873
975
|
except AgentProtocolError as error:
|
|
874
|
-
raise CacheClientError(
|
|
976
|
+
raise CacheClientError(
|
|
977
|
+
error.code,
|
|
978
|
+
error.message,
|
|
979
|
+
) from None
|
|
875
980
|
except (OSError, UnicodeError):
|
|
876
|
-
raise CacheClientError(
|
|
981
|
+
raise CacheClientError(
|
|
982
|
+
"source_unavailable",
|
|
983
|
+
"Source is unavailable.",
|
|
984
|
+
) from None
|
|
877
985
|
except Exception:
|
|
878
|
-
raise CacheClientError(
|
|
986
|
+
raise CacheClientError(
|
|
987
|
+
"internal_error",
|
|
988
|
+
"Internal cache error.",
|
|
989
|
+
) from None
|
|
879
990
|
finally:
|
|
880
|
-
self.
|
|
991
|
+
if not request_aborted and not self.shutdown.is_set():
|
|
992
|
+
self._enforce_budget()
|
|
881
993
|
after = str(response["workspace_revision"])
|
|
882
994
|
self.last_revision = after
|
|
883
995
|
self.stats.requests += 1
|
|
@@ -885,10 +997,20 @@ class _CacheService:
|
|
|
885
997
|
self.stats.warm_hits += 1
|
|
886
998
|
else:
|
|
887
999
|
self.stats.rebuilds += 1
|
|
888
|
-
self.stats.parallel_fallbacks +=
|
|
1000
|
+
self.stats.parallel_fallbacks += (
|
|
1001
|
+
self.context.parallel_stats.fallbacks
|
|
1002
|
+
)
|
|
889
1003
|
if before != after:
|
|
890
1004
|
self.stats.invalidations += 1
|
|
891
|
-
return CacheClientResponse(
|
|
1005
|
+
return CacheClientResponse(
|
|
1006
|
+
response,
|
|
1007
|
+
self._consume_warning(),
|
|
1008
|
+
)
|
|
1009
|
+
finally:
|
|
1010
|
+
if lock_acquired:
|
|
1011
|
+
self.lock.release()
|
|
1012
|
+
with self._request_state_lock:
|
|
1013
|
+
self._active_requests -= 1
|
|
892
1014
|
|
|
893
1015
|
def _enforce_budget(self) -> None:
|
|
894
1016
|
self.last_budget = self.budget.enforce(
|
|
@@ -932,6 +1054,8 @@ class _CacheService:
|
|
|
932
1054
|
if context is not None
|
|
933
1055
|
else None
|
|
934
1056
|
)
|
|
1057
|
+
with self._request_state_lock:
|
|
1058
|
+
busy = self._active_requests > 0
|
|
935
1059
|
return {
|
|
936
1060
|
"pid": self.metadata.pid, "root": self.metadata.root, "project_file": self.metadata.project_file,
|
|
937
1061
|
"version": self.metadata.version, "uptime": now - self.started, "idle_seconds": idle,
|
|
@@ -958,6 +1082,7 @@ class _CacheService:
|
|
|
958
1082
|
"workspace_revision": self.last_revision,
|
|
959
1083
|
"startup_error": self.startup_error,
|
|
960
1084
|
"watcher_active": not self.watcher_failed.is_set(),
|
|
1085
|
+
"busy": busy,
|
|
961
1086
|
}
|
|
962
1087
|
|
|
963
1088
|
|
|
@@ -1053,7 +1178,16 @@ def _serve_connection(connection: socket.socket, service: _CacheService) -> None
|
|
|
1053
1178
|
response: dict[str, object] = {"error": {"code": "authentication_failed", "message": "authentication failed"}}
|
|
1054
1179
|
else:
|
|
1055
1180
|
try:
|
|
1056
|
-
|
|
1181
|
+
action = request.get("action")
|
|
1182
|
+
guard = None if action in {"status", "stop"} else _RequestGuard(
|
|
1183
|
+
service,
|
|
1184
|
+
connection,
|
|
1185
|
+
enforce_rss_budget=action in {"trace", "cpg"},
|
|
1186
|
+
)
|
|
1187
|
+
result = service.request(
|
|
1188
|
+
request,
|
|
1189
|
+
cancel_check=guard.check if guard is not None else None,
|
|
1190
|
+
)
|
|
1057
1191
|
response = {"payload": result.payload, "warning": result.warning}
|
|
1058
1192
|
except CacheClientError as error:
|
|
1059
1193
|
response = {"error": {"code": error.code, "message": error.message}}
|
|
@@ -1105,6 +1239,11 @@ def run_cache_daemon(
|
|
|
1105
1239
|
max_disk_cache_bytes,
|
|
1106
1240
|
)
|
|
1107
1241
|
watcher: threading.Thread | None = None
|
|
1242
|
+
previous_sigterm: (
|
|
1243
|
+
Callable[[int, FrameType | None], object]
|
|
1244
|
+
| int
|
|
1245
|
+
| None
|
|
1246
|
+
) = None
|
|
1108
1247
|
connection_slots = threading.BoundedSemaphore(_CONNECTION_WORKERS)
|
|
1109
1248
|
connection_pool = ThreadPoolExecutor(
|
|
1110
1249
|
max_workers=_CONNECTION_WORKERS,
|
|
@@ -1112,6 +1251,16 @@ def run_cache_daemon(
|
|
|
1112
1251
|
)
|
|
1113
1252
|
try:
|
|
1114
1253
|
service = _CacheService(metadata, defer_context=True)
|
|
1254
|
+
if threading.current_thread() is threading.main_thread():
|
|
1255
|
+
previous_sigterm = signal.getsignal(signal.SIGTERM)
|
|
1256
|
+
|
|
1257
|
+
def request_shutdown(
|
|
1258
|
+
_signum: int,
|
|
1259
|
+
_frame: FrameType | None,
|
|
1260
|
+
) -> None:
|
|
1261
|
+
service.shutdown.set()
|
|
1262
|
+
|
|
1263
|
+
signal.signal(signal.SIGTERM, request_shutdown)
|
|
1115
1264
|
_write_metadata(metadata)
|
|
1116
1265
|
watcher = threading.Thread(
|
|
1117
1266
|
target=_watch_workspace,
|
|
@@ -1150,6 +1299,8 @@ def run_cache_daemon(
|
|
|
1150
1299
|
_remove_metadata_if_owned(metadata)
|
|
1151
1300
|
if watcher is not None:
|
|
1152
1301
|
watcher.join(timeout=2.0)
|
|
1302
|
+
if previous_sigterm is not None:
|
|
1303
|
+
signal.signal(signal.SIGTERM, previous_sigterm)
|
|
1153
1304
|
|
|
1154
1305
|
|
|
1155
1306
|
def _start_cache_unlocked(
|
|
@@ -1339,16 +1490,47 @@ def stop_cache(root: str | Path) -> None:
|
|
|
1339
1490
|
_client_exchange(metadata, {"action": "stop"})
|
|
1340
1491
|
except CacheClientError:
|
|
1341
1492
|
pass
|
|
1342
|
-
|
|
1493
|
+
started = time.monotonic()
|
|
1494
|
+
deadline = started + _STOP_TIMEOUT_SECONDS
|
|
1495
|
+
signal_sent = False
|
|
1343
1496
|
stopped = False
|
|
1344
|
-
while
|
|
1497
|
+
while True:
|
|
1498
|
+
now = time.monotonic()
|
|
1499
|
+
if now >= deadline:
|
|
1500
|
+
break
|
|
1345
1501
|
if _reap_child_if_exited(metadata.pid):
|
|
1346
1502
|
stopped = True
|
|
1347
1503
|
break
|
|
1348
1504
|
if not _pid_alive(metadata.pid):
|
|
1349
1505
|
stopped = True
|
|
1350
1506
|
break
|
|
1507
|
+
if (
|
|
1508
|
+
not signal_sent
|
|
1509
|
+
and os.name != "nt"
|
|
1510
|
+
and now - started >= _STOP_SIGNAL_DELAY_SECONDS
|
|
1511
|
+
):
|
|
1512
|
+
with contextlib.suppress(OSError):
|
|
1513
|
+
os.kill(metadata.pid, signal.SIGTERM)
|
|
1514
|
+
signal_sent = True
|
|
1351
1515
|
time.sleep(0.05)
|
|
1516
|
+
if not stopped and _pid_alive(metadata.pid):
|
|
1517
|
+
current = _read_metadata(root)
|
|
1518
|
+
if current == metadata:
|
|
1519
|
+
force_signal = (
|
|
1520
|
+
signal.SIGKILL
|
|
1521
|
+
if os.name != "nt" and hasattr(signal, "SIGKILL")
|
|
1522
|
+
else signal.SIGTERM
|
|
1523
|
+
)
|
|
1524
|
+
with contextlib.suppress(OSError):
|
|
1525
|
+
os.kill(metadata.pid, force_signal)
|
|
1526
|
+
force_deadline = time.monotonic() + _STOP_FORCE_TIMEOUT_SECONDS
|
|
1527
|
+
while time.monotonic() < force_deadline:
|
|
1528
|
+
if _reap_child_if_exited(metadata.pid) or not _pid_alive(
|
|
1529
|
+
metadata.pid
|
|
1530
|
+
):
|
|
1531
|
+
stopped = True
|
|
1532
|
+
break
|
|
1533
|
+
time.sleep(0.05)
|
|
1352
1534
|
if not stopped and _pid_alive(metadata.pid):
|
|
1353
1535
|
raise CacheClientError("stop_failed", "Cache daemon did not stop.")
|
|
1354
1536
|
_remove_metadata_if_owned(metadata)
|
|
@@ -25,7 +25,14 @@ from .agent_cache import (
|
|
|
25
25
|
watch_workspace_changes,
|
|
26
26
|
)
|
|
27
27
|
from .agent_context import AgentContext
|
|
28
|
-
from .agent_layers import
|
|
28
|
+
from .agent_layers import (
|
|
29
|
+
build_codebase_index,
|
|
30
|
+
build_metrics_payload,
|
|
31
|
+
build_references_payload,
|
|
32
|
+
layer_payload,
|
|
33
|
+
render_layer,
|
|
34
|
+
render_payload,
|
|
35
|
+
)
|
|
29
36
|
from .agent_protocol import (
|
|
30
37
|
SCHEMA_VERSION,
|
|
31
38
|
SUPPORTED_ACTIONS,
|
|
@@ -39,6 +46,12 @@ from .agent_templates import install_opencode_support, install_skill
|
|
|
39
46
|
from .agent_wiki import WikiExportError, WikiProgressEvent, export_okf_wiki
|
|
40
47
|
from .parallel_outline import ParallelOutlineError, parse_worker_setting
|
|
41
48
|
from .project_config import ProjectConfigError
|
|
49
|
+
from .response_cache import (
|
|
50
|
+
ResponseCacheKey,
|
|
51
|
+
ResponseCacheStore,
|
|
52
|
+
WorkspaceContentSnapshot,
|
|
53
|
+
workspace_content_snapshot,
|
|
54
|
+
)
|
|
42
55
|
|
|
43
56
|
_MAX_WORKER_RECORD_BYTES = 1024 * 1024
|
|
44
57
|
_INVALID_JSON_MESSAGE = "Invalid JSON request."
|
|
@@ -317,36 +330,130 @@ def _discard_broken_stdout() -> None:
|
|
|
317
330
|
def _view(args: argparse.Namespace) -> None:
|
|
318
331
|
args.root = _workspace_root(args.root)
|
|
319
332
|
args.project_file = _project_file(args.root, args.project_file)
|
|
320
|
-
|
|
321
|
-
args
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
333
|
+
store, cache_key, snapshot = _batch_response_cache(
|
|
334
|
+
args,
|
|
335
|
+
command="view",
|
|
336
|
+
layer=args.layer,
|
|
337
|
+
query=args.query,
|
|
338
|
+
output_format=args.format,
|
|
325
339
|
)
|
|
326
|
-
|
|
340
|
+
cached = store.load(cache_key)
|
|
341
|
+
if cached is not None:
|
|
342
|
+
sys.stdout.write(cached.decode("utf-8"))
|
|
343
|
+
return
|
|
344
|
+
if args.layer == "references":
|
|
345
|
+
payload = build_references_payload(
|
|
346
|
+
args.root,
|
|
347
|
+
query=args.query,
|
|
348
|
+
project_file=args.project_file,
|
|
349
|
+
workers=args.workers,
|
|
350
|
+
)
|
|
351
|
+
rendered = render_payload(payload, output_format=args.format)
|
|
352
|
+
elif args.layer == "metrics":
|
|
353
|
+
payload = build_metrics_payload(
|
|
354
|
+
args.root,
|
|
355
|
+
query=args.query,
|
|
356
|
+
project_file=args.project_file,
|
|
357
|
+
workers=args.workers,
|
|
358
|
+
discovery=snapshot.discovery,
|
|
359
|
+
)
|
|
360
|
+
if args.format == "json":
|
|
361
|
+
rendered = _json_text(payload)
|
|
362
|
+
else:
|
|
363
|
+
rendered = render_payload(payload, output_format=args.format)
|
|
364
|
+
else:
|
|
365
|
+
index = build_codebase_index(
|
|
366
|
+
args.root,
|
|
367
|
+
project_file=args.project_file,
|
|
368
|
+
index_projects=args.deep_projects,
|
|
369
|
+
workers=args.workers,
|
|
370
|
+
use_artifact_cache=False,
|
|
371
|
+
discovery=snapshot.discovery,
|
|
372
|
+
)
|
|
373
|
+
rendered = render_layer(
|
|
374
|
+
index,
|
|
375
|
+
args.layer,
|
|
376
|
+
query=args.query,
|
|
377
|
+
output_format=args.format,
|
|
378
|
+
)
|
|
379
|
+
encoded = rendered.encode("utf-8")
|
|
380
|
+
_store_batch_response(store, cache_key, encoded)
|
|
381
|
+
sys.stdout.write(rendered)
|
|
327
382
|
|
|
328
383
|
|
|
329
384
|
def _index(args: argparse.Namespace) -> None:
|
|
330
385
|
args.root = _workspace_root(args.root)
|
|
331
386
|
args.project_file = _project_file(args.root, args.project_file)
|
|
332
387
|
output = _resolve_output_path(args.root, args.out)
|
|
333
|
-
|
|
334
|
-
args
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
388
|
+
store, cache_key, snapshot = _batch_response_cache(
|
|
389
|
+
args,
|
|
390
|
+
command="index",
|
|
391
|
+
layer="",
|
|
392
|
+
query="",
|
|
393
|
+
output_format="json",
|
|
338
394
|
)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
395
|
+
encoded = store.load(cache_key)
|
|
396
|
+
if encoded is None:
|
|
397
|
+
index = build_codebase_index(
|
|
398
|
+
args.root,
|
|
399
|
+
project_file=args.project_file,
|
|
400
|
+
index_projects=args.deep_projects,
|
|
401
|
+
workers=args.workers,
|
|
402
|
+
use_artifact_cache=False,
|
|
403
|
+
discovery=snapshot.discovery,
|
|
404
|
+
)
|
|
405
|
+
payload = {
|
|
406
|
+
"deep_projects": bool(args.deep_projects),
|
|
407
|
+
"overview": layer_payload(index, "overview"),
|
|
408
|
+
"projects": layer_payload(index, "projects"),
|
|
409
|
+
"problems": layer_payload(index, "problems"),
|
|
410
|
+
}
|
|
411
|
+
encoded = (json.dumps(payload, indent=2, sort_keys=True) + "\n").encode(
|
|
412
|
+
"utf-8"
|
|
413
|
+
)
|
|
414
|
+
_store_batch_response(store, cache_key, encoded)
|
|
345
415
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
346
|
-
output.
|
|
416
|
+
output.write_bytes(encoded)
|
|
347
417
|
print(output)
|
|
348
418
|
|
|
349
419
|
|
|
420
|
+
def _batch_response_cache(
|
|
421
|
+
args: argparse.Namespace,
|
|
422
|
+
*,
|
|
423
|
+
command: str,
|
|
424
|
+
layer: str,
|
|
425
|
+
query: str,
|
|
426
|
+
output_format: str,
|
|
427
|
+
) -> tuple[ResponseCacheStore, ResponseCacheKey, WorkspaceContentSnapshot]:
|
|
428
|
+
snapshot = workspace_content_snapshot(
|
|
429
|
+
args.root,
|
|
430
|
+
project_file=args.project_file,
|
|
431
|
+
)
|
|
432
|
+
return (
|
|
433
|
+
ResponseCacheStore(args.root / ".delphi-lsp" / "response-cache"),
|
|
434
|
+
ResponseCacheKey(
|
|
435
|
+
workspace_revision=snapshot.revision,
|
|
436
|
+
command=command,
|
|
437
|
+
layer=layer,
|
|
438
|
+
query=query,
|
|
439
|
+
output_format=output_format,
|
|
440
|
+
deep_projects=bool(args.deep_projects),
|
|
441
|
+
),
|
|
442
|
+
snapshot,
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def _store_batch_response(
|
|
447
|
+
store: ResponseCacheStore,
|
|
448
|
+
key: ResponseCacheKey,
|
|
449
|
+
payload: bytes,
|
|
450
|
+
) -> None:
|
|
451
|
+
try:
|
|
452
|
+
store.store(key, payload)
|
|
453
|
+
except (OSError, ValueError):
|
|
454
|
+
pass
|
|
455
|
+
|
|
456
|
+
|
|
350
457
|
def _wiki_export(args: argparse.Namespace) -> None:
|
|
351
458
|
args.root = _workspace_root(args.root)
|
|
352
459
|
args.project_file = _project_file(args.root, args.project_file)
|
|
@@ -501,7 +608,11 @@ def _open_worker_context(
|
|
|
501
608
|
|
|
502
609
|
|
|
503
610
|
def _write_json(payload: object) -> None:
|
|
504
|
-
sys.stdout.write(
|
|
611
|
+
sys.stdout.write(_json_text(payload))
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
def _json_text(payload: object) -> str:
|
|
615
|
+
return json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n"
|
|
505
616
|
|
|
506
617
|
|
|
507
618
|
def _write_warning(warning: str) -> None:
|