01-unknown.patch 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. --- contrib/deprecated/python/enum34/enum/__init__.py (index)
  2. +++ contrib/deprecated/python/enum34/enum/__init__.py (working tree)
  3. @@ -8,6 +8,8 @@ version = 1, 1, 10
  4. pyver = float('%s.%s' % _sys.version_info[:2])
  5. +ALLOW_SYNONYMS = '__allow_synonyms__'
  6. +
  7. try:
  8. any
  9. except NameError:
  10. @@ -161,6 +163,7 @@ class EnumMeta(type):
  11. for k, v in original_dict.items():
  12. classdict[k] = v
  13. + allow_synonyms = classdict.get(ALLOW_SYNONYMS, True)
  14. member_type, first_enum = metacls._get_mixins_(bases)
  15. __new__, save_new, use_args = metacls._find_new_(classdict, member_type,
  16. first_enum)
  17. @@ -215,8 +218,18 @@ class EnumMeta(type):
  18. # auto-numbering ;)
  19. if __new__ is None:
  20. __new__ = enum_class.__new__
  21. +
  22. + val2name = {}
  23. for member_name in _order_:
  24. value = members[member_name]
  25. + if not allow_synonyms:
  26. + if value in val2name:
  27. + raise ValueError(
  28. + 'allow_synonyms=False forbids multiple names of the same value; '
  29. + 'Members {!r} and {!r} break this'.format(val2name[value], member_name)
  30. + )
  31. + val2name[value] = member_name
  32. +
  33. if not isinstance(value, tuple):
  34. args = (value, )
  35. else:
  36. @@ -237,7 +250,7 @@ class EnumMeta(type):
  37. enum_member.__init__(*args)
  38. # If another member with the same value was already defined, the
  39. # new member becomes an alias to the existing one.
  40. - for name, canonical_member in enum_class._member_map_.items():
  41. + for name, canonical_member in (enum_class._member_map_.items() if allow_synonyms else ()):
  42. if canonical_member.value == enum_member._value_:
  43. enum_member = canonical_member
  44. break
  45. @@ -328,7 +341,7 @@ class EnumMeta(type):
  46. """
  47. return True
  48. - def __call__(cls, value, names=None, module=None, type=None, start=1):
  49. + def __call__(cls, value, names=None, module=None, type=None, start=1, allow_synonyms=True):
  50. """Either returns an existing member, or creates a new enum class.
  51. This method is used both when an enum class is given a value to match
  52. @@ -347,7 +360,7 @@ class EnumMeta(type):
  53. if names is None: # simple value lookup
  54. return cls.__new__(cls, value)
  55. # otherwise, functional API: we're creating a new Enum type
  56. - return cls._create_(value, names, module=module, type=type, start=start)
  57. + return cls._create_(value, names, module=module, type=type, start=start, allow_synonyms=allow_synonyms)
  58. def __contains__(cls, member):
  59. return isinstance(member, cls) and member.name in cls._member_map_
  60. @@ -420,7 +433,7 @@ class EnumMeta(type):
  61. raise AttributeError('Cannot reassign members.')
  62. super(EnumMeta, cls).__setattr__(name, value)
  63. - def _create_(cls, class_name, names=None, module=None, type=None, start=1):
  64. + def _create_(cls, class_name, names=None, module=None, type=None, start=1, allow_synonyms=True):
  65. """Convenience method to create a new Enum class.
  66. `names` can be:
  67. @@ -465,6 +478,7 @@ class EnumMeta(type):
  68. # only set _order_ in classdict if name/value was not from a mapping
  69. if not isinstance(item, basestring):
  70. classdict['_order_'] = _order_
  71. + classdict[ALLOW_SYNONYMS] = getattr(cls, ALLOW_SYNONYMS, allow_synonyms)
  72. enum_class = metacls.__new__(metacls, class_name, bases, classdict)
  73. # TODO: replace the frame hack if a blessed way to know the calling