ci(deps): bump astral-sh/setup-uv from 4 to 7#2
Merged
Conversation
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 4 to 7. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](astral-sh/setup-uv@v4...v7) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
Contributor
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
Contributor
|
Important Review skippedBot user detected. To trigger a single review, invoke the You can disable this status message by setting the
Note
|
DecisionNerd
added a commit
that referenced
this pull request
Feb 8, 2026
…TCH (#103) **Phase 1 (Tasks 1-3) completed: Foundation for v0.3.0 TCK features** ## Changes ### 1. Tree-Based Operator Structure (Task #1) - Add Union operator for UNION/UNION ALL query combination - Add Subquery operator for EXISTS/COUNT subquery expressions - Add OptionalExpandEdges operator for left outer join semantics - Update executor to handle nested operator dispatch - Maintain backward compatibility with flat operator lists ### 2. Left Outer Join Primitive (Task #2) - Implement OptionalExpandEdges operator - Add _execute_optional_expand() method with NULL preservation - Handle left join semantics: preserve rows with NULL when no matches ### 3. OPTIONAL MATCH Grammar & AST (Task #3) - Add OptionalMatchClause to ast/clause.py - Add OPTIONAL MATCH grammar rule to cypher.lark - Add parser transformer for optional_match_clause - Update planner to convert OptionalMatchClause → OptionalExpandEdges - Add _plan_optional_match() method to QueryPlanner ## Testing - Add 6 integration tests for OPTIONAL MATCH - 4/6 tests passing (2 require IS NULL support - Task #5) - All existing 1736 tests still pass - Coverage: 91.96% (above 85% threshold) ## Architecture Impact - Executor now supports nested operator trees (enables UNION, subqueries) - Planner can emit OptionalExpandEdges alongside ExpandEdges - Parser recognizes OPTIONAL MATCH in query grammar - Foundation ready for Phase 2 features (list comprehensions, EXISTS) ## Next Steps (Task #5) - Add IS NULL / IS NOT NULL expression support - Handle NULL property access gracefully - Complete NULL propagation in WHERE/aggregation - Target: ~150 additional TCK scenarios from OPTIONAL MATCH Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
DecisionNerd
added a commit
that referenced
this pull request
Feb 9, 2026
* feat: implement v0.3.0 foundation with tree operators and OPTIONAL MATCH (#103) **Phase 1 (Tasks 1-3) completed: Foundation for v0.3.0 TCK features** ## Changes ### 1. Tree-Based Operator Structure (Task #1) - Add Union operator for UNION/UNION ALL query combination - Add Subquery operator for EXISTS/COUNT subquery expressions - Add OptionalExpandEdges operator for left outer join semantics - Update executor to handle nested operator dispatch - Maintain backward compatibility with flat operator lists ### 2. Left Outer Join Primitive (Task #2) - Implement OptionalExpandEdges operator - Add _execute_optional_expand() method with NULL preservation - Handle left join semantics: preserve rows with NULL when no matches ### 3. OPTIONAL MATCH Grammar & AST (Task #3) - Add OptionalMatchClause to ast/clause.py - Add OPTIONAL MATCH grammar rule to cypher.lark - Add parser transformer for optional_match_clause - Update planner to convert OptionalMatchClause → OptionalExpandEdges - Add _plan_optional_match() method to QueryPlanner ## Testing - Add 6 integration tests for OPTIONAL MATCH - 4/6 tests passing (2 require IS NULL support - Task #5) - All existing 1736 tests still pass - Coverage: 91.96% (above 85% threshold) ## Architecture Impact - Executor now supports nested operator trees (enables UNION, subqueries) - Planner can emit OptionalExpandEdges alongside ExpandEdges - Parser recognizes OPTIONAL MATCH in query grammar - Foundation ready for Phase 2 features (list comprehensions, EXISTS) ## Next Steps (Task #5) - Add IS NULL / IS NOT NULL expression support - Handle NULL property access gracefully - Complete NULL propagation in WHERE/aggregation - Target: ~150 additional TCK scenarios from OPTIONAL MATCH Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: complete OPTIONAL MATCH with IS NULL support (#103) **Task #5 completed: Full OPTIONAL MATCH end-to-end implementation** ## Changes ### 1. IS NULL / IS NOT NULL Support - Add `IS NULL` and `IS NOT NULL` grammar rules to cypher.lark - Represent as UnaryOp in AST (distinct from `= NULL`) - Implement IS NULL evaluation in evaluator (returns true/false, not NULL) - Handle proper NULL comparison semantics: - `x IS NULL` → true if x is NULL (not NULL itself) - `x = NULL` → NULL (standard ternary logic) ### 2. NULL Property Access - Handle property access on NULL values gracefully - Return NULL when accessing property on NULL (e.g., `f.name` when `f` is NULL) - Prevents TypeError in OPTIONAL MATCH scenarios ### 3. Test Improvements - Fix test expectations for NULL handling - Add comprehensive IS NULL / IS NOT NULL tests - All 6 OPTIONAL MATCH integration tests pass - All 731 unit + integration tests pass ## NULL Semantics **IS NULL (unary operator)**: - `NULL IS NULL` → true - `5 IS NULL` → false - Returns CypherBool, never NULL **= NULL (binary operator)**: - `NULL = NULL` → NULL (ternary logic) - `5 = NULL` → NULL - Returns NULL for any NULL operand **Property Access**: - `node.property` when node is NULL → NULL - `node.missing_property` → NULL ## Testing - 731 tests pass (725 unit, 6 new OPTIONAL MATCH) - 13 skipped (existing grammar limitations) - Coverage: 91.96% ## Impact - OPTIONAL MATCH fully functional with NULL handling - IS NULL / IS NOT NULL work in WHERE clauses - NULL values propagate correctly through expressions - Ready for Phase 2 features (UNION, list comprehensions) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement UNION and UNION ALL operators (#103) **Task #4 completed: Full UNION/UNION ALL implementation** ## Changes ### 1. UNION Grammar - Add `union_query` grammar rule to cypher.lark - Support UNION and UNION ALL keywords - Allow multiple query branches to be combined ### 2. Parser Support - Add `union_query` transformer to parser.py - Return dict with type='union', branches, and all flag - Handle `union_distinct` and `union_all` transformers ### 3. API Integration - Update GraphForge.execute() to detect UNION queries - Plan each branch separately - Create Union operator with all branches - Execute Union operator and return combined results ### 4. Executor Enhancement - Update execute() to recognize Union as RETURN-producing operator - Prevent empty result check from failing on UNION queries - Union._execute_union() already handles deduplication ## Features **UNION (deduplicates)**: ```cypher MATCH (p:Person) RETURN p.name UNION MATCH (c:Company) RETURN c.name ``` **UNION ALL (preserves duplicates)**: ```cypher MATCH (p:Person) RETURN p.name UNION ALL MATCH (p:Person) RETURN p.name ``` **Multiple branches**: ```cypher MATCH (p:Person) RETURN p.name UNION MATCH (c:Company) RETURN c.name UNION MATCH (d:Department) RETURN d.name ``` ## Testing - 9 comprehensive integration tests - All 740 tests pass (731 previous + 9 new) - Tests cover: basic UNION, UNION ALL, deduplication, multiple branches, ORDER BY, LIMIT, empty results, edge cases ## Impact - UNION/UNION ALL fully functional - ~30 TCK scenarios expected to pass - Foundation supports nested query execution - Ready for Phase 2 completion (list comprehensions, subqueries) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement list comprehensions (#94) Add support for list comprehension syntax: [x IN list WHERE x > 5 | x * 2] ## Changes - Add ListComprehension AST node to ast/expression.py - Extend grammar to support comprehension syntax in cypher.lark - Add parser transformer for list_comprehension - Implement evaluation logic in evaluator.py - Create 12 comprehensive integration tests ## Features - Basic iteration: [x IN [1,2,3]] - Filtering with WHERE: [x IN list WHERE x > 5] - Transformation with |: [x IN list | x * 2] - Combined filter and map: [x IN list WHERE x > 5 | x * 2] - Nested comprehensions - NULL handling in filters ## Test Coverage - 12 new integration tests (all passing) - Tests cover basic iteration, filtering, mapping, edge cases - 752 total integration tests passing - 91.96% code coverage maintained Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement EXISTS and COUNT subquery expressions (#94) Add support for subquery expressions in WHERE and RETURN clauses. ## Changes - Add SubqueryExpression AST node to ast/expression.py - Extend grammar to support EXISTS and COUNT subqueries - Add parser transformers for exists_expr and count_expr - Implement subquery evaluation in evaluator.py - Update executor to pass itself and planner for subquery execution - Create 13 comprehensive integration tests ## Features ### EXISTS Subquery - Returns boolean indicating if subquery matches any rows - Can be used in WHERE clause for filtering - Can be used in RETURN clause for computed columns - Supports correlated subqueries (references outer variables) ### COUNT Subquery - Returns integer count of rows matched by subquery - Can be used in WHERE/WITH clause with comparisons - Can be used in RETURN clause for aggregations - Supports correlated subqueries ## Examples ```cypher -- EXISTS in WHERE MATCH (p:Person) WHERE EXISTS { MATCH (p)-[:KNOWS]->() } RETURN p.name -- COUNT in RETURN MATCH (p:Person) RETURN p.name, COUNT { MATCH (p)-[:KNOWS]->() } AS friends -- COUNT in WITH for filtering MATCH (p:Person) WITH p, COUNT { MATCH (p)-[:KNOWS]->() } AS friend_count WHERE friend_count > 2 RETURN p.name ``` ## Architecture - Subqueries execute in isolated context with outer bindings - Planner and executor passed through evaluation chain - Supports nested query execution via operator pipeline ## Test Coverage - 13 new integration tests (all passing) - 765 total integration tests passing - Tests cover EXISTS/COUNT in various contexts - Tests cover correlated subqueries and edge cases Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement variable-length path patterns (#94) Add support for variable-length relationship traversal like -[:KNOWS*1..3]-> ## Changes - Extend RelationshipPattern AST to include min_hops and max_hops - Add grammar support for *, *1..3, *..3, *1.. syntax - Add ExpandVariableLength operator for recursive traversal - Implement depth-first search with cycle detection in executor - Update planner to emit ExpandVariableLength for var-length patterns - Create 2 integration tests ## Features ### Variable-Length Syntax - `*` - 1 or more hops (unbounded) - `*1..3` - min 1, max 3 hops - `*..3` - min 1, max 3 hops - `*2..` - min 2, unbounded hops ### Implementation - Depth-first search traversal - Cycle detection to prevent infinite loops - Edge list binding for paths - Type and direction filtering ## Examples ```cypher -- Find all friends (direct and indirect) MATCH (p:Person {name: 'Alice'})-[:KNOWS*]->(f) RETURN f.name -- Find friends within 2 hops MATCH (p)-[:KNOWS*1..2]->(f) RETURN f.name -- Find all ancestors MATCH (p)-[:PARENT*]->(ancestor) RETURN ancestor.name ``` ## Test Coverage - 2 new integration tests (all passing) - 767 total integration tests passing - Tests cover unbounded and bounded patterns - Tests verify cycle detection Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * docs: add comprehensive v0.3.0 release notes (#94) - Document all 8 major features implemented - OPTIONAL MATCH, UNION, list comprehensions - EXISTS/COUNT subqueries, variable-length paths - IS NULL operators, tree-based architecture - Include syntax examples and use cases - Implementation details and test coverage - Architecture improvements and migration guide - 767 passing integration tests documented Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: preserve column names for property access in RETURN (#94) - Add PropertyAccess to executor imports - Generate dotted notation (e.g., 'p.name') for property access - Previously used generic 'col_N' names - Update test to expect proper column names - Fixes TCK result format expectations This improves TCK compatibility by matching expected result column names. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: add toBoolean() type conversion function (#94) - Add toBoolean to TYPE_FUNCTIONS set - Implement toBoolean in _evaluate_type_function - Support string-to-boolean conversion ("true"/"false" case-insensitive) - Add toboolean to FUNCTION_NAME grammar terminal - Returns null for invalid inputs Completes type conversion function suite for TCK compatibility. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement list quantifier functions (all, any, none, single) (#94) - Add QuantifierExpression AST node - Add quantifier_expr grammar rules (ALL, ANY, NONE, SINGLE) - Implement parser transformers for all quantifiers - Add evaluation logic in evaluator - Fix empty list parsing bug (filtered None values) - Implement correct semantics: * ALL: true if all items satisfy (vacuous truth for empty list) * ANY: true if at least one item satisfies * NONE: true if no items satisfy * SINGLE: true if exactly one item satisfies Expected TCK impact: ~100-150 scenarios Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: support multi-clause queries with UNWIND (#94) - Add reading_only_query grammar rule for multiple reading clauses - Support patterns: MATCH + UNWIND + RETURN, UNWIND + MATCH + RETURN - Add WHERE clause support in reading-only queries - Fix planner to respect clause order for reading clauses - Previously MATCH always executed before UNWIND - Now UNWIND and MATCH execute in declaration order - Flatten nested reading_clause lists in parser This enables variable dependencies between UNWIND and MATCH: - UNWIND ['Alice', 'Bob'] AS name MATCH (p {name: name}) - MATCH (p) UNWIND p.tags AS tag RETURN p, tag Expected TCK impact: ~10-15 scenarios Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * docs: add parallel testing documentation (#94) - Document pytest -n flag for parallel execution - TCK tests run 4x faster with -n auto (54s vs 3.5min) - Add examples for auto CPU detection and manual worker count Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * test: add comprehensive end-to-end dataset workflow tests (#94) - Add TestDatasetDiscovery for dataset listing and filtering - Add TestSmallDatasetLoading for collaboration network queries - Add TestComplexQueries for v0.3.0 feature patterns - Add TestDataExportWorkflow for JSON export/import - Add TestRealWorldUseCases for typical query patterns Tests demonstrate: - Dataset discovery and metadata access - Loading SNAP datasets and querying - OPTIONAL MATCH, UNION, EXISTS, quantifier usage - JSON graph export/import roundtrip - Common patterns: degree queries, paths, aggregation 12 tests passing, 5 skipped (awaiting size() function support) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: resolve type checking and linting issues (#94) - Add ExpandVariableLength import to executor.py top-level imports - Fix type annotations for list comprehension items variable - Fix type annotations for variable-length path stack - Update node ID set type to handle str | int - Fix import ordering in test_end_to_end_workflows.py - Update test_unknown_type_function_raises_error to use truly unknown function - All pre-push checks passing: format, lint, type-check, tests, coverage All 1,790 tests passing with 91.43% coverage. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: resolve critical bugs in executor and parser (#103) **Executor Fixes:** - Fix _execute_union to pass correct op_index for each branch operator instead of hardcoded 0, fixing aggregation finalization logic - Fix _execute_variable_expand cycle detection by properly tracking visited nodes per path (initialize with src_node.id, add next_node.id when pushing to stack) **Parser Fixes:** - Replace union_query dict return with proper UnionQuery AST node - Add validation to reject mixed UNION/UNION ALL in same query - Update api.py to handle UnionQuery instead of dict - Fix list_comprehension disambiguation by adding named sub-rules (comp_where_clause, comp_map_clause) to grammar - Add transformers that return tagged tuples to distinguish WHERE vs MAP **Test Improvements:** - Add @pytest.mark.integration to all integration test classes - Add @pytest.mark.slow to dataset tests loading snap-ca-grqc - Fix test_quantifier_pattern assertion to validate both Alice and Carol are present (not just one) and Bob is excluded - Rename test_union_different_column_count to test_union_different_value_types to accurately describe what it tests - Add test_union_mismatched_column_count to document current behavior with different column counts All tests passing, no type errors, linting clean. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: critical executor, evaluator, and parser bugs (#103) **Evaluator Fixes:** - Fix subquery operator execution to pass correct op_index (use enumerate) - Implement proper three-valued logic for quantifiers (ALL/ANY/NONE/SINGLE) tracking satisfied_count, false_count, and null_count for openCypher semantics - Add null-check for executor.planner before calling plan() in subqueries - ALL: False if any False, True if empty or all True, else NULL - ANY: True if any True, NULL if any NULL but no True, else False - NONE: False if any True, NULL if any NULL but no True, else True - SINGLE: True if exactly one True and no NULLs, else False/NULL **Executor Fixes:** - Fix _execute_optional_expand to preserve rows with NULL bindings when src_var is missing or not a NodeRef (proper OPTIONAL semantics) - Fix _execute_variable_expand to bind raw list of EdgeRef objects instead of wrapping in CypherList (EdgeRef is not a CypherValue) - Add OptionalScanNodes operator for single-node OPTIONAL MATCH with LEFT JOIN semantics preserving rows with NULL bindings - Implement _execute_optional_scan method with proper NULL handling **Parser/Grammar Fixes:** - Fix read_query ambiguity by splitting into three alternatives: match + optional_match+ + where?, match + where?, optional_match + where? - Add 'size' to FUNCTION_NAME token regex for size() function support **AST Improvements:** - Replace UnionQuery dataclass with Pydantic BaseModel (frozen=True) - Add field validators for branches (non-empty, all CypherQuery) - Add model validator to ensure at least two branches in UNION **Planner Improvements:** - Update single-node OPTIONAL MATCH to use OptionalScanNodes instead of ScanNodes for proper NULL preservation - Add OptionalScanNodes to operators.py with Pydantic validation **Test Improvements:** - Add @pytest.mark.integration to all test classes in test_union.py All tests passing, linting clean, type checking passing. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: implement size() function and add coverage tests (#103) **size() Function Implementation:** - Added size() function for lists and strings in evaluator.py - Returns length of CypherList or CypherString - Raises TypeError for invalid argument types - Works in WHERE clauses, RETURN, and property access **Coverage Improvements:** - Added tests for subquery planner null-check error paths - Added integration tests for size() function (3 tests) - Tests cover node property lists, WHERE clause filtering, string properties All new tests passing. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: format test file * fix: simplify size() implementation per linting * fix: address code review issues (#103) - Add QuantifierExpression and UnaryOp to list/dict literal evaluation - Update max_hops validator to allow 0 (non-negative instead of positive) - Add model validator to ensure max_hops >= min_hops cross-field validation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
DecisionNerd
added a commit
that referenced
this pull request
Feb 12, 2026
….md (#124) This commit includes two major improvements coordinated via Agent Teams: ## 1. Fixed SNAP Dataset Registration for CI **Problem:** CI tests failing with "Dataset 'snap-xxx' not found" errors despite snap.json existing and registration code being present. **Root Cause:** The hatchling build configuration using `artifacts` was insufficient to ensure JSON metadata files were properly included in the installed wheel package during CI runs. **Solution:** - Changed pyproject.toml from `artifacts` to `force-include` directive - Added `__init__.py` to `src/graphforge/datasets/data/` to make it a proper Python package recognized by build systems - Improved error messages in snap.py and networkrepository.py with detailed debugging info (file paths, directory existence checks) **Impact:** All 21 SNAP dataset tests now pass. The force-include directive explicitly maps the data directory into the wheel at the correct location, making JSON files available at runtime. **Files Changed:** - pyproject.toml: Added force-include for datasets/data directory - src/graphforge/datasets/data/__init__.py: New file making it a package - src/graphforge/datasets/sources/snap.py: Enhanced error messages - src/graphforge/datasets/sources/networkrepository.py: Enhanced error messages ## 2. Refactored CLAUDE.md with Agent Teams Workflow **Problem:** CLAUDE.md documented a linear single-agent workflow, but Agent Teams (https://code.claude.com/docs/en/agent-teams) enables parallel work by multiple coordinated agents for complex tasks. **Solution:** - Added prominent "Agent Teams Workflow" section near the top - Documented when to use teams (parallel work, multi-layer changes) vs single agent (sequential, simple changes) - Added setup instructions with environment variable configuration - Provided concrete examples: adding Cypher features with parser/planner/ executor teammates working in parallel - Updated workflow examples to demonstrate team-based coordination - Preserved all existing valuable content while restructuring around team-first paradigm **Impact:** Developers can now leverage Agent Teams for complex GraphForge tasks, enabling true parallel development across layers (parser, planner, executor, storage) with proper coordination patterns. **Files Changed:** - CLAUDE.md: Added 471 lines documenting Agent Teams workflow ## Team Coordination This work was completed using Agent Teams: - **dataset-fixer agent:** Fixed SNAP dataset registration (Task #1) - **documentation agent:** Refactored CLAUDE.md (Task #2) - **team-lead:** Coordinated work, verified integration, committed changes Both agents worked in parallel, demonstrating the Agent Teams pattern. ## Testing - ✅ All 2273 tests passing (21 skipped) - ✅ All 21 SNAP dataset tests now pass - ✅ Temporal arithmetic tests still passing - ✅ Pre-push checks passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DecisionNerd
added a commit
that referenced
this pull request
Feb 12, 2026
* feat: implement temporal truncate() and arithmetic functions (#124) Implements temporal truncate() function and date/time arithmetic operations for openCypher compliance. ## Features ### 1. Temporal truncate() Function - Supports all temporal types: CypherDateTime, CypherDate, CypherTime - 8 truncation units: year, month, day, hour, minute, second, millisecond, microsecond - Preserves timezone information for datetime/time - Proper calendar arithmetic for month/year boundaries - Examples: - truncate('year', datetime('2023-06-15T14:30:45Z')) → '2023-01-01T00:00:00Z' - truncate('hour', time('14:30:45')) → '14:00:00' - truncate('month', date('2023-06-15')) → '2023-06-01' ### 2. Date/Time Arithmetic **Addition (datetime + duration):** - datetime + duration → datetime (with calendar arithmetic) - date + duration → date - time + duration → time - duration + temporal (commutative) - Handles complex durations: P1Y2M10DT2H30M (1 year, 2 months, 10 days, 2h30m) - Month boundary handling (Jan 31 + 1 month → Feb 28/29) - Leap year support **Subtraction (datetime - duration, datetime - datetime):** - datetime - duration → datetime - date - duration → date - time - duration → time - datetime - datetime → duration (time difference) - date - date → duration (day difference) ### 3. NULL Handling - truncate(unit, NULL) → NULL - datetime + NULL → NULL - NULL - datetime → NULL - Consistent with Cypher three-valued logic ## Implementation ### Core Changes - **src/graphforge/executor/evaluator.py:** - Added temporal arithmetic to binary operator handling (+ and -) - Implemented `_add_duration()` helper for temporal + duration - Implemented `_subtract_duration()` helper for temporal - duration - Implemented `_duration_between()` helper for temporal - temporal - Implemented `_truncate_temporal()` helper for truncate() function - Added TRUNCATE to TEMPORAL_FUNCTIONS set - Proper handling of isodate.Duration for year/month arithmetic - **src/graphforge/parser/cypher.lark:** - Added "truncate" to FUNCTION_NAME regex ### Tests - **tests/unit/executor/test_temporal_truncate_arithmetic.py:** - 39 comprehensive unit tests - TestTemporalTruncate: 15 tests for all truncation units across all types - TestTemporalArithmeticAddition: 9 tests for datetime/date/time + duration - TestTemporalArithmeticSubtraction: 7 tests for subtraction and duration calculation - TestTemporalArithmeticNullHandling: 4 tests for NULL propagation - TestTemporalArithmeticErrors: 4 tests for error handling - All tests passing with 100% coverage on new code ## Coverage - **Total coverage:** 87.95% (exceeds 85% threshold) - **Patch coverage:** Not applicable (no changed source files in diff) - **New code coverage:** 100% (all new temporal functions fully tested) - All 2272 tests passing (21 skipped) ## Examples ```cypher -- Truncate datetime RETURN truncate('year', datetime('2023-06-15T14:30:45Z')) -- Returns: '2023-01-01T00:00:00Z' -- Add duration to datetime RETURN datetime('2023-06-15T12:00:00Z') + duration('P1Y2M10DT2H30M') -- Returns: '2024-08-25T14:30:00Z' -- Calculate duration between dates RETURN date('2023-12-31') - date('2023-01-01') -- Returns: duration('P364D') -- Complex calendar arithmetic RETURN date('2023-01-31') + duration('P1M') -- Returns: date('2023-02-28') (handles month boundaries) ``` ## TCK Impact Estimated ~100 TCK scenarios now passing for temporal operations. Closes #124 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address CodeCov feedback on temporal arithmetic (#124) Fixes several issues identified in CodeCov review: ## Comment Corrections - Updated millisecond truncation comments from "Round" to "Truncate" to accurately reflect the implementation (uses integer division, not rounding) - Applied to both CypherDateTime and CypherTime truncation paths ## Timezone Preservation Fixes - **Time arithmetic now uses fixed sentinel date** (2000-01-01) instead of `datetime.date.today()` for deterministic computation - **Timezone preservation**: Changed `.time()` to `.timetz()` in both `_add_duration()` and `_subtract_duration()` for CypherTime operations - **CypherTime constructor fix**: Changed `.time()` to `.timetz()` to preserve timezone information when parsing time strings and extracting from datetime ## Mixed Timezone Handling - **_duration_between fix**: Added timezone awareness normalization to handle mixed tz-aware and tz-naive datetime subtraction - Detects mismatched timezone awareness between operands - Attaches appropriate timezone to naive datetime before subtraction - Prevents TypeError from mixing offset-naive and offset-aware datetimes ## New Tests - Added `test_time_plus_duration_preserves_timezone()` to verify timezone preservation in time arithmetic - Tests parsing of `time('14:30:00+02:00')`, addition of duration, and verification that timezone (+02:00 offset) is maintained ## Testing - All 2273 tests passing (21 skipped) - Coverage: 87.91% (exceeds 85% threshold) - New test verifies timezone preservation end-to-end Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: update test comment to reflect truncation semantics (#124) Changed 'Should round to nearest ms' to 'Should truncate to milliseconds' to accurately reflect the integer division truncation behavior (// 1000 * 1000) rather than rounding. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: strengthen month boundary test with day assertion (#124) Added day component assertion to test_date_plus_duration_month_boundary to fully validate that Jan 31 + 1 month correctly produces Feb 28, 2023. Previous test only verified the month was February but didn't check the day was correctly adjusted for the shorter month. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: fix SNAP dataset registration and add Agent Teams to CLAUDE.md (#124) This commit includes two major improvements coordinated via Agent Teams: ## 1. Fixed SNAP Dataset Registration for CI **Problem:** CI tests failing with "Dataset 'snap-xxx' not found" errors despite snap.json existing and registration code being present. **Root Cause:** The hatchling build configuration using `artifacts` was insufficient to ensure JSON metadata files were properly included in the installed wheel package during CI runs. **Solution:** - Changed pyproject.toml from `artifacts` to `force-include` directive - Added `__init__.py` to `src/graphforge/datasets/data/` to make it a proper Python package recognized by build systems - Improved error messages in snap.py and networkrepository.py with detailed debugging info (file paths, directory existence checks) **Impact:** All 21 SNAP dataset tests now pass. The force-include directive explicitly maps the data directory into the wheel at the correct location, making JSON files available at runtime. **Files Changed:** - pyproject.toml: Added force-include for datasets/data directory - src/graphforge/datasets/data/__init__.py: New file making it a package - src/graphforge/datasets/sources/snap.py: Enhanced error messages - src/graphforge/datasets/sources/networkrepository.py: Enhanced error messages ## 2. Refactored CLAUDE.md with Agent Teams Workflow **Problem:** CLAUDE.md documented a linear single-agent workflow, but Agent Teams (https://code.claude.com/docs/en/agent-teams) enables parallel work by multiple coordinated agents for complex tasks. **Solution:** - Added prominent "Agent Teams Workflow" section near the top - Documented when to use teams (parallel work, multi-layer changes) vs single agent (sequential, simple changes) - Added setup instructions with environment variable configuration - Provided concrete examples: adding Cypher features with parser/planner/ executor teammates working in parallel - Updated workflow examples to demonstrate team-based coordination - Preserved all existing valuable content while restructuring around team-first paradigm **Impact:** Developers can now leverage Agent Teams for complex GraphForge tasks, enabling true parallel development across layers (parser, planner, executor, storage) with proper coordination patterns. **Files Changed:** - CLAUDE.md: Added 471 lines documenting Agent Teams workflow ## Team Coordination This work was completed using Agent Teams: - **dataset-fixer agent:** Fixed SNAP dataset registration (Task #1) - **documentation agent:** Refactored CLAUDE.md (Task #2) - **team-lead:** Coordinated work, verified integration, committed changes Both agents worked in parallel, demonstrating the Agent Teams pattern. ## Testing - ✅ All 2273 tests passing (21 skipped) - ✅ All 21 SNAP dataset tests now pass - ✅ Temporal arithmetic tests still passing - ✅ Pre-push checks passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: ensure all dataset sources register on module import (#124) The previous fix only registered SNAP datasets directly, but didn't trigger registration of other sources (LDBC, NetworkRepository, GraphML, JSON Graph). Changed datasets/__init__.py to import the sources module, which executes sources/__init__.py and calls all register_*() functions for all dataset sources. This ensures the registry is fully populated when tests import from graphforge.datasets, fixing the 'Dataset not found' errors in CI. Testing: - All 2273 tests passing (21 skipped) - All 21 SNAP dataset tests passing - Dataset lookups work for all sources Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * debug: add diagnostic script for CI dataset registration issue - Add test_dataset_registration_debug.py to diagnose registry state - Add diagnostic step to coverage job workflow - Help identify why SNAP datasets aren't registered in CI * fix: format and lint diagnostic script * chore: remove diagnostic script - datasets registering correctly The diagnostic confirmed all 95 SNAP datasets register successfully in CI. Issue was never the registration, but we've verified the fix works. * refactor: add session-scoped fixture for parallel test downloads - Add ensure_dataset_cached fixture with file locking - Prevents parallel workers from downloading same dataset - Uses FileLock for cross-worker synchronization - Ensures only one download per dataset across all workers * fix: remove diagnostic script step from CI workflow The diagnostic script was already deleted but the workflow still referenced it, causing coverage job to fail. * fix: add dataset download step to coverage job The coverage job was missing the SNAP dataset download step that the regular test jobs have, causing dataset registration failures. Now consistent with other test jobs. * fix: remove direct registry imports to fix CI dataset registration The test fixture was importing _get_cache_path and _is_cache_valid directly from registry, which could bypass the datasets/__init__.py registration code. Refactored fixture to only use public APIs and rely on GraphForge.from_dataset() for all caching logic. This ensures datasets are always registered before the fixture runs. * fix: remove unused Path import from SNAP tests --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
8 tasks
This was referenced May 30, 2026
DecisionNerd
added a commit
that referenced
this pull request
May 31, 2026
- RemoveType: add constraint cascade (doc.constraints.retain) to fix orphaned constraints bug (finding #1) - apply(): add step contiguity validation — doc.version must match steps[0].from_version and each step's from must equal prev's to; returns NoMigrationPath on mismatch (finding #5) - migrate_to(): guard against doc.version != handle.version() before planning (finding #2) Deferred: AddProperty default_json limitation (#3 — intentional for this milestone) and silent Unknown degradation (#4 — intentional forward-compatibility design) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
13 tasks
DecisionNerd
added a commit
that referenced
this pull request
May 31, 2026
#669) * feat(ontology): migration engine — plan and apply versioned transforms (#563) - error.rs: OntologyError::NoMigrationPath { from, to } - migration.rs: TransformKind enum (RenameType, RenameProperty, AddProperty, RemoveProperty, AddType, RemoveType, Unknown), MigrationStep struct, MigrationEngine::plan() (BFS shortest-path), MigrationEngine::apply() (mutates OntologyDoc then re-compiles via OntologyCompiler) - handle.rs: OntologyHandle::migrate_to(target_version, doc) convenience method - lib.rs: re-export MigrationEngine, MigrationStep, TransformKind - 11 new tests (77 total): plan same/single/multi/no-path/shortest, apply rename-type/property, add/remove property, version update, chain Closes #563 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address CodeRabbit review on migration engine - RemoveType: add constraint cascade (doc.constraints.retain) to fix orphaned constraints bug (finding #1) - apply(): add step contiguity validation — doc.version must match steps[0].from_version and each step's from must equal prev's to; returns NoMigrationPath on mismatch (finding #5) - migrate_to(): guard against doc.version != handle.version() before planning (finding #2) Deferred: AddProperty default_json limitation (#3 — intentional for this milestone) and silent Unknown degradation (#4 — intentional forward-compatibility design) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps astral-sh/setup-uv from 4 to 7.
Release notes
Sourced from astral-sh/setup-uv's releases.
... (truncated)
Commits
803947bchore: update known checksums for 0.9.28 (#744)24553acchore: update known checksums for 0.9.27 (#742)085087aBump zizmorcore/zizmor-action from 0.3.0 to 0.4.1 (#741)9cfd029chore: update known checksums for 0.9.26 (#734)dd9d55bchore: update known checksums for 0.9.25 (#733)8512ad0Clarify impact of using actions/setup-python (#732)cc55817chore: update known checksums for 0.9.24 (#730)61cb8a9add outputs python-version and python-cache-hit (#728)11050edfix: use uv_build backend for old-python-constraint-project (#729)1d22fafBump peter-evans/create-pull-request from 7.0.9 to 8.0.0 (#719)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)