Skip to content

docs(gfql): Comprehensive Let bindings and Call operations documentation#708

Closed
lmeyerov wants to merge 11 commits into
feature/gfql-pr5-rename-chain-dag-to-let-v2from
feature/gfql-pr3-comprehensive-docs
Closed

docs(gfql): Comprehensive Let bindings and Call operations documentation#708
lmeyerov wants to merge 11 commits into
feature/gfql-pr5-rename-chain-dag-to-let-v2from
feature/gfql-pr3-comprehensive-docs

Conversation

@lmeyerov

@lmeyerov lmeyerov commented Jul 21, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR adds comprehensive documentation for Let bindings and Call operations, completing the documentation updates for the GFQL language enhancements.

Note: This PR has been rebased onto PR #713 (chain_dag→chain_let rename) to create a single linear stack for easier auditing.

Stack Order

This PR builds on top of:

Documentation Updates

Let Bindings Documentation

  • Added detailed documentation for let() bindings in the GFQL quick start guide
  • Included examples of variable creation, reuse, and chaining patterns
  • Documented naming conventions and best practices
  • Added Let bindings to the language specification with syntax and semantics

Call Operations Documentation

  • Comprehensive documentation for call() operations in GFQL
  • Examples of using pandas, numpy, and custom functions
  • Schema validation and type safety documentation
  • Added Call operations to the language specification

General Documentation Improvements

  • Updated all documentation to use gfql() instead of chain() consistently
  • Enhanced the GFQL language specification with Let and Call sections
  • Updated CHANGELOG.md to reflect the new features and promote gfql() usage
  • Added practical examples to the pattern mining notebook demonstrating Let bindings and Call operations

Documentation Files Modified

  • docs/source/gfql/quick.rst - Added Let bindings and Call operations sections
  • docs/source/gfql/spec/language.md - Added formal specification for Let and Call
  • docs/source/gfql/spec/cypher_mapping.md - Updated Cypher mapping examples
  • docs/source/gfql/translate.rst - Added Let and Call translation examples
  • demos/demos_by_use_case/hop_and_chain_graph_pattern_mining.ipynb - Added practical examples
  • Various other docs updated to use gfql() consistently

This completes the documentation requirements for the Let bindings and Call operations features introduced in the GFQL stack.

🤖 Generated with Claude Code

Co-Authored-By: Claude noreply@anthropic.com

@lmeyerov
lmeyerov force-pushed the feature/gfql-pr1-3-call-operations branch from 0db7223 to b752f1f Compare July 21, 2025 11:09
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch 3 times, most recently from a3ef363 to b1ea6ff Compare July 21, 2025 11:35
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr1-3-call-operations branch 3 times, most recently from d7faad0 to f4bdab0 Compare July 21, 2025 21:07
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch 2 times, most recently from 7b33919 to 999c5f9 Compare July 22, 2025 07:28
lmeyerov added a commit that referenced this pull request Jul 22, 2025
…lasses

Replace internal class names (ASTLet, ASTChainRef, ASTCall) with user-friendly
aliases in documentation to improve readability and consistency.

Changes:
- demos/gfql/call_operations.ipynb: Update imports to use friendly aliases
- docs/source/gfql/spec/wire_protocol.md: Update examples to use remote_dataset and call

Part of PR #708
lmeyerov added a commit that referenced this pull request Jul 22, 2025
…mples

Completely rewrite call_operations.ipynb to showcase real graph algorithms and
capabilities rather than hypothetical custom functions.

Changes:
- Start with PageRank, community detection, and other graph algorithms
- Demonstrate GPU acceleration with compute_cugraph and layout_cugraph
- Show degree calculations, visual encodings, and transformations
- Move custom functions to end as 'Advanced' section (minimal coverage)
- Use realistic social network example instead of fake network traffic

The new structure better reflects typical GFQL usage where users leverage
powerful built-in methods from cuGraph, igraph, and other libraries rather
than writing custom functions.

Structure: Algorithms → Metrics → Layouts → Visual → Transformations → Custom

Part of PR #708
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from 3659aa3 to 30eba49 Compare July 23, 2025 03:35
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr1-3-call-operations branch 5 times, most recently from 7025999 to 60c8cd2 Compare July 25, 2025 00:03
lmeyerov added a commit that referenced this pull request Jul 25, 2025
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from 84658bc to 857d568 Compare July 25, 2025 02:28
lmeyerov added a commit that referenced this pull request Jul 25, 2025
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from dde58eb to ec844db Compare July 25, 2025 03:46
lmeyerov added a commit that referenced this pull request Jul 25, 2025
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from ec844db to 5b73b87 Compare July 25, 2025 04:02
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr1-3-call-operations branch from fdd16e6 to f7bcbe1 Compare July 26, 2025 04:53
lmeyerov added a commit that referenced this pull request Jul 26, 2025
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch 2 times, most recently from aa33fa9 to fadabfc Compare July 26, 2025 06:38
@lmeyerov
lmeyerov changed the base branch from feature/gfql-pr1-3-call-operations to feature/gfql-pr5-rename-chain-dag-to-let-v2 July 26, 2025 06:39
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from 9c0896b to 3a0986e Compare July 26, 2025 09:02
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr5-rename-chain-dag-to-let-v2 branch from b99dbda to db54cb6 Compare July 26, 2025 09:49
lmeyerov and others added 9 commits July 26, 2025 08:54
- Add ASTCall node type for safe method execution
- Create safelist framework with method allowlists
- Implement parameter validation for exposed methods
- Add call execution support in chain_dag
- Include core graph methods (get_degrees, filter_by_dict, etc)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
…afelist.py files

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
…0 Minutes tutorial

- Add Let operations grammar (let_op, binding, chain_ref) to EBNF in language.md
- Update high-level discussion from 'Chains' to 'Chains and DAGs'
- Add 'Let Bindings (DAG Patterns)' section to quick.rst with examples
- Add 'Advanced: Let Bindings for Reusable Patterns' to 10 minutes tutorial

These changes make Let bindings discoverable in the key user-facing docs.
- Add comprehensive WITH → Let section to cypher_mapping.md with Python/Wire Protocol examples
- Add Complex Pattern Reuse section to translate.rst comparing SQL/Pandas/Cypher/GFQL
- Remove WITH clause from 'Not Supported' section
- Show GFQL DAG advantages over Cypher linear dependencies

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
Updates documentation to match ASTChainRef → ASTRef code refactoring:

Language Specification:
- Update EBNF grammar: chain_ref → ref_op
- Consistent terminology in grammar definitions

Python Embedding:
- Update section header: "ChainRef" → "Ref"

Wire Protocol:
- Update JSON type: "ChainRef" → "Ref" in all examples
- Update Python class references: ASTChainRef → ASTRef
- Update best practices: "ChainRef validation" → "Ref validation"

All documentation now uses consistent "Ref" terminology matching the
ASTRef code changes from commit ccdc867.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@lmeyerov
lmeyerov force-pushed the feature/gfql-pr3-comprehensive-docs branch from 3a0986e to ccc9202 Compare July 26, 2025 15:57
lmeyerov and others added 2 commits July 26, 2025 09:31
- Add "Sequencing Programs with Let" section to 10-minute guide with PageRank example
- Add Let sequencing example to Overview -> Quick Examples
- Add comprehensive Let examples to Remote Mode documentation
- Update all chain_let references to .let() syntax
- Update all .chain() calls to .gfql() in documentation
- Move Let Bindings section before Predicates in Quick Reference
- Update GFQL Language Spec to allow both chain and let at top level
- Add Query Structure section to Wire Protocol before operations
- Add Let example to hop_and_chain_graph_pattern_mining notebook
- Update Call Operations headers to include "and Let Bindings"
- Add Let+Call example to gfql_remote notebook
- Add Python vs pure GFQL comparison in "Combining GFQL" section
- Add forward reference from Multi-hop to Complex Pattern Reuse

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@lmeyerov

Copy link
Copy Markdown
Contributor Author

Superseded by PR #716 which consolidates all GFQL documentation updates into a single PR for easier review.

@lmeyerov lmeyerov closed this Jul 28, 2025
lmeyerov added a commit that referenced this pull request Jul 28, 2025
This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Jul 28, 2025
This commit extracts all GFQL documentation components from PR #708 that were
missing from the incomplete PRs #715/#716. This documentation PR stacks on top
of the code PR (gfql-code-v2) to provide complete GFQL implementation docs.

Documentation Extracted:
- Complete GFQL specification (language.md, wire_protocol.md, etc.)
- Python embedding documentation with AST, Let, and Call examples
- Updated tutorial and quick reference guides
- Validation framework documentation
- Remote execution patterns and examples
- NEW: Call operations demo notebook (502 lines)

Key Features Documented:
- AST classes: ASTLet (DAG patterns), ASTRemoteGraph, ASTRef, ASTCall
- Let bindings for named graph operations and DAG execution
- Call operations with security safelist (50+ allowed methods)
- Unified API: gfql(), gfql_remote(), gfql_remote_shape()
- Comprehensive validation with structured error types
- Remote execution capabilities for GPU acceleration

This addresses the documentation gap from PRs #715/#716 which captured
only ~20% of the actual GFQL implementation from PR #708.

Files: 18 documentation files + 1 new demo notebook
Total: ~15,000 lines of comprehensive GFQL documentation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Jul 28, 2025
This commit extracts all GFQL documentation components from PR #708 that were
missing from the incomplete PRs #715/#716. This documentation PR stacks on top
of the code PR (gfql-code-v2) to provide complete GFQL implementation docs.

Documentation Extracted:
- Complete GFQL specification (language.md, wire_protocol.md, etc.)
- Python embedding documentation with AST, Let, and Call examples
- Updated tutorial and quick reference guides
- Validation framework documentation
- Remote execution patterns and examples
- NEW: Call operations demo notebook (502 lines)

Key Features Documented:
- AST classes: ASTLet (DAG patterns), ASTRemoteGraph, ASTRef, ASTCall
- Let bindings for named graph operations and DAG execution
- Call operations with security safelist (50+ allowed methods)
- Unified API: gfql(), gfql_remote(), gfql_remote_shape()
- Comprehensive validation with structured error types
- Remote execution capabilities for GPU acceleration

This addresses the documentation gap from PRs #715/#716 which captured
only ~20% of the actual GFQL implementation from PR #708.

Files: 18 documentation files + 1 new demo notebook
Total: ~15,000 lines of comprehensive GFQL documentation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Aug 11, 2025
This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 22, 2025
This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 23, 2025
This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 24, 2025
The GFQL extraction commit (de45ae5) was based on PR #708 which predated
PR #714's py.typed support. This accidentally reversed the typing configuration
that was added just 2 days earlier.

This commit restores:
- MANIFEST.in: include graphistry/py.typed for source distributions
- setup.cfg: package_data configuration for wheel distributions
- CI validation: ensure py.typed is included in built wheels

This ensures type checkers (mypy, pyright, PyCharm) can properly use
PyGraphistry's type annotations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 25, 2025
The GFQL extraction commit (de45ae5) was based on PR #708 which predated
PR #714's py.typed support. This accidentally reversed the typing configuration
that was added just 2 days earlier.

This commit restores:
- MANIFEST.in: include graphistry/py.typed for source distributions
- setup.cfg: package_data configuration for wheel distributions
- CI validation: ensure py.typed is included in built wheels

This ensures type checkers (mypy, pyright, PyCharm) can properly use
PyGraphistry's type annotations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 25, 2025
…emote (#744)

* feat(docs): add RST validation tooling for documentation

Added comprehensive RST validation infrastructure to catch documentation
syntax errors early in development and CI:

- Created .rstcheck.cfg to configure RST validation, ignoring Sphinx-specific
  roles and directives while catching real syntax errors
- Added bin/validate-docs.sh script for AI-friendly local validation during
  development (supports --changed flag for validating only modified files)
- Added rstcheck[sphinx] to docs dependencies in setup.py
- Integrated RST validation into docs Docker build process to fail early
  on syntax errors before attempting Sphinx build
- Updated CLAUDE.md with documentation validation guidance for AI assistants

This ensures documentation quality by catching RST syntax errors before
they reach production, making it easier for both humans and AI assistants
to maintain documentation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(ci): use setup.py docs extras for RST linting dependencies

Changed lint-docs-rst job to install dependencies via setup.py's
[docs] extras instead of installing rstcheck directly. This ensures:

- Consistent dependency versions across all docs-related jobs
- Single source of truth for documentation dependencies
- Proper installation of all required docs tools, not just rstcheck

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(ci): remove redundant lint-docs-rst job

Removed the separate lint-docs-rst job since RST validation is already
integrated into the test-docs job via the Docker build process. The
validation happens automatically in build-docs.sh before Sphinx runs,
making a separate job unnecessary.

This simplifies the CI workflow while maintaining the same validation
coverage through the existing docs build pipeline.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move .rstcheck.cfg to docs/ directory

Moved .rstcheck.cfg from project root to docs/ directory since it's
documentation-specific configuration. Updated all references:

- bin/validate-docs.sh now checks docs/.rstcheck.cfg first
- Docker build copies from docs/.rstcheck.cfg
- CLAUDE.md documentation updated with new path

This keeps documentation-related configs organized in the docs/ directory.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move validation guidance to ai/README.md

Moved documentation validation instructions from CLAUDE.md to ai/README.md
where they belong. CLAUDE.md remains a simple pointer file as intended.

Added RST validation commands to the Essential Commands section in ai/README.md
for proper discoverability by AI assistants.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move validate-docs.sh to docs/ directory

Moved validation script from bin/ to docs/ since it's documentation-specific
tooling. Updated references in ai/README.md accordingly.

This keeps all documentation-related tools and configs together in the
docs/ directory for better organization.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(docs): expand rstcheck config to ignore all Sphinx-specific directives

Added missing Sphinx-specific directives and roles to .rstcheck.cfg:
- Added autodata directive (used in API docs)
- Added py:class, py:meth, and other py: prefixed roles
- Added include directive

This fixes validation errors for API documentation files that use
Sphinx autodoc features. All 161 RST files now pass validation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: make validate-docs.sh work in both Docker and local contexts

- Script now detects whether it's running in /docs (Docker) or project root
- Adjusts config and source paths accordingly
- Fixes 'Config path not found' error in CI

* feat(gfql): Extract comprehensive GFQL implementation from PR #708

This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(ast): Resolve _get_child_validators type annotation compatibility

- Change base class ASTSerializable._get_child_validators return type from List to Sequence
- Update all implementing methods to return Sequence['ASTSerializable']
- Fixes mypy variance errors where implementations returned List[ASTPredicate] or List[ASTObject]
- Sequence is covariant, allowing subtype returns while maintaining type safety

Resolves python-lint-types CI failures in Python 3.10 and 3.11.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(gfql): Add group_in_a_box_layout to Call safelist

- Add group_in_a_box_layout to SAFELIST_V1 with full parameter validation
- Support all parameters: partition_alg, layout_alg, positioning, colors, engine
- Add comprehensive pytest validation tests
- Verified parameter types match implementation signature

* feat(gfql): Add GraphOperation type constraints for let() bindings

Add strict type validation to ensure let() bindings only accept operations
that produce Plottable objects, preventing invalid wavefront matchers.

## Core Changes

### GraphOperation Type Definition
- Add `GraphOperation` union type for valid let() binding values
- Includes: Plottable, Chain, ASTRef, ASTCall, ASTRemoteGraph, ASTLet
- Excludes: bare ASTNode, ASTEdge (wavefront matchers need context)

### ASTLet Validation Enhancement
- Add GraphOperation validation in ASTLet._validate_fields()
- Clear error messages guide users to valid operation types
- Support mixed JSON/native object construction with validate parameter

### Dict Convenience Auto-Wrapping
- Auto-wrap ASTNode/ASTEdge in Chain when dict passed to gfql()
- Preserves user convenience while enforcing type safety
- Maintains backward compatibility for dict-based GFQL queries

### Public API Cleanup
- Remove chain_let from public API (use gfql() instead)
- Improve error handling in hop() and chain execution
- Add defensive checks for DataFrame column consistency

## Testing
- 110 tests pass (100% success rate for runnable tests)
- 4 tests skipped (documented runtime execution issues)
- Comprehensive test coverage for all GraphOperation types
- End-to-end validation of type constraints and error handling

## Breaking Changes
- let() now rejects bare n() and e() - wrap in Chain([n()]) instead
- chain_let() removed from public API - use gfql() instead

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(chain): resolve edge binding inconsistency in chain() function

Fixed critical bug where chain() left output graphs with inconsistent edge bindings
when temporary 'index' column was added and removed during processing.

**Root Cause**:
- chain() added 'index' column if g._edge was None
- After processing, 'index' column was dropped from DataFrame
- But output graph still had _edge='index' pointing to non-existent column
- Subsequent chain() calls failed with "Column 'index' not found"

**Solution**:
- Store original edge binding before modification
- Restore original binding when creating output graph after dropping 'index' column
- Ensures edge binding stays consistent with actual DataFrame columns

**Impact**:
- Fixes 4 previously skipped tests that relied on chaining chain() results
- Enables proper ASTRef chain execution in chain_let DAGs
- No regressions - all existing functionality preserved

**Tests Fixed**:
- test_node_edge_combination
- test_dag_with_node_and_chainref
- test_diamond_pattern_execution
- test_parallel_independent_branches

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignores for mixed type processing in GraphOperation

The ASTLet constructor temporarily stores different types during JSON/native
processing before validation. Added type ignores to suppress mypy errors
while maintaining runtime type safety through validation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix flake8 errors with proper dynamic imports

- Fix E261: Add proper spacing before inline comments
- Fix W292: Add newline at end of graph_operation.py
- Fix F402: Add noqa comment for legitimate dynamic Chain import
- Keep original Chain name for dynamic imports (no renaming needed)

The TYPE_CHECKING import is only for type hints and doesn't conflict
with runtime dynamic imports used to avoid circular dependencies.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix unused imports in hop.py

Removed unused imports:
- typing.Any
- pandas as pd
- Engine from graphistry.Engine

Also fixed line length for import statement.

Note: hop.py has many other whitespace/formatting issues that need cleanup.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix critical lint issues for CI

- Remove trailing whitespace in graph_operation.py
- Remove unused pandas import from ast.py
- Remove unused GFQLValidationError import
- Fix line length for typing imports

Note: Many other whitespace and unused predicate imports remain
but these are pre-existing issues not introduced by our changes.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix actual lint failures in test files

Fixed only the issues that actually fail CI (not ignored by lint.sh):
- F841: Renamed unused variables with underscore prefix and noqa
- W292: Added newline at end of test_graph_operation.py

The previous commits fixing F401, W291, W293 were not necessary
as these are ignored by bin/lint.sh, but they don't hurt either.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignores for runtime attribute checks

Fixed mypy errors where runtime hasattr() checks aren't recognized:
- ast.py:790: to_json() call on objects that may not have it
- validate_schema.py:44: chain attribute access on Union type

Both cases already have proper runtime checks, just need type ignores.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignore for GraphOperation in validate_chain_schema call

The binding_value is a GraphOperation (which includes Plottable) but
validate_chain_schema expects List[ASTObject]. The runtime code handles
this correctly, just needs type ignore.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(test): Update call operation tests for GraphOperation constraints

- Wrap ASTNode in Chain for DAG tests to comply with GraphOperation type requirements
- Add skip conditions for group_in_a_box_layout tests when method not available on test objects
- Tests now pass with proper GraphOperation validation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(typing): Restore PEP 561 py.typed configuration accidentally removed

The GFQL extraction commit (de45ae5) was based on PR #708 which predated
PR #714's py.typed support. This accidentally reversed the typing configuration
that was added just 2 days earlier.

This commit restores:
- MANIFEST.in: include graphistry/py.typed for source distributions
- setup.cfg: package_data configuration for wheel distributions
- CI validation: ensure py.typed is included in built wheels

This ensures type checkers (mypy, pyright, PyCharm) can properly use
PyGraphistry's type annotations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(gfql): Replace duplicate gfql_validation with deprecation proxies (#746)

* refactor(gfql): Replace duplicate gfql_validation with deprecation proxies

- Remove duplicate validate.py and exceptions.py files
- Replace with deprecation proxy __init__.py that forwards to gfql module
- Maintains backwards compatibility for any external users
- Shows clear deprecation warning explaining the duplication
- All 15 public exports properly proxied:
  * ValidationIssue, Schema classes
  * validate_syntax, validate_schema, validate_query functions
  * extract_schema, extract_schema_from_dataframes functions
  * format_validation_errors, suggest_fixes functions
  * All GFQL exception classes

This addresses the accidental duplication created during the July 28 code
extraction where gfql_validation became a duplicate of gfql/validate.

* fix(lint): Fix linting issues in deprecation proxy

- Move imports before deprecation warning to avoid E402 errors
- Add noqa: E402 comments for necessary late imports
- Add missing newline at end of file (W292)

* fix(validation): Remove type ignore and add handling for new AST types

- Replace type: ignore with proper getattr() call for dynamic attribute access
- Add else clause to handle new AST types (ASTLet, ASTRef, ASTCall, ASTRemoteGraph)
- Document that new AST types use their own _validate_fields() methods
- Schema validation at chain level is not applicable for new types since they
  don't directly filter on dataframe columns like ASTNode/ASTEdge

This fixes the missing validation cases identified in the plan (Phase 4).

* fix(tests): Fix floating point precision issues in ring layout tests

- Replace exact equality checks with approximate comparisons
- Use np.isclose() for radius calculations with rtol=1e-10
- Add tolerance for MIN_R_DEFAULT/MAX_R_DEFAULT comparisons
- Fixes CI failures on test-minimal-python across all Python versions

These tests were failing in CI with tiny floating point differences:
- 499.99999999999994 != 500
- 99.99999999999999 < 100

The fix allows for appropriate floating point tolerance while maintaining
test correctness.

* fix(docs): Fix GFQL remote notebook syntax

- Replace non-existent 'pipe' syntax with proper ASTRef JSON format
- Change {'var': 'name'} to {'type': 'Ref', 'ref': 'name', 'chain': []}
- Restructure let bindings to use correct GFQL AST JSON syntax
- Ensure all examples can execute with current GFQL implementation

The 'pipe' syntax never existed in the implementation - it was incorrect
documentation. Now using the correct ASTRef JSON format that matches
the actual AST classes.

* docs: Update GFQL remote notebook to use clean Python API

- Import ref, let, ASTCall from graphistry.compute.ast
- Replace verbose JSON with clean Python API throughout
- Show that chain_remote() accepts Python objects directly
- Add comparison section showing JSON vs Python API
- Fix incorrect 'call' syntax (was using 'method', should be 'function')

The Python API is much cleaner:
  Before: {'type': 'Ref', 'ref': 'data', 'chain': [...]}
  After: ref('data', [...])

---------

Co-authored-by: Claude <noreply@anthropic.com>
lmeyerov added a commit that referenced this pull request Sep 25, 2025
…from #742) (#745)

* feat(docs): add RST validation tooling for documentation

Added comprehensive RST validation infrastructure to catch documentation
syntax errors early in development and CI:

- Created .rstcheck.cfg to configure RST validation, ignoring Sphinx-specific
  roles and directives while catching real syntax errors
- Added bin/validate-docs.sh script for AI-friendly local validation during
  development (supports --changed flag for validating only modified files)
- Added rstcheck[sphinx] to docs dependencies in setup.py
- Integrated RST validation into docs Docker build process to fail early
  on syntax errors before attempting Sphinx build
- Updated CLAUDE.md with documentation validation guidance for AI assistants

This ensures documentation quality by catching RST syntax errors before
they reach production, making it easier for both humans and AI assistants
to maintain documentation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(ci): use setup.py docs extras for RST linting dependencies

Changed lint-docs-rst job to install dependencies via setup.py's
[docs] extras instead of installing rstcheck directly. This ensures:

- Consistent dependency versions across all docs-related jobs
- Single source of truth for documentation dependencies
- Proper installation of all required docs tools, not just rstcheck

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(ci): remove redundant lint-docs-rst job

Removed the separate lint-docs-rst job since RST validation is already
integrated into the test-docs job via the Docker build process. The
validation happens automatically in build-docs.sh before Sphinx runs,
making a separate job unnecessary.

This simplifies the CI workflow while maintaining the same validation
coverage through the existing docs build pipeline.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move .rstcheck.cfg to docs/ directory

Moved .rstcheck.cfg from project root to docs/ directory since it's
documentation-specific configuration. Updated all references:

- bin/validate-docs.sh now checks docs/.rstcheck.cfg first
- Docker build copies from docs/.rstcheck.cfg
- CLAUDE.md documentation updated with new path

This keeps documentation-related configs organized in the docs/ directory.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move validation guidance to ai/README.md

Moved documentation validation instructions from CLAUDE.md to ai/README.md
where they belong. CLAUDE.md remains a simple pointer file as intended.

Added RST validation commands to the Essential Commands section in ai/README.md
for proper discoverability by AI assistants.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(docs): move validate-docs.sh to docs/ directory

Moved validation script from bin/ to docs/ since it's documentation-specific
tooling. Updated references in ai/README.md accordingly.

This keeps all documentation-related tools and configs together in the
docs/ directory for better organization.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(docs): expand rstcheck config to ignore all Sphinx-specific directives

Added missing Sphinx-specific directives and roles to .rstcheck.cfg:
- Added autodata directive (used in API docs)
- Added py:class, py:meth, and other py: prefixed roles
- Added include directive

This fixes validation errors for API documentation files that use
Sphinx autodoc features. All 161 RST files now pass validation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: make validate-docs.sh work in both Docker and local contexts

- Script now detects whether it's running in /docs (Docker) or project root
- Adjusts config and source paths accordingly
- Fixes 'Config path not found' error in CI

* feat(gfql): Extract comprehensive GFQL implementation from PR #708

This commit extracts the massive GFQL implementation from PR #708 containing:

CORE IMPLEMENTATION (19 new files):
- AST classes: ASTLet, ASTRemoteGraph, ASTRef, ASTCall (700+ lines)
- Let execution engine: chain_let.py (445 lines)
- Call execution system: call_executor.py + call_safelist.py (500+ lines)
- Validation framework: gfql_validation/ (650+ lines)
- Comprehensive test suite: 10 new test files (3,000+ lines)

UNIFIED API & DEPRECATIONS (11 modified files):
- New methods: gfql(), gfql_remote(), gfql_remote_shape()
- Deprecation warnings: chain() → gfql(), chain_remote() → gfql_remote()
- Public API: Added let, remote, ref, call aliases
- Type distribution: py.typed marker for mypy/pyright support

MODIFIED NOTEBOOKS (CI-tested):
- demos/gfql/gfql_remote.ipynb
- demos/gfql/gfql_validation_fundamentals.ipynb
- demos/more_examples/graphistry_features/hop_and_chain_graph_pattern_mining.ipynb

CONFIGURATION:
- CI: Updated workflows for validation and type checking
- CHANGELOG: Added comprehensive feature documentation
- Packaging: MANIFEST.in and setup.cfg updates

This represents the complete GFQL v2 implementation with:
- DAG patterns with Let bindings and dependency resolution
- Safe method execution with call operations and safelist
- Comprehensive validation framework with structured error reporting
- Full backward compatibility with deprecation warnings
- Extensive test coverage ensuring quality

Supersedes incomplete PRs #715/#716 which missed 80%+ of this implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(ast): Resolve _get_child_validators type annotation compatibility

- Change base class ASTSerializable._get_child_validators return type from List to Sequence
- Update all implementing methods to return Sequence['ASTSerializable']
- Fixes mypy variance errors where implementations returned List[ASTPredicate] or List[ASTObject]
- Sequence is covariant, allowing subtype returns while maintaining type safety

Resolves python-lint-types CI failures in Python 3.10 and 3.11.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(gfql): Add group_in_a_box_layout to Call safelist

- Add group_in_a_box_layout to SAFELIST_V1 with full parameter validation
- Support all parameters: partition_alg, layout_alg, positioning, colors, engine
- Add comprehensive pytest validation tests
- Verified parameter types match implementation signature

* feat(gfql): Add GraphOperation type constraints for let() bindings

Add strict type validation to ensure let() bindings only accept operations
that produce Plottable objects, preventing invalid wavefront matchers.

## Core Changes

### GraphOperation Type Definition
- Add `GraphOperation` union type for valid let() binding values
- Includes: Plottable, Chain, ASTRef, ASTCall, ASTRemoteGraph, ASTLet
- Excludes: bare ASTNode, ASTEdge (wavefront matchers need context)

### ASTLet Validation Enhancement
- Add GraphOperation validation in ASTLet._validate_fields()
- Clear error messages guide users to valid operation types
- Support mixed JSON/native object construction with validate parameter

### Dict Convenience Auto-Wrapping
- Auto-wrap ASTNode/ASTEdge in Chain when dict passed to gfql()
- Preserves user convenience while enforcing type safety
- Maintains backward compatibility for dict-based GFQL queries

### Public API Cleanup
- Remove chain_let from public API (use gfql() instead)
- Improve error handling in hop() and chain execution
- Add defensive checks for DataFrame column consistency

## Testing
- 110 tests pass (100% success rate for runnable tests)
- 4 tests skipped (documented runtime execution issues)
- Comprehensive test coverage for all GraphOperation types
- End-to-end validation of type constraints and error handling

## Breaking Changes
- let() now rejects bare n() and e() - wrap in Chain([n()]) instead
- chain_let() removed from public API - use gfql() instead

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(chain): resolve edge binding inconsistency in chain() function

Fixed critical bug where chain() left output graphs with inconsistent edge bindings
when temporary 'index' column was added and removed during processing.

**Root Cause**:
- chain() added 'index' column if g._edge was None
- After processing, 'index' column was dropped from DataFrame
- But output graph still had _edge='index' pointing to non-existent column
- Subsequent chain() calls failed with "Column 'index' not found"

**Solution**:
- Store original edge binding before modification
- Restore original binding when creating output graph after dropping 'index' column
- Ensures edge binding stays consistent with actual DataFrame columns

**Impact**:
- Fixes 4 previously skipped tests that relied on chaining chain() results
- Enables proper ASTRef chain execution in chain_let DAGs
- No regressions - all existing functionality preserved

**Tests Fixed**:
- test_node_edge_combination
- test_dag_with_node_and_chainref
- test_diamond_pattern_execution
- test_parallel_independent_branches

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignores for mixed type processing in GraphOperation

The ASTLet constructor temporarily stores different types during JSON/native
processing before validation. Added type ignores to suppress mypy errors
while maintaining runtime type safety through validation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix flake8 errors with proper dynamic imports

- Fix E261: Add proper spacing before inline comments
- Fix W292: Add newline at end of graph_operation.py
- Fix F402: Add noqa comment for legitimate dynamic Chain import
- Keep original Chain name for dynamic imports (no renaming needed)

The TYPE_CHECKING import is only for type hints and doesn't conflict
with runtime dynamic imports used to avoid circular dependencies.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix unused imports in hop.py

Removed unused imports:
- typing.Any
- pandas as pd
- Engine from graphistry.Engine

Also fixed line length for import statement.

Note: hop.py has many other whitespace/formatting issues that need cleanup.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix critical lint issues for CI

- Remove trailing whitespace in graph_operation.py
- Remove unused pandas import from ast.py
- Remove unused GFQLValidationError import
- Fix line length for typing imports

Note: Many other whitespace and unused predicate imports remain
but these are pre-existing issues not introduced by our changes.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): Fix actual lint failures in test files

Fixed only the issues that actually fail CI (not ignored by lint.sh):
- F841: Renamed unused variables with underscore prefix and noqa
- W292: Added newline at end of test_graph_operation.py

The previous commits fixing F401, W291, W293 were not necessary
as these are ignored by bin/lint.sh, but they don't hurt either.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignores for runtime attribute checks

Fixed mypy errors where runtime hasattr() checks aren't recognized:
- ast.py:790: to_json() call on objects that may not have it
- validate_schema.py:44: chain attribute access on Union type

Both cases already have proper runtime checks, just need type ignores.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(types): Add type ignore for GraphOperation in validate_chain_schema call

The binding_value is a GraphOperation (which includes Plottable) but
validate_chain_schema expects List[ASTObject]. The runtime code handles
this correctly, just needs type ignore.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(test): Update call operation tests for GraphOperation constraints

- Wrap ASTNode in Chain for DAG tests to comply with GraphOperation type requirements
- Add skip conditions for group_in_a_box_layout tests when method not available on test objects
- Tests now pass with proper GraphOperation validation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(typing): Restore PEP 561 py.typed configuration accidentally removed

The GFQL extraction commit (de45ae5) was based on PR #708 which predated
PR #714's py.typed support. This accidentally reversed the typing configuration
that was added just 2 days earlier.

This commit restores:
- MANIFEST.in: include graphistry/py.typed for source distributions
- setup.cfg: package_data configuration for wheel distributions
- CI validation: ensure py.typed is included in built wheels

This ensures type checkers (mypy, pyright, PyCharm) can properly use
PyGraphistry's type annotations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(gfql): Replace duplicate gfql_validation with deprecation proxies (#746)

* refactor(gfql): Replace duplicate gfql_validation with deprecation proxies

- Remove duplicate validate.py and exceptions.py files
- Replace with deprecation proxy __init__.py that forwards to gfql module
- Maintains backwards compatibility for any external users
- Shows clear deprecation warning explaining the duplication
- All 15 public exports properly proxied:
  * ValidationIssue, Schema classes
  * validate_syntax, validate_schema, validate_query functions
  * extract_schema, extract_schema_from_dataframes functions
  * format_validation_errors, suggest_fixes functions
  * All GFQL exception classes

This addresses the accidental duplication created during the July 28 code
extraction where gfql_validation became a duplicate of gfql/validate.

* fix(lint): Fix linting issues in deprecation proxy

- Move imports before deprecation warning to avoid E402 errors
- Add noqa: E402 comments for necessary late imports
- Add missing newline at end of file (W292)

* fix(validation): Remove type ignore and add handling for new AST types

- Replace type: ignore with proper getattr() call for dynamic attribute access
- Add else clause to handle new AST types (ASTLet, ASTRef, ASTCall, ASTRemoteGraph)
- Document that new AST types use their own _validate_fields() methods
- Schema validation at chain level is not applicable for new types since they
  don't directly filter on dataframe columns like ASTNode/ASTEdge

This fixes the missing validation cases identified in the plan (Phase 4).

* fix(tests): Fix floating point precision issues in ring layout tests

- Replace exact equality checks with approximate comparisons
- Use np.isclose() for radius calculations with rtol=1e-10
- Add tolerance for MIN_R_DEFAULT/MAX_R_DEFAULT comparisons
- Fixes CI failures on test-minimal-python across all Python versions

These tests were failing in CI with tiny floating point differences:
- 499.99999999999994 != 500
- 99.99999999999999 < 100

The fix allows for appropriate floating point tolerance while maintaining
test correctness.

* fix(docs): Fix GFQL remote notebook syntax

- Replace non-existent 'pipe' syntax with proper ASTRef JSON format
- Change {'var': 'name'} to {'type': 'Ref', 'ref': 'name', 'chain': []}
- Restructure let bindings to use correct GFQL AST JSON syntax
- Ensure all examples can execute with current GFQL implementation

The 'pipe' syntax never existed in the implementation - it was incorrect
documentation. Now using the correct ASTRef JSON format that matches
the actual AST classes.

* docs: Update GFQL remote notebook to use clean Python API

- Import ref, let, ASTCall from graphistry.compute.ast
- Replace verbose JSON with clean Python API throughout
- Show that chain_remote() accepts Python objects directly
- Add comparison section showing JSON vs Python API
- Fix incorrect 'call' syntax (was using 'method', should be 'function')

The Python API is much cleaner:
  Before: {'type': 'Ref', 'ref': 'data', 'chain': [...]}
  After: ref('data', [...])

* docs: Add auto-generated API documentation files

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(gfql): Add comprehensive builtin_calls reference documentation

- Extract builtin_calls.rst from PR #719 (gfql-docs-clean-v3)
- Document all 24 safelist methods with detailed parameters
- Include working examples for each Call operation
- Add schema effects documentation
- Include algorithm categorization with external links
- Add GPU vs CPU recommendations for each method
- Update index.rst to include builtin_calls in TOC

This critical documentation was missing from PR #745 and provides
essential reference material for using GFQL Call operations.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant