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,343 @@
1
+ from __future__ import absolute_import, division, unicode_literals
2
+ # pylint:disable=protected-access
3
+
4
+ from tensorbored._vendor.bleach.six_shim import text_type
5
+
6
+ import re
7
+
8
+ from copy import copy
9
+
10
+ from . import base
11
+ from .. import _ihatexml
12
+ from .. import constants
13
+ from ..constants import namespaces
14
+ from .._utils import moduleFactoryFactory
15
+
16
+ tag_regexp = re.compile("{([^}]*)}(.*)")
17
+
18
+
19
+ def getETreeBuilder(ElementTreeImplementation, fullTree=False):
20
+ ElementTree = ElementTreeImplementation
21
+ ElementTreeCommentType = ElementTree.Comment("asd").tag
22
+
23
+ class Element(base.Node):
24
+ def __init__(self, name, namespace=None):
25
+ self._name = name
26
+ self._namespace = namespace
27
+ self._element = ElementTree.Element(self._getETreeTag(name,
28
+ namespace))
29
+ if namespace is None:
30
+ self.nameTuple = namespaces["html"], self._name
31
+ else:
32
+ self.nameTuple = self._namespace, self._name
33
+ self.parent = None
34
+ self._childNodes = []
35
+ self._flags = []
36
+
37
+ def _getETreeTag(self, name, namespace):
38
+ if namespace is None:
39
+ etree_tag = name
40
+ else:
41
+ etree_tag = "{%s}%s" % (namespace, name)
42
+ return etree_tag
43
+
44
+ def _setName(self, name):
45
+ self._name = name
46
+ self._element.tag = self._getETreeTag(self._name, self._namespace)
47
+
48
+ def _getName(self):
49
+ return self._name
50
+
51
+ name = property(_getName, _setName)
52
+
53
+ def _setNamespace(self, namespace):
54
+ self._namespace = namespace
55
+ self._element.tag = self._getETreeTag(self._name, self._namespace)
56
+
57
+ def _getNamespace(self):
58
+ return self._namespace
59
+
60
+ namespace = property(_getNamespace, _setNamespace)
61
+
62
+ def _getAttributes(self):
63
+ return self._element.attrib
64
+
65
+ def _setAttributes(self, attributes):
66
+ el_attrib = self._element.attrib
67
+ el_attrib.clear()
68
+ if attributes:
69
+ # calling .items _always_ allocates, and the above truthy check is cheaper than the
70
+ # allocation on average
71
+ for key, value in attributes.items():
72
+ if isinstance(key, tuple):
73
+ name = "{%s}%s" % (key[2], key[1])
74
+ else:
75
+ name = key
76
+ el_attrib[name] = value
77
+
78
+ attributes = property(_getAttributes, _setAttributes)
79
+
80
+ def _getChildNodes(self):
81
+ return self._childNodes
82
+
83
+ def _setChildNodes(self, value):
84
+ del self._element[:]
85
+ self._childNodes = []
86
+ for element in value:
87
+ self.insertChild(element)
88
+
89
+ childNodes = property(_getChildNodes, _setChildNodes)
90
+
91
+ def hasContent(self):
92
+ """Return true if the node has children or text"""
93
+ return bool(self._element.text or len(self._element))
94
+
95
+ def appendChild(self, node):
96
+ self._childNodes.append(node)
97
+ self._element.append(node._element)
98
+ node.parent = self
99
+
100
+ def insertBefore(self, node, refNode):
101
+ index = list(self._element).index(refNode._element)
102
+ self._element.insert(index, node._element)
103
+ node.parent = self
104
+
105
+ def removeChild(self, node):
106
+ self._childNodes.remove(node)
107
+ self._element.remove(node._element)
108
+ node.parent = None
109
+
110
+ def insertText(self, data, insertBefore=None):
111
+ if not(len(self._element)):
112
+ if not self._element.text:
113
+ self._element.text = ""
114
+ self._element.text += data
115
+ elif insertBefore is None:
116
+ # Insert the text as the tail of the last child element
117
+ if not self._element[-1].tail:
118
+ self._element[-1].tail = ""
119
+ self._element[-1].tail += data
120
+ else:
121
+ # Insert the text before the specified node
122
+ children = list(self._element)
123
+ index = children.index(insertBefore._element)
124
+ if index > 0:
125
+ if not self._element[index - 1].tail:
126
+ self._element[index - 1].tail = ""
127
+ self._element[index - 1].tail += data
128
+ else:
129
+ if not self._element.text:
130
+ self._element.text = ""
131
+ self._element.text += data
132
+
133
+ def cloneNode(self):
134
+ element = type(self)(self.name, self.namespace)
135
+ if self._element.attrib:
136
+ element._element.attrib = copy(self._element.attrib)
137
+ return element
138
+
139
+ def reparentChildren(self, newParent):
140
+ if newParent.childNodes:
141
+ newParent.childNodes[-1]._element.tail += self._element.text
142
+ else:
143
+ if not newParent._element.text:
144
+ newParent._element.text = ""
145
+ if self._element.text is not None:
146
+ newParent._element.text += self._element.text
147
+ self._element.text = ""
148
+ base.Node.reparentChildren(self, newParent)
149
+
150
+ class Comment(Element):
151
+ def __init__(self, data):
152
+ # Use the superclass constructor to set all properties on the
153
+ # wrapper element
154
+ self._element = ElementTree.Comment(data)
155
+ self.parent = None
156
+ self._childNodes = []
157
+ self._flags = []
158
+
159
+ def _getData(self):
160
+ return self._element.text
161
+
162
+ def _setData(self, value):
163
+ self._element.text = value
164
+
165
+ data = property(_getData, _setData)
166
+
167
+ class DocumentType(Element):
168
+ def __init__(self, name, publicId, systemId):
169
+ Element.__init__(self, "<!DOCTYPE>")
170
+ self._element.text = name
171
+ self.publicId = publicId
172
+ self.systemId = systemId
173
+
174
+ def _getPublicId(self):
175
+ return self._element.get("publicId", "")
176
+
177
+ def _setPublicId(self, value):
178
+ if value is not None:
179
+ self._element.set("publicId", value)
180
+
181
+ publicId = property(_getPublicId, _setPublicId)
182
+
183
+ def _getSystemId(self):
184
+ return self._element.get("systemId", "")
185
+
186
+ def _setSystemId(self, value):
187
+ if value is not None:
188
+ self._element.set("systemId", value)
189
+
190
+ systemId = property(_getSystemId, _setSystemId)
191
+
192
+ class Document(Element):
193
+ def __init__(self):
194
+ Element.__init__(self, "DOCUMENT_ROOT")
195
+
196
+ class DocumentFragment(Element):
197
+ def __init__(self):
198
+ Element.__init__(self, "DOCUMENT_FRAGMENT")
199
+
200
+ def testSerializer(element):
201
+ rv = []
202
+
203
+ def serializeElement(element, indent=0):
204
+ if not(hasattr(element, "tag")):
205
+ element = element.getroot()
206
+ if element.tag == "<!DOCTYPE>":
207
+ if element.get("publicId") or element.get("systemId"):
208
+ publicId = element.get("publicId") or ""
209
+ systemId = element.get("systemId") or ""
210
+ rv.append("""<!DOCTYPE %s "%s" "%s">""" %
211
+ (element.text, publicId, systemId))
212
+ else:
213
+ rv.append("<!DOCTYPE %s>" % (element.text,))
214
+ elif element.tag == "DOCUMENT_ROOT":
215
+ rv.append("#document")
216
+ if element.text is not None:
217
+ rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
218
+ if element.tail is not None:
219
+ raise TypeError("Document node cannot have tail")
220
+ if hasattr(element, "attrib") and len(element.attrib):
221
+ raise TypeError("Document node cannot have attributes")
222
+ elif element.tag == ElementTreeCommentType:
223
+ rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
224
+ else:
225
+ assert isinstance(element.tag, text_type), \
226
+ "Expected unicode, got %s, %s" % (type(element.tag), element.tag)
227
+ nsmatch = tag_regexp.match(element.tag)
228
+
229
+ if nsmatch is None:
230
+ name = element.tag
231
+ else:
232
+ ns, name = nsmatch.groups()
233
+ prefix = constants.prefixes[ns]
234
+ name = "%s %s" % (prefix, name)
235
+ rv.append("|%s<%s>" % (' ' * indent, name))
236
+
237
+ if hasattr(element, "attrib"):
238
+ attributes = []
239
+ for name, value in element.attrib.items():
240
+ nsmatch = tag_regexp.match(name)
241
+ if nsmatch is not None:
242
+ ns, name = nsmatch.groups()
243
+ prefix = constants.prefixes[ns]
244
+ attr_string = "%s %s" % (prefix, name)
245
+ else:
246
+ attr_string = name
247
+ attributes.append((attr_string, value))
248
+
249
+ for name, value in sorted(attributes):
250
+ rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
251
+ if element.text:
252
+ rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
253
+ indent += 2
254
+ for child in element:
255
+ serializeElement(child, indent)
256
+ if element.tail:
257
+ rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
258
+ serializeElement(element, 0)
259
+
260
+ return "\n".join(rv)
261
+
262
+ def tostring(element): # pylint:disable=unused-variable
263
+ """Serialize an element and its child nodes to a string"""
264
+ rv = []
265
+ filter = _ihatexml.InfosetFilter()
266
+
267
+ def serializeElement(element):
268
+ if isinstance(element, ElementTree.ElementTree):
269
+ element = element.getroot()
270
+
271
+ if element.tag == "<!DOCTYPE>":
272
+ if element.get("publicId") or element.get("systemId"):
273
+ publicId = element.get("publicId") or ""
274
+ systemId = element.get("systemId") or ""
275
+ rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" %
276
+ (element.text, publicId, systemId))
277
+ else:
278
+ rv.append("<!DOCTYPE %s>" % (element.text,))
279
+ elif element.tag == "DOCUMENT_ROOT":
280
+ if element.text is not None:
281
+ rv.append(element.text)
282
+ if element.tail is not None:
283
+ raise TypeError("Document node cannot have tail")
284
+ if hasattr(element, "attrib") and len(element.attrib):
285
+ raise TypeError("Document node cannot have attributes")
286
+
287
+ for child in element:
288
+ serializeElement(child)
289
+
290
+ elif element.tag == ElementTreeCommentType:
291
+ rv.append("<!--%s-->" % (element.text,))
292
+ else:
293
+ # This is assumed to be an ordinary element
294
+ if not element.attrib:
295
+ rv.append("<%s>" % (filter.fromXmlName(element.tag),))
296
+ else:
297
+ attr = " ".join(["%s=\"%s\"" % (
298
+ filter.fromXmlName(name), value)
299
+ for name, value in element.attrib.items()])
300
+ rv.append("<%s %s>" % (element.tag, attr))
301
+ if element.text:
302
+ rv.append(element.text)
303
+
304
+ for child in element:
305
+ serializeElement(child)
306
+
307
+ rv.append("</%s>" % (element.tag,))
308
+
309
+ if element.tail:
310
+ rv.append(element.tail)
311
+
312
+ serializeElement(element)
313
+
314
+ return "".join(rv)
315
+
316
+ class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable
317
+ documentClass = Document
318
+ doctypeClass = DocumentType
319
+ elementClass = Element
320
+ commentClass = Comment
321
+ fragmentClass = DocumentFragment
322
+ implementation = ElementTreeImplementation
323
+
324
+ def testSerializer(self, element):
325
+ return testSerializer(element)
326
+
327
+ def getDocument(self):
328
+ if fullTree:
329
+ return self.document._element
330
+ else:
331
+ if self.defaultNamespace is not None:
332
+ return self.document._element.find(
333
+ "{%s}html" % self.defaultNamespace)
334
+ else:
335
+ return self.document._element.find("html")
336
+
337
+ def getFragment(self):
338
+ return base.TreeBuilder.getFragment(self)._element
339
+
340
+ return locals()
341
+
342
+
343
+ getETreeModule = moduleFactoryFactory(getETreeBuilder)