snowflake-cli-labs 2.8.0rc1__py3-none-any.whl → 2.8.2__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 (242) hide show
  1. README.md +21 -0
  2. {snowflake_cli_labs-2.8.0rc1.dist-info → snowflake_cli_labs-2.8.2.dist-info}/METADATA +7 -95
  3. snowflake_cli_labs-2.8.2.dist-info/RECORD +5 -0
  4. snowflake/cli/__about__.py +0 -17
  5. snowflake/cli/__init__.py +0 -13
  6. snowflake/cli/api/__init__.py +0 -48
  7. snowflake/cli/api/cli_global_context.py +0 -390
  8. snowflake/cli/api/commands/__init__.py +0 -13
  9. snowflake/cli/api/commands/alias.py +0 -23
  10. snowflake/cli/api/commands/decorators.py +0 -354
  11. snowflake/cli/api/commands/execution_metadata.py +0 -40
  12. snowflake/cli/api/commands/experimental_behaviour.py +0 -19
  13. snowflake/cli/api/commands/flags.py +0 -640
  14. snowflake/cli/api/commands/project_initialisation.py +0 -65
  15. snowflake/cli/api/commands/snow_typer.py +0 -237
  16. snowflake/cli/api/commands/typer_pre_execute.py +0 -26
  17. snowflake/cli/api/config.py +0 -348
  18. snowflake/cli/api/console/__init__.py +0 -17
  19. snowflake/cli/api/console/abc.py +0 -89
  20. snowflake/cli/api/console/console.py +0 -134
  21. snowflake/cli/api/console/enum.py +0 -17
  22. snowflake/cli/api/constants.py +0 -79
  23. snowflake/cli/api/errno.py +0 -27
  24. snowflake/cli/api/exceptions.py +0 -164
  25. snowflake/cli/api/feature_flags.py +0 -55
  26. snowflake/cli/api/identifiers.py +0 -154
  27. snowflake/cli/api/output/__init__.py +0 -13
  28. snowflake/cli/api/output/formats.py +0 -20
  29. snowflake/cli/api/output/types.py +0 -118
  30. snowflake/cli/api/plugins/__init__.py +0 -13
  31. snowflake/cli/api/plugins/command/__init__.py +0 -72
  32. snowflake/cli/api/plugins/command/plugin_hook_specs.py +0 -21
  33. snowflake/cli/api/plugins/plugin_config.py +0 -32
  34. snowflake/cli/api/project/__init__.py +0 -13
  35. snowflake/cli/api/project/definition.py +0 -84
  36. snowflake/cli/api/project/definition_manager.py +0 -134
  37. snowflake/cli/api/project/errors.py +0 -56
  38. snowflake/cli/api/project/project_verification.py +0 -23
  39. snowflake/cli/api/project/schemas/__init__.py +0 -13
  40. snowflake/cli/api/project/schemas/entities/application_entity.py +0 -44
  41. snowflake/cli/api/project/schemas/entities/application_package_entity.py +0 -66
  42. snowflake/cli/api/project/schemas/entities/common.py +0 -78
  43. snowflake/cli/api/project/schemas/entities/entities.py +0 -30
  44. snowflake/cli/api/project/schemas/identifier_model.py +0 -49
  45. snowflake/cli/api/project/schemas/native_app/__init__.py +0 -13
  46. snowflake/cli/api/project/schemas/native_app/application.py +0 -62
  47. snowflake/cli/api/project/schemas/native_app/native_app.py +0 -93
  48. snowflake/cli/api/project/schemas/native_app/package.py +0 -78
  49. snowflake/cli/api/project/schemas/native_app/path_mapping.py +0 -65
  50. snowflake/cli/api/project/schemas/project_definition.py +0 -199
  51. snowflake/cli/api/project/schemas/snowpark/__init__.py +0 -13
  52. snowflake/cli/api/project/schemas/snowpark/argument.py +0 -28
  53. snowflake/cli/api/project/schemas/snowpark/callable.py +0 -69
  54. snowflake/cli/api/project/schemas/snowpark/snowpark.py +0 -36
  55. snowflake/cli/api/project/schemas/streamlit/__init__.py +0 -13
  56. snowflake/cli/api/project/schemas/streamlit/streamlit.py +0 -46
  57. snowflake/cli/api/project/schemas/template.py +0 -77
  58. snowflake/cli/api/project/schemas/updatable_model.py +0 -194
  59. snowflake/cli/api/project/util.py +0 -261
  60. snowflake/cli/api/rendering/__init__.py +0 -13
  61. snowflake/cli/api/rendering/jinja.py +0 -112
  62. snowflake/cli/api/rendering/project_definition_templates.py +0 -39
  63. snowflake/cli/api/rendering/project_templates.py +0 -98
  64. snowflake/cli/api/rendering/sql_templates.py +0 -60
  65. snowflake/cli/api/rest_api.py +0 -172
  66. snowflake/cli/api/sanitizers.py +0 -43
  67. snowflake/cli/api/secure_path.py +0 -362
  68. snowflake/cli/api/secure_utils.py +0 -29
  69. snowflake/cli/api/sql_execution.py +0 -260
  70. snowflake/cli/api/utils/__init__.py +0 -13
  71. snowflake/cli/api/utils/cursor.py +0 -34
  72. snowflake/cli/api/utils/definition_rendering.py +0 -383
  73. snowflake/cli/api/utils/dict_utils.py +0 -73
  74. snowflake/cli/api/utils/error_handling.py +0 -23
  75. snowflake/cli/api/utils/graph.py +0 -97
  76. snowflake/cli/api/utils/models.py +0 -63
  77. snowflake/cli/api/utils/naming_utils.py +0 -13
  78. snowflake/cli/api/utils/path_utils.py +0 -36
  79. snowflake/cli/api/utils/templating_functions.py +0 -144
  80. snowflake/cli/api/utils/types.py +0 -35
  81. snowflake/cli/app/__init__.py +0 -22
  82. snowflake/cli/app/__main__.py +0 -31
  83. snowflake/cli/app/api_impl/__init__.py +0 -13
  84. snowflake/cli/app/api_impl/plugin/__init__.py +0 -13
  85. snowflake/cli/app/api_impl/plugin/plugin_config_provider_impl.py +0 -66
  86. snowflake/cli/app/build_and_push.sh +0 -8
  87. snowflake/cli/app/cli_app.py +0 -243
  88. snowflake/cli/app/commands_registration/__init__.py +0 -33
  89. snowflake/cli/app/commands_registration/builtin_plugins.py +0 -54
  90. snowflake/cli/app/commands_registration/command_plugins_loader.py +0 -169
  91. snowflake/cli/app/commands_registration/commands_registration_with_callbacks.py +0 -105
  92. snowflake/cli/app/commands_registration/exception_logging.py +0 -26
  93. snowflake/cli/app/commands_registration/threadsafe.py +0 -48
  94. snowflake/cli/app/commands_registration/typer_registration.py +0 -153
  95. snowflake/cli/app/constants.py +0 -19
  96. snowflake/cli/app/dev/__init__.py +0 -13
  97. snowflake/cli/app/dev/commands_structure.py +0 -48
  98. snowflake/cli/app/dev/docs/__init__.py +0 -13
  99. snowflake/cli/app/dev/docs/commands_docs_generator.py +0 -100
  100. snowflake/cli/app/dev/docs/generator.py +0 -35
  101. snowflake/cli/app/dev/docs/project_definition_docs_generator.py +0 -58
  102. snowflake/cli/app/dev/docs/project_definition_generate_json_schema.py +0 -227
  103. snowflake/cli/app/dev/docs/template_utils.py +0 -23
  104. snowflake/cli/app/dev/docs/templates/definition_description.rst.jinja2 +0 -38
  105. snowflake/cli/app/dev/docs/templates/overview.rst.jinja2 +0 -9
  106. snowflake/cli/app/dev/docs/templates/usage.rst.jinja2 +0 -57
  107. snowflake/cli/app/dev/pycharm_remote_debug.py +0 -46
  108. snowflake/cli/app/loggers.py +0 -199
  109. snowflake/cli/app/main_typer.py +0 -62
  110. snowflake/cli/app/printing.py +0 -181
  111. snowflake/cli/app/snow_connector.py +0 -243
  112. snowflake/cli/app/telemetry.py +0 -189
  113. snowflake/cli/plugins/__init__.py +0 -13
  114. snowflake/cli/plugins/connection/__init__.py +0 -13
  115. snowflake/cli/plugins/connection/commands.py +0 -330
  116. snowflake/cli/plugins/connection/plugin_spec.py +0 -30
  117. snowflake/cli/plugins/connection/util.py +0 -179
  118. snowflake/cli/plugins/cortex/__init__.py +0 -13
  119. snowflake/cli/plugins/cortex/commands.py +0 -327
  120. snowflake/cli/plugins/cortex/constants.py +0 -17
  121. snowflake/cli/plugins/cortex/manager.py +0 -189
  122. snowflake/cli/plugins/cortex/plugin_spec.py +0 -30
  123. snowflake/cli/plugins/cortex/types.py +0 -22
  124. snowflake/cli/plugins/git/__init__.py +0 -13
  125. snowflake/cli/plugins/git/commands.py +0 -305
  126. snowflake/cli/plugins/git/manager.py +0 -96
  127. snowflake/cli/plugins/git/plugin_spec.py +0 -30
  128. snowflake/cli/plugins/init/__init__.py +0 -13
  129. snowflake/cli/plugins/init/commands.py +0 -244
  130. snowflake/cli/plugins/init/plugin_spec.py +0 -30
  131. snowflake/cli/plugins/nativeapp/__init__.py +0 -13
  132. snowflake/cli/plugins/nativeapp/artifacts.py +0 -742
  133. snowflake/cli/plugins/nativeapp/codegen/__init__.py +0 -13
  134. snowflake/cli/plugins/nativeapp/codegen/artifact_processor.py +0 -91
  135. snowflake/cli/plugins/nativeapp/codegen/compiler.py +0 -130
  136. snowflake/cli/plugins/nativeapp/codegen/sandbox.py +0 -306
  137. snowflake/cli/plugins/nativeapp/codegen/setup/native_app_setup_processor.py +0 -172
  138. snowflake/cli/plugins/nativeapp/codegen/setup/setup_driver.py.source +0 -56
  139. snowflake/cli/plugins/nativeapp/codegen/snowpark/callback_source.py.jinja +0 -181
  140. snowflake/cli/plugins/nativeapp/codegen/snowpark/extension_function_utils.py +0 -217
  141. snowflake/cli/plugins/nativeapp/codegen/snowpark/models.py +0 -61
  142. snowflake/cli/plugins/nativeapp/codegen/snowpark/python_processor.py +0 -528
  143. snowflake/cli/plugins/nativeapp/commands.py +0 -439
  144. snowflake/cli/plugins/nativeapp/common_flags.py +0 -44
  145. snowflake/cli/plugins/nativeapp/constants.py +0 -27
  146. snowflake/cli/plugins/nativeapp/exceptions.py +0 -122
  147. snowflake/cli/plugins/nativeapp/feature_flags.py +0 -24
  148. snowflake/cli/plugins/nativeapp/init.py +0 -345
  149. snowflake/cli/plugins/nativeapp/manager.py +0 -823
  150. snowflake/cli/plugins/nativeapp/plugin_spec.py +0 -30
  151. snowflake/cli/plugins/nativeapp/policy.py +0 -50
  152. snowflake/cli/plugins/nativeapp/project_model.py +0 -195
  153. snowflake/cli/plugins/nativeapp/run_processor.py +0 -389
  154. snowflake/cli/plugins/nativeapp/teardown_processor.py +0 -301
  155. snowflake/cli/plugins/nativeapp/utils.py +0 -98
  156. snowflake/cli/plugins/nativeapp/v2_conversions/v2_to_v1_decorator.py +0 -135
  157. snowflake/cli/plugins/nativeapp/version/__init__.py +0 -13
  158. snowflake/cli/plugins/nativeapp/version/commands.py +0 -170
  159. snowflake/cli/plugins/nativeapp/version/version_processor.py +0 -362
  160. snowflake/cli/plugins/notebook/__init__.py +0 -13
  161. snowflake/cli/plugins/notebook/commands.py +0 -84
  162. snowflake/cli/plugins/notebook/exceptions.py +0 -20
  163. snowflake/cli/plugins/notebook/manager.py +0 -71
  164. snowflake/cli/plugins/notebook/plugin_spec.py +0 -30
  165. snowflake/cli/plugins/notebook/types.py +0 -16
  166. snowflake/cli/plugins/object/__init__.py +0 -13
  167. snowflake/cli/plugins/object/command_aliases.py +0 -94
  168. snowflake/cli/plugins/object/commands.py +0 -174
  169. snowflake/cli/plugins/object/common.py +0 -85
  170. snowflake/cli/plugins/object/manager.py +0 -96
  171. snowflake/cli/plugins/object/plugin_spec.py +0 -30
  172. snowflake/cli/plugins/object_stage_deprecated/__init__.py +0 -15
  173. snowflake/cli/plugins/object_stage_deprecated/commands.py +0 -122
  174. snowflake/cli/plugins/object_stage_deprecated/plugin_spec.py +0 -32
  175. snowflake/cli/plugins/snowpark/__init__.py +0 -13
  176. snowflake/cli/plugins/snowpark/commands.py +0 -548
  177. snowflake/cli/plugins/snowpark/common.py +0 -307
  178. snowflake/cli/plugins/snowpark/manager.py +0 -109
  179. snowflake/cli/plugins/snowpark/models.py +0 -156
  180. snowflake/cli/plugins/snowpark/package/__init__.py +0 -13
  181. snowflake/cli/plugins/snowpark/package/anaconda_packages.py +0 -233
  182. snowflake/cli/plugins/snowpark/package/commands.py +0 -256
  183. snowflake/cli/plugins/snowpark/package/manager.py +0 -43
  184. snowflake/cli/plugins/snowpark/package/utils.py +0 -26
  185. snowflake/cli/plugins/snowpark/package_utils.py +0 -354
  186. snowflake/cli/plugins/snowpark/plugin_spec.py +0 -30
  187. snowflake/cli/plugins/snowpark/snowpark_package_paths.py +0 -65
  188. snowflake/cli/plugins/snowpark/snowpark_shared.py +0 -95
  189. snowflake/cli/plugins/snowpark/zipper.py +0 -81
  190. snowflake/cli/plugins/spcs/__init__.py +0 -35
  191. snowflake/cli/plugins/spcs/common.py +0 -99
  192. snowflake/cli/plugins/spcs/compute_pool/__init__.py +0 -13
  193. snowflake/cli/plugins/spcs/compute_pool/commands.py +0 -240
  194. snowflake/cli/plugins/spcs/compute_pool/manager.py +0 -121
  195. snowflake/cli/plugins/spcs/image_registry/__init__.py +0 -13
  196. snowflake/cli/plugins/spcs/image_registry/commands.py +0 -65
  197. snowflake/cli/plugins/spcs/image_registry/manager.py +0 -105
  198. snowflake/cli/plugins/spcs/image_repository/__init__.py +0 -13
  199. snowflake/cli/plugins/spcs/image_repository/commands.py +0 -196
  200. snowflake/cli/plugins/spcs/image_repository/manager.py +0 -84
  201. snowflake/cli/plugins/spcs/jobs/__init__.py +0 -13
  202. snowflake/cli/plugins/spcs/jobs/commands.py +0 -78
  203. snowflake/cli/plugins/spcs/jobs/manager.py +0 -53
  204. snowflake/cli/plugins/spcs/plugin_spec.py +0 -30
  205. snowflake/cli/plugins/spcs/services/__init__.py +0 -13
  206. snowflake/cli/plugins/spcs/services/commands.py +0 -311
  207. snowflake/cli/plugins/spcs/services/manager.py +0 -170
  208. snowflake/cli/plugins/sql/__init__.py +0 -13
  209. snowflake/cli/plugins/sql/commands.py +0 -83
  210. snowflake/cli/plugins/sql/manager.py +0 -92
  211. snowflake/cli/plugins/sql/plugin_spec.py +0 -30
  212. snowflake/cli/plugins/sql/snowsql_templating.py +0 -28
  213. snowflake/cli/plugins/stage/__init__.py +0 -13
  214. snowflake/cli/plugins/stage/commands.py +0 -261
  215. snowflake/cli/plugins/stage/diff.py +0 -326
  216. snowflake/cli/plugins/stage/manager.py +0 -544
  217. snowflake/cli/plugins/stage/md5.py +0 -160
  218. snowflake/cli/plugins/stage/plugin_spec.py +0 -30
  219. snowflake/cli/plugins/streamlit/__init__.py +0 -13
  220. snowflake/cli/plugins/streamlit/commands.py +0 -186
  221. snowflake/cli/plugins/streamlit/manager.py +0 -222
  222. snowflake/cli/plugins/streamlit/plugin_spec.py +0 -30
  223. snowflake/cli/plugins/workspace/__init__.py +0 -13
  224. snowflake/cli/plugins/workspace/commands.py +0 -35
  225. snowflake/cli/plugins/workspace/plugin_spec.py +0 -30
  226. snowflake/cli/templates/default_snowpark/.gitignore +0 -4
  227. snowflake/cli/templates/default_snowpark/app/__init__.py +0 -0
  228. snowflake/cli/templates/default_snowpark/app/common.py +0 -2
  229. snowflake/cli/templates/default_snowpark/app/functions.py +0 -15
  230. snowflake/cli/templates/default_snowpark/app/procedures.py +0 -22
  231. snowflake/cli/templates/default_snowpark/requirements.txt +0 -1
  232. snowflake/cli/templates/default_snowpark/snowflake.yml +0 -23
  233. snowflake/cli/templates/default_streamlit/.gitignore +0 -4
  234. snowflake/cli/templates/default_streamlit/common/hello.py +0 -2
  235. snowflake/cli/templates/default_streamlit/environment.yml +0 -6
  236. snowflake/cli/templates/default_streamlit/pages/my_page.py +0 -3
  237. snowflake/cli/templates/default_streamlit/snowflake.yml +0 -10
  238. snowflake/cli/templates/default_streamlit/streamlit_app.py +0 -4
  239. snowflake_cli_labs-2.8.0rc1.dist-info/RECORD +0 -240
  240. snowflake_cli_labs-2.8.0rc1.dist-info/entry_points.txt +0 -2
  241. {snowflake_cli_labs-2.8.0rc1.dist-info → snowflake_cli_labs-2.8.2.dist-info}/WHEEL +0 -0
  242. {snowflake_cli_labs-2.8.0rc1.dist-info → snowflake_cli_labs-2.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,640 +0,0 @@
1
- # Copyright (c) 2024 Snowflake Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- from __future__ import annotations
16
-
17
- import tempfile
18
- from dataclasses import dataclass
19
- from enum import Enum
20
- from inspect import signature
21
- from pathlib import Path
22
- from typing import Any, Callable, List, Optional, Tuple
23
-
24
- import click
25
- import typer
26
- from click import ClickException
27
- from snowflake.cli.api.cli_global_context import cli_context_manager
28
- from snowflake.cli.api.commands.typer_pre_execute import register_pre_execute_command
29
- from snowflake.cli.api.console import cli_console
30
- from snowflake.cli.api.exceptions import MissingConfiguration
31
- from snowflake.cli.api.output.formats import OutputFormat
32
- from snowflake.cli.api.project.definition_manager import DefinitionManager
33
- from snowflake.cli.api.rendering.jinja import CONTEXT_KEY
34
-
35
- DEFAULT_CONTEXT_SETTINGS = {"help_option_names": ["--help", "-h"]}
36
-
37
- _CONNECTION_SECTION = "Connection configuration"
38
- _CLI_BEHAVIOUR = "Global configuration"
39
-
40
-
41
- class OnErrorType(Enum):
42
- BREAK = "break"
43
- CONTINUE = "continue"
44
-
45
-
46
- class OverrideableOption:
47
- """
48
- Class that allows you to generate instances of typer.models.OptionInfo with some default properties while allowing
49
- specific values to be overridden.
50
-
51
- Custom parameters:
52
- - mutually_exclusive (Tuple[str]|List[str]): A list of parameter names that this Option is not compatible with. If this Option has
53
- a truthy value and any of the other parameters in the mutually_exclusive list has a truthy value, a
54
- ClickException will be thrown. Note that mutually_exclusive can contain an option's own name but does not require
55
- it.
56
- """
57
-
58
- def __init__(
59
- self,
60
- default: Any,
61
- *param_decls: str,
62
- mutually_exclusive: Optional[List[str] | Tuple[str]] = None,
63
- **kwargs,
64
- ):
65
- self.default = default
66
- self.param_decls = param_decls
67
- self.mutually_exclusive = mutually_exclusive
68
- self.kwargs = kwargs
69
-
70
- def __call__(self, **kwargs) -> typer.models.OptionInfo:
71
- """
72
- Returns a typer.models.OptionInfo instance initialized with the specified default values along with any overrides
73
- from kwargs. Note that if you are overriding param_decls, you must pass an iterable of strings, you cannot use
74
- positional arguments like you can with typer.Option. Does not modify the original instance.
75
- """
76
- default = kwargs.get("default", self.default)
77
- param_decls = kwargs.get("param_decls", self.param_decls)
78
- mutually_exclusive = kwargs.get("mutually_exclusive", self.mutually_exclusive)
79
- if not isinstance(param_decls, list) and not isinstance(param_decls, tuple):
80
- raise TypeError("param_decls must be a list or tuple")
81
- passed_kwargs = self.kwargs.copy()
82
- passed_kwargs.update(kwargs)
83
- if passed_kwargs.get("callback", None) or mutually_exclusive:
84
- passed_kwargs["callback"] = self._callback_factory(
85
- passed_kwargs.get("callback", None), mutually_exclusive
86
- )
87
- for non_kwarg in ["default", "param_decls", "mutually_exclusive"]:
88
- passed_kwargs.pop(non_kwarg, None)
89
- return typer.Option(default, *param_decls, **passed_kwargs)
90
-
91
- class InvalidCallbackSignature(ClickException):
92
- def __init__(self, callback):
93
- super().__init__(
94
- f"Signature {signature(callback)} is not valid for an OverrideableOption callback function. Must have at most one parameter with each of the following types: (typer.Context, typer.CallbackParam, Any Other Type)"
95
- )
96
-
97
- def _callback_factory(
98
- self, callback, mutually_exclusive: Optional[List[str] | Tuple[str]]
99
- ):
100
- callback = callback if callback else lambda x: x
101
-
102
- # inspect existing_callback to make sure signature is valid
103
- existing_params = signature(callback).parameters
104
- # at most one parameter with each type in [typer.Context, typer.CallbackParam, any other type]
105
- limits = [
106
- lambda x: x == typer.Context,
107
- lambda x: x == typer.CallbackParam,
108
- lambda x: x != typer.Context and x != typer.CallbackParam,
109
- ]
110
- for limit in limits:
111
- if len([v for v in existing_params.values() if limit(v.annotation)]) > 1:
112
- raise self.InvalidCallbackSignature(callback)
113
-
114
- def generated_callback(ctx: typer.Context, param: typer.CallbackParam, value):
115
- if mutually_exclusive:
116
- for name in mutually_exclusive:
117
- if value and ctx.params.get(
118
- name, False
119
- ): # if the current parameter is set to True and a previous parameter is also Truthy
120
- curr_opt = param.opts[0]
121
- other_opt = [x for x in ctx.command.params if x.name == name][
122
- 0
123
- ].opts[0]
124
- raise click.ClickException(
125
- f"Options '{curr_opt}' and '{other_opt}' are incompatible."
126
- )
127
-
128
- # pass args to existing callback based on its signature (this is how Typer infers callback args)
129
- passed_params = {}
130
- for existing_param in existing_params:
131
- annotation = existing_params[existing_param].annotation
132
- if annotation == typer.Context:
133
- passed_params[existing_param] = ctx
134
- elif annotation == typer.CallbackParam:
135
- passed_params[existing_param] = param
136
- else:
137
- passed_params[existing_param] = value
138
- return callback(**passed_params)
139
-
140
- return generated_callback
141
-
142
-
143
- from snowflake.cli.api.config import get_all_connections
144
-
145
-
146
- def _callback(provide_setter: Callable[[], Callable[[Any], Any]]):
147
- def callback(value):
148
- set_value = provide_setter()
149
- set_value(value)
150
- return value
151
-
152
- return callback
153
-
154
-
155
- ConnectionOption = typer.Option(
156
- None,
157
- "--connection",
158
- "-c",
159
- "--environment",
160
- help=f"Name of the connection, as defined in your `config.toml`. Default: `default`.",
161
- callback=_callback(
162
- lambda: cli_context_manager.connection_context.set_connection_name
163
- ),
164
- show_default=False,
165
- rich_help_panel=_CONNECTION_SECTION,
166
- autocompletion=lambda: list(get_all_connections()),
167
- )
168
-
169
- TemporaryConnectionOption = typer.Option(
170
- False,
171
- "--temporary-connection",
172
- "-x",
173
- help="Uses connection defined with command line parameters, instead of one defined in config",
174
- callback=_callback(
175
- lambda: cli_context_manager.connection_context.set_temporary_connection
176
- ),
177
- is_flag=True,
178
- rich_help_panel=_CONNECTION_SECTION,
179
- )
180
-
181
- AccountOption = typer.Option(
182
- None,
183
- "--account",
184
- "--accountname",
185
- help="Name assigned to your Snowflake account. Overrides the value specified for the connection.",
186
- callback=_callback(lambda: cli_context_manager.connection_context.set_account),
187
- show_default=False,
188
- rich_help_panel=_CONNECTION_SECTION,
189
- )
190
-
191
- UserOption = typer.Option(
192
- None,
193
- "--user",
194
- "--username",
195
- help="Username to connect to Snowflake. Overrides the value specified for the connection.",
196
- callback=_callback(lambda: cli_context_manager.connection_context.set_user),
197
- show_default=False,
198
- rich_help_panel=_CONNECTION_SECTION,
199
- )
200
-
201
-
202
- PLAIN_PASSWORD_MSG = "WARNING! Using --password via the CLI is insecure. Use environment variables instead."
203
-
204
-
205
- def _password_callback(value: str):
206
- if value:
207
- cli_console.message(PLAIN_PASSWORD_MSG)
208
-
209
- return _callback(lambda: cli_context_manager.connection_context.set_password)(value)
210
-
211
-
212
- PasswordOption = typer.Option(
213
- None,
214
- "--password",
215
- help="Snowflake password. Overrides the value specified for the connection.",
216
- hide_input=True,
217
- callback=_password_callback,
218
- show_default=False,
219
- rich_help_panel=_CONNECTION_SECTION,
220
- )
221
-
222
- AuthenticatorOption = typer.Option(
223
- None,
224
- "--authenticator",
225
- help="Snowflake authenticator. Overrides the value specified for the connection.",
226
- hide_input=True,
227
- callback=_callback(
228
- lambda: cli_context_manager.connection_context.set_authenticator
229
- ),
230
- show_default=False,
231
- rich_help_panel=_CONNECTION_SECTION,
232
- )
233
-
234
- PrivateKeyPathOption = typer.Option(
235
- None,
236
- "--private-key-path",
237
- help="Snowflake private key path. Overrides the value specified for the connection.",
238
- hide_input=True,
239
- callback=_callback(
240
- lambda: cli_context_manager.connection_context.set_private_key_path
241
- ),
242
- show_default=False,
243
- rich_help_panel=_CONNECTION_SECTION,
244
- exists=True,
245
- file_okay=True,
246
- dir_okay=False,
247
- )
248
-
249
- SessionTokenOption = typer.Option(
250
- None,
251
- "--session-token",
252
- help="Snowflake session token. Can be used only in conjunction with --master-token. Overrides the value specified for the connection.",
253
- hide_input=True,
254
- callback=_callback(
255
- lambda: cli_context_manager.connection_context.set_session_token
256
- ),
257
- show_default=False,
258
- rich_help_panel=_CONNECTION_SECTION,
259
- exists=True,
260
- file_okay=True,
261
- dir_okay=False,
262
- hidden=True,
263
- )
264
-
265
- MasterTokenOption = typer.Option(
266
- None,
267
- "--master-token",
268
- help="Snowflake master token. Can be used only in conjunction with --session-token. Overrides the value specified for the connection.",
269
- hide_input=True,
270
- callback=_callback(lambda: cli_context_manager.connection_context.set_master_token),
271
- show_default=False,
272
- rich_help_panel=_CONNECTION_SECTION,
273
- exists=True,
274
- file_okay=True,
275
- dir_okay=False,
276
- hidden=True,
277
- )
278
-
279
- TokenFilePathOption = typer.Option(
280
- None,
281
- "--token-file-path",
282
- help="Path to file with an OAuth token that should be used when connecting to Snowflake",
283
- callback=_callback(
284
- lambda: cli_context_manager.connection_context.set_token_file_path
285
- ),
286
- show_default=False,
287
- rich_help_panel=_CONNECTION_SECTION,
288
- exists=True,
289
- file_okay=True,
290
- dir_okay=False,
291
- )
292
-
293
- DatabaseOption = typer.Option(
294
- None,
295
- "--database",
296
- "--dbname",
297
- help="Database to use. Overrides the value specified for the connection.",
298
- callback=_callback(lambda: cli_context_manager.connection_context.set_database),
299
- show_default=False,
300
- rich_help_panel=_CONNECTION_SECTION,
301
- )
302
-
303
- SchemaOption = typer.Option(
304
- None,
305
- "--schema",
306
- "--schemaname",
307
- help="Database schema to use. Overrides the value specified for the connection.",
308
- callback=_callback(lambda: cli_context_manager.connection_context.set_schema),
309
- show_default=False,
310
- rich_help_panel=_CONNECTION_SECTION,
311
- )
312
-
313
- RoleOption = typer.Option(
314
- None,
315
- "--role",
316
- "--rolename",
317
- help="Role to use. Overrides the value specified for the connection.",
318
- callback=_callback(lambda: cli_context_manager.connection_context.set_role),
319
- show_default=False,
320
- rich_help_panel=_CONNECTION_SECTION,
321
- )
322
-
323
- WarehouseOption = typer.Option(
324
- None,
325
- "--warehouse",
326
- help="Warehouse to use. Overrides the value specified for the connection.",
327
- callback=_callback(lambda: cli_context_manager.connection_context.set_warehouse),
328
- show_default=False,
329
- rich_help_panel=_CONNECTION_SECTION,
330
- )
331
-
332
- MfaPasscodeOption = typer.Option(
333
- None,
334
- "--mfa-passcode",
335
- help="Token to use for multi-factor authentication (MFA)",
336
- callback=_callback(lambda: cli_context_manager.connection_context.set_mfa_passcode),
337
- prompt="MFA passcode",
338
- prompt_required=False,
339
- show_default=False,
340
- rich_help_panel=_CONNECTION_SECTION,
341
- )
342
-
343
- EnableDiagOption = typer.Option(
344
- False,
345
- "--enable-diag",
346
- help="Run python connector diagnostic test",
347
- callback=_callback(lambda: cli_context_manager.connection_context.set_enable_diag),
348
- show_default=False,
349
- is_flag=True,
350
- rich_help_panel=_CONNECTION_SECTION,
351
- )
352
-
353
- DiagLogPathOption: Path = typer.Option(
354
- tempfile.gettempdir(),
355
- "--diag-log-path",
356
- help="Diagnostic report path",
357
- callback=_callback(
358
- lambda: cli_context_manager.connection_context.set_diag_log_path
359
- ),
360
- show_default=False,
361
- rich_help_panel=_CONNECTION_SECTION,
362
- exists=True,
363
- writable=True,
364
- )
365
-
366
- DiagAllowlistPathOption: Path = typer.Option(
367
- None,
368
- "--diag-allowlist-path",
369
- help="Diagnostic report path to optional allowlist",
370
- callback=_callback(
371
- lambda: cli_context_manager.connection_context.set_diag_allowlist_path
372
- ),
373
- show_default=False,
374
- rich_help_panel=_CONNECTION_SECTION,
375
- exists=True,
376
- file_okay=True,
377
- )
378
-
379
- OutputFormatOption = typer.Option(
380
- OutputFormat.TABLE.value,
381
- "--format",
382
- help="Specifies the output format.",
383
- case_sensitive=False,
384
- callback=_callback(lambda: cli_context_manager.set_output_format),
385
- rich_help_panel=_CLI_BEHAVIOUR,
386
- )
387
-
388
- SilentOption = typer.Option(
389
- False,
390
- "--silent",
391
- help="Turns off intermediate output to console.",
392
- callback=_callback(lambda: cli_context_manager.set_silent),
393
- is_flag=True,
394
- rich_help_panel=_CLI_BEHAVIOUR,
395
- is_eager=True,
396
- )
397
-
398
- VerboseOption = typer.Option(
399
- False,
400
- "--verbose",
401
- "-v",
402
- help="Displays log entries for log levels `info` and higher.",
403
- callback=_callback(lambda: cli_context_manager.set_verbose),
404
- is_flag=True,
405
- rich_help_panel=_CLI_BEHAVIOUR,
406
- )
407
-
408
- DebugOption = typer.Option(
409
- False,
410
- "--debug",
411
- help="Displays log entries for log levels `debug` and higher; debug logs contains additional information.",
412
- callback=_callback(lambda: cli_context_manager.set_enable_tracebacks),
413
- is_flag=True,
414
- rich_help_panel=_CLI_BEHAVIOUR,
415
- )
416
-
417
-
418
- # If IfExistsOption, IfNotExistsOption, or ReplaceOption are used with names other than those in CREATE_MODE_OPTION_NAMES,
419
- # you must also override mutually_exclusive if you want to retain the validation that at most one of these flags is
420
- # passed.
421
- CREATE_MODE_OPTION_NAMES = ["if_exists", "if_not_exists", "replace"]
422
-
423
- IfExistsOption = OverrideableOption(
424
- False,
425
- "--if-exists",
426
- help="Only apply this operation if the specified object exists.",
427
- mutually_exclusive=CREATE_MODE_OPTION_NAMES,
428
- )
429
-
430
- IfNotExistsOption = OverrideableOption(
431
- False,
432
- "--if-not-exists",
433
- help="Only apply this operation if the specified object does not already exist.",
434
- mutually_exclusive=CREATE_MODE_OPTION_NAMES,
435
- )
436
-
437
- ReplaceOption = OverrideableOption(
438
- False,
439
- "--replace",
440
- help="Replace this object if it already exists.",
441
- mutually_exclusive=CREATE_MODE_OPTION_NAMES,
442
- )
443
-
444
- OnErrorOption = typer.Option(
445
- OnErrorType.BREAK.value,
446
- "--on-error",
447
- help="What to do when an error occurs. Defaults to break.",
448
- )
449
-
450
- NoInteractiveOption = typer.Option(False, "--no-interactive", help="Disable prompting.")
451
-
452
-
453
- def variables_option(description: str):
454
- return typer.Option(
455
- None,
456
- "--variable",
457
- "-D",
458
- help=description,
459
- show_default=False,
460
- )
461
-
462
-
463
- ExecuteVariablesOption = variables_option(
464
- 'Variables for the execution context. For example: `-D "<key>=<value>"`. '
465
- "For SQL files variables are use to expand the template and any unknown variable will cause an error. "
466
- "For Python files variables are used to update os.environ dictionary. Provided keys are capitalized to adhere to best practices."
467
- "In case of SQL files string values must be quoted in `''` (consider embedding quoting in the file).",
468
- )
469
-
470
-
471
- def like_option(help_example: str):
472
- return typer.Option(
473
- "%%",
474
- "--like",
475
- "-l",
476
- help=f"SQL LIKE pattern for filtering objects by name. For example, {help_example}.",
477
- )
478
-
479
-
480
- def _pattern_option_callback(value):
481
- if value and value.count("'") != value.count("\\'"):
482
- raise ClickException('All "\'" characters in PATTERN must be escaped: "\\\'"')
483
- return value
484
-
485
-
486
- PatternOption = typer.Option(
487
- None,
488
- "--pattern",
489
- help=(
490
- "Regex pattern for filtering files by name."
491
- r' For example --pattern ".*\.txt" will filter only files with .txt extension.'
492
- ),
493
- show_default=False,
494
- callback=_pattern_option_callback,
495
- )
496
-
497
-
498
- def experimental_option(
499
- experimental_behaviour_description: Optional[str] = None,
500
- ) -> typer.Option:
501
- help_text = (
502
- f"Turns on experimental behaviour of the command: {experimental_behaviour_description}"
503
- if experimental_behaviour_description
504
- else "Turns on experimental behaviour of the command."
505
- )
506
- return typer.Option(
507
- False,
508
- "--experimental",
509
- help=help_text,
510
- hidden=True,
511
- callback=_callback(lambda: cli_context_manager.set_experimental),
512
- is_flag=True,
513
- rich_help_panel=_CLI_BEHAVIOUR,
514
- )
515
-
516
-
517
- def identifier_argument(sf_object: str, example: str) -> typer.Argument:
518
- return typer.Argument(
519
- ...,
520
- help=f"Identifier of the {sf_object}. For example: {example}",
521
- show_default=False,
522
- )
523
-
524
-
525
- def execution_identifier_argument(sf_object: str, example: str) -> typer.Argument:
526
- return typer.Argument(
527
- ...,
528
- help=f"Execution identifier of the {sf_object}. For example: {example}",
529
- show_default=False,
530
- )
531
-
532
-
533
- def register_project_definition(is_optional: bool) -> None:
534
- project_path = cli_context_manager.project_path_arg
535
- env_overrides_args = cli_context_manager.project_env_overrides_args
536
-
537
- dm = DefinitionManager(project_path, {CONTEXT_KEY: {"env": env_overrides_args}})
538
- project_definition = dm.project_definition
539
- project_root = dm.project_root
540
- template_context = dm.template_context
541
-
542
- if not dm.has_definition_file and not is_optional:
543
- raise MissingConfiguration(
544
- "Cannot find project definition (snowflake.yml). Please provide a path to the project or run this command in a valid project directory."
545
- )
546
-
547
- cli_context_manager.set_project_definition(project_definition)
548
- cli_context_manager.set_project_root(project_root)
549
- cli_context_manager.set_template_context(template_context)
550
-
551
-
552
- def project_definition_option(is_optional: bool):
553
- def project_definition_callback(project_path: str) -> None:
554
- cli_context_manager.set_project_path_arg(project_path)
555
- register_pre_execute_command(lambda: register_project_definition(is_optional))
556
-
557
- return typer.Option(
558
- None,
559
- "-p",
560
- "--project",
561
- help=f"Path where Snowflake project resides. "
562
- f"Defaults to current working directory.",
563
- callback=_callback(lambda: project_definition_callback),
564
- show_default=False,
565
- )
566
-
567
-
568
- def project_env_overrides_option():
569
- def project_env_overrides_callback(env_overrides_args_list: list[str]) -> None:
570
- env_overrides_args_map = {
571
- v.key: v.value for v in parse_key_value_variables(env_overrides_args_list)
572
- }
573
- cli_context_manager.set_project_env_overrides_args(env_overrides_args_map)
574
-
575
- return typer.Option(
576
- [],
577
- "--env",
578
- help="String in format of key=value. Overrides variables from env section used for templating.",
579
- callback=_callback(lambda: project_env_overrides_callback),
580
- show_default=False,
581
- )
582
-
583
-
584
- def readable_file_option(param_name: str, help_str: str) -> typer.Option:
585
- return typer.Option(
586
- None,
587
- param_name,
588
- exists=True,
589
- file_okay=True,
590
- dir_okay=False,
591
- readable=True,
592
- help=help_str,
593
- show_default=False,
594
- )
595
-
596
-
597
- def deprecated_flag_callback(msg: str):
598
- def _warning_callback(ctx: click.Context, param: click.Parameter, value: Any):
599
- if ctx.get_parameter_source(param.name) != click.core.ParameterSource.DEFAULT: # type: ignore[attr-defined]
600
- cli_console.warning(message=msg)
601
- return value
602
-
603
- return _warning_callback
604
-
605
-
606
- def deprecated_flag_callback_enum(msg: str):
607
- def _warning_callback(ctx: click.Context, param: click.Parameter, value: Any):
608
- if ctx.get_parameter_source(param.name) != click.core.ParameterSource.DEFAULT: # type: ignore[attr-defined]
609
- cli_console.warning(message=msg)
610
- # Typer bug: enums passed through callback are turning into None,
611
- # unless their explicit value is returned ¯\_(ツ)_/¯
612
- return value.value
613
-
614
- return _warning_callback
615
-
616
-
617
- @dataclass
618
- class Variable:
619
- key: str
620
- value: str
621
-
622
- def __init__(self, key: str, value: str):
623
- self.key = key
624
- self.value = value
625
-
626
-
627
- def parse_key_value_variables(variables: Optional[List[str]]) -> List[Variable]:
628
- """Util for parsing key=value input. Useful for commands accepting multiple input options."""
629
- if not variables:
630
- return []
631
- result: List[Variable] = []
632
- if not variables:
633
- return result
634
- for p in variables:
635
- if "=" not in p:
636
- raise ClickException(f"Invalid variable: '{p}'")
637
-
638
- key, value = p.split("=", 1)
639
- result.append(Variable(key.strip(), value.strip()))
640
- return result
@@ -1,65 +0,0 @@
1
- # Copyright (c) 2024 Snowflake Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- from __future__ import annotations
16
-
17
- from typing import Optional
18
-
19
- from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
20
- from snowflake.cli.api.constants import TEMPLATES_PATH
21
- from snowflake.cli.api.output.types import CommandResult, MessageResult
22
- from snowflake.cli.api.secure_path import SecurePath
23
- from typer import Argument
24
-
25
-
26
- def _create_project_template(template_name: str, project_directory: str):
27
- SecurePath(TEMPLATES_PATH / template_name).copy(
28
- project_directory, dirs_exist_ok=True
29
- )
30
-
31
-
32
- def add_init_command(
33
- app: SnowTyperFactory,
34
- project_type: str,
35
- template: str,
36
- help_message: Optional[str] = None,
37
- ):
38
- @app.command(deprecated=True)
39
- def init(
40
- project_name: str = Argument(
41
- f"example_{project_type.lower()}",
42
- help=(
43
- help_message
44
- if help_message is not None
45
- else f"Name of the {project_type} project you want to create."
46
- ),
47
- ),
48
- **options,
49
- ) -> CommandResult:
50
-
51
- _create_project_template(template, project_directory=project_name)
52
- return MessageResult(f"Initialized the new project in {project_name}/")
53
-
54
- project_type_doc = (
55
- project_type if project_type.lower() != "streamlit" else "Streamlit app"
56
- )
57
-
58
- init.__doc__ = (
59
- f"Initializes this directory with a sample set "
60
- f"of files for creating a {project_type_doc} project. "
61
- f"This command is deprecated and will be removed soon. "
62
- f"Please use 'snow init' instead"
63
- )
64
-
65
- return init