mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-10-31 07:57:26 +03:00 
			
		
		
		
	Added Enum
This commit is contained in:
		
							parent
							
								
									9c4706f7c5
								
							
						
					
					
						commit
						8cf5b1d9ab
					
				
							
								
								
									
										51
									
								
								graphene/new_types/enum.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								graphene/new_types/enum.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| from collections import OrderedDict | ||||
| 
 | ||||
| import six | ||||
| 
 | ||||
| from ..generators import generate_enum | ||||
| from ..utils.is_base_type import is_base_type | ||||
| from .options import Options | ||||
| from .unmountedtype import UnmountedType | ||||
| 
 | ||||
| try: | ||||
|     from enum import Enum as PyEnum | ||||
| except ImportError: | ||||
|     from ..utils.enum import Enum as PyEnum | ||||
| 
 | ||||
| 
 | ||||
| class EnumTypeMeta(type): | ||||
| 
 | ||||
|     def __new__(cls, name, bases, attrs): | ||||
|         # Also ensure initialization is only performed for subclasses of Model | ||||
|         # (excluding Model class itself). | ||||
|         if not is_base_type(bases, EnumTypeMeta): | ||||
|             return type.__new__(cls, name, bases, attrs) | ||||
| 
 | ||||
|         options = Options( | ||||
|             attrs.pop('Meta', None), | ||||
|             name=name, | ||||
|             description=attrs.get('__doc__'), | ||||
|             enum=None, | ||||
|         ) | ||||
|         if not options.enum: | ||||
|             options.enum = PyEnum(cls.__name__, attrs) | ||||
| 
 | ||||
|         new_attrs = OrderedDict(attrs, _meta=options, **options.enum.__members__) | ||||
|         return type.__new__(cls, name, bases, new_attrs) | ||||
| 
 | ||||
|     def __prepare__(name, bases, **kwargs):  # noqa: N805 | ||||
|         return OrderedDict() | ||||
| 
 | ||||
|     def __call__(cls, *args, **kwargs):  # noqa: N805 | ||||
|         if cls is Enum: | ||||
|             description = kwargs.pop('description', None) | ||||
|             return cls.from_enum(PyEnum(*args, **kwargs), description=description) | ||||
|         return super(EnumTypeMeta, cls).__call__(*args, **kwargs) | ||||
| 
 | ||||
|     def from_enum(cls, enum, description=None): | ||||
|         meta_class = type('Meta', (object,), {'enum': enum, 'description': description}) | ||||
|         return type(meta_class.enum.__name__, (Enum,), {'Meta': meta_class}) | ||||
| 
 | ||||
| 
 | ||||
| class Enum(six.with_metaclass(EnumTypeMeta, UnmountedType)): | ||||
|     pass | ||||
							
								
								
									
										73
									
								
								graphene/new_types/tests/test_enum.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								graphene/new_types/tests/test_enum.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,73 @@ | |||
| from ..enum import Enum, PyEnum | ||||
| 
 | ||||
| 
 | ||||
| def test_enum_construction(): | ||||
|     class RGB(Enum): | ||||
|         '''Description''' | ||||
|         RED = 1 | ||||
|         GREEN = 2 | ||||
|         BLUE = 3 | ||||
| 
 | ||||
|         @property | ||||
|         def description(self): | ||||
|             return "Description {}".format(self.name) | ||||
| 
 | ||||
|     assert RGB._meta.name == 'RGB' | ||||
|     assert RGB._meta.description == 'Description' | ||||
| 
 | ||||
|     values = RGB._meta.enum.__members__.values() | ||||
|     assert sorted([v.name for v in values]) == [ | ||||
|         'BLUE', | ||||
|         'GREEN', | ||||
|         'RED' | ||||
|     ] | ||||
|     assert sorted([v.description for v in values]) == [ | ||||
|         'Description BLUE', | ||||
|         'Description GREEN', | ||||
|         'Description RED' | ||||
|     ] | ||||
| 
 | ||||
| 
 | ||||
| def test_enum_construction_meta(): | ||||
|     class RGB(Enum): | ||||
|         class Meta: | ||||
|             name = 'RGBEnum' | ||||
|             description = 'Description' | ||||
|         RED = 1 | ||||
|         GREEN = 2 | ||||
|         BLUE = 3 | ||||
| 
 | ||||
|     assert RGB._meta.name == 'RGBEnum' | ||||
|     assert RGB._meta.description == 'Description' | ||||
| 
 | ||||
| 
 | ||||
| def test_enum_instance_construction(): | ||||
|     RGB = Enum('RGB', 'RED,GREEN,BLUE') | ||||
| 
 | ||||
|     values = RGB._meta.enum.__members__.values() | ||||
|     assert sorted([v.name for v in values]) == [ | ||||
|         'BLUE', | ||||
|         'GREEN', | ||||
|         'RED' | ||||
|     ] | ||||
| 
 | ||||
| 
 | ||||
| def test_enum_from_builtin_enum(): | ||||
|     PyRGB = PyEnum('RGB', 'RED,GREEN,BLUE') | ||||
| 
 | ||||
|     RGB = Enum.from_enum(PyRGB) | ||||
|     assert RGB._meta.enum == PyRGB | ||||
|     assert RGB.RED | ||||
|     assert RGB.GREEN | ||||
|     assert RGB.BLUE | ||||
| 
 | ||||
| 
 | ||||
| def test_enum_value_from_class(): | ||||
|     class RGB(Enum): | ||||
|         RED = 1 | ||||
|         GREEN = 2 | ||||
|         BLUE = 3 | ||||
| 
 | ||||
|     assert RGB.RED.value == 1 | ||||
|     assert RGB.GREEN.value == 2 | ||||
|     assert RGB.BLUE.value == 3 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user