Jentic OpenAPI Traversal Utilities
Project description
jentic-openapi-traverse
A Python library for traversing OpenAPI documents. This package is part of the Jentic OpenAPI Tools ecosystem and provides two types of traversal:
- JSON Traversal (current) - Generic depth-first traversal of JSON-like structures
- Datamodel Traversal (planned) - OpenAPI-aware semantic traversal with visitor pattern
Installation
pip install jentic-openapi-traverse
Prerequisites:
- Python 3.11+
JSON Traversal (Current Implementation)
Generic depth-first traversal of any JSON-like structure (dicts, lists, scalars). Works with raw parsed OpenAPI documents or any other JSON data.
Quick Start
from jentic.apitools.openapi.traverse.json import traverse
# Traverse a nested structure
data = {
"openapi": "3.1.0",
"info": {"title": "My API", "version": "1.0.0"},
"paths": {
"/users": {
"get": {"summary": "List users"}
}
}
}
# Walk all nodes
for node in traverse(data):
print(f"{node.format_path()}: {node.value}")
Output:
openapi: 3.1.0
info: {'title': 'My API', 'version': '1.0.0'}
info.title: My API
info.version: 1.0.0
paths: {'/users': {'get': {'summary': 'List users'}}}
paths./users: {'get': {'summary': 'List users'}}
paths./users.get: {'summary': 'List users'}
paths./users.get.summary: List users
Working with Paths
from jentic.apitools.openapi.traverse.json import traverse
data = {
"users": [
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]
}
for node in traverse(data):
# Access path information
print(f"Path: {node.path}")
print(f"Segment: {node.segment}")
print(f"Full path: {node.full_path}")
print(f"Formatted: {node.format_path()}")
print(f"Depth: {len(node.ancestors)}")
print()
Custom Path Formatting
for node in traverse(data):
# Default dot separator
print(node.format_path()) # e.g., "paths./users.get.summary"
# Custom separator
print(node.format_path(separator="/")) # e.g., "paths//users/get/summary"
Finding Specific Nodes
# Find all $ref references in a document
refs = [
node.value["$ref"]
for node in traverse(openapi_doc)
if isinstance(node.value, dict) and "$ref" in node.value
]
# Find all nodes at a specific path segment
schemas = [
node.value
for node in traverse(openapi_doc)
if node.segment == "schema"
]
# Find deeply nested values
response_descriptions = [
node.value
for node in traverse(openapi_doc)
if node.segment == "description" and "responses" in node.path
]
API Reference
traverse(root: JSONValue) -> Iterator[TraversalNode]
Performs depth-first traversal of a JSON-like structure.
Parameters:
root: The data structure to traverse (dict, list, or scalar)
Returns:
- Iterator of
TraversalNodeobjects
Yields:
- For dicts: one node per key-value pair
- For lists: one node per index-item pair
- Scalars at root don't yield nodes (but are accessible via parent nodes)
TraversalNode
Immutable dataclass representing a node encountered during traversal.
Attributes:
path: JSONPath- Path from root to the parent container (tuple of segments)parent: JSONContainer- The parent container (dict or list)segment: PathSeg- The key (for dicts) or index (for lists) within parentvalue: JSONValue- The actual value atparent[segment]ancestors: tuple[JSONValue, ...]- Ordered tuple of values from root down to (but not including) parent
Properties:
full_path: JSONPath- Complete path from root to this value (path + (segment,))
Methods:
format_path(separator: str = ".") -> str- Format the full path as a human-readable string
Usage Examples
Collecting All Schemas
from jentic.apitools.openapi.traverse.json import traverse
def collect_schemas(openapi_doc):
"""Collect all schema objects from an OpenAPI document."""
schemas = []
for node in traverse(openapi_doc):
if node.segment == "schema" and isinstance(node.value, dict):
schemas.append({
"path": node.format_path(),
"schema": node.value
})
return schemas
Analyzing Document Structure
def analyze_depth(data):
"""Analyze the depth distribution of a document."""
max_depth = 0
depth_counts = {}
for node in traverse(data):
depth = len(node.ancestors)
max_depth = max(max_depth, depth)
depth_counts[depth] = depth_counts.get(depth, 0) + 1
return {
"max_depth": max_depth,
"depth_distribution": depth_counts
}
Testing
The package includes comprehensive test coverage for JSON traversal:
uv run --package jentic-openapi-traverse pytest packages/jentic-openapi-traverse/tests -v
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jentic_openapi_traverse-1.0.0a8-py3-none-any.whl.
File metadata
- Download URL: jentic_openapi_traverse-1.0.0a8-py3-none-any.whl
- Upload date:
- Size: 10.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdb3de19a9c46751df8357c61f81fb26e3351e626bd227bb12d9625a0486e49f
|
|
| MD5 |
3a01bbeaa5ba4c5a3f38d9bb58e28181
|
|
| BLAKE2b-256 |
3da5f199958388c853738e4792952281f667bb9ecc65982fb9b77ae0b4632991
|
Provenance
The following attestation bundles were made for jentic_openapi_traverse-1.0.0a8-py3-none-any.whl:
Publisher:
release.yml on jentic/jentic-openapi-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jentic_openapi_traverse-1.0.0a8-py3-none-any.whl -
Subject digest:
fdb3de19a9c46751df8357c61f81fb26e3351e626bd227bb12d9625a0486e49f - Sigstore transparency entry: 632353239
- Sigstore integration time:
-
Permalink:
jentic/jentic-openapi-tools@20c95c15a449238c995024758febe9d7ad990c23 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jentic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@20c95c15a449238c995024758febe9d7ad990c23 -
Trigger Event:
workflow_dispatch
-
Statement type: