ob-metaflow 2.11.13.1__py2.py3-none-any.whl → 2.19.7.1rc0__py2.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 (289) hide show
  1. metaflow/R.py +10 -7
  2. metaflow/__init__.py +40 -25
  3. metaflow/_vendor/imghdr/__init__.py +186 -0
  4. metaflow/_vendor/importlib_metadata/__init__.py +1063 -0
  5. metaflow/_vendor/importlib_metadata/_adapters.py +68 -0
  6. metaflow/_vendor/importlib_metadata/_collections.py +30 -0
  7. metaflow/_vendor/importlib_metadata/_compat.py +71 -0
  8. metaflow/_vendor/importlib_metadata/_functools.py +104 -0
  9. metaflow/_vendor/importlib_metadata/_itertools.py +73 -0
  10. metaflow/_vendor/importlib_metadata/_meta.py +48 -0
  11. metaflow/_vendor/importlib_metadata/_text.py +99 -0
  12. metaflow/_vendor/importlib_metadata/py.typed +0 -0
  13. metaflow/_vendor/typeguard/__init__.py +48 -0
  14. metaflow/_vendor/typeguard/_checkers.py +1070 -0
  15. metaflow/_vendor/typeguard/_config.py +108 -0
  16. metaflow/_vendor/typeguard/_decorators.py +233 -0
  17. metaflow/_vendor/typeguard/_exceptions.py +42 -0
  18. metaflow/_vendor/typeguard/_functions.py +308 -0
  19. metaflow/_vendor/typeguard/_importhook.py +213 -0
  20. metaflow/_vendor/typeguard/_memo.py +48 -0
  21. metaflow/_vendor/typeguard/_pytest_plugin.py +127 -0
  22. metaflow/_vendor/typeguard/_suppression.py +86 -0
  23. metaflow/_vendor/typeguard/_transformer.py +1229 -0
  24. metaflow/_vendor/typeguard/_union_transformer.py +55 -0
  25. metaflow/_vendor/typeguard/_utils.py +173 -0
  26. metaflow/_vendor/typeguard/py.typed +0 -0
  27. metaflow/_vendor/typing_extensions.py +3641 -0
  28. metaflow/_vendor/v3_7/importlib_metadata/__init__.py +1063 -0
  29. metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +68 -0
  30. metaflow/_vendor/v3_7/importlib_metadata/_collections.py +30 -0
  31. metaflow/_vendor/v3_7/importlib_metadata/_compat.py +71 -0
  32. metaflow/_vendor/v3_7/importlib_metadata/_functools.py +104 -0
  33. metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +73 -0
  34. metaflow/_vendor/v3_7/importlib_metadata/_meta.py +48 -0
  35. metaflow/_vendor/v3_7/importlib_metadata/_text.py +99 -0
  36. metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  37. metaflow/_vendor/v3_7/typeguard/__init__.py +48 -0
  38. metaflow/_vendor/v3_7/typeguard/_checkers.py +906 -0
  39. metaflow/_vendor/v3_7/typeguard/_config.py +108 -0
  40. metaflow/_vendor/v3_7/typeguard/_decorators.py +237 -0
  41. metaflow/_vendor/v3_7/typeguard/_exceptions.py +42 -0
  42. metaflow/_vendor/v3_7/typeguard/_functions.py +310 -0
  43. metaflow/_vendor/v3_7/typeguard/_importhook.py +213 -0
  44. metaflow/_vendor/v3_7/typeguard/_memo.py +48 -0
  45. metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +100 -0
  46. metaflow/_vendor/v3_7/typeguard/_suppression.py +88 -0
  47. metaflow/_vendor/v3_7/typeguard/_transformer.py +1207 -0
  48. metaflow/_vendor/v3_7/typeguard/_union_transformer.py +54 -0
  49. metaflow/_vendor/v3_7/typeguard/_utils.py +169 -0
  50. metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  51. metaflow/_vendor/v3_7/typing_extensions.py +3072 -0
  52. metaflow/_vendor/yaml/__init__.py +427 -0
  53. metaflow/_vendor/yaml/composer.py +139 -0
  54. metaflow/_vendor/yaml/constructor.py +748 -0
  55. metaflow/_vendor/yaml/cyaml.py +101 -0
  56. metaflow/_vendor/yaml/dumper.py +62 -0
  57. metaflow/_vendor/yaml/emitter.py +1137 -0
  58. metaflow/_vendor/yaml/error.py +75 -0
  59. metaflow/_vendor/yaml/events.py +86 -0
  60. metaflow/_vendor/yaml/loader.py +63 -0
  61. metaflow/_vendor/yaml/nodes.py +49 -0
  62. metaflow/_vendor/yaml/parser.py +589 -0
  63. metaflow/_vendor/yaml/reader.py +185 -0
  64. metaflow/_vendor/yaml/representer.py +389 -0
  65. metaflow/_vendor/yaml/resolver.py +227 -0
  66. metaflow/_vendor/yaml/scanner.py +1435 -0
  67. metaflow/_vendor/yaml/serializer.py +111 -0
  68. metaflow/_vendor/yaml/tokens.py +104 -0
  69. metaflow/cards.py +5 -0
  70. metaflow/cli.py +331 -785
  71. metaflow/cli_args.py +17 -0
  72. metaflow/cli_components/__init__.py +0 -0
  73. metaflow/cli_components/dump_cmd.py +96 -0
  74. metaflow/cli_components/init_cmd.py +52 -0
  75. metaflow/cli_components/run_cmds.py +546 -0
  76. metaflow/cli_components/step_cmd.py +334 -0
  77. metaflow/cli_components/utils.py +140 -0
  78. metaflow/client/__init__.py +1 -0
  79. metaflow/client/core.py +467 -73
  80. metaflow/client/filecache.py +75 -35
  81. metaflow/clone_util.py +7 -1
  82. metaflow/cmd/code/__init__.py +231 -0
  83. metaflow/cmd/develop/stub_generator.py +756 -288
  84. metaflow/cmd/develop/stubs.py +12 -28
  85. metaflow/cmd/main_cli.py +6 -4
  86. metaflow/cmd/make_wrapper.py +78 -0
  87. metaflow/datastore/__init__.py +1 -0
  88. metaflow/datastore/content_addressed_store.py +41 -10
  89. metaflow/datastore/datastore_set.py +11 -2
  90. metaflow/datastore/flow_datastore.py +156 -10
  91. metaflow/datastore/spin_datastore.py +91 -0
  92. metaflow/datastore/task_datastore.py +154 -39
  93. metaflow/debug.py +5 -0
  94. metaflow/decorators.py +404 -78
  95. metaflow/exception.py +8 -2
  96. metaflow/extension_support/__init__.py +527 -376
  97. metaflow/extension_support/_empty_file.py +2 -2
  98. metaflow/extension_support/plugins.py +49 -31
  99. metaflow/flowspec.py +482 -33
  100. metaflow/graph.py +210 -42
  101. metaflow/includefile.py +84 -40
  102. metaflow/lint.py +141 -22
  103. metaflow/meta_files.py +13 -0
  104. metaflow/{metadata → metadata_provider}/heartbeat.py +24 -8
  105. metaflow/{metadata → metadata_provider}/metadata.py +86 -1
  106. metaflow/metaflow_config.py +175 -28
  107. metaflow/metaflow_config_funcs.py +51 -3
  108. metaflow/metaflow_current.py +4 -10
  109. metaflow/metaflow_environment.py +139 -53
  110. metaflow/metaflow_git.py +115 -0
  111. metaflow/metaflow_profile.py +18 -0
  112. metaflow/metaflow_version.py +150 -66
  113. metaflow/mflog/__init__.py +4 -3
  114. metaflow/mflog/save_logs.py +2 -2
  115. metaflow/multicore_utils.py +31 -14
  116. metaflow/package/__init__.py +673 -0
  117. metaflow/packaging_sys/__init__.py +880 -0
  118. metaflow/packaging_sys/backend.py +128 -0
  119. metaflow/packaging_sys/distribution_support.py +153 -0
  120. metaflow/packaging_sys/tar_backend.py +99 -0
  121. metaflow/packaging_sys/utils.py +54 -0
  122. metaflow/packaging_sys/v1.py +527 -0
  123. metaflow/parameters.py +149 -28
  124. metaflow/plugins/__init__.py +74 -5
  125. metaflow/plugins/airflow/airflow.py +40 -25
  126. metaflow/plugins/airflow/airflow_cli.py +22 -5
  127. metaflow/plugins/airflow/airflow_decorator.py +1 -1
  128. metaflow/plugins/airflow/airflow_utils.py +5 -3
  129. metaflow/plugins/airflow/sensors/base_sensor.py +4 -4
  130. metaflow/plugins/airflow/sensors/external_task_sensor.py +2 -2
  131. metaflow/plugins/airflow/sensors/s3_sensor.py +2 -2
  132. metaflow/plugins/argo/argo_client.py +78 -33
  133. metaflow/plugins/argo/argo_events.py +6 -6
  134. metaflow/plugins/argo/argo_workflows.py +2410 -527
  135. metaflow/plugins/argo/argo_workflows_cli.py +571 -121
  136. metaflow/plugins/argo/argo_workflows_decorator.py +43 -12
  137. metaflow/plugins/argo/argo_workflows_deployer.py +106 -0
  138. metaflow/plugins/argo/argo_workflows_deployer_objects.py +453 -0
  139. metaflow/plugins/argo/capture_error.py +73 -0
  140. metaflow/plugins/argo/conditional_input_paths.py +35 -0
  141. metaflow/plugins/argo/exit_hooks.py +209 -0
  142. metaflow/plugins/argo/jobset_input_paths.py +15 -0
  143. metaflow/plugins/argo/param_val.py +19 -0
  144. metaflow/plugins/aws/aws_client.py +10 -3
  145. metaflow/plugins/aws/aws_utils.py +55 -2
  146. metaflow/plugins/aws/batch/batch.py +72 -5
  147. metaflow/plugins/aws/batch/batch_cli.py +33 -10
  148. metaflow/plugins/aws/batch/batch_client.py +4 -3
  149. metaflow/plugins/aws/batch/batch_decorator.py +102 -35
  150. metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +13 -10
  151. metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -3
  152. metaflow/plugins/aws/step_functions/production_token.py +1 -1
  153. metaflow/plugins/aws/step_functions/step_functions.py +65 -8
  154. metaflow/plugins/aws/step_functions/step_functions_cli.py +101 -7
  155. metaflow/plugins/aws/step_functions/step_functions_decorator.py +1 -2
  156. metaflow/plugins/aws/step_functions/step_functions_deployer.py +97 -0
  157. metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +264 -0
  158. metaflow/plugins/azure/azure_exceptions.py +1 -1
  159. metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +240 -0
  160. metaflow/plugins/azure/azure_tail.py +1 -1
  161. metaflow/plugins/azure/includefile_support.py +2 -0
  162. metaflow/plugins/cards/card_cli.py +66 -30
  163. metaflow/plugins/cards/card_creator.py +25 -1
  164. metaflow/plugins/cards/card_datastore.py +21 -49
  165. metaflow/plugins/cards/card_decorator.py +132 -8
  166. metaflow/plugins/cards/card_modules/basic.py +112 -17
  167. metaflow/plugins/cards/card_modules/bundle.css +1 -1
  168. metaflow/plugins/cards/card_modules/card.py +16 -1
  169. metaflow/plugins/cards/card_modules/chevron/renderer.py +1 -1
  170. metaflow/plugins/cards/card_modules/components.py +665 -28
  171. metaflow/plugins/cards/card_modules/convert_to_native_type.py +36 -7
  172. metaflow/plugins/cards/card_modules/json_viewer.py +232 -0
  173. metaflow/plugins/cards/card_modules/main.css +1 -0
  174. metaflow/plugins/cards/card_modules/main.js +68 -49
  175. metaflow/plugins/cards/card_modules/renderer_tools.py +1 -0
  176. metaflow/plugins/cards/card_modules/test_cards.py +26 -12
  177. metaflow/plugins/cards/card_server.py +39 -14
  178. metaflow/plugins/cards/component_serializer.py +2 -9
  179. metaflow/plugins/cards/metadata.py +22 -0
  180. metaflow/plugins/catch_decorator.py +9 -0
  181. metaflow/plugins/datastores/azure_storage.py +10 -1
  182. metaflow/plugins/datastores/gs_storage.py +6 -2
  183. metaflow/plugins/datastores/local_storage.py +12 -6
  184. metaflow/plugins/datastores/spin_storage.py +12 -0
  185. metaflow/plugins/datatools/local.py +2 -0
  186. metaflow/plugins/datatools/s3/s3.py +126 -75
  187. metaflow/plugins/datatools/s3/s3op.py +254 -121
  188. metaflow/plugins/env_escape/__init__.py +3 -3
  189. metaflow/plugins/env_escape/client_modules.py +102 -72
  190. metaflow/plugins/env_escape/server.py +7 -0
  191. metaflow/plugins/env_escape/stub.py +24 -5
  192. metaflow/plugins/events_decorator.py +343 -185
  193. metaflow/plugins/exit_hook/__init__.py +0 -0
  194. metaflow/plugins/exit_hook/exit_hook_decorator.py +46 -0
  195. metaflow/plugins/exit_hook/exit_hook_script.py +52 -0
  196. metaflow/plugins/gcp/__init__.py +1 -1
  197. metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +11 -6
  198. metaflow/plugins/gcp/gs_tail.py +10 -6
  199. metaflow/plugins/gcp/includefile_support.py +3 -0
  200. metaflow/plugins/kubernetes/kube_utils.py +108 -0
  201. metaflow/plugins/kubernetes/kubernetes.py +411 -130
  202. metaflow/plugins/kubernetes/kubernetes_cli.py +168 -36
  203. metaflow/plugins/kubernetes/kubernetes_client.py +104 -2
  204. metaflow/plugins/kubernetes/kubernetes_decorator.py +246 -88
  205. metaflow/plugins/kubernetes/kubernetes_job.py +253 -581
  206. metaflow/plugins/kubernetes/kubernetes_jobsets.py +1071 -0
  207. metaflow/plugins/kubernetes/spot_metadata_cli.py +69 -0
  208. metaflow/plugins/kubernetes/spot_monitor_sidecar.py +109 -0
  209. metaflow/plugins/logs_cli.py +359 -0
  210. metaflow/plugins/{metadata → metadata_providers}/local.py +144 -84
  211. metaflow/plugins/{metadata → metadata_providers}/service.py +103 -26
  212. metaflow/plugins/metadata_providers/spin.py +16 -0
  213. metaflow/plugins/package_cli.py +36 -24
  214. metaflow/plugins/parallel_decorator.py +128 -11
  215. metaflow/plugins/parsers.py +16 -0
  216. metaflow/plugins/project_decorator.py +51 -5
  217. metaflow/plugins/pypi/bootstrap.py +357 -105
  218. metaflow/plugins/pypi/conda_decorator.py +82 -81
  219. metaflow/plugins/pypi/conda_environment.py +187 -52
  220. metaflow/plugins/pypi/micromamba.py +157 -47
  221. metaflow/plugins/pypi/parsers.py +268 -0
  222. metaflow/plugins/pypi/pip.py +88 -13
  223. metaflow/plugins/pypi/pypi_decorator.py +37 -1
  224. metaflow/plugins/pypi/utils.py +48 -2
  225. metaflow/plugins/resources_decorator.py +2 -2
  226. metaflow/plugins/secrets/__init__.py +3 -0
  227. metaflow/plugins/secrets/secrets_decorator.py +26 -181
  228. metaflow/plugins/secrets/secrets_func.py +49 -0
  229. metaflow/plugins/secrets/secrets_spec.py +101 -0
  230. metaflow/plugins/secrets/utils.py +74 -0
  231. metaflow/plugins/tag_cli.py +4 -7
  232. metaflow/plugins/test_unbounded_foreach_decorator.py +41 -6
  233. metaflow/plugins/timeout_decorator.py +3 -3
  234. metaflow/plugins/uv/__init__.py +0 -0
  235. metaflow/plugins/uv/bootstrap.py +128 -0
  236. metaflow/plugins/uv/uv_environment.py +72 -0
  237. metaflow/procpoll.py +1 -1
  238. metaflow/pylint_wrapper.py +5 -1
  239. metaflow/runner/__init__.py +0 -0
  240. metaflow/runner/click_api.py +717 -0
  241. metaflow/runner/deployer.py +470 -0
  242. metaflow/runner/deployer_impl.py +201 -0
  243. metaflow/runner/metaflow_runner.py +714 -0
  244. metaflow/runner/nbdeploy.py +132 -0
  245. metaflow/runner/nbrun.py +225 -0
  246. metaflow/runner/subprocess_manager.py +650 -0
  247. metaflow/runner/utils.py +335 -0
  248. metaflow/runtime.py +1078 -260
  249. metaflow/sidecar/sidecar_worker.py +1 -1
  250. metaflow/system/__init__.py +5 -0
  251. metaflow/system/system_logger.py +85 -0
  252. metaflow/system/system_monitor.py +108 -0
  253. metaflow/system/system_utils.py +19 -0
  254. metaflow/task.py +521 -225
  255. metaflow/tracing/__init__.py +7 -7
  256. metaflow/tracing/span_exporter.py +31 -38
  257. metaflow/tracing/tracing_modules.py +38 -43
  258. metaflow/tuple_util.py +27 -0
  259. metaflow/user_configs/__init__.py +0 -0
  260. metaflow/user_configs/config_options.py +563 -0
  261. metaflow/user_configs/config_parameters.py +598 -0
  262. metaflow/user_decorators/__init__.py +0 -0
  263. metaflow/user_decorators/common.py +144 -0
  264. metaflow/user_decorators/mutable_flow.py +512 -0
  265. metaflow/user_decorators/mutable_step.py +424 -0
  266. metaflow/user_decorators/user_flow_decorator.py +264 -0
  267. metaflow/user_decorators/user_step_decorator.py +749 -0
  268. metaflow/util.py +243 -27
  269. metaflow/vendor.py +23 -7
  270. metaflow/version.py +1 -1
  271. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/Makefile +355 -0
  272. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/Tiltfile +726 -0
  273. ob_metaflow-2.19.7.1rc0.data/data/share/metaflow/devtools/pick_services.sh +105 -0
  274. ob_metaflow-2.19.7.1rc0.dist-info/METADATA +87 -0
  275. ob_metaflow-2.19.7.1rc0.dist-info/RECORD +445 -0
  276. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/WHEEL +1 -1
  277. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/entry_points.txt +1 -0
  278. metaflow/_vendor/v3_5/__init__.py +0 -1
  279. metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -644
  280. metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -152
  281. metaflow/package.py +0 -188
  282. ob_metaflow-2.11.13.1.dist-info/METADATA +0 -85
  283. ob_metaflow-2.11.13.1.dist-info/RECORD +0 -308
  284. /metaflow/_vendor/{v3_5/zipp.py → zipp.py} +0 -0
  285. /metaflow/{metadata → metadata_provider}/__init__.py +0 -0
  286. /metaflow/{metadata → metadata_provider}/util.py +0 -0
  287. /metaflow/plugins/{metadata → metadata_providers}/__init__.py +0 -0
  288. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info/licenses}/LICENSE +0 -0
  289. {ob_metaflow-2.11.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,427 @@
1
+
2
+ from .error import *
3
+
4
+ from .tokens import *
5
+ from .events import *
6
+ from .nodes import *
7
+
8
+ from .loader import *
9
+ from .dumper import *
10
+
11
+ __version__ = '5.3.1'
12
+ try:
13
+ from .cyaml import *
14
+ __with_libyaml__ = True
15
+ except ImportError:
16
+ __with_libyaml__ = False
17
+
18
+ import io
19
+
20
+ #------------------------------------------------------------------------------
21
+ # Warnings control
22
+ #------------------------------------------------------------------------------
23
+
24
+ # 'Global' warnings state:
25
+ _warnings_enabled = {
26
+ 'YAMLLoadWarning': True,
27
+ }
28
+
29
+ # Get or set global warnings' state
30
+ def warnings(settings=None):
31
+ if settings is None:
32
+ return _warnings_enabled
33
+
34
+ if type(settings) is dict:
35
+ for key in settings:
36
+ if key in _warnings_enabled:
37
+ _warnings_enabled[key] = settings[key]
38
+
39
+ # Warn when load() is called without Loader=...
40
+ class YAMLLoadWarning(RuntimeWarning):
41
+ pass
42
+
43
+ def load_warning(method):
44
+ if _warnings_enabled['YAMLLoadWarning'] is False:
45
+ return
46
+
47
+ import warnings
48
+
49
+ message = (
50
+ "calling yaml.%s() without Loader=... is deprecated, as the "
51
+ "default Loader is unsafe. Please read "
52
+ "https://msg.pyyaml.org/load for full details."
53
+ ) % method
54
+
55
+ warnings.warn(message, YAMLLoadWarning, stacklevel=3)
56
+
57
+ #------------------------------------------------------------------------------
58
+ def scan(stream, Loader=Loader):
59
+ """
60
+ Scan a YAML stream and produce scanning tokens.
61
+ """
62
+ loader = Loader(stream)
63
+ try:
64
+ while loader.check_token():
65
+ yield loader.get_token()
66
+ finally:
67
+ loader.dispose()
68
+
69
+ def parse(stream, Loader=Loader):
70
+ """
71
+ Parse a YAML stream and produce parsing events.
72
+ """
73
+ loader = Loader(stream)
74
+ try:
75
+ while loader.check_event():
76
+ yield loader.get_event()
77
+ finally:
78
+ loader.dispose()
79
+
80
+ def compose(stream, Loader=Loader):
81
+ """
82
+ Parse the first YAML document in a stream
83
+ and produce the corresponding representation tree.
84
+ """
85
+ loader = Loader(stream)
86
+ try:
87
+ return loader.get_single_node()
88
+ finally:
89
+ loader.dispose()
90
+
91
+ def compose_all(stream, Loader=Loader):
92
+ """
93
+ Parse all YAML documents in a stream
94
+ and produce corresponding representation trees.
95
+ """
96
+ loader = Loader(stream)
97
+ try:
98
+ while loader.check_node():
99
+ yield loader.get_node()
100
+ finally:
101
+ loader.dispose()
102
+
103
+ def load(stream, Loader=None):
104
+ """
105
+ Parse the first YAML document in a stream
106
+ and produce the corresponding Python object.
107
+ """
108
+ if Loader is None:
109
+ load_warning('load')
110
+ Loader = FullLoader
111
+
112
+ loader = Loader(stream)
113
+ try:
114
+ return loader.get_single_data()
115
+ finally:
116
+ loader.dispose()
117
+
118
+ def load_all(stream, Loader=None):
119
+ """
120
+ Parse all YAML documents in a stream
121
+ and produce corresponding Python objects.
122
+ """
123
+ if Loader is None:
124
+ load_warning('load_all')
125
+ Loader = FullLoader
126
+
127
+ loader = Loader(stream)
128
+ try:
129
+ while loader.check_data():
130
+ yield loader.get_data()
131
+ finally:
132
+ loader.dispose()
133
+
134
+ def full_load(stream):
135
+ """
136
+ Parse the first YAML document in a stream
137
+ and produce the corresponding Python object.
138
+
139
+ Resolve all tags except those known to be
140
+ unsafe on untrusted input.
141
+ """
142
+ return load(stream, FullLoader)
143
+
144
+ def full_load_all(stream):
145
+ """
146
+ Parse all YAML documents in a stream
147
+ and produce corresponding Python objects.
148
+
149
+ Resolve all tags except those known to be
150
+ unsafe on untrusted input.
151
+ """
152
+ return load_all(stream, FullLoader)
153
+
154
+ def safe_load(stream):
155
+ """
156
+ Parse the first YAML document in a stream
157
+ and produce the corresponding Python object.
158
+
159
+ Resolve only basic YAML tags. This is known
160
+ to be safe for untrusted input.
161
+ """
162
+ return load(stream, SafeLoader)
163
+
164
+ def safe_load_all(stream):
165
+ """
166
+ Parse all YAML documents in a stream
167
+ and produce corresponding Python objects.
168
+
169
+ Resolve only basic YAML tags. This is known
170
+ to be safe for untrusted input.
171
+ """
172
+ return load_all(stream, SafeLoader)
173
+
174
+ def unsafe_load(stream):
175
+ """
176
+ Parse the first YAML document in a stream
177
+ and produce the corresponding Python object.
178
+
179
+ Resolve all tags, even those known to be
180
+ unsafe on untrusted input.
181
+ """
182
+ return load(stream, UnsafeLoader)
183
+
184
+ def unsafe_load_all(stream):
185
+ """
186
+ Parse all YAML documents in a stream
187
+ and produce corresponding Python objects.
188
+
189
+ Resolve all tags, even those known to be
190
+ unsafe on untrusted input.
191
+ """
192
+ return load_all(stream, UnsafeLoader)
193
+
194
+ def emit(events, stream=None, Dumper=Dumper,
195
+ canonical=None, indent=None, width=None,
196
+ allow_unicode=None, line_break=None):
197
+ """
198
+ Emit YAML parsing events into a stream.
199
+ If stream is None, return the produced string instead.
200
+ """
201
+ getvalue = None
202
+ if stream is None:
203
+ stream = io.StringIO()
204
+ getvalue = stream.getvalue
205
+ dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
206
+ allow_unicode=allow_unicode, line_break=line_break)
207
+ try:
208
+ for event in events:
209
+ dumper.emit(event)
210
+ finally:
211
+ dumper.dispose()
212
+ if getvalue:
213
+ return getvalue()
214
+
215
+ def serialize_all(nodes, stream=None, Dumper=Dumper,
216
+ canonical=None, indent=None, width=None,
217
+ allow_unicode=None, line_break=None,
218
+ encoding=None, explicit_start=None, explicit_end=None,
219
+ version=None, tags=None):
220
+ """
221
+ Serialize a sequence of representation trees into a YAML stream.
222
+ If stream is None, return the produced string instead.
223
+ """
224
+ getvalue = None
225
+ if stream is None:
226
+ if encoding is None:
227
+ stream = io.StringIO()
228
+ else:
229
+ stream = io.BytesIO()
230
+ getvalue = stream.getvalue
231
+ dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
232
+ allow_unicode=allow_unicode, line_break=line_break,
233
+ encoding=encoding, version=version, tags=tags,
234
+ explicit_start=explicit_start, explicit_end=explicit_end)
235
+ try:
236
+ dumper.open()
237
+ for node in nodes:
238
+ dumper.serialize(node)
239
+ dumper.close()
240
+ finally:
241
+ dumper.dispose()
242
+ if getvalue:
243
+ return getvalue()
244
+
245
+ def serialize(node, stream=None, Dumper=Dumper, **kwds):
246
+ """
247
+ Serialize a representation tree into a YAML stream.
248
+ If stream is None, return the produced string instead.
249
+ """
250
+ return serialize_all([node], stream, Dumper=Dumper, **kwds)
251
+
252
+ def dump_all(documents, stream=None, Dumper=Dumper,
253
+ default_style=None, default_flow_style=False,
254
+ canonical=None, indent=None, width=None,
255
+ allow_unicode=None, line_break=None,
256
+ encoding=None, explicit_start=None, explicit_end=None,
257
+ version=None, tags=None, sort_keys=True):
258
+ """
259
+ Serialize a sequence of Python objects into a YAML stream.
260
+ If stream is None, return the produced string instead.
261
+ """
262
+ getvalue = None
263
+ if stream is None:
264
+ if encoding is None:
265
+ stream = io.StringIO()
266
+ else:
267
+ stream = io.BytesIO()
268
+ getvalue = stream.getvalue
269
+ dumper = Dumper(stream, default_style=default_style,
270
+ default_flow_style=default_flow_style,
271
+ canonical=canonical, indent=indent, width=width,
272
+ allow_unicode=allow_unicode, line_break=line_break,
273
+ encoding=encoding, version=version, tags=tags,
274
+ explicit_start=explicit_start, explicit_end=explicit_end, sort_keys=sort_keys)
275
+ try:
276
+ dumper.open()
277
+ for data in documents:
278
+ dumper.represent(data)
279
+ dumper.close()
280
+ finally:
281
+ dumper.dispose()
282
+ if getvalue:
283
+ return getvalue()
284
+
285
+ def dump(data, stream=None, Dumper=Dumper, **kwds):
286
+ """
287
+ Serialize a Python object into a YAML stream.
288
+ If stream is None, return the produced string instead.
289
+ """
290
+ return dump_all([data], stream, Dumper=Dumper, **kwds)
291
+
292
+ def safe_dump_all(documents, stream=None, **kwds):
293
+ """
294
+ Serialize a sequence of Python objects into a YAML stream.
295
+ Produce only basic YAML tags.
296
+ If stream is None, return the produced string instead.
297
+ """
298
+ return dump_all(documents, stream, Dumper=SafeDumper, **kwds)
299
+
300
+ def safe_dump(data, stream=None, **kwds):
301
+ """
302
+ Serialize a Python object into a YAML stream.
303
+ Produce only basic YAML tags.
304
+ If stream is None, return the produced string instead.
305
+ """
306
+ return dump_all([data], stream, Dumper=SafeDumper, **kwds)
307
+
308
+ def add_implicit_resolver(tag, regexp, first=None,
309
+ Loader=None, Dumper=Dumper):
310
+ """
311
+ Add an implicit scalar detector.
312
+ If an implicit scalar value matches the given regexp,
313
+ the corresponding tag is assigned to the scalar.
314
+ first is a sequence of possible initial characters or None.
315
+ """
316
+ if Loader is None:
317
+ loader.Loader.add_implicit_resolver(tag, regexp, first)
318
+ loader.FullLoader.add_implicit_resolver(tag, regexp, first)
319
+ loader.UnsafeLoader.add_implicit_resolver(tag, regexp, first)
320
+ else:
321
+ Loader.add_implicit_resolver(tag, regexp, first)
322
+ Dumper.add_implicit_resolver(tag, regexp, first)
323
+
324
+ def add_path_resolver(tag, path, kind=None, Loader=None, Dumper=Dumper):
325
+ """
326
+ Add a path based resolver for the given tag.
327
+ A path is a list of keys that forms a path
328
+ to a node in the representation tree.
329
+ Keys can be string values, integers, or None.
330
+ """
331
+ if Loader is None:
332
+ loader.Loader.add_path_resolver(tag, path, kind)
333
+ loader.FullLoader.add_path_resolver(tag, path, kind)
334
+ loader.UnsafeLoader.add_path_resolver(tag, path, kind)
335
+ else:
336
+ Loader.add_path_resolver(tag, path, kind)
337
+ Dumper.add_path_resolver(tag, path, kind)
338
+
339
+ def add_constructor(tag, constructor, Loader=None):
340
+ """
341
+ Add a constructor for the given tag.
342
+ Constructor is a function that accepts a Loader instance
343
+ and a node object and produces the corresponding Python object.
344
+ """
345
+ if Loader is None:
346
+ loader.Loader.add_constructor(tag, constructor)
347
+ loader.FullLoader.add_constructor(tag, constructor)
348
+ loader.UnsafeLoader.add_constructor(tag, constructor)
349
+ else:
350
+ Loader.add_constructor(tag, constructor)
351
+
352
+ def add_multi_constructor(tag_prefix, multi_constructor, Loader=None):
353
+ """
354
+ Add a multi-constructor for the given tag prefix.
355
+ Multi-constructor is called for a node if its tag starts with tag_prefix.
356
+ Multi-constructor accepts a Loader instance, a tag suffix,
357
+ and a node object and produces the corresponding Python object.
358
+ """
359
+ if Loader is None:
360
+ loader.Loader.add_multi_constructor(tag_prefix, multi_constructor)
361
+ loader.FullLoader.add_multi_constructor(tag_prefix, multi_constructor)
362
+ loader.UnsafeLoader.add_multi_constructor(tag_prefix, multi_constructor)
363
+ else:
364
+ Loader.add_multi_constructor(tag_prefix, multi_constructor)
365
+
366
+ def add_representer(data_type, representer, Dumper=Dumper):
367
+ """
368
+ Add a representer for the given type.
369
+ Representer is a function accepting a Dumper instance
370
+ and an instance of the given data type
371
+ and producing the corresponding representation node.
372
+ """
373
+ Dumper.add_representer(data_type, representer)
374
+
375
+ def add_multi_representer(data_type, multi_representer, Dumper=Dumper):
376
+ """
377
+ Add a representer for the given type.
378
+ Multi-representer is a function accepting a Dumper instance
379
+ and an instance of the given data type or subtype
380
+ and producing the corresponding representation node.
381
+ """
382
+ Dumper.add_multi_representer(data_type, multi_representer)
383
+
384
+ class YAMLObjectMetaclass(type):
385
+ """
386
+ The metaclass for YAMLObject.
387
+ """
388
+ def __init__(cls, name, bases, kwds):
389
+ super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds)
390
+ if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None:
391
+ if isinstance(cls.yaml_loader, list):
392
+ for loader in cls.yaml_loader:
393
+ loader.add_constructor(cls.yaml_tag, cls.from_yaml)
394
+ else:
395
+ cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
396
+
397
+ cls.yaml_dumper.add_representer(cls, cls.to_yaml)
398
+
399
+ class YAMLObject(metaclass=YAMLObjectMetaclass):
400
+ """
401
+ An object that can dump itself to a YAML stream
402
+ and load itself from a YAML stream.
403
+ """
404
+
405
+ __slots__ = () # no direct instantiation, so allow immutable subclasses
406
+
407
+ yaml_loader = [Loader, FullLoader, UnsafeLoader]
408
+ yaml_dumper = Dumper
409
+
410
+ yaml_tag = None
411
+ yaml_flow_style = None
412
+
413
+ @classmethod
414
+ def from_yaml(cls, loader, node):
415
+ """
416
+ Convert a representation node to a Python object.
417
+ """
418
+ return loader.construct_yaml_object(node, cls)
419
+
420
+ @classmethod
421
+ def to_yaml(cls, dumper, data):
422
+ """
423
+ Convert a Python object to a representation node.
424
+ """
425
+ return dumper.represent_yaml_object(cls.yaml_tag, data, cls,
426
+ flow_style=cls.yaml_flow_style)
427
+
@@ -0,0 +1,139 @@
1
+
2
+ __all__ = ['Composer', 'ComposerError']
3
+
4
+ from .error import MarkedYAMLError
5
+ from .events import *
6
+ from .nodes import *
7
+
8
+ class ComposerError(MarkedYAMLError):
9
+ pass
10
+
11
+ class Composer:
12
+
13
+ def __init__(self):
14
+ self.anchors = {}
15
+
16
+ def check_node(self):
17
+ # Drop the STREAM-START event.
18
+ if self.check_event(StreamStartEvent):
19
+ self.get_event()
20
+
21
+ # If there are more documents available?
22
+ return not self.check_event(StreamEndEvent)
23
+
24
+ def get_node(self):
25
+ # Get the root node of the next document.
26
+ if not self.check_event(StreamEndEvent):
27
+ return self.compose_document()
28
+
29
+ def get_single_node(self):
30
+ # Drop the STREAM-START event.
31
+ self.get_event()
32
+
33
+ # Compose a document if the stream is not empty.
34
+ document = None
35
+ if not self.check_event(StreamEndEvent):
36
+ document = self.compose_document()
37
+
38
+ # Ensure that the stream contains no more documents.
39
+ if not self.check_event(StreamEndEvent):
40
+ event = self.get_event()
41
+ raise ComposerError("expected a single document in the stream",
42
+ document.start_mark, "but found another document",
43
+ event.start_mark)
44
+
45
+ # Drop the STREAM-END event.
46
+ self.get_event()
47
+
48
+ return document
49
+
50
+ def compose_document(self):
51
+ # Drop the DOCUMENT-START event.
52
+ self.get_event()
53
+
54
+ # Compose the root node.
55
+ node = self.compose_node(None, None)
56
+
57
+ # Drop the DOCUMENT-END event.
58
+ self.get_event()
59
+
60
+ self.anchors = {}
61
+ return node
62
+
63
+ def compose_node(self, parent, index):
64
+ if self.check_event(AliasEvent):
65
+ event = self.get_event()
66
+ anchor = event.anchor
67
+ if anchor not in self.anchors:
68
+ raise ComposerError(None, None, "found undefined alias %r"
69
+ % anchor, event.start_mark)
70
+ return self.anchors[anchor]
71
+ event = self.peek_event()
72
+ anchor = event.anchor
73
+ if anchor is not None:
74
+ if anchor in self.anchors:
75
+ raise ComposerError("found duplicate anchor %r; first occurrence"
76
+ % anchor, self.anchors[anchor].start_mark,
77
+ "second occurrence", event.start_mark)
78
+ self.descend_resolver(parent, index)
79
+ if self.check_event(ScalarEvent):
80
+ node = self.compose_scalar_node(anchor)
81
+ elif self.check_event(SequenceStartEvent):
82
+ node = self.compose_sequence_node(anchor)
83
+ elif self.check_event(MappingStartEvent):
84
+ node = self.compose_mapping_node(anchor)
85
+ self.ascend_resolver()
86
+ return node
87
+
88
+ def compose_scalar_node(self, anchor):
89
+ event = self.get_event()
90
+ tag = event.tag
91
+ if tag is None or tag == '!':
92
+ tag = self.resolve(ScalarNode, event.value, event.implicit)
93
+ node = ScalarNode(tag, event.value,
94
+ event.start_mark, event.end_mark, style=event.style)
95
+ if anchor is not None:
96
+ self.anchors[anchor] = node
97
+ return node
98
+
99
+ def compose_sequence_node(self, anchor):
100
+ start_event = self.get_event()
101
+ tag = start_event.tag
102
+ if tag is None or tag == '!':
103
+ tag = self.resolve(SequenceNode, None, start_event.implicit)
104
+ node = SequenceNode(tag, [],
105
+ start_event.start_mark, None,
106
+ flow_style=start_event.flow_style)
107
+ if anchor is not None:
108
+ self.anchors[anchor] = node
109
+ index = 0
110
+ while not self.check_event(SequenceEndEvent):
111
+ node.value.append(self.compose_node(node, index))
112
+ index += 1
113
+ end_event = self.get_event()
114
+ node.end_mark = end_event.end_mark
115
+ return node
116
+
117
+ def compose_mapping_node(self, anchor):
118
+ start_event = self.get_event()
119
+ tag = start_event.tag
120
+ if tag is None or tag == '!':
121
+ tag = self.resolve(MappingNode, None, start_event.implicit)
122
+ node = MappingNode(tag, [],
123
+ start_event.start_mark, None,
124
+ flow_style=start_event.flow_style)
125
+ if anchor is not None:
126
+ self.anchors[anchor] = node
127
+ while not self.check_event(MappingEndEvent):
128
+ #key_event = self.peek_event()
129
+ item_key = self.compose_node(node, None)
130
+ #if item_key in node.value:
131
+ # raise ComposerError("while composing a mapping", start_event.start_mark,
132
+ # "found duplicate key", key_event.start_mark)
133
+ item_value = self.compose_node(node, item_key)
134
+ #node.value[item_key] = item_value
135
+ node.value.append((item_key, item_value))
136
+ end_event = self.get_event()
137
+ node.end_mark = end_event.end_mark
138
+ return node
139
+