tensorbored 2.21.0rc1769983804__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. tensorbored/__init__.py +112 -0
  2. tensorbored/_vendor/__init__.py +0 -0
  3. tensorbored/_vendor/bleach/__init__.py +125 -0
  4. tensorbored/_vendor/bleach/_vendor/__init__.py +0 -0
  5. tensorbored/_vendor/bleach/_vendor/html5lib/__init__.py +35 -0
  6. tensorbored/_vendor/bleach/_vendor/html5lib/_ihatexml.py +289 -0
  7. tensorbored/_vendor/bleach/_vendor/html5lib/_inputstream.py +918 -0
  8. tensorbored/_vendor/bleach/_vendor/html5lib/_tokenizer.py +1735 -0
  9. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/__init__.py +5 -0
  10. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/_base.py +40 -0
  11. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/py.py +67 -0
  12. tensorbored/_vendor/bleach/_vendor/html5lib/_utils.py +159 -0
  13. tensorbored/_vendor/bleach/_vendor/html5lib/constants.py +2946 -0
  14. tensorbored/_vendor/bleach/_vendor/html5lib/filters/__init__.py +0 -0
  15. tensorbored/_vendor/bleach/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
  16. tensorbored/_vendor/bleach/_vendor/html5lib/filters/base.py +12 -0
  17. tensorbored/_vendor/bleach/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
  18. tensorbored/_vendor/bleach/_vendor/html5lib/filters/lint.py +93 -0
  19. tensorbored/_vendor/bleach/_vendor/html5lib/filters/optionaltags.py +207 -0
  20. tensorbored/_vendor/bleach/_vendor/html5lib/filters/sanitizer.py +916 -0
  21. tensorbored/_vendor/bleach/_vendor/html5lib/filters/whitespace.py +38 -0
  22. tensorbored/_vendor/bleach/_vendor/html5lib/html5parser.py +2795 -0
  23. tensorbored/_vendor/bleach/_vendor/html5lib/serializer.py +409 -0
  24. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/__init__.py +30 -0
  25. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/genshi.py +54 -0
  26. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/sax.py +50 -0
  27. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/__init__.py +88 -0
  28. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/base.py +417 -0
  29. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/dom.py +239 -0
  30. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree.py +343 -0
  31. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
  32. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/__init__.py +154 -0
  33. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/base.py +252 -0
  34. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/dom.py +43 -0
  35. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree.py +131 -0
  36. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
  37. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/genshi.py +69 -0
  38. tensorbored/_vendor/bleach/_vendor/parse.py +1078 -0
  39. tensorbored/_vendor/bleach/callbacks.py +32 -0
  40. tensorbored/_vendor/bleach/html5lib_shim.py +757 -0
  41. tensorbored/_vendor/bleach/linkifier.py +633 -0
  42. tensorbored/_vendor/bleach/parse_shim.py +1 -0
  43. tensorbored/_vendor/bleach/sanitizer.py +638 -0
  44. tensorbored/_vendor/bleach/six_shim.py +19 -0
  45. tensorbored/_vendor/webencodings/__init__.py +342 -0
  46. tensorbored/_vendor/webencodings/labels.py +231 -0
  47. tensorbored/_vendor/webencodings/mklabels.py +59 -0
  48. tensorbored/_vendor/webencodings/x_user_defined.py +325 -0
  49. tensorbored/assets.py +36 -0
  50. tensorbored/auth.py +102 -0
  51. tensorbored/backend/__init__.py +0 -0
  52. tensorbored/backend/application.py +604 -0
  53. tensorbored/backend/auth_context_middleware.py +38 -0
  54. tensorbored/backend/client_feature_flags.py +113 -0
  55. tensorbored/backend/empty_path_redirect.py +46 -0
  56. tensorbored/backend/event_processing/__init__.py +0 -0
  57. tensorbored/backend/event_processing/data_ingester.py +276 -0
  58. tensorbored/backend/event_processing/data_provider.py +535 -0
  59. tensorbored/backend/event_processing/directory_loader.py +142 -0
  60. tensorbored/backend/event_processing/directory_watcher.py +272 -0
  61. tensorbored/backend/event_processing/event_accumulator.py +950 -0
  62. tensorbored/backend/event_processing/event_file_inspector.py +463 -0
  63. tensorbored/backend/event_processing/event_file_loader.py +292 -0
  64. tensorbored/backend/event_processing/event_multiplexer.py +521 -0
  65. tensorbored/backend/event_processing/event_util.py +68 -0
  66. tensorbored/backend/event_processing/io_wrapper.py +223 -0
  67. tensorbored/backend/event_processing/plugin_asset_util.py +104 -0
  68. tensorbored/backend/event_processing/plugin_event_accumulator.py +721 -0
  69. tensorbored/backend/event_processing/plugin_event_multiplexer.py +522 -0
  70. tensorbored/backend/event_processing/reservoir.py +266 -0
  71. tensorbored/backend/event_processing/tag_types.py +29 -0
  72. tensorbored/backend/experiment_id.py +71 -0
  73. tensorbored/backend/experimental_plugin.py +51 -0
  74. tensorbored/backend/http_util.py +263 -0
  75. tensorbored/backend/json_util.py +70 -0
  76. tensorbored/backend/path_prefix.py +67 -0
  77. tensorbored/backend/process_graph.py +74 -0
  78. tensorbored/backend/security_validator.py +202 -0
  79. tensorbored/compat/__init__.py +69 -0
  80. tensorbored/compat/proto/__init__.py +0 -0
  81. tensorbored/compat/proto/allocation_description_pb2.py +35 -0
  82. tensorbored/compat/proto/api_def_pb2.py +82 -0
  83. tensorbored/compat/proto/attr_value_pb2.py +80 -0
  84. tensorbored/compat/proto/cluster_pb2.py +58 -0
  85. tensorbored/compat/proto/config_pb2.py +271 -0
  86. tensorbored/compat/proto/coordination_config_pb2.py +45 -0
  87. tensorbored/compat/proto/cost_graph_pb2.py +87 -0
  88. tensorbored/compat/proto/cpp_shape_inference_pb2.py +70 -0
  89. tensorbored/compat/proto/debug_pb2.py +65 -0
  90. tensorbored/compat/proto/event_pb2.py +149 -0
  91. tensorbored/compat/proto/full_type_pb2.py +74 -0
  92. tensorbored/compat/proto/function_pb2.py +157 -0
  93. tensorbored/compat/proto/graph_debug_info_pb2.py +111 -0
  94. tensorbored/compat/proto/graph_pb2.py +41 -0
  95. tensorbored/compat/proto/histogram_pb2.py +39 -0
  96. tensorbored/compat/proto/meta_graph_pb2.py +254 -0
  97. tensorbored/compat/proto/node_def_pb2.py +61 -0
  98. tensorbored/compat/proto/op_def_pb2.py +81 -0
  99. tensorbored/compat/proto/resource_handle_pb2.py +48 -0
  100. tensorbored/compat/proto/rewriter_config_pb2.py +93 -0
  101. tensorbored/compat/proto/rpc_options_pb2.py +35 -0
  102. tensorbored/compat/proto/saved_object_graph_pb2.py +193 -0
  103. tensorbored/compat/proto/saver_pb2.py +38 -0
  104. tensorbored/compat/proto/step_stats_pb2.py +116 -0
  105. tensorbored/compat/proto/struct_pb2.py +144 -0
  106. tensorbored/compat/proto/summary_pb2.py +111 -0
  107. tensorbored/compat/proto/tensor_description_pb2.py +38 -0
  108. tensorbored/compat/proto/tensor_pb2.py +68 -0
  109. tensorbored/compat/proto/tensor_shape_pb2.py +46 -0
  110. tensorbored/compat/proto/tfprof_log_pb2.py +307 -0
  111. tensorbored/compat/proto/trackable_object_graph_pb2.py +90 -0
  112. tensorbored/compat/proto/types_pb2.py +105 -0
  113. tensorbored/compat/proto/variable_pb2.py +62 -0
  114. tensorbored/compat/proto/verifier_config_pb2.py +38 -0
  115. tensorbored/compat/proto/versions_pb2.py +35 -0
  116. tensorbored/compat/tensorflow_stub/__init__.py +38 -0
  117. tensorbored/compat/tensorflow_stub/app.py +124 -0
  118. tensorbored/compat/tensorflow_stub/compat/__init__.py +131 -0
  119. tensorbored/compat/tensorflow_stub/compat/v1/__init__.py +20 -0
  120. tensorbored/compat/tensorflow_stub/dtypes.py +692 -0
  121. tensorbored/compat/tensorflow_stub/error_codes.py +169 -0
  122. tensorbored/compat/tensorflow_stub/errors.py +507 -0
  123. tensorbored/compat/tensorflow_stub/flags.py +124 -0
  124. tensorbored/compat/tensorflow_stub/io/__init__.py +17 -0
  125. tensorbored/compat/tensorflow_stub/io/gfile.py +1011 -0
  126. tensorbored/compat/tensorflow_stub/pywrap_tensorflow.py +285 -0
  127. tensorbored/compat/tensorflow_stub/tensor_shape.py +1035 -0
  128. tensorbored/context.py +129 -0
  129. tensorbored/data/__init__.py +0 -0
  130. tensorbored/data/grpc_provider.py +365 -0
  131. tensorbored/data/ingester.py +46 -0
  132. tensorbored/data/proto/__init__.py +0 -0
  133. tensorbored/data/proto/data_provider_pb2.py +517 -0
  134. tensorbored/data/proto/data_provider_pb2_grpc.py +374 -0
  135. tensorbored/data/provider.py +1365 -0
  136. tensorbored/data/server_ingester.py +301 -0
  137. tensorbored/data_compat.py +159 -0
  138. tensorbored/dataclass_compat.py +224 -0
  139. tensorbored/default.py +124 -0
  140. tensorbored/errors.py +130 -0
  141. tensorbored/lazy.py +99 -0
  142. tensorbored/main.py +48 -0
  143. tensorbored/main_lib.py +62 -0
  144. tensorbored/manager.py +487 -0
  145. tensorbored/notebook.py +441 -0
  146. tensorbored/plugin_util.py +266 -0
  147. tensorbored/plugins/__init__.py +0 -0
  148. tensorbored/plugins/audio/__init__.py +0 -0
  149. tensorbored/plugins/audio/audio_plugin.py +229 -0
  150. tensorbored/plugins/audio/metadata.py +69 -0
  151. tensorbored/plugins/audio/plugin_data_pb2.py +37 -0
  152. tensorbored/plugins/audio/summary.py +230 -0
  153. tensorbored/plugins/audio/summary_v2.py +124 -0
  154. tensorbored/plugins/base_plugin.py +367 -0
  155. tensorbored/plugins/core/__init__.py +0 -0
  156. tensorbored/plugins/core/core_plugin.py +981 -0
  157. tensorbored/plugins/custom_scalar/__init__.py +0 -0
  158. tensorbored/plugins/custom_scalar/custom_scalars_plugin.py +320 -0
  159. tensorbored/plugins/custom_scalar/layout_pb2.py +85 -0
  160. tensorbored/plugins/custom_scalar/metadata.py +35 -0
  161. tensorbored/plugins/custom_scalar/summary.py +79 -0
  162. tensorbored/plugins/debugger_v2/__init__.py +0 -0
  163. tensorbored/plugins/debugger_v2/debug_data_multiplexer.py +631 -0
  164. tensorbored/plugins/debugger_v2/debug_data_provider.py +634 -0
  165. tensorbored/plugins/debugger_v2/debugger_v2_plugin.py +504 -0
  166. tensorbored/plugins/distribution/__init__.py +0 -0
  167. tensorbored/plugins/distribution/compressor.py +158 -0
  168. tensorbored/plugins/distribution/distributions_plugin.py +116 -0
  169. tensorbored/plugins/distribution/metadata.py +19 -0
  170. tensorbored/plugins/graph/__init__.py +0 -0
  171. tensorbored/plugins/graph/graph_util.py +129 -0
  172. tensorbored/plugins/graph/graphs_plugin.py +336 -0
  173. tensorbored/plugins/graph/keras_util.py +328 -0
  174. tensorbored/plugins/graph/metadata.py +42 -0
  175. tensorbored/plugins/histogram/__init__.py +0 -0
  176. tensorbored/plugins/histogram/histograms_plugin.py +144 -0
  177. tensorbored/plugins/histogram/metadata.py +63 -0
  178. tensorbored/plugins/histogram/plugin_data_pb2.py +34 -0
  179. tensorbored/plugins/histogram/summary.py +234 -0
  180. tensorbored/plugins/histogram/summary_v2.py +292 -0
  181. tensorbored/plugins/hparams/__init__.py +14 -0
  182. tensorbored/plugins/hparams/_keras.py +93 -0
  183. tensorbored/plugins/hparams/api.py +130 -0
  184. tensorbored/plugins/hparams/api_pb2.py +208 -0
  185. tensorbored/plugins/hparams/backend_context.py +606 -0
  186. tensorbored/plugins/hparams/download_data.py +158 -0
  187. tensorbored/plugins/hparams/error.py +26 -0
  188. tensorbored/plugins/hparams/get_experiment.py +71 -0
  189. tensorbored/plugins/hparams/hparams_plugin.py +206 -0
  190. tensorbored/plugins/hparams/hparams_util_pb2.py +69 -0
  191. tensorbored/plugins/hparams/json_format_compat.py +38 -0
  192. tensorbored/plugins/hparams/list_metric_evals.py +57 -0
  193. tensorbored/plugins/hparams/list_session_groups.py +1040 -0
  194. tensorbored/plugins/hparams/metadata.py +125 -0
  195. tensorbored/plugins/hparams/metrics.py +41 -0
  196. tensorbored/plugins/hparams/plugin_data_pb2.py +69 -0
  197. tensorbored/plugins/hparams/summary.py +205 -0
  198. tensorbored/plugins/hparams/summary_v2.py +597 -0
  199. tensorbored/plugins/image/__init__.py +0 -0
  200. tensorbored/plugins/image/images_plugin.py +232 -0
  201. tensorbored/plugins/image/metadata.py +65 -0
  202. tensorbored/plugins/image/plugin_data_pb2.py +34 -0
  203. tensorbored/plugins/image/summary.py +159 -0
  204. tensorbored/plugins/image/summary_v2.py +130 -0
  205. tensorbored/plugins/mesh/__init__.py +14 -0
  206. tensorbored/plugins/mesh/mesh_plugin.py +292 -0
  207. tensorbored/plugins/mesh/metadata.py +152 -0
  208. tensorbored/plugins/mesh/plugin_data_pb2.py +37 -0
  209. tensorbored/plugins/mesh/summary.py +251 -0
  210. tensorbored/plugins/mesh/summary_v2.py +214 -0
  211. tensorbored/plugins/metrics/__init__.py +0 -0
  212. tensorbored/plugins/metrics/metadata.py +17 -0
  213. tensorbored/plugins/metrics/metrics_plugin.py +623 -0
  214. tensorbored/plugins/pr_curve/__init__.py +0 -0
  215. tensorbored/plugins/pr_curve/metadata.py +75 -0
  216. tensorbored/plugins/pr_curve/plugin_data_pb2.py +34 -0
  217. tensorbored/plugins/pr_curve/pr_curves_plugin.py +241 -0
  218. tensorbored/plugins/pr_curve/summary.py +574 -0
  219. tensorbored/plugins/profile_redirect/__init__.py +0 -0
  220. tensorbored/plugins/profile_redirect/profile_redirect_plugin.py +49 -0
  221. tensorbored/plugins/projector/__init__.py +67 -0
  222. tensorbored/plugins/projector/metadata.py +26 -0
  223. tensorbored/plugins/projector/projector_config_pb2.py +54 -0
  224. tensorbored/plugins/projector/projector_plugin.py +795 -0
  225. tensorbored/plugins/projector/tf_projector_plugin/index.js +32 -0
  226. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.html +524 -0
  227. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.js +15536 -0
  228. tensorbored/plugins/scalar/__init__.py +0 -0
  229. tensorbored/plugins/scalar/metadata.py +60 -0
  230. tensorbored/plugins/scalar/plugin_data_pb2.py +34 -0
  231. tensorbored/plugins/scalar/scalars_plugin.py +181 -0
  232. tensorbored/plugins/scalar/summary.py +109 -0
  233. tensorbored/plugins/scalar/summary_v2.py +124 -0
  234. tensorbored/plugins/text/__init__.py +0 -0
  235. tensorbored/plugins/text/metadata.py +62 -0
  236. tensorbored/plugins/text/plugin_data_pb2.py +34 -0
  237. tensorbored/plugins/text/summary.py +114 -0
  238. tensorbored/plugins/text/summary_v2.py +124 -0
  239. tensorbored/plugins/text/text_plugin.py +288 -0
  240. tensorbored/plugins/wit_redirect/__init__.py +0 -0
  241. tensorbored/plugins/wit_redirect/wit_redirect_plugin.py +49 -0
  242. tensorbored/program.py +910 -0
  243. tensorbored/summary/__init__.py +35 -0
  244. tensorbored/summary/_output.py +124 -0
  245. tensorbored/summary/_tf/__init__.py +14 -0
  246. tensorbored/summary/_tf/summary/__init__.py +178 -0
  247. tensorbored/summary/_writer.py +105 -0
  248. tensorbored/summary/v1.py +51 -0
  249. tensorbored/summary/v2.py +25 -0
  250. tensorbored/summary/writer/__init__.py +13 -0
  251. tensorbored/summary/writer/event_file_writer.py +291 -0
  252. tensorbored/summary/writer/record_writer.py +50 -0
  253. tensorbored/util/__init__.py +0 -0
  254. tensorbored/util/encoder.py +116 -0
  255. tensorbored/util/grpc_util.py +311 -0
  256. tensorbored/util/img_mime_type_detector.py +40 -0
  257. tensorbored/util/io_util.py +20 -0
  258. tensorbored/util/lazy_tensor_creator.py +110 -0
  259. tensorbored/util/op_evaluator.py +104 -0
  260. tensorbored/util/platform_util.py +20 -0
  261. tensorbored/util/tb_logging.py +24 -0
  262. tensorbored/util/tensor_util.py +617 -0
  263. tensorbored/util/timing.py +122 -0
  264. tensorbored/version.py +21 -0
  265. tensorbored/webfiles.zip +0 -0
  266. tensorbored-2.21.0rc1769983804.dist-info/METADATA +49 -0
  267. tensorbored-2.21.0rc1769983804.dist-info/RECORD +271 -0
  268. tensorbored-2.21.0rc1769983804.dist-info/WHEEL +5 -0
  269. tensorbored-2.21.0rc1769983804.dist-info/entry_points.txt +6 -0
  270. tensorbored-2.21.0rc1769983804.dist-info/licenses/LICENSE +739 -0
  271. tensorbored-2.21.0rc1769983804.dist-info/top_level.txt +1 -0
@@ -0,0 +1,5 @@
1
+ from __future__ import absolute_import, division, unicode_literals
2
+
3
+ from .py import Trie
4
+
5
+ __all__ = ["Trie"]
@@ -0,0 +1,40 @@
1
+ from __future__ import absolute_import, division, unicode_literals
2
+
3
+ try:
4
+ from collections.abc import Mapping
5
+ except ImportError: # Python 2.7
6
+ from collections import Mapping
7
+
8
+
9
+ class Trie(Mapping):
10
+ """Abstract base class for tries"""
11
+
12
+ def keys(self, prefix=None):
13
+ # pylint:disable=arguments-differ
14
+ keys = super(Trie, self).keys()
15
+
16
+ if prefix is None:
17
+ return set(keys)
18
+
19
+ return {x for x in keys if x.startswith(prefix)}
20
+
21
+ def has_keys_with_prefix(self, prefix):
22
+ for key in self.keys():
23
+ if key.startswith(prefix):
24
+ return True
25
+
26
+ return False
27
+
28
+ def longest_prefix(self, prefix):
29
+ if prefix in self:
30
+ return prefix
31
+
32
+ for i in range(1, len(prefix) + 1):
33
+ if prefix[:-i] in self:
34
+ return prefix[:-i]
35
+
36
+ raise KeyError(prefix)
37
+
38
+ def longest_prefix_item(self, prefix):
39
+ lprefix = self.longest_prefix(prefix)
40
+ return (lprefix, self[lprefix])
@@ -0,0 +1,67 @@
1
+ from __future__ import absolute_import, division, unicode_literals
2
+ from tensorbored._vendor.bleach.six_shim import text_type
3
+
4
+ from bisect import bisect_left
5
+
6
+ from ._base import Trie as ABCTrie
7
+
8
+
9
+ class Trie(ABCTrie):
10
+ def __init__(self, data):
11
+ if not all(isinstance(x, text_type) for x in data.keys()):
12
+ raise TypeError("All keys must be strings")
13
+
14
+ self._data = data
15
+ self._keys = sorted(data.keys())
16
+ self._cachestr = ""
17
+ self._cachepoints = (0, len(data))
18
+
19
+ def __contains__(self, key):
20
+ return key in self._data
21
+
22
+ def __len__(self):
23
+ return len(self._data)
24
+
25
+ def __iter__(self):
26
+ return iter(self._data)
27
+
28
+ def __getitem__(self, key):
29
+ return self._data[key]
30
+
31
+ def keys(self, prefix=None):
32
+ if prefix is None or prefix == "" or not self._keys:
33
+ return set(self._keys)
34
+
35
+ if prefix.startswith(self._cachestr):
36
+ lo, hi = self._cachepoints
37
+ start = i = bisect_left(self._keys, prefix, lo, hi)
38
+ else:
39
+ start = i = bisect_left(self._keys, prefix)
40
+
41
+ keys = set()
42
+ if start == len(self._keys):
43
+ return keys
44
+
45
+ while self._keys[i].startswith(prefix):
46
+ keys.add(self._keys[i])
47
+ i += 1
48
+
49
+ self._cachestr = prefix
50
+ self._cachepoints = (start, i)
51
+
52
+ return keys
53
+
54
+ def has_keys_with_prefix(self, prefix):
55
+ if prefix in self._data:
56
+ return True
57
+
58
+ if prefix.startswith(self._cachestr):
59
+ lo, hi = self._cachepoints
60
+ i = bisect_left(self._keys, prefix, lo, hi)
61
+ else:
62
+ i = bisect_left(self._keys, prefix)
63
+
64
+ if i == len(self._keys):
65
+ return False
66
+
67
+ return self._keys[i].startswith(prefix)
@@ -0,0 +1,159 @@
1
+ from __future__ import absolute_import, division, unicode_literals
2
+
3
+ from types import ModuleType
4
+
5
+ try:
6
+ from collections.abc import Mapping
7
+ except ImportError:
8
+ from collections import Mapping
9
+
10
+ from tensorbored._vendor.bleach.six_shim import text_type, PY3
11
+
12
+ if PY3:
13
+ import xml.etree.ElementTree as default_etree
14
+ else:
15
+ try:
16
+ import xml.etree.cElementTree as default_etree
17
+ except ImportError:
18
+ import xml.etree.ElementTree as default_etree
19
+
20
+
21
+ __all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair",
22
+ "surrogatePairToCodepoint", "moduleFactoryFactory",
23
+ "supports_lone_surrogates"]
24
+
25
+
26
+ # Platforms not supporting lone surrogates (\uD800-\uDFFF) should be
27
+ # caught by the below test. In general this would be any platform
28
+ # using UTF-16 as its encoding of unicode strings, such as
29
+ # Jython. This is because UTF-16 itself is based on the use of such
30
+ # surrogates, and there is no mechanism to further escape such
31
+ # escapes.
32
+ try:
33
+ _x = eval('"\\uD800"') # pylint:disable=eval-used
34
+ if not isinstance(_x, text_type):
35
+ # We need this with u"" because of http://bugs.jython.org/issue2039
36
+ _x = eval('u"\\uD800"') # pylint:disable=eval-used
37
+ assert isinstance(_x, text_type)
38
+ except Exception:
39
+ supports_lone_surrogates = False
40
+ else:
41
+ supports_lone_surrogates = True
42
+
43
+
44
+ class MethodDispatcher(dict):
45
+ """Dict with 2 special properties:
46
+
47
+ On initiation, keys that are lists, sets or tuples are converted to
48
+ multiple keys so accessing any one of the items in the original
49
+ list-like object returns the matching value
50
+
51
+ md = MethodDispatcher({("foo", "bar"):"baz"})
52
+ md["foo"] == "baz"
53
+
54
+ A default value which can be set through the default attribute.
55
+ """
56
+
57
+ def __init__(self, items=()):
58
+ _dictEntries = []
59
+ for name, value in items:
60
+ if isinstance(name, (list, tuple, frozenset, set)):
61
+ for item in name:
62
+ _dictEntries.append((item, value))
63
+ else:
64
+ _dictEntries.append((name, value))
65
+ dict.__init__(self, _dictEntries)
66
+ assert len(self) == len(_dictEntries)
67
+ self.default = None
68
+
69
+ def __getitem__(self, key):
70
+ return dict.get(self, key, self.default)
71
+
72
+ def __get__(self, instance, owner=None):
73
+ return BoundMethodDispatcher(instance, self)
74
+
75
+
76
+ class BoundMethodDispatcher(Mapping):
77
+ """Wraps a MethodDispatcher, binding its return values to `instance`"""
78
+ def __init__(self, instance, dispatcher):
79
+ self.instance = instance
80
+ self.dispatcher = dispatcher
81
+
82
+ def __getitem__(self, key):
83
+ # see https://docs.python.org/3/reference/datamodel.html#object.__get__
84
+ # on a function, __get__ is used to bind a function to an instance as a bound method
85
+ return self.dispatcher[key].__get__(self.instance)
86
+
87
+ def get(self, key, default):
88
+ if key in self.dispatcher:
89
+ return self[key]
90
+ else:
91
+ return default
92
+
93
+ def __iter__(self):
94
+ return iter(self.dispatcher)
95
+
96
+ def __len__(self):
97
+ return len(self.dispatcher)
98
+
99
+ def __contains__(self, key):
100
+ return key in self.dispatcher
101
+
102
+
103
+ # Some utility functions to deal with weirdness around UCS2 vs UCS4
104
+ # python builds
105
+
106
+ def isSurrogatePair(data):
107
+ return (len(data) == 2 and
108
+ ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and
109
+ ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF)
110
+
111
+
112
+ def surrogatePairToCodepoint(data):
113
+ char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 +
114
+ (ord(data[1]) - 0xDC00))
115
+ return char_val
116
+
117
+ # Module Factory Factory (no, this isn't Java, I know)
118
+ # Here to stop this being duplicated all over the place.
119
+
120
+
121
+ def moduleFactoryFactory(factory):
122
+ moduleCache = {}
123
+
124
+ def moduleFactory(baseModule, *args, **kwargs):
125
+ if isinstance(ModuleType.__name__, type("")):
126
+ name = "_%s_factory" % baseModule.__name__
127
+ else:
128
+ name = b"_%s_factory" % baseModule.__name__
129
+
130
+ kwargs_tuple = tuple(kwargs.items())
131
+
132
+ try:
133
+ return moduleCache[name][args][kwargs_tuple]
134
+ except KeyError:
135
+ mod = ModuleType(name)
136
+ objs = factory(baseModule, *args, **kwargs)
137
+ mod.__dict__.update(objs)
138
+ if "name" not in moduleCache:
139
+ moduleCache[name] = {}
140
+ if "args" not in moduleCache[name]:
141
+ moduleCache[name][args] = {}
142
+ if "kwargs" not in moduleCache[name][args]:
143
+ moduleCache[name][args][kwargs_tuple] = {}
144
+ moduleCache[name][args][kwargs_tuple] = mod
145
+ return mod
146
+
147
+ return moduleFactory
148
+
149
+
150
+ def memoize(func):
151
+ cache = {}
152
+
153
+ def wrapped(*args, **kwargs):
154
+ key = (tuple(args), tuple(kwargs.items()))
155
+ if key not in cache:
156
+ cache[key] = func(*args, **kwargs)
157
+ return cache[key]
158
+
159
+ return wrapped