49 lines
1.6 KiB
Python
49 lines
1.6 KiB
Python
from typing import cast
|
|
|
|
from ..error import GraphQLError
|
|
from ..language import parse
|
|
from ..type import GraphQLSchema
|
|
from .get_introspection_query import get_introspection_query, IntrospectionQuery
|
|
|
|
__all__ = ["introspection_from_schema"]
|
|
|
|
|
|
def introspection_from_schema(
|
|
schema: GraphQLSchema,
|
|
descriptions: bool = True,
|
|
specified_by_url: bool = True,
|
|
directive_is_repeatable: bool = True,
|
|
schema_description: bool = True,
|
|
input_value_deprecation: bool = True,
|
|
input_object_one_of: bool = True,
|
|
) -> IntrospectionQuery:
|
|
"""Build an IntrospectionQuery from a GraphQLSchema
|
|
|
|
IntrospectionQuery is useful for utilities that care about type and field
|
|
relationships, but do not need to traverse through those relationships.
|
|
|
|
This is the inverse of build_client_schema. The primary use case is outside of the
|
|
server context, for instance when doing schema comparisons.
|
|
"""
|
|
document = parse(
|
|
get_introspection_query(
|
|
descriptions,
|
|
specified_by_url,
|
|
directive_is_repeatable,
|
|
schema_description,
|
|
input_value_deprecation,
|
|
input_object_one_of,
|
|
)
|
|
)
|
|
|
|
from ..execution.execute import execute_sync, ExecutionResult
|
|
|
|
result = execute_sync(schema, document)
|
|
if not isinstance(result, ExecutionResult): # pragma: no cover
|
|
raise RuntimeError("Introspection cannot be executed")
|
|
if result.errors: # pragma: no cover
|
|
raise result.errors[0]
|
|
if not result.data: # pragma: no cover
|
|
raise GraphQLError("Introspection did not return a result")
|
|
return cast(IntrospectionQuery, result.data)
|