Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions graphene/types/inputobjecttype.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

# For static type checking with type checker
if TYPE_CHECKING:
from typing import Dict, Callable # NOQA
from typing import Dict, Callable, Type # NOQA


class InputObjectTypeOptions(BaseOptions):
fields = None # type: Dict[str, InputField]
container = None # type: InputObjectTypeContainer
container = None # type: Type[InputObjectTypeContainer]


# Currently in Graphene, we get a `None` whenever we access an (optional) field that was not set in an InputObjectType
Expand Down Expand Up @@ -103,8 +103,8 @@ def __init_subclass_with_meta__(cls, container=None, _meta=None, **options):
else:
_meta.fields = fields
if container is None:
container = type(cls.__name__, (InputObjectTypeContainer, cls), {})
_meta.container = container
container = InputObjectTypeContainer
_meta.container = type(cls.__name__, (container, cls), {}) # type: ignore
super(InputObjectType, cls).__init_subclass_with_meta__(_meta=_meta, **options)

@classmethod
Expand Down
16 changes: 15 additions & 1 deletion graphene/types/tests/test_inputobjecttype.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from graphql import Undefined
import pytest

from ..argument import Argument
from ..field import Field
from ..inputfield import InputField
from ..inputobjecttype import InputObjectType
from ..inputobjecttype import InputObjectType, InputObjectTypeContainer
from ..objecttype import ObjectType
from ..scalars import Boolean, String
from ..schema import Schema
Expand Down Expand Up @@ -167,3 +168,16 @@ def resolve_undefined_optionals_work(self, info, input: TestUndefinedInput):

assert not result.errors
assert result.data == {"undefinedOptionalsWork": True}


def test_inputobjecttype_explicit_container():
class MyInputObjectType(InputObjectType):
class Meta:
container = InputObjectTypeContainer

first_name = String()
last_name = String()

container = MyInputObjectType._meta.container(first_name="John")
assert container.first_name == "John"
assert container.last_name is None