graphforge 0.3.8__tar.gz → 0.3.10__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.
Files changed (713) hide show
  1. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/docs.yml +15 -13
  2. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/publish.yaml +1 -1
  3. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/test.yml +34 -23
  4. {graphforge-0.3.8 → graphforge-0.3.10}/.gitignore +7 -0
  5. {graphforge-0.3.8 → graphforge-0.3.10}/CHANGELOG.md +48 -0
  6. {graphforge-0.3.8 → graphforge-0.3.10}/CLAUDE.md +19 -2
  7. graphforge-0.3.10/Makefile +189 -0
  8. {graphforge-0.3.8 → graphforge-0.3.10}/PKG-INFO +30 -23
  9. {graphforge-0.3.8 → graphforge-0.3.10}/README.md +18 -16
  10. graphforge-0.3.10/docs/development/perf-baseline-findings-v0.3.9.md +104 -0
  11. graphforge-0.3.10/docs/development/perf-v038-to-v039-delta.md +297 -0
  12. {graphforge-0.3.8 → graphforge-0.3.10}/docs/getting-started/installation.md +23 -2
  13. graphforge-0.3.10/docs/guide/analytics-integration.md +234 -0
  14. {graphforge-0.3.8 → graphforge-0.3.10}/docs/guide/cypher-guide.md +1 -1
  15. {graphforge-0.3.8 → graphforge-0.3.10}/docs/index.md +2 -2
  16. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-compatibility.md +16 -15
  17. graphforge-0.3.10/docs/reference/scale-limits.md +139 -0
  18. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/tck-compliance.md +5 -5
  19. graphforge-0.3.10/docs/releases/roadmap.md +90 -0
  20. graphforge-0.3.10/docs/research/agent-grounding.md +719 -0
  21. graphforge-0.3.10/docs/research/kg-construction.md +731 -0
  22. graphforge-0.3.10/docs/research/llm-workflows.md +794 -0
  23. graphforge-0.3.10/docs/research/network-analysis.md +796 -0
  24. {graphforge-0.3.8 → graphforge-0.3.10}/docs/use-cases/agent-grounding.md +69 -48
  25. {graphforge-0.3.8 → graphforge-0.3.10}/docs/use-cases/agent-tool-recall.md +112 -64
  26. {graphforge-0.3.8 → graphforge-0.3.10}/docs/use-cases/knowledge-graph-construction.md +60 -7
  27. {graphforge-0.3.8 → graphforge-0.3.10}/docs/use-cases/llm-workflows.md +100 -60
  28. {graphforge-0.3.8 → graphforge-0.3.10}/docs/use-cases/network-analysis.md +41 -58
  29. {graphforge-0.3.8 → graphforge-0.3.10}/examples/05_migration_from_networkx.py +40 -24
  30. {graphforge-0.3.8 → graphforge-0.3.10}/mkdocs.yml +2 -5
  31. {graphforge-0.3.8 → graphforge-0.3.10}/pyproject.toml +28 -14
  32. graphforge-0.3.10/scripts/benchmark_neighbourhood.py +421 -0
  33. graphforge-0.3.10/scripts/benchmark_tool_registry.py +329 -0
  34. graphforge-0.3.10/scripts/perf_report.py +86 -0
  35. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/tck_metrics.py +20 -8
  36. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/tck_perf_report.py +2 -2
  37. graphforge-0.3.10/scripts/validate_agent_snippets.py +1188 -0
  38. graphforge-0.3.10/scripts/validate_llm_snippets.py +916 -0
  39. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/__init__.py +3 -2
  40. graphforge-0.3.10/src/graphforge/_compat.py +14 -0
  41. graphforge-0.3.10/src/graphforge/api.py +1732 -0
  42. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/ast/expression.py +17 -0
  43. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/ast/pattern.py +4 -0
  44. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/base.py +1 -1
  45. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/exporters/json_graph.py +7 -2
  46. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/csv.py +59 -61
  47. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/executor/evaluator.py +200 -32
  48. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/executor/executor.py +319 -20
  49. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/optimizer.py +13 -2
  50. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/predicate_utils.py +37 -14
  51. graphforge-0.3.10/src/graphforge/parser/cypher.lark +383 -0
  52. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/parser/parser.py +687 -358
  53. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/planner/planner.py +297 -53
  54. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/storage/memory.py +97 -4
  55. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/storage/sqlite_backend.py +83 -4
  56. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/types/values.py +89 -0
  57. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_distinct_clause.py +45 -0
  58. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_exists_is_empty.py +76 -0
  59. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_pattern_comprehension.py +56 -36
  60. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_pattern_predicates.py +116 -0
  61. graphforge-0.3.10/tests/integration/test_shortest_path.py +45 -0
  62. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_sqlite_persistence.py +80 -0
  63. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_transactions.py +90 -0
  64. graphforge-0.3.10/tests/integration/test_varlen_predicate_and_uniqueness.py +142 -0
  65. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_with_clause.py +69 -0
  66. graphforge-0.3.10/tests/perf/__init__.py +0 -0
  67. graphforge-0.3.10/tests/perf/conftest.py +90 -0
  68. graphforge-0.3.10/tests/perf/test_real_datasets.py +262 -0
  69. graphforge-0.3.10/tests/unit/api/test_add_graph_documents.py +261 -0
  70. graphforge-0.3.10/tests/unit/api/test_analytics.py +366 -0
  71. graphforge-0.3.10/tests/unit/api/test_api_coverage.py +268 -0
  72. graphforge-0.3.10/tests/unit/api/test_bulk_ingest.py +138 -0
  73. graphforge-0.3.10/tests/unit/api/test_cache.py +220 -0
  74. graphforge-0.3.10/tests/unit/api/test_json_io.py +261 -0
  75. graphforge-0.3.10/tests/unit/api/test_merge_node.py +156 -0
  76. graphforge-0.3.10/tests/unit/api/test_schema_introspection.py +163 -0
  77. graphforge-0.3.10/tests/unit/ast/test_expression_coverage.py +253 -0
  78. graphforge-0.3.10/tests/unit/datasets/test_compression_coverage.py +866 -0
  79. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_registry.py +37 -16
  80. graphforge-0.3.10/tests/unit/executor/test_element_id.py +95 -0
  81. graphforge-0.3.10/tests/unit/executor/test_evaluator_coverage_boost.py +1345 -0
  82. graphforge-0.3.10/tests/unit/executor/test_executor_coverage_boost.py +1318 -0
  83. graphforge-0.3.10/tests/unit/executor/test_infer_rel_var.py +84 -0
  84. graphforge-0.3.10/tests/unit/executor/test_limit_short_circuit.py +210 -0
  85. graphforge-0.3.10/tests/unit/executor/test_property_index_executor.py +294 -0
  86. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_temporal_truncate_arithmetic.py +4 -2
  87. graphforge-0.3.10/tests/unit/executor/test_unwind_limit_short_circuit.py +129 -0
  88. graphforge-0.3.10/tests/unit/optimizer/test_join_reorder_coverage.py +362 -0
  89. graphforge-0.3.10/tests/unit/optimizer/test_optimizer_coverage.py +232 -0
  90. graphforge-0.3.10/tests/unit/optimizer/test_predicate_utils_coverage.py +286 -0
  91. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_redundant_elimination.py +53 -1
  92. graphforge-0.3.10/tests/unit/parser/test_parser_coverage_boost.py +869 -0
  93. graphforge-0.3.10/tests/unit/parser/test_pattern_comprehension_binding.py +108 -0
  94. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_pattern_predicates.py +56 -0
  95. graphforge-0.3.10/tests/unit/parser/test_shortest_path_parser.py +63 -0
  96. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_syntax_error_validation.py +47 -3
  97. graphforge-0.3.10/tests/unit/procedures/__init__.py +0 -0
  98. graphforge-0.3.10/tests/unit/storage/test_property_index.py +185 -0
  99. graphforge-0.3.10/tests/unit/storage/test_sqlite_backend_delete_bulk.py +194 -0
  100. graphforge-0.3.10/tests/unit/storage/test_storage_coverage.py +217 -0
  101. graphforge-0.3.10/tests/unit/test_procedure_registry_coverage.py +191 -0
  102. graphforge-0.3.10/tests/unit/types/test_unwrap.py +179 -0
  103. {graphforge-0.3.8 → graphforge-0.3.10}/uv.lock +460 -39
  104. graphforge-0.3.8/Makefile +0 -107
  105. graphforge-0.3.8/docs/releases/roadmap.md +0 -685
  106. graphforge-0.3.8/src/graphforge/api.py +0 -880
  107. graphforge-0.3.8/src/graphforge/parser/cypher.lark +0 -353
  108. {graphforge-0.3.8 → graphforge-0.3.10}/.codecov.yml +0 -0
  109. {graphforge-0.3.8 → graphforge-0.3.10}/.coderabbit.yaml +0 -0
  110. {graphforge-0.3.8 → graphforge-0.3.10}/.editorconfig +0 -0
  111. {graphforge-0.3.8 → graphforge-0.3.10}/.github/CODEOWNERS +0 -0
  112. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  113. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  114. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  115. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  116. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  117. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  118. {graphforge-0.3.8 → graphforge-0.3.10}/.github/ISSUE_WORKFLOW.md +0 -0
  119. {graphforge-0.3.8 → graphforge-0.3.10}/.github/SECURITY.md +0 -0
  120. {graphforge-0.3.8 → graphforge-0.3.10}/.github/dependabot.yml +0 -0
  121. {graphforge-0.3.8 → graphforge-0.3.10}/.github/pull_request_template.md +0 -0
  122. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/README.md +0 -0
  123. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/changelog-check.yml +0 -0
  124. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/pr-labeler.yml +0 -0
  125. {graphforge-0.3.8 → graphforge-0.3.10}/.github/workflows/release-tracking.yml +0 -0
  126. {graphforge-0.3.8 → graphforge-0.3.10}/.pre-commit-config.yaml +0 -0
  127. {graphforge-0.3.8 → graphforge-0.3.10}/CHANGELOG_v0.3.0.md +0 -0
  128. {graphforge-0.3.8 → graphforge-0.3.10}/CODE_OF_CONDUCT.md +0 -0
  129. {graphforge-0.3.8 → graphforge-0.3.10}/CONTRIBUTING.md +0 -0
  130. {graphforge-0.3.8 → graphforge-0.3.10}/IMPLEMENTATION_PLAN.md +0 -0
  131. {graphforge-0.3.8 → graphforge-0.3.10}/LICENSE +0 -0
  132. {graphforge-0.3.8 → graphforge-0.3.10}/RELEASING.md +0 -0
  133. /graphforge-0.3.8/tests/unit/procedures/__init__.py → /graphforge-0.3.10/benchmarks/.gitkeep +0 -0
  134. {graphforge-0.3.8 → graphforge-0.3.10}/coverage.json +0 -0
  135. {graphforge-0.3.8 → graphforge-0.3.10}/docs/architecture/ast-and-planning.md +0 -0
  136. {graphforge-0.3.8 → graphforge-0.3.10}/docs/architecture/execution-model.md +0 -0
  137. {graphforge-0.3.8 → graphforge-0.3.10}/docs/architecture/overview.md +0 -0
  138. {graphforge-0.3.8 → graphforge-0.3.10}/docs/architecture/storage-analysis.md +0 -0
  139. {graphforge-0.3.8 → graphforge-0.3.10}/docs/architecture/storage.md +0 -0
  140. {graphforge-0.3.8 → graphforge-0.3.10}/docs/community/code-of-conduct.md +0 -0
  141. {graphforge-0.3.8 → graphforge-0.3.10}/docs/community/security.md +0 -0
  142. {graphforge-0.3.8 → graphforge-0.3.10}/docs/cypher-guide.md +0 -0
  143. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/cypher-script-loading.md +0 -0
  144. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/ldbc.md +0 -0
  145. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/neo4j-examples.md +0 -0
  146. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/networkrepository.md +0 -0
  147. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/overview.md +0 -0
  148. {graphforge-0.3.8 → graphforge-0.3.10}/docs/datasets/snap.md +0 -0
  149. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/QUICKSTART_V0.2.md +0 -0
  150. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/codecov-integration.md +0 -0
  151. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/contributing.md +0 -0
  152. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/documentation-update-summary.md +0 -0
  153. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/parser-performance-analysis.md +0 -0
  154. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/phase-1a-completion-report.md +0 -0
  155. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/release-process.md +0 -0
  156. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/release-strategy.md +0 -0
  157. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/requirements.md +0 -0
  158. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
  159. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
  160. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
  161. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
  162. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
  163. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
  164. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/session-summary.md +0 -0
  165. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
  166. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
  167. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
  168. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/testing-setup-complete.md +0 -0
  169. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/testing.md +0 -0
  170. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/v0.2-plan-summary.md +0 -0
  171. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/v0.4-revised-plan.md +0 -0
  172. {graphforge-0.3.8 → graphforge-0.3.10}/docs/development/workflow.md +0 -0
  173. {graphforge-0.3.8 → graphforge-0.3.10}/docs/getting-started/quickstart.md +0 -0
  174. {graphforge-0.3.8 → graphforge-0.3.10}/docs/getting-started/tutorial.md +0 -0
  175. {graphforge-0.3.8 → graphforge-0.3.10}/docs/guide/graph-construction.md +0 -0
  176. {graphforge-0.3.8 → graphforge-0.3.10}/docs/guide/overview.md +0 -0
  177. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
  178. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/README.md +0 -0
  179. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/RELEASE_TRACKING.md +0 -0
  180. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/VALIDATION_REPORT.md +0 -0
  181. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/api.md +0 -0
  182. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/changelog.md +0 -0
  183. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/column-naming-behavior.md +0 -0
  184. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-aggregation-functions.md +0 -0
  185. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-graph-queries.md +0 -0
  186. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-graph-schema.md +0 -0
  187. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
  188. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-mapping/function-to-tck.md +0 -0
  189. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-order-by.md +0 -0
  190. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/feature-return-aliasing.md +0 -0
  191. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/implementation-status/clauses.md +0 -0
  192. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/implementation-status/functions.md +0 -0
  193. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/implementation-status/operators.md +0 -0
  194. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/implementation-status/patterns.md +0 -0
  195. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-compatibility-matrix.md +0 -0
  196. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-features/01-clauses.md +0 -0
  197. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-features/02-functions.md +0 -0
  198. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-features/03-operators.md +0 -0
  199. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-features/04-patterns.md +0 -0
  200. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/opencypher-features/05-data-types.md +0 -0
  201. {graphforge-0.3.8 → graphforge-0.3.10}/docs/reference/tck-inventory.md +0 -0
  202. {graphforge-0.3.8 → graphforge-0.3.10}/docs/releases/implementation-summary.md +0 -0
  203. {graphforge-0.3.8 → graphforge-0.3.10}/docs/releases/next-steps.md +0 -0
  204. {graphforge-0.3.8 → graphforge-0.3.10}/docs/releases/phase-1-complete.md +0 -0
  205. {graphforge-0.3.8 → graphforge-0.3.10}/docs/releases/phase-2-complete.md +0 -0
  206. {graphforge-0.3.8 → graphforge-0.3.10}/docs/releases/phase-3-complete.md +0 -0
  207. {graphforge-0.3.8 → graphforge-0.3.10}/docs/stylesheets/extra.css +0 -0
  208. {graphforge-0.3.8 → graphforge-0.3.10}/examples/01_social_network.py +0 -0
  209. {graphforge-0.3.8 → graphforge-0.3.10}/examples/02_knowledge_graph.py +0 -0
  210. {graphforge-0.3.8 → graphforge-0.3.10}/examples/03_data_lineage.py +0 -0
  211. {graphforge-0.3.8 → graphforge-0.3.10}/examples/04_citation_network.py +0 -0
  212. {graphforge-0.3.8 → graphforge-0.3.10}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
  213. {graphforge-0.3.8 → graphforge-0.3.10}/examples/basic_graph.py +0 -0
  214. {graphforge-0.3.8 → graphforge-0.3.10}/examples/basic_usage.py +0 -0
  215. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/build_feature_graph.py +0 -0
  216. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/bump_version.py +0 -0
  217. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/check_release_needed.py +0 -0
  218. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/inventory_tck.py +0 -0
  219. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/pre-push-check.sh +0 -0
  220. {graphforge-0.3.8 → graphforge-0.3.10}/scripts/validate_datasets.py +0 -0
  221. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/ast/__init__.py +0 -0
  222. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/ast/clause.py +0 -0
  223. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/ast/query.py +0 -0
  224. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/__init__.py +0 -0
  225. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/data/__init__.py +0 -0
  226. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/data/networkrepository.json +0 -0
  227. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/data/snap.json +0 -0
  228. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/exporters/__init__.py +0 -0
  229. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/formats/__init__.py +0 -0
  230. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/formats/json_graph.py +0 -0
  231. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/__init__.py +0 -0
  232. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/compression.py +0 -0
  233. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/cypher.py +0 -0
  234. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/graphml.py +0 -0
  235. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/json_graph.py +0 -0
  236. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc.py +0 -0
  237. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
  238. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/registry.py +0 -0
  239. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/__init__.py +0 -0
  240. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/graphml.py +0 -0
  241. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/json_graph.py +0 -0
  242. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/ldbc.py +0 -0
  243. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/networkrepository.py +0 -0
  244. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/datasets/sources/snap.py +0 -0
  245. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/executor/__init__.py +0 -0
  246. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/__init__.py +0 -0
  247. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/cost_model.py +0 -0
  248. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/join_reorder.py +0 -0
  249. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/optimizer/statistics.py +0 -0
  250. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/parser/__init__.py +0 -0
  251. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/planner/__init__.py +0 -0
  252. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/planner/operators.py +0 -0
  253. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/planner/types.py +0 -0
  254. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/procedures/__init__.py +0 -0
  255. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/procedures/registry.py +0 -0
  256. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/storage/__init__.py +0 -0
  257. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/storage/pydantic_serialization.py +0 -0
  258. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/storage/serialization.py +0 -0
  259. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/types/__init__.py +0 -0
  260. {graphforge-0.3.8 → graphforge-0.3.10}/src/graphforge/types/graph.py +0 -0
  261. {graphforge-0.3.8 → graphforge-0.3.10}/tests/README.md +0 -0
  262. {graphforge-0.3.8 → graphforge-0.3.10}/tests/__init__.py +0 -0
  263. {graphforge-0.3.8 → graphforge-0.3.10}/tests/conftest.py +0 -0
  264. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/__init__.py +0 -0
  265. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/conftest.py +0 -0
  266. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_compression.py +0 -0
  267. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
  268. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
  269. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_graphml_loader.py +0 -0
  270. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
  271. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_loader.py +0 -0
  272. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
  273. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_ldbc_loader.py +0 -0
  274. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
  275. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/executor/test_graph_functions.py +0 -0
  276. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_aggregation_edge_cases.py +0 -0
  277. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_aggregation_functions_advanced.py +0 -0
  278. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_anonymous_relationships.py +0 -0
  279. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_arithmetic.py +0 -0
  280. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_builder_api.py +0 -0
  281. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_call_procedures.py +0 -0
  282. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_call_subqueries.py +0 -0
  283. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_case_expressions.py +0 -0
  284. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_collect.py +0 -0
  285. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_column_naming.py +0 -0
  286. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_compact_iso8601.py +0 -0
  287. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_complex_merge_patterns.py +0 -0
  288. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_complex_where_predicates.py +0 -0
  289. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_create_clause.py +0 -0
  290. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_create_edge_cases.py +0 -0
  291. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_delete_null.py +0 -0
  292. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_detach_delete.py +0 -0
  293. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_e2e_queries.py +0 -0
  294. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_executor_edge_cases.py +0 -0
  295. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_graph_element_comparison.py +0 -0
  296. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_hex_octal_literals.py +0 -0
  297. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_iana_timezones.py +0 -0
  298. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_id_function.py +0 -0
  299. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_issues_271_274.py +0 -0
  300. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_label_disjunction.py +0 -0
  301. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_label_predicate.py +0 -0
  302. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_comprehension.py +0 -0
  303. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_concatenation.py +0 -0
  304. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_functions.py +0 -0
  305. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_operations.py +0 -0
  306. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_path_overloading.py +0 -0
  307. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_list_subscript.py +0 -0
  308. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_logical_operators.py +0 -0
  309. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_map_subscript.py +0 -0
  310. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_match_create.py +0 -0
  311. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_math_functions.py +0 -0
  312. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_math_functions_extended.py +0 -0
  313. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_math_functions_new.py +0 -0
  314. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_merge_edge_cases.py +0 -0
  315. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_merge_on_create_real.py +0 -0
  316. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_merge_on_match_real.py +0 -0
  317. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_mixed_type_sort.py +0 -0
  318. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_nan_handling.py +0 -0
  319. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_null_handling.py +0 -0
  320. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_operator_precedence.py +0 -0
  321. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
  322. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_optimizer_integration.py +0 -0
  323. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
  324. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_optional_match.py +0 -0
  325. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_optional_match_delete.py +0 -0
  326. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_path_binding.py +0 -0
  327. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_path_binding_variable_length.py +0 -0
  328. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_path_functions.py +0 -0
  329. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_persistence.py +0 -0
  330. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_power_operator.py +0 -0
  331. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_predicate_functions.py +0 -0
  332. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_properties_keys_functions.py +0 -0
  333. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_relationship_directions.py +0 -0
  334. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_relationship_uniqueness.py +0 -0
  335. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_remove_clause.py +0 -0
  336. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_set_delete_merge.py +0 -0
  337. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_size_function.py +0 -0
  338. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_skip_limit_expressions.py +0 -0
  339. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_snap_dataset_loading.py +0 -0
  340. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_sort_after_aggregation.py +0 -0
  341. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_spatial_api.py +0 -0
  342. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_startnode_endnode_functions.py +0 -0
  343. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_string_functions.py +0 -0
  344. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_string_functions_new.py +0 -0
  345. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_string_matching.py +0 -0
  346. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_subquery_expressions.py +0 -0
  347. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_temporal_map_constructors.py +0 -0
  348. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_temporal_queries.py +0 -0
  349. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_temporal_select_into.py +0 -0
  350. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_type_conversion_fixes.py +0 -0
  351. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_type_functions.py +0 -0
  352. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_union.py +0 -0
  353. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_unwind.py +0 -0
  354. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_variable_length_paths.py +0 -0
  355. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_wildcard_execution.py +0 -0
  356. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_with_aggregation_real.py +0 -0
  357. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_with_clause_modifiers.py +0 -0
  358. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_with_clause_positions.py +0 -0
  359. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_with_distinct_skip_limit.py +0 -0
  360. {graphforge-0.3.8 → graphforge-0.3.10}/tests/integration/test_xor_operator.py +0 -0
  361. {graphforge-0.3.8 → graphforge-0.3.10}/tests/property/__init__.py +0 -0
  362. {graphforge-0.3.8 → graphforge-0.3.10}/tests/property/strategies.py +0 -0
  363. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/__init__.py +0 -0
  364. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/conftest.py +0 -0
  365. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/coverage_matrix.json +0 -0
  366. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/download_tck.py +0 -0
  367. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
  368. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
  369. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
  370. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
  371. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
  372. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
  373. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
  374. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
  375. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
  376. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
  377. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
  378. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
  379. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
  380. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
  381. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
  382. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
  383. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
  384. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
  385. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
  386. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
  387. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
  388. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
  389. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
  390. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
  391. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
  392. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
  393. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
  394. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
  395. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
  396. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
  397. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
  398. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
  399. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
  400. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
  401. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
  402. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
  403. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
  404. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
  405. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
  406. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
  407. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
  408. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
  409. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
  410. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
  411. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
  412. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
  413. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
  414. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
  415. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
  416. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
  417. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
  418. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
  419. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
  420. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
  421. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
  422. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
  423. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
  424. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
  425. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
  426. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
  427. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
  428. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
  429. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
  430. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
  431. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
  432. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
  433. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
  434. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
  435. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
  436. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
  437. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
  438. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
  439. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
  440. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
  441. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With1.feature +0 -0
  442. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With2.feature +0 -0
  443. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With3.feature +0 -0
  444. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With4.feature +0 -0
  445. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With5.feature +0 -0
  446. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With6.feature +0 -0
  447. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With7.feature +0 -0
  448. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
  449. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
  450. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
  451. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
  452. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
  453. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
  454. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
  455. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
  456. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
  457. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
  458. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
  459. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
  460. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
  461. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
  462. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
  463. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
  464. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
  465. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
  466. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
  467. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
  468. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
  469. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
  470. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
  471. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
  472. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
  473. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
  474. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
  475. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
  476. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
  477. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
  478. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
  479. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
  480. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
  481. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
  482. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
  483. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
  484. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
  485. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
  486. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
  487. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
  488. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
  489. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
  490. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
  491. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
  492. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
  493. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List1.feature +0 -0
  494. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List10.feature +0 -0
  495. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List11.feature +0 -0
  496. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List12.feature +0 -0
  497. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List2.feature +0 -0
  498. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List3.feature +0 -0
  499. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List4.feature +0 -0
  500. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List5.feature +0 -0
  501. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List6.feature +0 -0
  502. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List7.feature +0 -0
  503. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List8.feature +0 -0
  504. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List9.feature +0 -0
  505. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
  506. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
  507. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
  508. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
  509. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
  510. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
  511. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
  512. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
  513. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
  514. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
  515. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
  516. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
  517. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
  518. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
  519. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
  520. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
  521. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
  522. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
  523. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
  524. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
  525. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
  526. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
  527. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
  528. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
  529. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
  530. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
  531. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
  532. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
  533. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
  534. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
  535. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
  536. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
  537. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
  538. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
  539. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
  540. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
  541. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
  542. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
  543. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
  544. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
  545. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
  546. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
  547. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
  548. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
  549. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
  550. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
  551. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
  552. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
  553. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
  554. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
  555. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
  556. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
  557. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String1.feature +0 -0
  558. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String10.feature +0 -0
  559. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String11.feature +0 -0
  560. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String12.feature +0 -0
  561. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String13.feature +0 -0
  562. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String14.feature +0 -0
  563. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String2.feature +0 -0
  564. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String3.feature +0 -0
  565. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String4.feature +0 -0
  566. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String5.feature +0 -0
  567. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String6.feature +0 -0
  568. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String7.feature +0 -0
  569. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String8.feature +0 -0
  570. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String9.feature +0 -0
  571. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
  572. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
  573. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
  574. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
  575. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
  576. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
  577. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
  578. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
  579. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
  580. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
  581. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
  582. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
  583. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
  584. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
  585. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
  586. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
  587. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
  588. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
  589. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
  590. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
  591. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
  592. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
  593. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/graphs/named-graphs.adoc +0 -0
  594. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/tck_config.yaml +0 -0
  595. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/tck_markers.py +0 -0
  596. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/test_features.py +0 -0
  597. {graphforge-0.3.8 → graphforge-0.3.10}/tests/tck/test_tck_compliance.py +0 -0
  598. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/__init__.py +0 -0
  599. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/api/__init__.py +0 -0
  600. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/api/test_clear.py +0 -0
  601. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/api/test_clone.py +0 -0
  602. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/api/test_cypher_value_conversion.py +0 -0
  603. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/ast/__init__.py +0 -0
  604. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/ast/test_ast_nodes.py +0 -0
  605. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/__init__.py +0 -0
  606. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_csv_loader.py +0 -0
  607. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_cypher_loader.py +0 -0
  608. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_graphml_loader.py +0 -0
  609. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
  610. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_format.py +0 -0
  611. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_loader.py +0 -0
  612. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_ldbc_schema.py +0 -0
  613. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_networkrepository.py +0 -0
  614. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_snap_datasets.py +0 -0
  615. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/datasets/test_sources_registration.py +0 -0
  616. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/__init__.py +0 -0
  617. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_errors.py +0 -0
  618. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
  619. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
  620. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_evaluator.py +0 -0
  621. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
  622. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
  623. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_executor_error_paths.py +0 -0
  624. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_expression_matching.py +0 -0
  625. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_expressions_match.py +0 -0
  626. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_graph_functions.py +0 -0
  627. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_id_function.py +0 -0
  628. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_in_operator.py +0 -0
  629. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_list_functions.py +0 -0
  630. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_list_functions_errors.py +0 -0
  631. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_map_property_access.py +0 -0
  632. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_create.py +0 -0
  633. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_match.py +0 -0
  634. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_multihop_create.py +0 -0
  635. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_optional_expand_bound_dst.py +0 -0
  636. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
  637. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_parenthesized_expr_coverage.py +0 -0
  638. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_path_functions.py +0 -0
  639. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_procedure_call_executor.py +0 -0
  640. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_properties_keys_errors.py +0 -0
  641. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_set_extensions.py +0 -0
  642. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_sort_edge_cases.py +0 -0
  643. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_spatial_functions.py +0 -0
  644. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
  645. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_string_functions_new.py +0 -0
  646. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
  647. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_subquery_planner_check.py +0 -0
  648. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_temporal_functions.py +0 -0
  649. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_three_valued_logic.py +0 -0
  650. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_type_conversion_complex.py +0 -0
  651. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
  652. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/executor/test_with_aggregation.py +0 -0
  653. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/__init__.py +0 -0
  654. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
  655. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_cost_model.py +0 -0
  656. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
  657. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_join_reorder.py +0 -0
  658. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
  659. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
  660. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_utils.py +0 -0
  661. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/optimizer/test_statistics.py +0 -0
  662. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/__init__.py +0 -0
  663. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_arithmetic_parser.py +0 -0
  664. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_call_procedure_parser.py +0 -0
  665. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_case_parser.py +0 -0
  666. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_collect_parser.py +0 -0
  667. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_delete_parser.py +0 -0
  668. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_float_literals.py +0 -0
  669. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_grammar.py +0 -0
  670. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_hex_octal_literals.py +0 -0
  671. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_label_predicate_parser.py +0 -0
  672. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_create.py +0 -0
  673. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_match.py +0 -0
  674. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_optional_match_delete.py +0 -0
  675. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_order_by_direction.py +0 -0
  676. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_parser.py +0 -0
  677. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_parser_caching.py +0 -0
  678. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_path_binding.py +0 -0
  679. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_remove_parser.py +0 -0
  680. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_string_matching_parser.py +0 -0
  681. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_wildcard_parsing.py +0 -0
  682. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_with_at_query_start.py +0 -0
  683. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/parser/test_with_clause_positions.py +0 -0
  684. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/__init__.py +0 -0
  685. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_call_procedure_planner.py +0 -0
  686. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
  687. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_operator_validation.py +0 -0
  688. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_operators.py +0 -0
  689. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
  690. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_planner_comprehensive.py +0 -0
  691. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_planner_edge_cases.py +0 -0
  692. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_remove_planner.py +0 -0
  693. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_type_tracking.py +0 -0
  694. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/planner/test_with_validation.py +0 -0
  695. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/procedures/test_registry.py +0 -0
  696. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/__init__.py +0 -0
  697. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_graph_edge_cases.py +0 -0
  698. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_memory_store.py +0 -0
  699. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_pydantic_serialization.py +0 -0
  700. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
  701. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_spatial_serialization.py +0 -0
  702. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
  703. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/storage/test_temporal_serialization.py +0 -0
  704. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/test_graph_elements.py +0 -0
  705. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/test_iana_timezone_construction.py +0 -0
  706. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/test_values.py +0 -0
  707. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
  708. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
  709. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_extreme_temporal_values.py +0 -0
  710. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
  711. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_path_values.py +0 -0
  712. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_spatial_values.py +0 -0
  713. {graphforge-0.3.8 → graphforge-0.3.10}/tests/unit/types/test_temporal_values.py +0 -0
@@ -6,12 +6,15 @@ on:
6
6
  paths:
7
7
  - 'docs/**'
8
8
  - 'mkdocs.yml'
9
+ - 'src/graphforge/**'
10
+ - 'pyproject.toml'
9
11
  - '.github/workflows/docs.yml'
10
12
  pull_request:
11
13
  branches: [main]
12
14
  paths:
13
15
  - 'docs/**'
14
16
  - 'mkdocs.yml'
17
+ - 'src/graphforge/**'
15
18
  workflow_dispatch:
16
19
 
17
20
  permissions:
@@ -19,7 +22,6 @@ permissions:
19
22
  pages: write
20
23
  id-token: write
21
24
 
22
- # Allow only one concurrent deployment
23
25
  concurrency:
24
26
  group: pages
25
27
  cancel-in-progress: false
@@ -28,38 +30,38 @@ jobs:
28
30
  build:
29
31
  name: Build Documentation
30
32
  runs-on: ubuntu-latest
31
-
32
33
  steps:
33
- - name: Checkout code
34
+ - name: Checkout
34
35
  uses: actions/checkout@v6
35
36
  with:
36
- fetch-depth: 0 # Fetch all history for git info
37
+ fetch-depth: 0
37
38
 
38
39
  - name: Install uv
39
- uses: astral-sh/setup-uv@v7
40
+ uses: astral-sh/setup-uv@v8.1.0
41
+ with:
42
+ enable-cache: true
40
43
 
41
44
  - name: Set up Python
42
45
  uses: actions/setup-python@v6
43
46
  with:
44
47
  python-version: '3.12'
45
48
 
46
- - name: Install documentation dependencies
47
- run: |
48
- uv pip install --system -e ".[docs]"
49
+ - name: Install docs dependencies
50
+ run: uv sync --group docs
49
51
 
50
52
  - name: Build documentation
51
- run: mkdocs build --strict
53
+ run: uv run mkdocs build --strict
52
54
 
53
55
  - name: Upload Pages artifact
54
- if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
55
- uses: actions/upload-pages-artifact@v3
56
+ if: github.event_name != 'pull_request'
57
+ uses: actions/upload-pages-artifact@v5
56
58
  with:
57
59
  path: site/
58
60
 
59
61
  deploy:
60
62
  name: Deploy to GitHub Pages
61
63
  needs: build
62
- if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
64
+ if: github.event_name != 'pull_request'
63
65
  runs-on: ubuntu-latest
64
66
 
65
67
  environment:
@@ -69,4 +71,4 @@ jobs:
69
71
  steps:
70
72
  - name: Deploy to GitHub Pages
71
73
  id: deployment
72
- uses: actions/deploy-pages@v4
74
+ uses: actions/deploy-pages@v5
@@ -11,6 +11,6 @@ jobs:
11
11
  id-token: write
12
12
  steps:
13
13
  - uses: actions/checkout@v6
14
- - uses: astral-sh/setup-uv@v7
14
+ - uses: astral-sh/setup-uv@v8.1.0
15
15
  - run: uv build
16
16
  - run: uv publish
@@ -24,7 +24,7 @@ jobs:
24
24
  uses: actions/checkout@v6
25
25
 
26
26
  - name: Install uv
27
- uses: astral-sh/setup-uv@v7
27
+ uses: astral-sh/setup-uv@v8.1.0
28
28
  with:
29
29
  enable-cache: true
30
30
 
@@ -49,7 +49,7 @@ jobs:
49
49
  run: uv run pytest tests/integration -n auto -m "not snap" --junitxml=test-results-integration.xml
50
50
 
51
51
  - name: Upload test results to Codecov
52
- uses: codecov/codecov-action@v5
52
+ uses: codecov/codecov-action@v6
53
53
  if: always()
54
54
  with:
55
55
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -67,7 +67,7 @@ jobs:
67
67
  uses: actions/checkout@v6
68
68
 
69
69
  - name: Install uv
70
- uses: astral-sh/setup-uv@v7
70
+ uses: astral-sh/setup-uv@v8.1.0
71
71
 
72
72
  - name: Set up Python
73
73
  uses: actions/setup-python@v6
@@ -92,7 +92,7 @@ jobs:
92
92
  uses: actions/checkout@v6
93
93
 
94
94
  - name: Install uv
95
- uses: astral-sh/setup-uv@v7
95
+ uses: astral-sh/setup-uv@v8.1.0
96
96
 
97
97
  - name: Set up Python
98
98
  uses: actions/setup-python@v6
@@ -114,7 +114,7 @@ jobs:
114
114
  uses: actions/checkout@v6
115
115
 
116
116
  - name: Install uv
117
- uses: astral-sh/setup-uv@v7
117
+ uses: astral-sh/setup-uv@v8.1.0
118
118
 
119
119
  - name: Set up Python
120
120
  uses: actions/setup-python@v6
@@ -140,7 +140,7 @@ jobs:
140
140
  uses: actions/checkout@v6
141
141
 
142
142
  - name: Install uv
143
- uses: astral-sh/setup-uv@v7
143
+ uses: astral-sh/setup-uv@v8.1.0
144
144
 
145
145
  - name: Set up Python
146
146
  uses: actions/setup-python@v6
@@ -151,7 +151,7 @@ jobs:
151
151
  run: uv sync --all-extras
152
152
 
153
153
  - name: Restore test durations cache
154
- uses: actions/cache/restore@v4
154
+ uses: actions/cache/restore@v5
155
155
  with:
156
156
  path: .test_durations
157
157
  key: tck-durations-${{ github.ref }}
@@ -168,7 +168,7 @@ jobs:
168
168
  --junitxml=test-results-tck-${{ matrix.group }}.xml
169
169
 
170
170
  - name: Upload shard results artifact
171
- uses: actions/upload-artifact@v4
171
+ uses: actions/upload-artifact@v7
172
172
  if: always()
173
173
  with:
174
174
  name: tck-shard-${{ matrix.group }}
@@ -190,7 +190,7 @@ jobs:
190
190
  uses: actions/checkout@v6
191
191
 
192
192
  - name: Install uv
193
- uses: astral-sh/setup-uv@v7
193
+ uses: astral-sh/setup-uv@v8.1.0
194
194
 
195
195
  - name: Set up Python
196
196
  uses: actions/setup-python@v6
@@ -201,9 +201,10 @@ jobs:
201
201
  run: uv sync --all-extras
202
202
 
203
203
  - name: Download all shard results
204
- uses: actions/download-artifact@v4
204
+ uses: actions/download-artifact@v8
205
205
  with:
206
206
  pattern: tck-shard-*
207
+ run-id: ${{ github.run_id }}
207
208
  merge-multiple: true
208
209
  path: tck-results/
209
210
 
@@ -253,7 +254,7 @@ jobs:
253
254
  " || echo "No duration files found, skipping merge"
254
255
 
255
256
  - name: Save test durations cache
256
- uses: actions/cache/save@v4
257
+ uses: actions/cache/save@v5
257
258
  if: always()
258
259
  with:
259
260
  path: .test_durations
@@ -265,10 +266,10 @@ jobs:
265
266
 
266
267
  - name: Report TCK performance metrics
267
268
  if: always()
268
- run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 5
269
+ run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 2
269
270
 
270
271
  - name: Upload TCK results to Codecov
271
- uses: codecov/codecov-action@v5
272
+ uses: codecov/codecov-action@v6
272
273
  if: always()
273
274
  with:
274
275
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -278,7 +279,7 @@ jobs:
278
279
  fail_ci_if_error: false
279
280
 
280
281
  - name: Upload merged TCK results artifact
281
- uses: actions/upload-artifact@v4
282
+ uses: actions/upload-artifact@v7
282
283
  if: always()
283
284
  with:
284
285
  name: tck-test-results
@@ -297,7 +298,7 @@ jobs:
297
298
  uses: actions/checkout@v6
298
299
 
299
300
  - name: Install uv
300
- uses: astral-sh/setup-uv@v7
301
+ uses: astral-sh/setup-uv@v8.1.0
301
302
 
302
303
  - name: Set up Python
303
304
  uses: actions/setup-python@v6
@@ -325,7 +326,7 @@ jobs:
325
326
  --junitxml=test-results-cov-${{ matrix.group }}.xml
326
327
 
327
328
  - name: Upload coverage shard artifact
328
- uses: actions/upload-artifact@v4
329
+ uses: actions/upload-artifact@v7
329
330
  if: always()
330
331
  with:
331
332
  name: coverage-shard-${{ matrix.group }}
@@ -344,7 +345,7 @@ jobs:
344
345
  uses: actions/checkout@v6
345
346
 
346
347
  - name: Install uv
347
- uses: astral-sh/setup-uv@v7
348
+ uses: astral-sh/setup-uv@v8.1.0
348
349
 
349
350
  - name: Set up Python
350
351
  uses: actions/setup-python@v6
@@ -355,9 +356,10 @@ jobs:
355
356
  run: uv sync --all-extras
356
357
 
357
358
  - name: Download all coverage shards
358
- uses: actions/download-artifact@v4
359
+ uses: actions/download-artifact@v8
359
360
  with:
360
361
  pattern: coverage-shard-*
362
+ run-id: ${{ github.run_id }}
361
363
  merge-multiple: true
362
364
  path: cov-results/
363
365
 
@@ -387,11 +389,20 @@ jobs:
387
389
 
388
390
  - name: Check coverage threshold
389
391
  run: |
390
- uv run coverage combine cov-results/.coverage* 2>/dev/null || true
391
- uv run coverage report --fail-under=85 || echo "Coverage below 85% - expected during initial development"
392
+ uv run python3 -c "
393
+ import xml.etree.ElementTree as ET, sys
394
+ tree = ET.parse('coverage.xml')
395
+ line_rate = float(tree.getroot().get('line-rate', 0))
396
+ pct = round(line_rate * 100, 1)
397
+ print(f'Coverage: {pct}%')
398
+ if pct < 85:
399
+ print(f'Coverage {pct}% is below 85% threshold')
400
+ sys.exit(1)
401
+ print('Coverage meets 85% threshold')
402
+ " || echo "Coverage check failed - see above for details"
392
403
 
393
404
  - name: Upload coverage to Codecov
394
- uses: codecov/codecov-action@v5
405
+ uses: codecov/codecov-action@v6
395
406
  with:
396
407
  token: ${{ secrets.CODECOV_TOKEN }}
397
408
  files: ./coverage.xml
@@ -400,7 +411,7 @@ jobs:
400
411
  fail_ci_if_error: false
401
412
 
402
413
  - name: Upload test results to Codecov
403
- uses: codecov/codecov-action@v5
414
+ uses: codecov/codecov-action@v6
404
415
  if: always()
405
416
  with:
406
417
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -410,7 +421,7 @@ jobs:
410
421
  fail_ci_if_error: false
411
422
 
412
423
  - name: Upload coverage artifacts
413
- uses: actions/upload-artifact@v4
424
+ uses: actions/upload-artifact@v7
414
425
  with:
415
426
  name: coverage-report
416
427
  path: coverage.xml
@@ -173,6 +173,13 @@ profile_*
173
173
  *.log
174
174
  .temp/
175
175
  tmp/
176
+
177
+ # macOS Finder "keep both" duplicates (e.g. "file 2.py", "file 2.md", "file 3")
178
+ * [0-9]
179
+ * [0-9].*
176
180
  # MkDocs build output
177
181
  site/
178
182
  tck_*.txt
183
+
184
+ # Perf baseline results (machine-specific, generated by make test-perf)
185
+ benchmarks/real_dataset_baseline_v*.json
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.10] - 2026-05-06
11
+
12
+ ### Added
13
+ - **Schema introspection API** (#469, #499) — `labels()`, `relationship_types()`, `node_count(label=None)`, `relationship_count(type=None)` on `GraphForge`; efficient set-union over storage backend
14
+ - **JSON export/import** (#470, #500) — `gf.to_json(path, metadata, indent)` serialises the full graph to a portable JSON file; `GraphForge.from_json(path)` reconstructs it; Hypothesis roundtrip property test
15
+ - **`merge_node()` safe upsert** (#471, #501) — `merge_node(labels, match_on, on_create, on_match)` with regex label validation, index-safe on_match updates, and create/match semantics matching MERGE clause behaviour
16
+ - **`add_graph_documents()` LangChain-compatible ingestion** (#472, #502) — duck-typed batch ingestion accepting any object with `.nodes`/`.relationships` attributes; idempotent edges; rel type pre-check; no `langchain-community` import required
17
+ - **Parse/plan LRU cache** (#464, #504) — `GraphForge(cache_size=N)` caches parsed+planned query pipelines; `clear_cache()` and `cache_info()` for introspection; thread-safe; default size 128
18
+
19
+ ### Fixed
20
+ - **ORDER BY on aliased RETURN DISTINCT property no longer raises UndefinedVariable** (#481, #494) — planner now records `(variable, property)` paths for aliased `PropertyAccess` return items, so `RETURN DISTINCT a.year AS year ORDER BY a.year` resolves correctly
21
+ - **Variable reuse across WITH boundary no longer raises KeyError** (#482, #495) — optimizer's redundant-traversal-elimination pass now treats `Aggregate` as a scope boundary (same as `With`/`Union`/`Subquery`), preventing fresh post-WITH variable bindings from being silently dropped
22
+ - **EXISTS {} subquery crash on anonymous inner node with outer-scope property** (#474, #496) — `_plan_match` now passes `var_name` (always set, from pattern variable or generated) instead of `node_pattern.variable` (can be None) to `_properties_to_predicate`
23
+ - **`shortestPath()` / `allShortestPaths()` parse correctly and raise NotImplementedError** (#468, #497) — previously caused unhelpful `SyntaxError: Unexpected token`; now parsed into `ShortestPathExpression` AST nodes; planner raises `NotImplementedError` with BFS workaround: `MATCH path = (a)-[*1..N]-(b) RETURN length(path) ORDER BY length(path) LIMIT 1`
24
+
25
+ ## [0.3.9] - 2026-05-04
26
+
27
+ ### Added
28
+ - **LALR(1) parser migration** (#365, #430) — grammar refactored to LALR(1); linear-time parsing replaces Earley; unknown function names now detected at parse time; 586 new parser tests; OOM-safe local coverage via sharded `make coverage`
29
+ - **Property equality index for O(1) node lookup** (#390, #427) — in-memory `_prop_index` (prop → value → {node\_id}) on `Graph`; `get_nodes_by_property` and `get_nodes_by_label_and_property` methods; executor `_extract_equality_hints` replaces full scan with index lookup when a `ScanNodes` is followed by a simple equality `Filter`; index maintained on `SET`/`REMOVE`/`DELETE`
30
+ - **Bulk ingestion API** (#389, #444) — `create_node_bulk`, `create_relationship_bulk` (skip per-call Pydantic validation); `bulk_ingest()` context manager defers statistics rebuilds until exit via `_flush_deferred_stats()`; CSV loader uses bulk path; significant throughput improvement for dataset loading
31
+ - **Real-dataset QA and performance profiling suite** (#417, #419) — 5-tier perf suite (karate 34n, ego-facebook 4k, amazon 334k, livejournal 4M, orkut 117M edges); `scripts/perf_report.py` renders baseline/delta Markdown tables; `make test-perf`, `make test-perf-xs`, `make test-perf-large`, `make test-perf-slow` targets; L/XL tier benchmarks added; `perf_slow` marker applied consistently (#440, #441)
32
+ - **`elementId()` scalar function** (#211, #447) — GQL-spec `elementId(node|rel)` returns the element id as `CypherString`; `id()` continues to return `CypherInt`; NULL-safe; arity-checked
33
+ - **Scale limits documentation** — `docs/reference/scale-limits.md` explains LIMIT-respecting (~20M edges) vs full-scan (~1M edges) performance ceilings; README graph-size claim updated to reflect edge-count as binding constraint (#443)
34
+ - **`make pre-push-fast`** (#429, #437) — fast-fail pre-push shortcut (format, lint, type, security, docstrings; no coverage); inline coverage thresholds (85% total, 90% patch)
35
+
36
+ ### Fixed
37
+ - **Fixed-length hop ignores rel predicate** (#431, #439) — fixed-length traversal now evaluates `rel_pattern.predicate` inline; parser predicate whitelist replaced with open accept
38
+ - **var-length relationship predicates** (#381, #425) — `_var_length_reachable` now evaluates inline relationship predicates (e.g. `[*1..3 {weight: 1}]`) at each hop instead of ignoring them
39
+ - **Cross-hop edge uniqueness in multi-segment patterns** (#382, #425) — `initial_used_edge_ids` seeds the visited-edge set from prior hops, preventing the same edge being traversed twice across pattern segments
40
+ - **SQLite delete persistence** (#409, #421) — deleted nodes and edges now removed from SQLite backend; previously they resurrected on reload
41
+ - **SQLite bulk I/O** (#392, #421) — `save_nodes_bulk` / `save_edges_bulk` use `executemany`; `_save_graph_to_backend` wrapped in rollback; resolves >20s hang on M-tier reload
42
+ - **`sys.setrecursionlimit` thread safety** (#433, #445) — limit set once in `CypherParser.__init__` instead of per-request get/set/restore, eliminating races in concurrent parser use
43
+ - **Transaction rollback restores ID counters** (#412) — `rollback()` restores `_next_node_id` and `_next_edge_id`, preventing ID gaps after aborted transactions
44
+ - **Closed-instance guard** (#411) — `execute()` and mutation methods raise `RuntimeError` after `close()`
45
+ - **`DatasetInfo` rejects `ftp://` URLs** (#414)
46
+ - **TCK metrics CI gate** (#410) — `tck_metrics.py` exits non-zero on TCK failures
47
+
48
+ ### Performance
49
+ - **UNWIND + WITH LIMIT short-circuit** (#393, #443) — `_pipeline_limit` reverse-scan treats pass-through `With(limit_count=N, no sort, no filter)` as transparent; `_execute_unwind` respects `row_limit` and exits early; `UNWIND range(1M, 2M) AS i WITH i LIMIT 3000 RETURN sum(i)` drops from ~4.5s to <10ms
50
+ - **LIMIT short-circuit for scan and expand operators** (#422, #423) — `_pipeline_limit` look-ahead stops scan/expand at row budget; write operators and Filter block short-circuit to preserve correctness
51
+ - **SQLite PRAGMA tuning** (#392, #446) — `synchronous=NORMAL` (eliminates `fdatasync` per commit), 64 MB page cache (`cache_size=-65536`), `temp_store=MEMORY`; safe with WAL mode for analytical workloads
52
+ - **Lazy statistics timestamp** — `_stats_last_updated` stamped at read time in `get_statistics()` rather than on every add; `_defer_stats` flag eliminates per-edge stat overhead during bulk ingest
53
+
54
+ ### CI / Tooling
55
+ - **Test suite zero-base renovation** (#428, #438) — fixture strategy audit, duplication removal, marker consistency, parametrization improvements across unit and integration suites
56
+ - **GHA actions updated** — `actions/upload-artifact` v7, `actions/download-artifact` v8, `codecov/codecov-action` v6, `actions/upload-pages-artifact` v5, `astral-sh/setup-uv` v8.1.0
57
+
10
58
  ## [0.3.8] - 2026-05-02
11
59
 
12
60
  ### Fixed - TCK Feature Completeness (3885/3885 passing)
@@ -51,6 +51,16 @@ make pre-push
51
51
 
52
52
  Runs: format-check, lint, type-check, coverage (85% total, 90% patch).
53
53
 
54
+ **Before running tests locally during planning:** If the branch has no committed changes yet (i.e., you're still in the planning phase), check the last CI run instead of running the full test suite locally. This avoids OOM errors from running all tests unnecessarily.
55
+
56
+ ```bash
57
+ # Check last CI run status and test results
58
+ gh run list --branch main --limit 5
59
+ gh run view <run-id> --log-failed # see only failed tests
60
+ ```
61
+
62
+ Only run tests locally once you have actual code changes to validate.
63
+
54
64
  ### 5. Commit with Issue Number
55
65
 
56
66
  ```bash
@@ -77,16 +87,21 @@ GitHub automatically closes the issue when PR merges.
77
87
  ## Development Commands
78
88
 
79
89
  ```bash
80
- make pre-push # Run all checks (mirrors CI)
90
+ make pre-push # Run all checks (mirrors CI): format, lint, type, security, docstrings, coverage + thresholds
91
+ make pre-push-fast # Fast checks only (no coverage, ~30s): format, lint, type, security, docstrings
81
92
  make test # All tests
82
93
  make test-unit # Unit tests only
83
94
  make test-integration # Integration tests only
84
- make coverage # Run with coverage
95
+ make coverage # Run with coverage + validate thresholds (sharded, includes 85%/90% checks)
96
+ make coverage-quick # Coverage on unit tests only (fast feedback during development)
85
97
  make coverage-report # View HTML coverage report
86
98
  make coverage-diff # Coverage for changed files only
87
99
 
88
100
  # Run tests in parallel (4x faster for TCK)
89
101
  pytest tests/ -n auto
102
+
103
+ # Override worker count (default 4, lower to reduce memory)
104
+ PYTEST_WORKERS=2 make test
90
105
  ```
91
106
 
92
107
  **Coverage Requirements:**
@@ -94,6 +109,8 @@ pytest tests/ -n auto
94
109
  - Patch: 90% minimum for changed files
95
110
  - Best practice: Aim for 100% on new code
96
111
 
112
+ **When to use `pre-push-fast`:** iterating on non-test changes (refactors, docs, config). Always run the full `pre-push` before opening a PR.
113
+
97
114
  ## Architecture: 4-Layer System
98
115
 
99
116
  ```
@@ -0,0 +1,189 @@
1
+ .PHONY: help lint format type-check security test pre-push pre-push-fast clean test-tck docstring-coverage test-network test-perf test-perf-xs test-perf-slow test-perf-large coverage coverage-quick coverage-report coverage-diff coverage-strict check-coverage check-patch-coverage test-durations test-analytics docs-serve docs-build docs-clean
2
+
3
+ help: ## Show this help message
4
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
5
+
6
+ lint: ## Run ruff linter
7
+ uv run ruff check .
8
+
9
+ format: ## Format code with ruff
10
+ uv run ruff format .
11
+
12
+ format-check: ## Check code formatting
13
+ uv run ruff format --check .
14
+
15
+ type-check: ## Run mypy type checker
16
+ uv run mypy src/graphforge --strict-optional --show-error-codes
17
+
18
+ security: ## Run Bandit security scanner
19
+ uv run bandit -c pyproject.toml -r src/
20
+
21
+ docstring-coverage: ## Check docstring coverage (90% minimum)
22
+ uv run interrogate src/graphforge --fail-under 90 --quiet
23
+
24
+ test: ## Run all tests in parallel (excludes snap/network downloads)
25
+ uv run pytest tests/ -n $${PYTEST_WORKERS:-4} -m "not snap"
26
+
27
+ test-unit: ## Run unit tests in parallel
28
+ uv run pytest tests/unit -n $${PYTEST_WORKERS:-4}
29
+
30
+ test-integration: ## Run integration tests in parallel (excludes snap/network downloads)
31
+ uv run pytest tests/integration -n $${PYTEST_WORKERS:-4} -m "not snap"
32
+
33
+ test-network: ## Run external network/download tests (snap datasets; requires internet)
34
+ uv run pytest tests/ -m "snap" -v
35
+
36
+ test-perf-xs: ## Run perf QA for XS/S datasets only (karate + ego-facebook, ~3 MB total)
37
+ uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -k "xs or s_face" -v -s
38
+
39
+ test-perf: ## Run perf QA through M-tier (Amazon 334k nodes, ~15 MB); writes baseline JSON
40
+ uv run pytest tests/perf/ -m "perf and not perf_large and not perf_slow" -v -s
41
+ @echo ""
42
+ @echo "Baseline written to benchmarks/real_dataset_baseline_v0.3.9.json"
43
+
44
+ test-perf-slow: ## Run slow two-hop full-expansion benchmarks (opt-in; minutes on S/M, hours on L)
45
+ uv run pytest tests/perf/ -m "perf_slow" -v -s
46
+
47
+ test-perf-large: ## Run L/XL tiers (livejournal 500 MB, cit-patents 270 MB, orkut 1.7 GB); needs 16 GB RAM
48
+ uv run pytest tests/perf/ -m "perf and perf_large" -v -s --timeout=3600
49
+
50
+ test-tck: ## Run TCK compliance tests in parallel
51
+ uv run pytest tests/tck/ -n $${PYTEST_WORKERS:-4} -v
52
+
53
+ coverage: ## Run tests with coverage and validate thresholds (sharded to avoid OOM)
54
+ @echo "━━━ Coverage shard 1/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
55
+ uv run coverage erase
56
+ uv run pytest tests/unit tests/integration -m "not snap" \
57
+ --splits 2 --group 1 \
58
+ -n $${PYTEST_WORKERS:-4} \
59
+ --cov=src --cov-branch \
60
+ --cov-report= \
61
+ --cov-append
62
+ @echo "━━━ Coverage shard 2/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
63
+ uv run pytest tests/unit tests/integration -m "not snap" \
64
+ --splits 2 --group 2 \
65
+ -n $${PYTEST_WORKERS:-4} \
66
+ --cov=src --cov-branch \
67
+ --cov-report=term-missing \
68
+ --cov-report=xml \
69
+ --cov-append
70
+ @echo "━━━ Threshold checks ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
71
+ @uv run coverage report --fail-under=85 || \
72
+ (echo "❌ Total coverage below 85% threshold" && exit 1)
73
+ @echo "✅ Total coverage ≥ 85%"
74
+ @DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
75
+ { echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
76
+ CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
77
+ if [ -z "$$CHANGED_FILES" ]; then \
78
+ echo "ℹ️ No source files changed — skipping patch coverage check"; \
79
+ else \
80
+ echo "Changed files:"; \
81
+ echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
82
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
83
+ uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
84
+ (echo "❌ Patch coverage below 90% for changed files" && \
85
+ echo " Run 'make coverage-report' to see detailed coverage" && \
86
+ exit 1); \
87
+ echo "✅ Patch coverage ≥ 90%"; \
88
+ fi
89
+
90
+ coverage-quick: ## Quick coverage on unit tests only (for iterative development)
91
+ @echo "Running unit tests with coverage..."
92
+ uv run pytest tests/unit \
93
+ -n $${PYTEST_WORKERS:-4} \
94
+ --cov=src --cov-branch \
95
+ --cov-report=term-missing \
96
+ --cov-report=xml
97
+
98
+ test-durations: ## Generate .test_durations for pytest-split shard balancing
99
+ uv run pytest tests/unit tests/integration -m "not snap" \
100
+ --store-durations --durations-path=.test_durations -q
101
+
102
+ test-analytics: ## Run tests with analytics output (JUnit XML)
103
+ @echo "Running tests with analytics output..."
104
+ uv run pytest tests/unit tests/integration \
105
+ --junitxml=test-results-local.xml \
106
+ -v
107
+
108
+ check-coverage: ## Validate total coverage meets 85% threshold (uses existing .coverage data)
109
+ @echo "Checking coverage thresholds..."
110
+ @uv run coverage report --fail-under=85 || \
111
+ (echo "❌ Coverage below 85% threshold" && exit 1)
112
+ @echo "✅ Coverage meets threshold"
113
+
114
+ coverage-strict: ## Strict 90% coverage check for new features
115
+ @echo "Checking strict coverage (90%)..."
116
+ @uv run coverage report --fail-under=90 || \
117
+ (echo "❌ Coverage below 90% - consider adding more tests" && exit 1)
118
+ @echo "✅ Coverage meets strict threshold"
119
+
120
+ coverage-report: ## Generate HTML coverage report and open in browser
121
+ @echo "Generating HTML coverage report..."
122
+ uv run coverage html
123
+ @echo "Opening coverage report in browser..."
124
+ @open htmlcov/index.html || xdg-open htmlcov/index.html || \
125
+ echo "Coverage report generated at htmlcov/index.html"
126
+
127
+ coverage-diff: ## Show coverage for changed files only
128
+ @echo "Showing coverage for changed files..."
129
+ @CHANGED_FILES=$$(git diff --name-only origin/main... | grep '\.py$$' || true); \
130
+ if [ -z "$$CHANGED_FILES" ]; then \
131
+ echo "ℹ️ No Python files changed"; \
132
+ else \
133
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
134
+ uv run coverage report --include="$$INCLUDE_PATTERN"; \
135
+ fi
136
+
137
+ check-patch-coverage: ## Validate patch coverage for changed files (90% threshold, uses existing .coverage data)
138
+ @echo "Checking patch coverage for changed files..."
139
+ @DIFF_OUT=$$(git diff --name-only origin/main... 2>&1) || \
140
+ { echo "❌ git diff failed — check that origin/main is accessible"; exit 1; }; \
141
+ CHANGED_FILES=$$(printf '%s\n' "$$DIFF_OUT" | grep '^src/.*\.py$$' || true); \
142
+ if [ -z "$$CHANGED_FILES" ]; then \
143
+ echo "ℹ️ No source files changed - skipping patch coverage check"; \
144
+ else \
145
+ echo "Changed files:"; \
146
+ echo "$$CHANGED_FILES" | sed 's/^/ - /'; \
147
+ INCLUDE_PATTERN=$$(echo "$$CHANGED_FILES" | tr '\n' ',' | sed 's/,$$//'); \
148
+ uv run coverage report --include="$$INCLUDE_PATTERN" --fail-under=90 || \
149
+ (echo "❌ Patch coverage below 90% for changed files" && \
150
+ echo " Run 'make coverage-report' to see detailed coverage" && \
151
+ exit 1); \
152
+ echo "✅ Patch coverage meets 90% threshold"; \
153
+ fi
154
+
155
+ pre-push-fast: ## Run fast checks only — format, lint, type, security, docstrings (no coverage, ~30s)
156
+ @echo "━━━ Format check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
157
+ @$(MAKE) format-check
158
+ @echo "━━━ Lint ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
159
+ @$(MAKE) lint
160
+ @echo "━━━ Type check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
161
+ @$(MAKE) type-check
162
+ @echo "━━━ Security ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
163
+ @$(MAKE) security
164
+ @echo "━━━ Docstring coverage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
165
+ @$(MAKE) docstring-coverage
166
+ @echo "✅ Fast checks passed! Run 'make pre-push' to include coverage."
167
+
168
+ pre-push: ## Run all pre-push checks — fast checks + coverage with thresholds (mirrors CI)
169
+ @$(MAKE) pre-push-fast
170
+ @echo "━━━ Coverage + thresholds ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
171
+ @$(MAKE) coverage
172
+ @echo "✅ All pre-push checks passed!"
173
+
174
+ clean: ## Clean up cache files
175
+ find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
176
+ find . -type d -name .pytest_cache -exec rm -rf {} + 2>/dev/null || true
177
+ find . -type d -name .mypy_cache -exec rm -rf {} + 2>/dev/null || true
178
+ find . -type f -name "*.pyc" -delete 2>/dev/null || true
179
+ rm -f test-results*.xml coverage.xml 2>/dev/null || true
180
+ rm -rf htmlcov/ 2>/dev/null || true
181
+
182
+ docs-serve: ## Serve docs locally with live reload (http://127.0.0.1:8000)
183
+ uv run --group docs mkdocs serve
184
+
185
+ docs-build: ## Build docs site to site/ (strict mode)
186
+ uv run --group docs mkdocs build --strict
187
+
188
+ docs-clean: ## Remove built docs
189
+ rm -rf site/