feat(python-driver): add public API for connection pooling and model dict conversion by uesleilima · Pull Request #2374 · apache/age

added 2 commits

April 5, 2026 13:47
…dict conversion

Add two enhancements to the Python driver's public API:

1. Add configure_connection() function that registers AGE agtype adapters
   on an existing psycopg connection without creating a new one. This
   enables use with external connection pools (e.g. psycopg_pool) and
   managed PostgreSQL services where LOAD 'age' may be restricted.
   Also explicitly export AgeLoader and ClientCursor as public symbols
   in age/__init__.py. (apache#2369)

2. Add to_dict() methods to Vertex, Edge, and Path model classes for
   conversion to plain Python dicts. This enables direct JSON
   serialization with json.dumps() without requiring custom conversion
   logic. (apache#2371)

   - Vertex.to_dict() returns {id, label, properties}
   - Edge.to_dict() returns {id, label, start_id, end_id, properties}
   - Path.to_dict() returns a list of to_dict() results

Closes apache#2369
Closes apache#2371
…plugins

- Replace confusing `skip_load` (double-negative) with `load` (positive
  boolean, default False). The default now correctly matches the intent:
  no LOAD by default for connection pool / managed PostgreSQL use cases.
- Add `load_from_plugins` parameter for parity with setUpAge().
- Fix docstring to accurately describe parameter behavior.
- Add 6 unit tests for configure_connection covering: default no-load,
  explicit load, load_from_plugins, search_path always set, adapter
  registration, and graph_name check delegation.

Made-with: Cursor

@uesleilima

- Move TypeInfo.fetch() inside cursor block so search_path change is
  visible regardless of transaction isolation mode
- Raise ValueError when load_from_plugins=True but load=False
- Add type annotations to configure_connection signature
- Document shallow-copy semantics in Vertex/Edge to_dict()
- Path.to_dict() uses str() fallback for non-AGObj entities to
  guarantee JSON-serializable output
- Add test for AgeNotSet when TypeInfo.fetch returns None
- Add test for load_from_plugins=True without load=True
- Replace fragile string assertions with assert_called_with/assert_any_call

Made-with: Cursor

@uesleilima

- Path.to_dict(): leave dict/list/str/int/float/bool/None unchanged
  instead of converting to str(); handle entities=None safely
- Add TestModelToDict, TestPublicImports, TestConfigureConnection to
  the __main__ suite so they run via direct script execution

Made-with: Cursor