python-delphi-lsp 3.2.1__tar.gz → 3.5.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.1 → python_delphi_lsp-3.5.0}/MANIFEST.in +2 -0
- {python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info → python_delphi_lsp-3.5.0}/PKG-INFO +19 -3
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/README.md +18 -2
- python_delphi_lsp-3.5.0/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_cache.py +197 -15
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_cli.py +137 -20
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_context.py +774 -96
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_layers.py +550 -32
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_metrics.py +227 -15
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_relations.py +708 -27
- python_delphi_lsp-3.5.0/delphi_lsp/agent_wiki.py +2853 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_workspace.py +18 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/delphiast_lexer.py +156 -39
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/delphiast_parser.py +336 -48
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/delphiast_tokens.py +4 -4
- python_delphi_lsp-3.5.0/delphi_lsp/incremental.py +1139 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/lark_builder.py +6 -3
- python_delphi_lsp-3.5.0/delphi_lsp/lsp_server.py +6693 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/metrics.py +654 -75
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/navigation_cache.py +2 -2
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/nodes.py +93 -2
- python_delphi_lsp-3.5.0/delphi_lsp/parallel_outline.py +662 -0
- python_delphi_lsp-3.5.0/delphi_lsp/parse_artifacts.py +969 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/parser.py +21 -2
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/parser_backend.py +13 -2
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/preprocessor.py +28 -14
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/project_config.py +22 -4
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/project_indexer.py +50 -10
- python_delphi_lsp-3.5.0/delphi_lsp/response_cache.py +465 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/semantic.py +31 -21
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/semantic_builder.py +986 -114
- python_delphi_lsp-3.5.0/delphi_lsp/wiki_external_sort.py +392 -0
- python_delphi_lsp-3.5.0/delphi_lsp/wiki_memory.py +548 -0
- python_delphi_lsp-3.5.0/docs/release-3.2.2.md +52 -0
- python_delphi_lsp-3.5.0/docs/release-3.3.0.md +93 -0
- python_delphi_lsp-3.5.0/docs/release-3.4.0.md +97 -0
- python_delphi_lsp-3.5.0/docs/release-3.5.0.md +82 -0
- python_delphi_lsp-3.5.0/docs/superpowers/plans/2026-08-04-release-performance-unblock.md +384 -0
- python_delphi_lsp-3.5.0/docs/superpowers/specs/2026-08-04-release-performance-unblock-design.md +190 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/pyproject.toml +1 -1
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0/python_delphi_lsp.egg-info}/PKG-INFO +19 -3
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/python_delphi_lsp.egg-info/SOURCES.txt +26 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/audit_delphi_language_features.py +1 -1
- python_delphi_lsp-3.5.0/scripts/benchmark_response_cache.py +222 -0
- python_delphi_lsp-3.5.0/scripts/outline_gap_detector.py +656 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_cache.py +529 -1
- python_delphi_lsp-3.5.0/tests/test_agent_cli_content.py +624 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_cli_errors.py +15 -14
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_codebase.py +293 -1
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_context.py +735 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_metrics.py +219 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_relations.py +1386 -45
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_wiki.py +410 -6
- python_delphi_lsp-3.5.0/tests/test_artifact_cache_cpu_smoke.py +116 -0
- python_delphi_lsp-3.5.0/tests/test_artifact_cache_integration.py +315 -0
- python_delphi_lsp-3.5.0/tests/test_delphiast_lexer.py +284 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_delphiast_native_compatibility.py +54 -1
- python_delphi_lsp-3.5.0/tests/test_delphiast_parser_linearity.py +255 -0
- python_delphi_lsp-3.5.0/tests/test_incremental.py +296 -0
- python_delphi_lsp-3.5.0/tests/test_incremental_performance.py +58 -0
- python_delphi_lsp-3.5.0/tests/test_incremental_property.py +560 -0
- python_delphi_lsp-3.5.0/tests/test_lsp_features.py +948 -0
- python_delphi_lsp-3.5.0/tests/test_lsp_server.py +4005 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_lsp_support.py +62 -10
- python_delphi_lsp-3.5.0/tests/test_metrics.py +604 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_navigation_cache.py +5 -0
- python_delphi_lsp-3.5.0/tests/test_outline_gap_detector.py +469 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_package_metadata.py +50 -3
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_parallel_outline.py +179 -2
- python_delphi_lsp-3.5.0/tests/test_parse_artifacts.py +230 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_parser_backends.py +46 -1
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_preprocessor.py +40 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_project_indexer.py +104 -0
- python_delphi_lsp-3.5.0/tests/test_response_cache.py +329 -0
- python_delphi_lsp-3.5.0/tests/test_response_cache_benchmark.py +53 -0
- python_delphi_lsp-3.5.0/tests/test_semantic.py +987 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_throughput_scaling.py +27 -2
- python_delphi_lsp-3.5.0/tests/test_wiki_external_sort.py +322 -0
- python_delphi_lsp-3.5.0/tests/test_wiki_memory.py +316 -0
- python_delphi_lsp-3.2.1/delphi_lsp/_version.py +0 -1
- python_delphi_lsp-3.2.1/delphi_lsp/agent_wiki.py +0 -1435
- python_delphi_lsp-3.2.1/delphi_lsp/lsp_server.py +0 -2722
- python_delphi_lsp-3.2.1/delphi_lsp/parallel_outline.py +0 -316
- python_delphi_lsp-3.2.1/tests/test_delphiast_lexer.py +0 -122
- python_delphi_lsp-3.2.1/tests/test_lsp_features.py +0 -171
- python_delphi_lsp-3.2.1/tests/test_lsp_server.py +0 -901
- python_delphi_lsp-3.2.1/tests/test_metrics.py +0 -275
- python_delphi_lsp-3.2.1/tests/test_semantic.py +0 -283
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/LICENSE +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_cpg_builder.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/agent_templates.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/lexical_scanner.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/project_discovery.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/py.typed +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/performance-delphi.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/performance-fpc.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-2.3.0.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-2.3.3.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.0.0.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.1.0.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.1.1.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.1.2.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.2.0.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/release-3.2.1.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/opencode.json +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/benchmark_cpg.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/benchmark_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/benchmark_github_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/prepare_delphi_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/prepare_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/run_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/setup.cfg +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/fpc_parse_quality.baseline.json +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_worker.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_delphi_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_fpc_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_parser.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_progress.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_project_config.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_project_discovery.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.0}/tests/test_vllm_start_script.py +0 -0
- {python_delphi_lsp-3.2.1 → python_delphi_lsp-3.5.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.5.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.5.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
49
49
|
|
|
50
50
|
## Install and quick start
|
|
51
51
|
|
|
@@ -226,7 +226,8 @@ delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
|
|
|
226
226
|
```
|
|
227
227
|
|
|
228
228
|
`--deep-projects` opts into per-project dependency parsing for the `projects`
|
|
229
|
-
|
|
229
|
+
and `problems` layers. It is off by default because it dominates run time on
|
|
230
|
+
real repositories:
|
|
230
231
|
on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
|
|
231
232
|
adds nothing to the unit model set. Without it the `projects` and `problems`
|
|
232
233
|
layers report `deep_indexed: false`, and `index` records `deep_projects` at the
|
|
@@ -416,6 +417,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
|
|
|
416
417
|
from 1 through 32 overrides the automatic CPU and memory caps but is still
|
|
417
418
|
limited by the number of tasks.
|
|
418
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
|
+
|
|
419
435
|
Worker processes build compact, detached navigation shards and exit before
|
|
420
436
|
retained-cache accounting. Full semantic object graphs and source text are not
|
|
421
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.5.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
6
6
|
|
|
7
7
|
## Install and quick start
|
|
8
8
|
|
|
@@ -183,7 +183,8 @@ delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
|
|
|
183
183
|
```
|
|
184
184
|
|
|
185
185
|
`--deep-projects` opts into per-project dependency parsing for the `projects`
|
|
186
|
-
|
|
186
|
+
and `problems` layers. It is off by default because it dominates run time on
|
|
187
|
+
real repositories:
|
|
187
188
|
on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
|
|
188
189
|
adds nothing to the unit model set. Without it the `projects` and `problems`
|
|
189
190
|
layers report `deep_indexed: false`, and `index` records `deep_projects` at the
|
|
@@ -373,6 +374,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
|
|
|
373
374
|
from 1 through 32 overrides the automatic CPU and memory caps but is still
|
|
374
375
|
limited by the number of tasks.
|
|
375
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
|
+
|
|
376
392
|
Worker processes build compact, detached navigation shards and exit before
|
|
377
393
|
retained-cache accounting. Full semantic object graphs and source text are not
|
|
378
394
|
retained in the parent. Tokenized source documents are loaded only for source
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.5.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."
|
|
@@ -110,6 +123,11 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
110
123
|
wiki_export.add_argument("--project-file", type=Path)
|
|
111
124
|
wiki_export.add_argument("--out", type=Path, default=Path(".delphi-lsp") / "wiki")
|
|
112
125
|
wiki_export.add_argument("--workers", type=parse_worker_setting, default=0)
|
|
126
|
+
wiki_export.add_argument(
|
|
127
|
+
"--max-memory",
|
|
128
|
+
type=parse_memory_size,
|
|
129
|
+
help="Hard process-tree memory limit (default: min(4G, 90%% of system RAM)).",
|
|
130
|
+
)
|
|
113
131
|
wiki_export.add_argument("--force", action="store_true")
|
|
114
132
|
wiki_export.add_argument(
|
|
115
133
|
"--quiet",
|
|
@@ -317,36 +335,130 @@ def _discard_broken_stdout() -> None:
|
|
|
317
335
|
def _view(args: argparse.Namespace) -> None:
|
|
318
336
|
args.root = _workspace_root(args.root)
|
|
319
337
|
args.project_file = _project_file(args.root, args.project_file)
|
|
320
|
-
|
|
321
|
-
args
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
338
|
+
store, cache_key, snapshot = _batch_response_cache(
|
|
339
|
+
args,
|
|
340
|
+
command="view",
|
|
341
|
+
layer=args.layer,
|
|
342
|
+
query=args.query,
|
|
343
|
+
output_format=args.format,
|
|
325
344
|
)
|
|
326
|
-
|
|
345
|
+
cached = store.load(cache_key)
|
|
346
|
+
if cached is not None:
|
|
347
|
+
sys.stdout.write(cached.decode("utf-8"))
|
|
348
|
+
return
|
|
349
|
+
if args.layer == "references":
|
|
350
|
+
payload = build_references_payload(
|
|
351
|
+
args.root,
|
|
352
|
+
query=args.query,
|
|
353
|
+
project_file=args.project_file,
|
|
354
|
+
workers=args.workers,
|
|
355
|
+
)
|
|
356
|
+
rendered = render_payload(payload, output_format=args.format)
|
|
357
|
+
elif args.layer == "metrics":
|
|
358
|
+
payload = build_metrics_payload(
|
|
359
|
+
args.root,
|
|
360
|
+
query=args.query,
|
|
361
|
+
project_file=args.project_file,
|
|
362
|
+
workers=args.workers,
|
|
363
|
+
discovery=snapshot.discovery,
|
|
364
|
+
)
|
|
365
|
+
if args.format == "json":
|
|
366
|
+
rendered = _json_text(payload)
|
|
367
|
+
else:
|
|
368
|
+
rendered = render_payload(payload, output_format=args.format)
|
|
369
|
+
else:
|
|
370
|
+
index = build_codebase_index(
|
|
371
|
+
args.root,
|
|
372
|
+
project_file=args.project_file,
|
|
373
|
+
index_projects=args.deep_projects,
|
|
374
|
+
workers=args.workers,
|
|
375
|
+
use_artifact_cache=False,
|
|
376
|
+
discovery=snapshot.discovery,
|
|
377
|
+
)
|
|
378
|
+
rendered = render_layer(
|
|
379
|
+
index,
|
|
380
|
+
args.layer,
|
|
381
|
+
query=args.query,
|
|
382
|
+
output_format=args.format,
|
|
383
|
+
)
|
|
384
|
+
encoded = rendered.encode("utf-8")
|
|
385
|
+
_store_batch_response(store, cache_key, encoded)
|
|
386
|
+
sys.stdout.write(rendered)
|
|
327
387
|
|
|
328
388
|
|
|
329
389
|
def _index(args: argparse.Namespace) -> None:
|
|
330
390
|
args.root = _workspace_root(args.root)
|
|
331
391
|
args.project_file = _project_file(args.root, args.project_file)
|
|
332
392
|
output = _resolve_output_path(args.root, args.out)
|
|
333
|
-
|
|
334
|
-
args
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
393
|
+
store, cache_key, snapshot = _batch_response_cache(
|
|
394
|
+
args,
|
|
395
|
+
command="index",
|
|
396
|
+
layer="",
|
|
397
|
+
query="",
|
|
398
|
+
output_format="json",
|
|
338
399
|
)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
400
|
+
encoded = store.load(cache_key)
|
|
401
|
+
if encoded is None:
|
|
402
|
+
index = build_codebase_index(
|
|
403
|
+
args.root,
|
|
404
|
+
project_file=args.project_file,
|
|
405
|
+
index_projects=args.deep_projects,
|
|
406
|
+
workers=args.workers,
|
|
407
|
+
use_artifact_cache=False,
|
|
408
|
+
discovery=snapshot.discovery,
|
|
409
|
+
)
|
|
410
|
+
payload = {
|
|
411
|
+
"deep_projects": bool(args.deep_projects),
|
|
412
|
+
"overview": layer_payload(index, "overview"),
|
|
413
|
+
"projects": layer_payload(index, "projects"),
|
|
414
|
+
"problems": layer_payload(index, "problems"),
|
|
415
|
+
}
|
|
416
|
+
encoded = (json.dumps(payload, indent=2, sort_keys=True) + "\n").encode(
|
|
417
|
+
"utf-8"
|
|
418
|
+
)
|
|
419
|
+
_store_batch_response(store, cache_key, encoded)
|
|
345
420
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
346
|
-
output.
|
|
421
|
+
output.write_bytes(encoded)
|
|
347
422
|
print(output)
|
|
348
423
|
|
|
349
424
|
|
|
425
|
+
def _batch_response_cache(
|
|
426
|
+
args: argparse.Namespace,
|
|
427
|
+
*,
|
|
428
|
+
command: str,
|
|
429
|
+
layer: str,
|
|
430
|
+
query: str,
|
|
431
|
+
output_format: str,
|
|
432
|
+
) -> tuple[ResponseCacheStore, ResponseCacheKey, WorkspaceContentSnapshot]:
|
|
433
|
+
snapshot = workspace_content_snapshot(
|
|
434
|
+
args.root,
|
|
435
|
+
project_file=args.project_file,
|
|
436
|
+
)
|
|
437
|
+
return (
|
|
438
|
+
ResponseCacheStore(args.root / ".delphi-lsp" / "response-cache"),
|
|
439
|
+
ResponseCacheKey(
|
|
440
|
+
workspace_revision=snapshot.revision,
|
|
441
|
+
command=command,
|
|
442
|
+
layer=layer,
|
|
443
|
+
query=query,
|
|
444
|
+
output_format=output_format,
|
|
445
|
+
deep_projects=bool(args.deep_projects),
|
|
446
|
+
),
|
|
447
|
+
snapshot,
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def _store_batch_response(
|
|
452
|
+
store: ResponseCacheStore,
|
|
453
|
+
key: ResponseCacheKey,
|
|
454
|
+
payload: bytes,
|
|
455
|
+
) -> None:
|
|
456
|
+
try:
|
|
457
|
+
store.store(key, payload)
|
|
458
|
+
except (OSError, ValueError):
|
|
459
|
+
pass
|
|
460
|
+
|
|
461
|
+
|
|
350
462
|
def _wiki_export(args: argparse.Namespace) -> None:
|
|
351
463
|
args.root = _workspace_root(args.root)
|
|
352
464
|
args.project_file = _project_file(args.root, args.project_file)
|
|
@@ -358,6 +470,7 @@ def _wiki_export(args: argparse.Namespace) -> None:
|
|
|
358
470
|
output,
|
|
359
471
|
project_file=args.project_file,
|
|
360
472
|
workers=args.workers,
|
|
473
|
+
max_memory_bytes=args.max_memory,
|
|
361
474
|
force=args.force,
|
|
362
475
|
on_progress=renderer,
|
|
363
476
|
)
|
|
@@ -501,7 +614,11 @@ def _open_worker_context(
|
|
|
501
614
|
|
|
502
615
|
|
|
503
616
|
def _write_json(payload: object) -> None:
|
|
504
|
-
sys.stdout.write(
|
|
617
|
+
sys.stdout.write(_json_text(payload))
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
def _json_text(payload: object) -> str:
|
|
621
|
+
return json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n"
|
|
505
622
|
|
|
506
623
|
|
|
507
624
|
def _write_warning(warning: str) -> None:
|