Improved Options merge attrs. Fixed #432

This commit is contained in:
Syrus Akbary 2017-03-04 18:11:51 -08:00
parent d5960a7630
commit 48efec307c
3 changed files with 16 additions and 11 deletions

View File

@ -20,8 +20,8 @@ class SpecialObjectTypeMeta(ObjectTypeMeta):
other_attr='default',
)
return ObjectTypeMeta.__new__(cls, name, bases, dict(attrs, _meta=options))
cls = ObjectTypeMeta.__new__(cls, name, bases, dict(attrs, _meta=options))
assert cls._meta is options
return cls

View File

@ -20,15 +20,21 @@ class ObjectTypeMeta(AbstractTypeMeta):
return type.__new__(cls, name, bases, attrs)
_meta = attrs.pop('_meta', None)
options = Options(
attrs.pop('Meta', None),
defaults = dict(
name=name,
description=trim_docstring(attrs.get('__doc__')),
interfaces=(),
default_resolver=None,
local_fields=OrderedDict(),
)
options.extend_with_meta(_meta)
if not _meta:
options = Options(
attrs.pop('Meta', None),
**defaults
)
else:
options = _meta.extend_with_defaults(defaults)
options.base_fields = get_base_fields(bases, _as=Field)
if not options.local_fields:

View File

@ -30,12 +30,11 @@ class Options(object):
)
)
def extend_with_meta(self, meta):
if not meta:
return
meta_attrs = props(meta)
for attr_name, value in meta_attrs.items():
setattr(self, attr_name, value)
def extend_with_defaults(self, defaults):
for attr_name, value in defaults.items():
if not hasattr(self, attr_name):
setattr(self, attr_name, value)
return self
def __repr__(self):
options_props = props(self)