Skip to main content

hexastack-graphql

hexastack-graphql

Strawberry GraphQL presentation adapter and CQRS integration for Hexastack.

PyPI: hexastack-graphql Python 3.13+ Coverage License: Apache 2.0

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, and QueryBusPort directly into Strawberry's Info.context (GraphQLContext).
  • Declarative Query & Mutation Registries:
    • @graphql_query_type and @graphql_mutation_type: Register whole type classes to be merged into root Query and Mutation types.
    • @graphql_query and @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 a GraphQLError or returning a safe fallback value.
  • Observability & Metrics:
    • StrawberryMetricsExtension: Captures operation execution duration histograms and throughput counters pushed to MetricsPort.
  • FastAPI Mount & GraphiQL Playground: Seamless mounting as a GraphQLRouter into 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: CommandBusPort and QueryBusPort for 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 the FastAPI instance created by FastApiBootstrapper (order=30) and attaches the GraphQLRouter automatically if auto_mount_fastapi=true.
  • CQRS Dispatching: Field resolvers receive info.context.query_bus and info.context.command_bus to delegate execution into the CQRS pipeline.

Optional Integrations (Extras)

  • [fastapi]: Installs hexastack-fastapi and fastapi>=0.141.1 for 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'}}

Metadata

Release files for hexastack-graphql 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hexastack-graphql 0.5.0
File Size Uploaded
hexastack_graphql-0.5.0.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hexastack-graphql 0.5.0
File Interpreter ABI Platform
hexastack_graphql-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.4 kB

Release files / hexastack_graphql-0.5.0.tar.gz

Download URL hexastack_graphql-0.5.0.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
9233c5d16cac54153171a2a89dd6ddb6e672f273150bf68fcf3f1c5b3a3faaee
BLAKE2b-256 checksum
How to use checksums
cb07317d981c7e7f3003c7f0269a1102dddcfca5bb75ddcee426b938820425fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / hexastack_graphql-0.5.0-py3-none-any.whl

Download URL hexastack_graphql-0.5.0-py3-none-any.whl
Size 17.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
82abeb9587dde1e40140a981d33757eacbc605be935f4a498d087ec79731bcc2
BLAKE2b-256 checksum
How to use checksums
b33ea1d3f865668d320176575fa6ecdf09f1b48e2c06825240185eae04b141f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

This release

0.5.0 This release

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page