Skip to content

Commit 5b2eb11

Browse files
authored
ObjectType meta arguments (#1219)
* Pass extra kwargs down the meta chain * Rename name argument to allow custom name * Reword error message * Explicitly define kwargs * Revert change to explicit kwargs * name -> name_ for Enum __new__ function
1 parent ecd11cc commit 5b2eb11

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

graphene/types/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def create_type(cls, class_name, **options):
3838
def __init_subclass_with_meta__(
3939
cls, name=None, description=None, _meta=None, **_kwargs
4040
):
41-
assert "_meta" not in cls.__dict__, "Can't assign directly meta"
41+
assert "_meta" not in cls.__dict__, "Can't assign meta directly"
4242
if not _meta:
4343
return
4444
_meta.name = name or cls.__name__

graphene/types/enum.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ class EnumOptions(BaseOptions):
2121

2222

2323
class EnumMeta(SubclassWithMeta_Meta):
24-
def __new__(cls, name, bases, classdict, **options):
24+
def __new__(cls, name_, bases, classdict, **options):
2525
enum_members = dict(classdict, __eq__=eq_enum)
2626
# We remove the Meta attribute from the class to not collide
2727
# with the enum values.
2828
enum_members.pop("Meta", None)
2929
enum = PyEnum(cls.__name__, enum_members)
3030
return SubclassWithMeta_Meta.__new__(
31-
cls, name, bases, dict(classdict, __enum__=enum), **options
31+
cls, name_, bases, dict(classdict, __enum__=enum), **options
3232
)
3333

3434
def get(cls, value):

graphene/types/objecttype.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ class ObjectTypeOptions(BaseOptions):
2020

2121

2222
class ObjectTypeMeta(BaseTypeMeta):
23-
def __new__(cls, name, bases, namespace):
23+
def __new__(cls, name_, bases, namespace, **options):
24+
# Note: it's safe to pass options as keyword arguments as they are still type-checked by ObjectTypeOptions.
25+
2426
# We create this type, to then overload it with the dataclass attrs
2527
class InterObjectType:
2628
pass
2729

28-
base_cls = super().__new__(cls, name, (InterObjectType,) + bases, namespace)
30+
base_cls = super().__new__(
31+
cls, name_, (InterObjectType,) + bases, namespace, **options,
32+
)
2933
if base_cls._meta:
3034
fields = [
3135
(
@@ -39,7 +43,7 @@ class InterObjectType:
3943
)
4044
for key, field_value in base_cls._meta.fields.items()
4145
]
42-
dataclass = make_dataclass(name, fields, bases=())
46+
dataclass = make_dataclass(name_, fields, bases=())
4347
InterObjectType.__init__ = dataclass.__init__
4448
InterObjectType.__eq__ = dataclass.__eq__
4549
InterObjectType.__repr__ = dataclass.__repr__

graphene/types/tests/test_objecttype.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,21 @@ def resolve_hello(self, info):
295295

296296
schema = Schema(query=Query)
297297
assert schema is not None
298+
299+
300+
def test_objecttype_meta_arguments():
301+
class MyInterface(Interface):
302+
foo = String()
303+
304+
class MyType(ObjectType, interfaces=[MyInterface]):
305+
bar = String()
306+
307+
assert MyType._meta.interfaces == [MyInterface]
308+
assert list(MyType._meta.fields.keys()) == ["foo", "bar"]
309+
310+
311+
def test_objecttype_type_name():
312+
class MyObjectType(ObjectType, name="FooType"):
313+
pass
314+
315+
assert MyObjectType._meta.name == "FooType"

0 commit comments

Comments
 (0)