hexastack-graphql
Strawberry GraphQL presentation adapter and CQRS integration for Hexastack.
1. Overview & Capabilities
hexastack-graphql brings the power and type-safety of Strawberry GraphQL into the Hexastack architecture:
- Type-Safe GraphQL Schemas: Native Python dataclass-based GraphQL schema definition via Strawberry.
- CQRS Integration via Context: Injects the
rodi.Container,CommandBusPort, andQueryBusPortdirectly into Strawberry'sInfo.context(GraphQLContext). - Declarative Query & Mutation Registries:
@graphql_query_typeand@graphql_mutation_type: Register whole type classes to be merged into root Query and Mutation types.@graphql_queryand@graphql_mutation: Register standalone resolver functions as top-level fields.
- Dynamic Field Resolver Feature Flagging:
@feature_flag_field("flag_key", raise_error=True, fallback=...): Evaluates feature flags dynamically before executing field resolvers, raising aGraphQLErroror returning a safe fallback value.
- FastAPI Mount & GraphiQL Playground: Seamless mounting as a
GraphQLRouterinto FastAPI applications with interactive GraphiQL playground enabled.
2. Package Anatomy & Key Components
hexastack_graphql/
├── domain/ # GraphQLContext, GraphQLError, SchemaBuildingError
├── ports/ # GraphQLContextFactoryPort
├── adapters/ # create_graphql_router, mount_graphql_router (FastAPI integration)
└── infra/
├── bootstrap.py # GraphQLBootstrapper (order=35)
├── config.py # HexastackGraphQLConfig
├── decorators.py# @graphql_query, @graphql_mutation, @graphql_query_type, @graphql_mutation_type, @feature_flag_field
└── registries/ # schema.py (GraphQLSchemaRegistry)
Key Exports
| Category | Exports |
|---|---|
| Bootstrap | GraphQLBootstrapper (order=35), HexastackGraphQLConfig |
| Context & Domain | GraphQLContext, GraphQLError, SchemaBuildingError |
| Decorators | @graphql_query, @graphql_mutation, @graphql_query_type, @graphql_mutation_type, @feature_flag_field |
| FastAPI Adapters | create_graphql_router, mount_graphql_router |
| Registries | GraphQLSchemaRegistry, get_schema_registry |
3. Monorepo & Sibling Relationships
graph TD
subgraph ClientRequests ["GraphQL Client Requests"]
CLIENT["Web / Mobile GraphQL Clients"]
end
subgraph GraphQLAdapter ["hexastack-graphql"]
SCHEMA["strawberry.Schema"]
CTX["GraphQLContext (Container + Buses)"]
ROUTER["GraphQLRouter (FastAPI integration)"]
end
subgraph ApplicationLayer ["hexastack-cqrs"]
CBUS["CommandBusPort"]
QBUS["QueryBusPort"]
end
subgraph WebServer ["hexastack-fastapi"]
FASTAPI_APP["FastAPI Application"]
end
CLIENT --> ROUTER
FASTAPI_APP --> ROUTER
ROUTER --> SCHEMA
SCHEMA --> CTX
CTX -->|dispatches commands/queries to| CBUS
CTX -->|dispatches commands/queries to| QBUS
Explicit Dependencies (Direct)
hexastack-core: DI container, configuration registry, base exceptions.hexastack-cqrs:CommandBusPortandQueryBusPortfor message dispatching.strawberry-graphql>=0.260.0: Core GraphQL engine and schema generator.
Implied / Behavioral Relationships (DI-Mediated)
- FastAPI Auto-Mounting:
GraphQLBootstrapper(order=35) discovers theFastAPIinstance created byFastApiBootstrapper(order=30) and attaches theGraphQLRouterautomatically ifauto_mount_fastapi=true. - CQRS Dispatching: Field resolvers receive
info.context.query_busandinfo.context.command_busto delegate execution into the CQRS pipeline.
Optional Integrations (Extras)
[fastapi]: Installshexastack-fastapiandfastapi>=0.141.1for HTTP routing and GraphiQL playground.
4. Installation
# Standalone install
pip install hexastack-graphql
# With FastAPI integration
pip install "hexastack-graphql[fastapi]"
# Via umbrella package
pip install "hexastack[graphql]"
5. Configuration Reference
[hexastack.graphql]
path = "/graphql" # Route prefix for GraphQL endpoint
graphiql = true # Enable interactive GraphiQL web UI
allow_queries = true
allow_mutations = true
auto_mount_fastapi = true # Auto mount onto FastAPI application on bootstrap
title = "Hexastack GraphQL API"
6. Quickstart Example
from dataclasses import dataclass
import strawberry
from strawberry.types import Info
from hexastack_core.infra.bootstrap import bootstrap
from hexastack_cqrs.domain.query import Query
from hexastack_cqrs.infra.decorators import query_handler
from hexastack_graphql.domain.context import GraphQLContext
from hexastack_graphql.infra.decorators import graphql_query_type
# 1. Define CQRS Query & Handler
@dataclass(frozen=True)
class GetItemQuery(Query):
item_id: str
@query_handler(GetItemQuery)
class GetItemHandler:
def __call__(self, qry: GetItemQuery) -> dict:
return {"id": qry.item_id, "name": f"Item {qry.item_id}"}
# 2. Define Strawberry GraphQL Type
@strawberry.type
class ItemType:
id: str
name: str
@graphql_query_type
class Query:
@strawberry.field
def item(self, info: Info[GraphQLContext, None], item_id: str) -> ItemType:
res = info.context.query_bus.dispatch(GetItemQuery(item_id=item_id))
return ItemType(id=res["id"], name=res["name"])
# 3. Bootstrap Runtime with GraphQL
runtime = bootstrap(packages_to_scan=[__name__])
schema = runtime.get("graphql_schema")
result = schema.execute_sync(
'{ item(itemId: "123") { id name } }',
context_value=GraphQLContext(
container=runtime.container, query_bus=runtime.get("query_bus")
),
)
print(result.data) # {'item': {'id': '123', 'name': 'Item 123'}}
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
hexastack_graphql-0.2.0.tar.gz
(10.2 kB
view details)
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 hexastack_graphql-0.2.0.tar.gz.
File metadata
- Download URL: hexastack_graphql-0.2.0.tar.gz
- Upload date:
- Size: 10.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86bb7479f3020e7a455544cb0e816d645cc8e9fc03d2aac0df7c7acb146f8014
|
|
| MD5 |
b433a25a237c6f5bb0353ae0dd7dabce
|
|
| BLAKE2b-256 |
88bbfb8d863586b0e15ffed6be2847220dedf528f03973d2c6d734f97b281e1a
|
File details
Details for the file hexastack_graphql-0.2.0-py3-none-any.whl.
File metadata
- Download URL: hexastack_graphql-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68390738c446b76948b84842dc57bf19c063f468f16c6117cf8199b0570dd4dd
|
|
| MD5 |
a6cf830f5256c61c25f67f83efe2f4eb
|
|
| BLAKE2b-256 |
ed92978eab061ae6130c3b944f8836bb7a8474ba4c24cda956ac6053612b6d91
|