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.
- tensorbored/__init__.py +112 -0
- tensorbored/_vendor/__init__.py +0 -0
- tensorbored/_vendor/bleach/__init__.py +125 -0
- tensorbored/_vendor/bleach/_vendor/__init__.py +0 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/__init__.py +35 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_ihatexml.py +289 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_inputstream.py +918 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_tokenizer.py +1735 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/__init__.py +5 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/_base.py +40 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/py.py +67 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_utils.py +159 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/constants.py +2946 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/__init__.py +0 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/base.py +12 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/lint.py +93 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/optionaltags.py +207 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/sanitizer.py +916 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/whitespace.py +38 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/html5parser.py +2795 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/serializer.py +409 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/__init__.py +30 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/genshi.py +54 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/sax.py +50 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/__init__.py +88 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/base.py +417 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/dom.py +239 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree.py +343 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/__init__.py +154 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/base.py +252 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/dom.py +43 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree.py +131 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/genshi.py +69 -0
- tensorbored/_vendor/bleach/_vendor/parse.py +1078 -0
- tensorbored/_vendor/bleach/callbacks.py +32 -0
- tensorbored/_vendor/bleach/html5lib_shim.py +757 -0
- tensorbored/_vendor/bleach/linkifier.py +633 -0
- tensorbored/_vendor/bleach/parse_shim.py +1 -0
- tensorbored/_vendor/bleach/sanitizer.py +638 -0
- tensorbored/_vendor/bleach/six_shim.py +19 -0
- tensorbored/_vendor/webencodings/__init__.py +342 -0
- tensorbored/_vendor/webencodings/labels.py +231 -0
- tensorbored/_vendor/webencodings/mklabels.py +59 -0
- tensorbored/_vendor/webencodings/x_user_defined.py +325 -0
- tensorbored/assets.py +36 -0
- tensorbored/auth.py +102 -0
- tensorbored/backend/__init__.py +0 -0
- tensorbored/backend/application.py +604 -0
- tensorbored/backend/auth_context_middleware.py +38 -0
- tensorbored/backend/client_feature_flags.py +113 -0
- tensorbored/backend/empty_path_redirect.py +46 -0
- tensorbored/backend/event_processing/__init__.py +0 -0
- tensorbored/backend/event_processing/data_ingester.py +276 -0
- tensorbored/backend/event_processing/data_provider.py +535 -0
- tensorbored/backend/event_processing/directory_loader.py +142 -0
- tensorbored/backend/event_processing/directory_watcher.py +272 -0
- tensorbored/backend/event_processing/event_accumulator.py +950 -0
- tensorbored/backend/event_processing/event_file_inspector.py +463 -0
- tensorbored/backend/event_processing/event_file_loader.py +292 -0
- tensorbored/backend/event_processing/event_multiplexer.py +521 -0
- tensorbored/backend/event_processing/event_util.py +68 -0
- tensorbored/backend/event_processing/io_wrapper.py +223 -0
- tensorbored/backend/event_processing/plugin_asset_util.py +104 -0
- tensorbored/backend/event_processing/plugin_event_accumulator.py +721 -0
- tensorbored/backend/event_processing/plugin_event_multiplexer.py +522 -0
- tensorbored/backend/event_processing/reservoir.py +266 -0
- tensorbored/backend/event_processing/tag_types.py +29 -0
- tensorbored/backend/experiment_id.py +71 -0
- tensorbored/backend/experimental_plugin.py +51 -0
- tensorbored/backend/http_util.py +263 -0
- tensorbored/backend/json_util.py +70 -0
- tensorbored/backend/path_prefix.py +67 -0
- tensorbored/backend/process_graph.py +74 -0
- tensorbored/backend/security_validator.py +202 -0
- tensorbored/compat/__init__.py +69 -0
- tensorbored/compat/proto/__init__.py +0 -0
- tensorbored/compat/proto/allocation_description_pb2.py +35 -0
- tensorbored/compat/proto/api_def_pb2.py +82 -0
- tensorbored/compat/proto/attr_value_pb2.py +80 -0
- tensorbored/compat/proto/cluster_pb2.py +58 -0
- tensorbored/compat/proto/config_pb2.py +271 -0
- tensorbored/compat/proto/coordination_config_pb2.py +45 -0
- tensorbored/compat/proto/cost_graph_pb2.py +87 -0
- tensorbored/compat/proto/cpp_shape_inference_pb2.py +70 -0
- tensorbored/compat/proto/debug_pb2.py +65 -0
- tensorbored/compat/proto/event_pb2.py +149 -0
- tensorbored/compat/proto/full_type_pb2.py +74 -0
- tensorbored/compat/proto/function_pb2.py +157 -0
- tensorbored/compat/proto/graph_debug_info_pb2.py +111 -0
- tensorbored/compat/proto/graph_pb2.py +41 -0
- tensorbored/compat/proto/histogram_pb2.py +39 -0
- tensorbored/compat/proto/meta_graph_pb2.py +254 -0
- tensorbored/compat/proto/node_def_pb2.py +61 -0
- tensorbored/compat/proto/op_def_pb2.py +81 -0
- tensorbored/compat/proto/resource_handle_pb2.py +48 -0
- tensorbored/compat/proto/rewriter_config_pb2.py +93 -0
- tensorbored/compat/proto/rpc_options_pb2.py +35 -0
- tensorbored/compat/proto/saved_object_graph_pb2.py +193 -0
- tensorbored/compat/proto/saver_pb2.py +38 -0
- tensorbored/compat/proto/step_stats_pb2.py +116 -0
- tensorbored/compat/proto/struct_pb2.py +144 -0
- tensorbored/compat/proto/summary_pb2.py +111 -0
- tensorbored/compat/proto/tensor_description_pb2.py +38 -0
- tensorbored/compat/proto/tensor_pb2.py +68 -0
- tensorbored/compat/proto/tensor_shape_pb2.py +46 -0
- tensorbored/compat/proto/tfprof_log_pb2.py +307 -0
- tensorbored/compat/proto/trackable_object_graph_pb2.py +90 -0
- tensorbored/compat/proto/types_pb2.py +105 -0
- tensorbored/compat/proto/variable_pb2.py +62 -0
- tensorbored/compat/proto/verifier_config_pb2.py +38 -0
- tensorbored/compat/proto/versions_pb2.py +35 -0
- tensorbored/compat/tensorflow_stub/__init__.py +38 -0
- tensorbored/compat/tensorflow_stub/app.py +124 -0
- tensorbored/compat/tensorflow_stub/compat/__init__.py +131 -0
- tensorbored/compat/tensorflow_stub/compat/v1/__init__.py +20 -0
- tensorbored/compat/tensorflow_stub/dtypes.py +692 -0
- tensorbored/compat/tensorflow_stub/error_codes.py +169 -0
- tensorbored/compat/tensorflow_stub/errors.py +507 -0
- tensorbored/compat/tensorflow_stub/flags.py +124 -0
- tensorbored/compat/tensorflow_stub/io/__init__.py +17 -0
- tensorbored/compat/tensorflow_stub/io/gfile.py +1011 -0
- tensorbored/compat/tensorflow_stub/pywrap_tensorflow.py +285 -0
- tensorbored/compat/tensorflow_stub/tensor_shape.py +1035 -0
- tensorbored/context.py +129 -0
- tensorbored/data/__init__.py +0 -0
- tensorbored/data/grpc_provider.py +365 -0
- tensorbored/data/ingester.py +46 -0
- tensorbored/data/proto/__init__.py +0 -0
- tensorbored/data/proto/data_provider_pb2.py +517 -0
- tensorbored/data/proto/data_provider_pb2_grpc.py +374 -0
- tensorbored/data/provider.py +1365 -0
- tensorbored/data/server_ingester.py +301 -0
- tensorbored/data_compat.py +159 -0
- tensorbored/dataclass_compat.py +224 -0
- tensorbored/default.py +124 -0
- tensorbored/errors.py +130 -0
- tensorbored/lazy.py +99 -0
- tensorbored/main.py +48 -0
- tensorbored/main_lib.py +62 -0
- tensorbored/manager.py +487 -0
- tensorbored/notebook.py +441 -0
- tensorbored/plugin_util.py +266 -0
- tensorbored/plugins/__init__.py +0 -0
- tensorbored/plugins/audio/__init__.py +0 -0
- tensorbored/plugins/audio/audio_plugin.py +229 -0
- tensorbored/plugins/audio/metadata.py +69 -0
- tensorbored/plugins/audio/plugin_data_pb2.py +37 -0
- tensorbored/plugins/audio/summary.py +230 -0
- tensorbored/plugins/audio/summary_v2.py +124 -0
- tensorbored/plugins/base_plugin.py +367 -0
- tensorbored/plugins/core/__init__.py +0 -0
- tensorbored/plugins/core/core_plugin.py +981 -0
- tensorbored/plugins/custom_scalar/__init__.py +0 -0
- tensorbored/plugins/custom_scalar/custom_scalars_plugin.py +320 -0
- tensorbored/plugins/custom_scalar/layout_pb2.py +85 -0
- tensorbored/plugins/custom_scalar/metadata.py +35 -0
- tensorbored/plugins/custom_scalar/summary.py +79 -0
- tensorbored/plugins/debugger_v2/__init__.py +0 -0
- tensorbored/plugins/debugger_v2/debug_data_multiplexer.py +631 -0
- tensorbored/plugins/debugger_v2/debug_data_provider.py +634 -0
- tensorbored/plugins/debugger_v2/debugger_v2_plugin.py +504 -0
- tensorbored/plugins/distribution/__init__.py +0 -0
- tensorbored/plugins/distribution/compressor.py +158 -0
- tensorbored/plugins/distribution/distributions_plugin.py +116 -0
- tensorbored/plugins/distribution/metadata.py +19 -0
- tensorbored/plugins/graph/__init__.py +0 -0
- tensorbored/plugins/graph/graph_util.py +129 -0
- tensorbored/plugins/graph/graphs_plugin.py +336 -0
- tensorbored/plugins/graph/keras_util.py +328 -0
- tensorbored/plugins/graph/metadata.py +42 -0
- tensorbored/plugins/histogram/__init__.py +0 -0
- tensorbored/plugins/histogram/histograms_plugin.py +144 -0
- tensorbored/plugins/histogram/metadata.py +63 -0
- tensorbored/plugins/histogram/plugin_data_pb2.py +34 -0
- tensorbored/plugins/histogram/summary.py +234 -0
- tensorbored/plugins/histogram/summary_v2.py +292 -0
- tensorbored/plugins/hparams/__init__.py +14 -0
- tensorbored/plugins/hparams/_keras.py +93 -0
- tensorbored/plugins/hparams/api.py +130 -0
- tensorbored/plugins/hparams/api_pb2.py +208 -0
- tensorbored/plugins/hparams/backend_context.py +606 -0
- tensorbored/plugins/hparams/download_data.py +158 -0
- tensorbored/plugins/hparams/error.py +26 -0
- tensorbored/plugins/hparams/get_experiment.py +71 -0
- tensorbored/plugins/hparams/hparams_plugin.py +206 -0
- tensorbored/plugins/hparams/hparams_util_pb2.py +69 -0
- tensorbored/plugins/hparams/json_format_compat.py +38 -0
- tensorbored/plugins/hparams/list_metric_evals.py +57 -0
- tensorbored/plugins/hparams/list_session_groups.py +1040 -0
- tensorbored/plugins/hparams/metadata.py +125 -0
- tensorbored/plugins/hparams/metrics.py +41 -0
- tensorbored/plugins/hparams/plugin_data_pb2.py +69 -0
- tensorbored/plugins/hparams/summary.py +205 -0
- tensorbored/plugins/hparams/summary_v2.py +597 -0
- tensorbored/plugins/image/__init__.py +0 -0
- tensorbored/plugins/image/images_plugin.py +232 -0
- tensorbored/plugins/image/metadata.py +65 -0
- tensorbored/plugins/image/plugin_data_pb2.py +34 -0
- tensorbored/plugins/image/summary.py +159 -0
- tensorbored/plugins/image/summary_v2.py +130 -0
- tensorbored/plugins/mesh/__init__.py +14 -0
- tensorbored/plugins/mesh/mesh_plugin.py +292 -0
- tensorbored/plugins/mesh/metadata.py +152 -0
- tensorbored/plugins/mesh/plugin_data_pb2.py +37 -0
- tensorbored/plugins/mesh/summary.py +251 -0
- tensorbored/plugins/mesh/summary_v2.py +214 -0
- tensorbored/plugins/metrics/__init__.py +0 -0
- tensorbored/plugins/metrics/metadata.py +17 -0
- tensorbored/plugins/metrics/metrics_plugin.py +623 -0
- tensorbored/plugins/pr_curve/__init__.py +0 -0
- tensorbored/plugins/pr_curve/metadata.py +75 -0
- tensorbored/plugins/pr_curve/plugin_data_pb2.py +34 -0
- tensorbored/plugins/pr_curve/pr_curves_plugin.py +241 -0
- tensorbored/plugins/pr_curve/summary.py +574 -0
- tensorbored/plugins/profile_redirect/__init__.py +0 -0
- tensorbored/plugins/profile_redirect/profile_redirect_plugin.py +49 -0
- tensorbored/plugins/projector/__init__.py +67 -0
- tensorbored/plugins/projector/metadata.py +26 -0
- tensorbored/plugins/projector/projector_config_pb2.py +54 -0
- tensorbored/plugins/projector/projector_plugin.py +795 -0
- tensorbored/plugins/projector/tf_projector_plugin/index.js +32 -0
- tensorbored/plugins/projector/tf_projector_plugin/projector_binary.html +524 -0
- tensorbored/plugins/projector/tf_projector_plugin/projector_binary.js +15536 -0
- tensorbored/plugins/scalar/__init__.py +0 -0
- tensorbored/plugins/scalar/metadata.py +60 -0
- tensorbored/plugins/scalar/plugin_data_pb2.py +34 -0
- tensorbored/plugins/scalar/scalars_plugin.py +181 -0
- tensorbored/plugins/scalar/summary.py +109 -0
- tensorbored/plugins/scalar/summary_v2.py +124 -0
- tensorbored/plugins/text/__init__.py +0 -0
- tensorbored/plugins/text/metadata.py +62 -0
- tensorbored/plugins/text/plugin_data_pb2.py +34 -0
- tensorbored/plugins/text/summary.py +114 -0
- tensorbored/plugins/text/summary_v2.py +124 -0
- tensorbored/plugins/text/text_plugin.py +288 -0
- tensorbored/plugins/wit_redirect/__init__.py +0 -0
- tensorbored/plugins/wit_redirect/wit_redirect_plugin.py +49 -0
- tensorbored/program.py +910 -0
- tensorbored/summary/__init__.py +35 -0
- tensorbored/summary/_output.py +124 -0
- tensorbored/summary/_tf/__init__.py +14 -0
- tensorbored/summary/_tf/summary/__init__.py +178 -0
- tensorbored/summary/_writer.py +105 -0
- tensorbored/summary/v1.py +51 -0
- tensorbored/summary/v2.py +25 -0
- tensorbored/summary/writer/__init__.py +13 -0
- tensorbored/summary/writer/event_file_writer.py +291 -0
- tensorbored/summary/writer/record_writer.py +50 -0
- tensorbored/util/__init__.py +0 -0
- tensorbored/util/encoder.py +116 -0
- tensorbored/util/grpc_util.py +311 -0
- tensorbored/util/img_mime_type_detector.py +40 -0
- tensorbored/util/io_util.py +20 -0
- tensorbored/util/lazy_tensor_creator.py +110 -0
- tensorbored/util/op_evaluator.py +104 -0
- tensorbored/util/platform_util.py +20 -0
- tensorbored/util/tb_logging.py +24 -0
- tensorbored/util/tensor_util.py +617 -0
- tensorbored/util/timing.py +122 -0
- tensorbored/version.py +21 -0
- tensorbored/webfiles.zip +0 -0
- tensorbored-2.21.0rc1769983804.dist-info/METADATA +49 -0
- tensorbored-2.21.0rc1769983804.dist-info/RECORD +271 -0
- tensorbored-2.21.0rc1769983804.dist-info/WHEEL +5 -0
- tensorbored-2.21.0rc1769983804.dist-info/entry_points.txt +6 -0
- tensorbored-2.21.0rc1769983804.dist-info/licenses/LICENSE +739 -0
- tensorbored-2.21.0rc1769983804.dist-info/top_level.txt +1 -0
|
@@ -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
|