Skip to content

Commit

Permalink
fix circular import
Browse files Browse the repository at this point in the history
  • Loading branch information
DamianCzajkowski committed Sep 9, 2024
1 parent 151a733 commit 92d44a9
Show file tree
Hide file tree
Showing 24 changed files with 176 additions and 142 deletions.
3 changes: 2 additions & 1 deletion ariadne_graphql_modules/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLModel, GraphQLType
from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLType
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.convert_name import (
convert_graphql_name_to_python,
convert_python_name_to_graphql,
Expand Down
19 changes: 6 additions & 13 deletions ariadne_graphql_modules/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from enum import Enum
from typing import Any, Optional, Union

from graphql import GraphQLSchema, TypeDefinitionNode
from ariadne_graphql_modules.base_graphql_model import GraphQLModel


class GraphQLType:
Expand Down Expand Up @@ -35,7 +35,7 @@ def __get_graphql_name__(cls) -> str:
return name

@classmethod
def __get_graphql_model__(cls, metadata: "GraphQLMetadata") -> "GraphQLModel":
def __get_graphql_model__(cls, metadata: "GraphQLMetadata") -> GraphQLModel:
raise NotImplementedError(
"Subclasses of 'GraphQLType' must define '__get_graphql_model__'"
)
Expand All @@ -48,16 +48,6 @@ def __get_graphql_types__(
return [cls]


@dataclass(frozen=True)
class GraphQLModel:
name: str
ast: TypeDefinitionNode
ast_type: type[TypeDefinitionNode]

def bind_to_schema(self, schema: GraphQLSchema):
pass


@dataclass(frozen=True)
class GraphQLMetadata:
data: dict[Union[type[GraphQLType], type[Enum]], Any] = field(default_factory=dict)
Expand Down Expand Up @@ -85,7 +75,10 @@ def get_graphql_model(
if hasattr(graphql_type, "__get_graphql_model__"):
self.models[graphql_type] = graphql_type.__get_graphql_model__(self)
elif issubclass(graphql_type, Enum):
from ariadne_graphql_modules.enum_type import create_graphql_enum_model
# pylint: disable=import-outside-toplevel
from ariadne_graphql_modules.enum_type.enum_model_utils import (
create_graphql_enum_model,
)

self.models[graphql_type] = create_graphql_enum_model(graphql_type)
else:
Expand Down
13 changes: 13 additions & 0 deletions ariadne_graphql_modules/base_graphql_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from dataclasses import dataclass

from graphql import GraphQLSchema, TypeDefinitionNode


@dataclass(frozen=True)
class GraphQLModel:
name: str
ast: TypeDefinitionNode
ast_type: type[TypeDefinitionNode]

def bind_to_schema(self, schema: GraphQLSchema):
pass
9 changes: 5 additions & 4 deletions ariadne_graphql_modules/base_object_type/graphql_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
StringValueNode,
)

from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLModel, GraphQLType
from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLType
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.base_object_type.graphql_field import (
GraphQLClassData,
GraphQLFieldData,
Expand Down Expand Up @@ -115,9 +116,9 @@ def _create_fields_and_resolvers_with_schema(
for arg_name, arg_options in final_args.items():
arg_description = get_description_node(arg_options.description)
if arg_description:
args_descriptions[cls_attr.field][arg_name] = (
arg_description
)
args_descriptions[cls_attr.field][
arg_name
] = arg_description

if arg_options.default_value is not None:
args_defaults[cls_attr.field][arg_name] = get_value_node(
Expand Down
3 changes: 2 additions & 1 deletion ariadne_graphql_modules/compatibility_layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
GraphQLSubscriptionModel,
GraphQLUnionModel,
)
from ariadne_graphql_modules.base import GraphQLModel, GraphQLType
from ariadne_graphql_modules.base import GraphQLType
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.v1.bases import BaseType, BindableType
from ariadne_graphql_modules.v1.directive_type import DirectiveType
from ariadne_graphql_modules.v1.enum_type import EnumType
Expand Down
6 changes: 4 additions & 2 deletions ariadne_graphql_modules/enum_type/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from ariadne_graphql_modules.enum_type.graphql_type import (
GraphQLEnum,
from ariadne_graphql_modules.enum_type.enum_model_utils import (
create_graphql_enum_model,
graphql_enum,
)
from ariadne_graphql_modules.enum_type.graphql_type import (
GraphQLEnum,
)
from ariadne_graphql_modules.enum_type.models import GraphQLEnumModel

__all__ = [
Expand Down
104 changes: 104 additions & 0 deletions ariadne_graphql_modules/enum_type/enum_model_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
from collections.abc import Iterable
from enum import Enum
from typing import Any, Optional, cast

from graphql import EnumTypeDefinitionNode, EnumValueDefinitionNode, NameNode

from ariadne_graphql_modules.description import get_description_node
from ariadne_graphql_modules.enum_type.models import GraphQLEnumModel


def create_graphql_enum_model( # noqa: C901
enum: type[Enum],
*,
name: Optional[str] = None,
description: Optional[str] = None,
members_descriptions: Optional[dict[str, str]] = None,
members_include: Optional[Iterable[str]] = None,
members_exclude: Optional[Iterable[str]] = None,
) -> "GraphQLEnumModel":
if members_include and members_exclude:
raise ValueError(
"'members_include' and 'members_exclude' options are mutually exclusive."
)

if hasattr(enum, "__get_graphql_model__"):
return cast(GraphQLEnumModel, enum.__get_graphql_model__())

if not name:
if hasattr(enum, "__get_graphql_name__"):
name = cast("str", enum.__get_graphql_name__())
else:
name = enum.__name__

members: dict[str, Any] = {i.name: i for i in enum}
final_members: dict[str, Any] = {}

if members_include:
for key, value in members.items():
if key in members_include:
final_members[key] = value
elif members_exclude:
for key, value in members.items():
if key not in members_exclude:
final_members[key] = value
else:
final_members = members

members_descriptions = members_descriptions or {}
for member in members_descriptions:
if member not in final_members:
raise ValueError(
f"Member description was specified for a member '{member}' "
"not present in final GraphQL enum."
)

return GraphQLEnumModel(
name=name,
members=final_members,
ast_type=EnumTypeDefinitionNode,
ast=EnumTypeDefinitionNode(
name=NameNode(value=name),
description=get_description_node(description),
values=tuple(
EnumValueDefinitionNode(
name=NameNode(value=value_name),
description=get_description_node(
members_descriptions.get(value_name)
),
)
for value_name in final_members
),
),
)


def graphql_enum(
cls=None,
*,
name: Optional[str] = None,
description: Optional[str] = None,
members_descriptions: Optional[dict[str, str]] = None,
members_include: Optional[Iterable[str]] = None,
members_exclude: Optional[Iterable[str]] = None,
):
def graphql_enum_decorator(cls):
graphql_model = create_graphql_enum_model(
cls,
name=name,
description=description,
members_descriptions=members_descriptions,
members_include=members_include,
members_exclude=members_exclude,
)

def __get_graphql_model__(*_) -> GraphQLEnumModel: # noqa: N807
return graphql_model

setattr(cls, "__get_graphql_model__", classmethod(__get_graphql_model__))
return cls

if cls:
return graphql_enum_decorator(cls)

return graphql_enum_decorator
100 changes: 1 addition & 99 deletions ariadne_graphql_modules/enum_type/graphql_type.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from collections.abc import Iterable
from enum import Enum
from inspect import isclass
from typing import Any, Optional, Union, cast
Expand Down Expand Up @@ -141,8 +140,7 @@ def _validate_enum_type_with_schema(cls):
validate_description(cls, definition)

members_names = {
value.name.value
for value in definition.values # pylint: disable=no-member
value.name.value for value in definition.values # pylint: disable=no-member
}
if not members_names:
raise ValueError(
Expand Down Expand Up @@ -251,99 +249,3 @@ def get_members_set(
f"Expected members to be of type Dict[str, Any], List[str], or Enum."
f"Got {type(members).__name__} instead."
)


def create_graphql_enum_model( # noqa: C901
enum: type[Enum],
*,
name: Optional[str] = None,
description: Optional[str] = None,
members_descriptions: Optional[dict[str, str]] = None,
members_include: Optional[Iterable[str]] = None,
members_exclude: Optional[Iterable[str]] = None,
) -> "GraphQLEnumModel":
if members_include and members_exclude:
raise ValueError(
"'members_include' and 'members_exclude' options are mutually exclusive."
)

if hasattr(enum, "__get_graphql_model__"):
return cast(GraphQLEnumModel, enum.__get_graphql_model__())

if not name:
if hasattr(enum, "__get_graphql_name__"):
name = cast("str", enum.__get_graphql_name__())
else:
name = enum.__name__

members: dict[str, Any] = {i.name: i for i in enum}
final_members: dict[str, Any] = {}

if members_include:
for key, value in members.items():
if key in members_include:
final_members[key] = value
elif members_exclude:
for key, value in members.items():
if key not in members_exclude:
final_members[key] = value
else:
final_members = members

members_descriptions = members_descriptions or {}
for member in members_descriptions:
if member not in final_members:
raise ValueError(
f"Member description was specified for a member '{member}' "
"not present in final GraphQL enum."
)

return GraphQLEnumModel(
name=name,
members=final_members,
ast_type=EnumTypeDefinitionNode,
ast=EnumTypeDefinitionNode(
name=NameNode(value=name),
description=get_description_node(description),
values=tuple(
EnumValueDefinitionNode(
name=NameNode(value=value_name),
description=get_description_node(
members_descriptions.get(value_name)
),
)
for value_name in final_members
),
),
)


def graphql_enum(
cls=None,
*,
name: Optional[str] = None,
description: Optional[str] = None,
members_descriptions: Optional[dict[str, str]] = None,
members_include: Optional[Iterable[str]] = None,
members_exclude: Optional[Iterable[str]] = None,
):
def graphql_enum_decorator(cls):
graphql_model = create_graphql_enum_model(
cls,
name=name,
description=description,
members_descriptions=members_descriptions,
members_include=members_include,
members_exclude=members_exclude,
)

def __get_graphql_model__(*_) -> GraphQLEnumModel: # noqa: N807
return graphql_model

setattr(cls, "__get_graphql_model__", classmethod(__get_graphql_model__))
return cls

if cls:
return graphql_enum_decorator(cls)

return graphql_enum_decorator
2 changes: 1 addition & 1 deletion ariadne_graphql_modules/enum_type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ariadne import EnumType
from graphql import GraphQLSchema

from ariadne_graphql_modules.base import GraphQLModel
from ariadne_graphql_modules.base_graphql_model import GraphQLModel


@dataclass(frozen=True)
Expand Down
3 changes: 2 additions & 1 deletion ariadne_graphql_modules/executable_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
parse,
)

from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLModel, GraphQLType
from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLType
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.roots import ROOTS_NAMES, merge_root_nodes
from ariadne_graphql_modules.sort import sort_schema_document

Expand Down
3 changes: 2 additions & 1 deletion ariadne_graphql_modules/input_type/graphql_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

from graphql import InputObjectTypeDefinitionNode, InputValueDefinitionNode, NameNode

from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLModel, GraphQLType
from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLType
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.convert_name import (
convert_graphql_name_to_python,
convert_python_name_to_graphql,
Expand Down
2 changes: 1 addition & 1 deletion ariadne_graphql_modules/input_type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ariadne import InputType as InputTypeBindable
from graphql import GraphQLSchema

from ariadne_graphql_modules.base import GraphQLModel
from ariadne_graphql_modules.base_graphql_model import GraphQLModel


@dataclass(frozen=True)
Expand Down
3 changes: 2 additions & 1 deletion ariadne_graphql_modules/interface_type/graphql_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
NameNode,
)

from ariadne_graphql_modules.base import GraphQLMetadata, GraphQLModel
from ariadne_graphql_modules.base import GraphQLMetadata
from ariadne_graphql_modules.base_graphql_model import GraphQLModel
from ariadne_graphql_modules.base_object_type import (
GraphQLBaseObject,
GraphQLFieldData,
Expand Down
2 changes: 1 addition & 1 deletion ariadne_graphql_modules/interface_type/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from ariadne.types import Resolver
from graphql import GraphQLField, GraphQLObjectType, GraphQLSchema, GraphQLTypeResolver

from ariadne_graphql_modules.base import GraphQLModel
from ariadne_graphql_modules.base_graphql_model import GraphQLModel


@dataclass(frozen=True)
Expand Down
Loading

0 comments on commit 92d44a9

Please sign in to comment.