From 48efec307ce245bfe692f75b5dc07c14d8bce15b Mon Sep 17 00:00:00 2001
From: Syrus Akbary <me@syrusakbary.com>
Date: Sat, 4 Mar 2017 18:11:51 -0800
Subject: [PATCH] Improved Options merge attrs. Fixed #432

---
 graphene/tests/issues/test_425.py |  4 ++--
 graphene/types/objecttype.py      | 12 +++++++++---
 graphene/types/options.py         | 11 +++++------
 3 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/graphene/tests/issues/test_425.py b/graphene/tests/issues/test_425.py
index 95a1d79d..08bdde8c 100644
--- a/graphene/tests/issues/test_425.py
+++ b/graphene/tests/issues/test_425.py
@@ -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
 
 
diff --git a/graphene/types/objecttype.py b/graphene/types/objecttype.py
index b92af9e5..bedc5e76 100644
--- a/graphene/types/objecttype.py
+++ b/graphene/types/objecttype.py
@@ -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:
diff --git a/graphene/types/options.py b/graphene/types/options.py
index 43f7154b..7cefbea0 100644
--- a/graphene/types/options.py
+++ b/graphene/types/options.py
@@ -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)