This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

235 linhas
5.9 KiB

  1. import sys
  2. from collections import deque
  3. class fzset(frozenset):
  4. def __repr__(self):
  5. return '{%s}' % ', '.join(map(repr, self))
  6. def classify_bool(seq, pred):
  7. true_elems = []
  8. false_elems = []
  9. for elem in seq:
  10. if pred(elem):
  11. true_elems.append(elem)
  12. else:
  13. false_elems.append(elem)
  14. return true_elems, false_elems
  15. def classify(seq, key=None, value=None):
  16. d = {}
  17. for item in seq:
  18. k = key(item) if (key is not None) else item
  19. v = value(item) if (value is not None) else item
  20. if k in d:
  21. d[k].append(v)
  22. else:
  23. d[k] = [v]
  24. return d
  25. def bfs(initial, expand):
  26. open_q = deque(list(initial))
  27. visited = set(open_q)
  28. while open_q:
  29. node = open_q.popleft()
  30. yield node
  31. for next_node in expand(node):
  32. if next_node not in visited:
  33. visited.add(next_node)
  34. open_q.append(next_node)
  35. def _serialize(value, memo):
  36. # if memo and memo.in_types(value):
  37. # return {'__memo__': memo.memoized.get(value)}
  38. if isinstance(value, Serialize):
  39. return value.serialize(memo)
  40. elif isinstance(value, list):
  41. return [_serialize(elem, memo) for elem in value]
  42. elif isinstance(value, frozenset):
  43. return list(value) # TODO reversible?
  44. elif isinstance(value, dict):
  45. return {key:_serialize(elem, memo) for key, elem in value.items()}
  46. return value
  47. ###{standalone
  48. def _deserialize(data, namespace, memo):
  49. if isinstance(data, dict):
  50. if '__type__' in data: # Object
  51. class_ = namespace[data['__type__']]
  52. return class_.deserialize(data, memo)
  53. elif '__memo__' in data:
  54. return memo[data['__memo__']]
  55. return {key:_deserialize(value, namespace, memo) for key, value in data.items()}
  56. elif isinstance(data, list):
  57. return [_deserialize(value, namespace, memo) for value in data]
  58. return data
  59. class Serialize(object):
  60. def memo_serialize(self, types_to_memoize):
  61. memo = SerializeMemoizer(types_to_memoize)
  62. return self.serialize(memo), memo.serialize()
  63. def serialize(self, memo=None):
  64. if memo and memo.in_types(self):
  65. return {'__memo__': memo.memoized.get(self)}
  66. fields = getattr(self, '__serialize_fields__')
  67. res = {f: _serialize(getattr(self, f), memo) for f in fields}
  68. res['__type__'] = type(self).__name__
  69. postprocess = getattr(self, '_serialize', None)
  70. if postprocess:
  71. postprocess(res, memo)
  72. return res
  73. @classmethod
  74. def deserialize(cls, data, memo):
  75. namespace = getattr(cls, '__serialize_namespace__', {})
  76. namespace = {c.__name__:c for c in namespace}
  77. fields = getattr(cls, '__serialize_fields__')
  78. if '__memo__' in data:
  79. return memo[data['__memo__']]
  80. inst = cls.__new__(cls)
  81. for f in fields:
  82. setattr(inst, f, _deserialize(data[f], namespace, memo))
  83. postprocess = getattr(inst, '_deserialize', None)
  84. if postprocess:
  85. postprocess()
  86. return inst
  87. class SerializeMemoizer(Serialize):
  88. __serialize_fields__ = 'memoized',
  89. def __init__(self, types_to_memoize):
  90. self.types_to_memoize = tuple(types_to_memoize)
  91. self.memoized = Enumerator()
  92. def in_types(self, value):
  93. return isinstance(value, self.types_to_memoize)
  94. def serialize(self):
  95. return _serialize(self.memoized.reversed(), None)
  96. @classmethod
  97. def deserialize(cls, data, namespace, memo):
  98. return _deserialize(data, namespace, memo)
  99. try:
  100. STRING_TYPE = basestring
  101. except NameError: # Python 3
  102. STRING_TYPE = str
  103. import types
  104. from functools import wraps, partial
  105. from contextlib import contextmanager
  106. Str = type(u'')
  107. try:
  108. classtype = types.ClassType # Python2
  109. except AttributeError:
  110. classtype = type # Python3
  111. def smart_decorator(f, create_decorator):
  112. if isinstance(f, types.FunctionType):
  113. return wraps(f)(create_decorator(f, True))
  114. elif isinstance(f, (classtype, type, types.BuiltinFunctionType)):
  115. return wraps(f)(create_decorator(f, False))
  116. elif isinstance(f, types.MethodType):
  117. return wraps(f)(create_decorator(f.__func__, True))
  118. elif isinstance(f, partial):
  119. # wraps does not work for partials in 2.7: https://bugs.python.org/issue3445
  120. return create_decorator(f.__func__, True)
  121. else:
  122. return create_decorator(f.__func__.__call__, True)
  123. import sys, re
  124. Py36 = (sys.version_info[:2] >= (3, 6))
  125. ###}
  126. def dedup_list(l):
  127. """Given a list (l) will removing duplicates from the list,
  128. preserving the original order of the list. Assumes that
  129. the list entrie are hashable."""
  130. dedup = set()
  131. return [ x for x in l if not (x in dedup or dedup.add(x))]
  132. try:
  133. from contextlib import suppress # Python 3
  134. except ImportError:
  135. @contextmanager
  136. def suppress(*excs):
  137. '''Catch and dismiss the provided exception
  138. >>> x = 'hello'
  139. >>> with suppress(IndexError):
  140. ... x = x[10]
  141. >>> x
  142. 'hello'
  143. '''
  144. try:
  145. yield
  146. except excs:
  147. pass
  148. try:
  149. compare = cmp
  150. except NameError:
  151. def compare(a, b):
  152. if a == b:
  153. return 0
  154. elif a > b:
  155. return 1
  156. return -1
  157. import sre_parse
  158. import sre_constants
  159. def get_regexp_width(regexp):
  160. try:
  161. return sre_parse.parse(regexp).getwidth()
  162. except sre_constants.error:
  163. raise ValueError(regexp)
  164. class Enumerator(Serialize):
  165. def __init__(self):
  166. self.enums = {}
  167. def get(self, item):
  168. if item not in self.enums:
  169. self.enums[item] = len(self.enums)
  170. return self.enums[item]
  171. def __len__(self):
  172. return len(self.enums)
  173. def reversed(self):
  174. r = {v: k for k, v in self.enums.items()}
  175. assert len(r) == len(self.enums)
  176. return r