snowflake-cli-labs 2.8.0rc0__py3-none-any.whl → 3.0.0rc0__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 (220) hide show
  1. snowflake/cli/__about__.py +1 -1
  2. snowflake/cli/{app → _app}/__main__.py +1 -1
  3. snowflake/cli/{app → _app}/cli_app.py +12 -12
  4. snowflake/cli/{app → _app}/commands_registration/builtin_plugins.py +13 -19
  5. snowflake/cli/{app → _app}/commands_registration/command_plugins_loader.py +9 -9
  6. snowflake/cli/{app → _app}/commands_registration/commands_registration_with_callbacks.py +4 -4
  7. snowflake/cli/{app → _app}/commands_registration/exception_logging.py +2 -2
  8. snowflake/cli/{app → _app}/commands_registration/typer_registration.py +2 -2
  9. snowflake/cli/{app → _app}/dev/docs/commands_docs_generator.py +30 -12
  10. snowflake/cli/{app → _app}/dev/docs/generator.py +3 -3
  11. snowflake/cli/{app → _app}/dev/docs/project_definition_docs_generator.py +4 -4
  12. snowflake/cli/{app → _app}/dev/docs/templates/usage.rst.jinja2 +14 -4
  13. snowflake/cli/{app → _app}/main_typer.py +2 -2
  14. snowflake/cli/{app → _app}/printing.py +2 -2
  15. snowflake/cli/{app → _app}/snow_connector.py +6 -6
  16. snowflake/cli/{app → _app}/telemetry.py +4 -5
  17. snowflake/cli/{plugins → _plugins}/connection/commands.py +22 -5
  18. snowflake/cli/_plugins/connection/plugin_spec.py +30 -0
  19. snowflake/cli/{plugins → _plugins}/connection/util.py +16 -0
  20. snowflake/cli/{plugins → _plugins}/cortex/commands.py +54 -49
  21. snowflake/cli/{plugins → _plugins}/cortex/constants.py +1 -1
  22. snowflake/cli/{plugins → _plugins}/cortex/manager.py +5 -5
  23. snowflake/cli/{plugins → _plugins}/cortex/plugin_spec.py +1 -1
  24. snowflake/cli/{plugins → _plugins}/git/commands.py +32 -20
  25. snowflake/cli/{plugins → _plugins}/git/manager.py +6 -5
  26. snowflake/cli/{plugins → _plugins}/git/plugin_spec.py +1 -1
  27. snowflake/cli/{plugins → _plugins}/init/commands.py +10 -6
  28. snowflake/cli/{plugins → _plugins}/init/plugin_spec.py +1 -1
  29. snowflake/cli/{plugins → _plugins}/nativeapp/artifacts.py +14 -0
  30. snowflake/cli/_plugins/nativeapp/bundle_context.py +31 -0
  31. snowflake/cli/{plugins → _plugins}/nativeapp/codegen/artifact_processor.py +3 -3
  32. snowflake/cli/{plugins → _plugins}/nativeapp/codegen/compiler.py +16 -18
  33. snowflake/cli/{plugins → _plugins}/nativeapp/codegen/setup/native_app_setup_processor.py +24 -28
  34. snowflake/cli/{plugins → _plugins}/nativeapp/codegen/snowpark/extension_function_utils.py +4 -4
  35. snowflake/cli/{plugins → _plugins}/nativeapp/codegen/snowpark/python_processor.py +20 -24
  36. snowflake/cli/{plugins → _plugins}/nativeapp/commands.py +171 -42
  37. snowflake/cli/{plugins → _plugins}/nativeapp/common_flags.py +1 -1
  38. snowflake/cli/{plugins → _plugins}/nativeapp/init.py +1 -1
  39. snowflake/cli/_plugins/nativeapp/manager.py +601 -0
  40. snowflake/cli/{plugins/connection → _plugins/nativeapp}/plugin_spec.py +1 -1
  41. snowflake/cli/{plugins → _plugins}/nativeapp/project_model.py +34 -11
  42. snowflake/cli/{plugins → _plugins}/nativeapp/run_processor.py +25 -23
  43. snowflake/cli/{plugins → _plugins}/nativeapp/teardown_processor.py +8 -8
  44. snowflake/cli/{plugins → _plugins}/nativeapp/v2_conversions/v2_to_v1_decorator.py +47 -28
  45. snowflake/cli/{plugins → _plugins}/nativeapp/version/commands.py +15 -12
  46. snowflake/cli/{plugins → _plugins}/nativeapp/version/version_processor.py +22 -20
  47. snowflake/cli/{plugins → _plugins}/notebook/commands.py +8 -6
  48. snowflake/cli/{plugins → _plugins}/notebook/manager.py +14 -14
  49. snowflake/cli/{plugins → _plugins}/notebook/plugin_spec.py +1 -1
  50. snowflake/cli/{plugins → _plugins}/notebook/types.py +0 -1
  51. snowflake/cli/{plugins → _plugins}/object/command_aliases.py +6 -5
  52. snowflake/cli/{plugins → _plugins}/object/commands.py +16 -10
  53. snowflake/cli/{plugins → _plugins}/object/manager.py +7 -6
  54. snowflake/cli/{plugins → _plugins}/object/plugin_spec.py +1 -1
  55. snowflake/cli/_plugins/snowpark/commands.py +510 -0
  56. snowflake/cli/_plugins/snowpark/common.py +252 -0
  57. snowflake/cli/{plugins → _plugins}/snowpark/models.py +0 -7
  58. snowflake/cli/{plugins → _plugins}/snowpark/package/anaconda_packages.py +1 -1
  59. snowflake/cli/{plugins → _plugins}/snowpark/package/commands.py +13 -74
  60. snowflake/cli/{plugins → _plugins}/snowpark/package/manager.py +4 -3
  61. snowflake/cli/{plugins → _plugins}/snowpark/package_utils.py +5 -5
  62. snowflake/cli/{plugins/nativeapp → _plugins/snowpark}/plugin_spec.py +1 -1
  63. snowflake/cli/_plugins/snowpark/snowpark_project_paths.py +109 -0
  64. snowflake/cli/{plugins → _plugins}/snowpark/snowpark_shared.py +0 -36
  65. snowflake/cli/{plugins → _plugins}/snowpark/zipper.py +16 -8
  66. snowflake/cli/{plugins → _plugins}/spcs/__init__.py +5 -7
  67. snowflake/cli/{plugins → _plugins}/spcs/compute_pool/commands.py +29 -28
  68. snowflake/cli/{plugins → _plugins}/spcs/compute_pool/manager.py +3 -3
  69. snowflake/cli/{plugins → _plugins}/spcs/image_registry/commands.py +3 -3
  70. snowflake/cli/{plugins → _plugins}/spcs/image_repository/commands.py +25 -19
  71. snowflake/cli/{plugins → _plugins}/spcs/image_repository/manager.py +1 -1
  72. snowflake/cli/{plugins → _plugins}/spcs/plugin_spec.py +1 -1
  73. snowflake/cli/{plugins → _plugins}/spcs/services/commands.py +66 -32
  74. snowflake/cli/{plugins → _plugins}/spcs/services/manager.py +43 -5
  75. snowflake/cli/{plugins → _plugins}/sql/commands.py +19 -15
  76. snowflake/cli/{plugins → _plugins}/sql/manager.py +1 -1
  77. snowflake/cli/{plugins → _plugins}/sql/plugin_spec.py +1 -1
  78. snowflake/cli/{plugins → _plugins}/stage/commands.py +20 -17
  79. snowflake/cli/{plugins → _plugins}/stage/diff.py +1 -47
  80. snowflake/cli/{plugins → _plugins}/stage/manager.py +8 -6
  81. snowflake/cli/{plugins → _plugins}/stage/plugin_spec.py +1 -1
  82. snowflake/cli/_plugins/stage/utils.py +54 -0
  83. snowflake/cli/_plugins/streamlit/commands.py +242 -0
  84. snowflake/cli/{plugins → _plugins}/streamlit/manager.py +47 -70
  85. snowflake/cli/_plugins/streamlit/plugin_spec.py +30 -0
  86. snowflake/cli/_plugins/workspace/action_context.py +11 -0
  87. snowflake/cli/_plugins/workspace/commands.py +113 -0
  88. snowflake/cli/_plugins/workspace/manager.py +57 -0
  89. snowflake/cli/{plugins → _plugins}/workspace/plugin_spec.py +1 -1
  90. snowflake/cli/api/cli_global_context.py +34 -7
  91. snowflake/cli/api/commands/common.py +25 -0
  92. snowflake/cli/api/commands/decorators.py +4 -3
  93. snowflake/cli/api/commands/experimental_behaviour.py +2 -3
  94. snowflake/cli/api/commands/flags.py +73 -174
  95. snowflake/cli/api/commands/overrideable_parameter.py +143 -0
  96. snowflake/cli/api/commands/snow_typer.py +5 -4
  97. snowflake/cli/api/commands/typer_pre_execute.py +3 -3
  98. snowflake/cli/api/commands/utils.py +18 -0
  99. snowflake/cli/api/config.py +1 -1
  100. snowflake/cli/api/console/abc.py +5 -2
  101. snowflake/cli/api/entities/application_entity.py +12 -0
  102. snowflake/cli/api/entities/application_package_entity.py +260 -0
  103. snowflake/cli/api/entities/common.py +47 -0
  104. snowflake/cli/api/entities/snowpark_entity.py +29 -0
  105. snowflake/cli/api/entities/streamlit_entity.py +12 -0
  106. snowflake/cli/api/entities/utils.py +321 -0
  107. snowflake/cli/api/exceptions.py +19 -3
  108. snowflake/cli/api/feature_flags.py +2 -1
  109. snowflake/cli/api/identifiers.py +41 -9
  110. snowflake/cli/api/project/definition.py +13 -5
  111. snowflake/cli/api/project/definition_manager.py +12 -1
  112. snowflake/cli/api/project/errors.py +16 -1
  113. snowflake/cli/api/project/project_verification.py +3 -3
  114. snowflake/cli/api/project/schemas/entities/{application_entity.py → application_entity_model.py} +21 -9
  115. snowflake/cli/api/project/schemas/entities/{application_package_entity.py → application_package_entity_model.py} +26 -15
  116. snowflake/cli/api/project/schemas/entities/common.py +80 -6
  117. snowflake/cli/api/project/schemas/entities/entities.py +38 -8
  118. snowflake/cli/api/project/schemas/entities/snowpark_entity.py +176 -0
  119. snowflake/cli/api/project/schemas/entities/streamlit_entity_model.py +73 -0
  120. snowflake/cli/api/project/schemas/identifier_model.py +10 -1
  121. snowflake/cli/api/project/schemas/native_app/application.py +8 -9
  122. snowflake/cli/api/project/schemas/native_app/package.py +7 -1
  123. snowflake/cli/api/project/schemas/project_definition.py +97 -23
  124. snowflake/cli/api/project/schemas/updatable_model.py +11 -3
  125. snowflake/cli/api/project/util.py +23 -6
  126. snowflake/cli/api/rendering/jinja.py +28 -8
  127. snowflake/cli/api/rendering/sql_templates.py +41 -12
  128. snowflake/cli/api/secure_path.py +3 -0
  129. snowflake/cli/api/sql_execution.py +35 -19
  130. snowflake/cli/api/utils/definition_rendering.py +14 -2
  131. {snowflake_cli_labs-2.8.0rc0.dist-info → snowflake_cli_labs-3.0.0rc0.dist-info}/METADATA +12 -12
  132. snowflake_cli_labs-3.0.0rc0.dist-info/RECORD +234 -0
  133. snowflake_cli_labs-3.0.0rc0.dist-info/entry_points.txt +2 -0
  134. snowflake/cli/api/commands/project_initialisation.py +0 -65
  135. snowflake/cli/app/build_and_push.sh +0 -8
  136. snowflake/cli/plugins/nativeapp/manager.py +0 -819
  137. snowflake/cli/plugins/object_stage_deprecated/__init__.py +0 -15
  138. snowflake/cli/plugins/object_stage_deprecated/commands.py +0 -122
  139. snowflake/cli/plugins/object_stage_deprecated/plugin_spec.py +0 -32
  140. snowflake/cli/plugins/snowpark/commands.py +0 -548
  141. snowflake/cli/plugins/snowpark/common.py +0 -307
  142. snowflake/cli/plugins/snowpark/manager.py +0 -109
  143. snowflake/cli/plugins/snowpark/plugin_spec.py +0 -30
  144. snowflake/cli/plugins/snowpark/snowpark_package_paths.py +0 -65
  145. snowflake/cli/plugins/spcs/jobs/commands.py +0 -78
  146. snowflake/cli/plugins/spcs/jobs/manager.py +0 -53
  147. snowflake/cli/plugins/streamlit/commands.py +0 -186
  148. snowflake/cli/plugins/streamlit/plugin_spec.py +0 -30
  149. snowflake/cli/plugins/workspace/commands.py +0 -35
  150. snowflake/cli/templates/default_snowpark/.gitignore +0 -4
  151. snowflake/cli/templates/default_snowpark/app/__init__.py +0 -0
  152. snowflake/cli/templates/default_snowpark/app/common.py +0 -2
  153. snowflake/cli/templates/default_snowpark/app/functions.py +0 -15
  154. snowflake/cli/templates/default_snowpark/app/procedures.py +0 -22
  155. snowflake/cli/templates/default_snowpark/requirements.txt +0 -1
  156. snowflake/cli/templates/default_snowpark/snowflake.yml +0 -23
  157. snowflake/cli/templates/default_streamlit/.gitignore +0 -4
  158. snowflake/cli/templates/default_streamlit/common/hello.py +0 -2
  159. snowflake/cli/templates/default_streamlit/environment.yml +0 -6
  160. snowflake/cli/templates/default_streamlit/pages/my_page.py +0 -3
  161. snowflake/cli/templates/default_streamlit/snowflake.yml +0 -10
  162. snowflake/cli/templates/default_streamlit/streamlit_app.py +0 -4
  163. snowflake_cli_labs-2.8.0rc0.dist-info/RECORD +0 -240
  164. snowflake_cli_labs-2.8.0rc0.dist-info/entry_points.txt +0 -2
  165. /snowflake/cli/{app → _app}/__init__.py +0 -0
  166. /snowflake/cli/{app → _app}/api_impl/__init__.py +0 -0
  167. /snowflake/cli/{app → _app}/api_impl/plugin/__init__.py +0 -0
  168. /snowflake/cli/{app → _app}/api_impl/plugin/plugin_config_provider_impl.py +0 -0
  169. /snowflake/cli/{app → _app}/commands_registration/__init__.py +0 -0
  170. /snowflake/cli/{app → _app}/commands_registration/threadsafe.py +0 -0
  171. /snowflake/cli/{app → _app}/constants.py +0 -0
  172. /snowflake/cli/{app → _app}/dev/__init__.py +0 -0
  173. /snowflake/cli/{app → _app}/dev/commands_structure.py +0 -0
  174. /snowflake/cli/{app → _app}/dev/docs/__init__.py +0 -0
  175. /snowflake/cli/{app → _app}/dev/docs/project_definition_generate_json_schema.py +0 -0
  176. /snowflake/cli/{app → _app}/dev/docs/template_utils.py +0 -0
  177. /snowflake/cli/{app → _app}/dev/docs/templates/definition_description.rst.jinja2 +0 -0
  178. /snowflake/cli/{app → _app}/dev/docs/templates/overview.rst.jinja2 +0 -0
  179. /snowflake/cli/{app → _app}/dev/pycharm_remote_debug.py +0 -0
  180. /snowflake/cli/{app → _app}/loggers.py +0 -0
  181. /snowflake/cli/{plugins → _plugins}/__init__.py +0 -0
  182. /snowflake/cli/{plugins → _plugins}/connection/__init__.py +0 -0
  183. /snowflake/cli/{plugins → _plugins}/cortex/__init__.py +0 -0
  184. /snowflake/cli/{plugins → _plugins}/cortex/types.py +0 -0
  185. /snowflake/cli/{plugins → _plugins}/git/__init__.py +0 -0
  186. /snowflake/cli/{plugins → _plugins}/init/__init__.py +0 -0
  187. /snowflake/cli/{plugins → _plugins}/nativeapp/__init__.py +0 -0
  188. /snowflake/cli/{plugins → _plugins}/nativeapp/codegen/__init__.py +0 -0
  189. /snowflake/cli/{plugins → _plugins}/nativeapp/codegen/sandbox.py +0 -0
  190. /snowflake/cli/{plugins → _plugins}/nativeapp/codegen/setup/setup_driver.py.source +0 -0
  191. /snowflake/cli/{plugins → _plugins}/nativeapp/codegen/snowpark/callback_source.py.jinja +0 -0
  192. /snowflake/cli/{plugins → _plugins}/nativeapp/codegen/snowpark/models.py +0 -0
  193. /snowflake/cli/{plugins → _plugins}/nativeapp/constants.py +0 -0
  194. /snowflake/cli/{plugins → _plugins}/nativeapp/exceptions.py +0 -0
  195. /snowflake/cli/{plugins → _plugins}/nativeapp/feature_flags.py +0 -0
  196. /snowflake/cli/{plugins → _plugins}/nativeapp/policy.py +0 -0
  197. /snowflake/cli/{plugins → _plugins}/nativeapp/utils.py +0 -0
  198. /snowflake/cli/{plugins → _plugins}/nativeapp/version/__init__.py +0 -0
  199. /snowflake/cli/{plugins → _plugins}/notebook/__init__.py +0 -0
  200. /snowflake/cli/{plugins → _plugins}/notebook/exceptions.py +0 -0
  201. /snowflake/cli/{plugins → _plugins}/object/__init__.py +0 -0
  202. /snowflake/cli/{plugins → _plugins}/object/common.py +0 -0
  203. /snowflake/cli/{plugins → _plugins}/snowpark/__init__.py +0 -0
  204. /snowflake/cli/{plugins → _plugins}/snowpark/package/__init__.py +0 -0
  205. /snowflake/cli/{plugins → _plugins}/snowpark/package/utils.py +0 -0
  206. /snowflake/cli/{plugins → _plugins}/spcs/common.py +0 -0
  207. /snowflake/cli/{plugins → _plugins}/spcs/compute_pool/__init__.py +0 -0
  208. /snowflake/cli/{plugins → _plugins}/spcs/image_registry/__init__.py +0 -0
  209. /snowflake/cli/{plugins → _plugins}/spcs/image_registry/manager.py +0 -0
  210. /snowflake/cli/{plugins → _plugins}/spcs/image_repository/__init__.py +0 -0
  211. /snowflake/cli/{plugins/spcs/jobs → _plugins/spcs/services}/__init__.py +0 -0
  212. /snowflake/cli/{plugins/spcs/services → _plugins/sql}/__init__.py +0 -0
  213. /snowflake/cli/{plugins → _plugins}/sql/snowsql_templating.py +0 -0
  214. /snowflake/cli/{plugins/sql → _plugins/stage}/__init__.py +0 -0
  215. /snowflake/cli/{plugins → _plugins}/stage/md5.py +0 -0
  216. /snowflake/cli/{plugins/stage → _plugins/streamlit}/__init__.py +0 -0
  217. /snowflake/cli/{plugins/streamlit → _plugins/workspace}/__init__.py +0 -0
  218. /snowflake/cli/{plugins/workspace → api/project/schemas/entities}/__init__.py +0 -0
  219. {snowflake_cli_labs-2.8.0rc0.dist-info → snowflake_cli_labs-3.0.0rc0.dist-info}/WHEEL +0 -0
  220. {snowflake_cli_labs-2.8.0rc0.dist-info → snowflake_cli_labs-3.0.0rc0.dist-info}/licenses/LICENSE +0 -0
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
  import fnmatch
18
18
  import logging
19
19
  from pathlib import Path
20
- from typing import Iterator, Literal
20
+ from typing import Dict, List, Literal
21
21
  from zipfile import ZIP_DEFLATED, ZipFile
22
22
 
23
23
  log = logging.getLogger(__name__)
@@ -59,16 +59,24 @@ def add_file_to_existing_zip(zip_file: str, file: str):
59
59
 
60
60
 
61
61
  def zip_dir(
62
- source: Path, dest_zip: Path, mode: Literal["r", "w", "x", "a"] = "w"
62
+ source: Path | List[Path],
63
+ dest_zip: Path,
64
+ mode: Literal["r", "w", "x", "a"] = "w",
63
65
  ) -> None:
64
- files_to_pack: Iterator[Path] = filter(
65
- _to_be_zipped, map(lambda f: f.absolute(), source.glob("**/*"))
66
- )
66
+
67
+ if isinstance(source, Path):
68
+ source = [source]
69
+
70
+ files_to_pack: Dict[Path, List[Path]] = {
71
+ src: list(filter(_to_be_zipped, (f.absolute() for f in src.glob("**/*"))))
72
+ for src in source
73
+ }
67
74
 
68
75
  with ZipFile(dest_zip, mode, ZIP_DEFLATED, allowZip64=True) as package_zip:
69
- for file in files_to_pack:
70
- log.debug("Adding %s to %s", file, dest_zip)
71
- package_zip.write(file, arcname=file.relative_to(source.absolute()))
76
+ for src, files in files_to_pack.items():
77
+ for file in files:
78
+ log.debug("Adding %s to %s", file, dest_zip)
79
+ package_zip.write(file, arcname=file.relative_to(src))
72
80
 
73
81
 
74
82
  def _to_be_zipped(file: Path) -> bool:
@@ -12,16 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
16
- from snowflake.cli.plugins.spcs.compute_pool.commands import (
15
+ from snowflake.cli._plugins.spcs.compute_pool.commands import (
17
16
  app as compute_pools_app,
18
17
  )
19
- from snowflake.cli.plugins.spcs.image_registry.commands import app as registry_app
20
- from snowflake.cli.plugins.spcs.image_repository.commands import (
18
+ from snowflake.cli._plugins.spcs.image_registry.commands import app as registry_app
19
+ from snowflake.cli._plugins.spcs.image_repository.commands import (
21
20
  app as image_repository_app,
22
21
  )
23
- from snowflake.cli.plugins.spcs.jobs.commands import app as jobs_app
24
- from snowflake.cli.plugins.spcs.services.commands import app as services_app
22
+ from snowflake.cli._plugins.spcs.services.commands import app as services_app
23
+ from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
25
24
 
26
25
  app = SnowTyperFactory(
27
26
  name="spcs",
@@ -30,6 +29,5 @@ app = SnowTyperFactory(
30
29
 
31
30
  app.add_typer(compute_pools_app)
32
31
  app.add_typer(services_app)
33
- app.add_typer(jobs_app)
34
32
  app.add_typer(registry_app)
35
33
  app.add_typer(image_repository_app)
@@ -18,23 +18,25 @@ from typing import Optional
18
18
 
19
19
  import typer
20
20
  from click import ClickException
21
+ from snowflake.cli._plugins.object.command_aliases import (
22
+ add_object_command_aliases,
23
+ )
24
+ from snowflake.cli._plugins.object.common import CommentOption
25
+ from snowflake.cli._plugins.spcs.common import (
26
+ validate_and_set_instances,
27
+ )
28
+ from snowflake.cli._plugins.spcs.compute_pool.manager import ComputePoolManager
21
29
  from snowflake.cli.api.commands.flags import (
22
30
  IfNotExistsOption,
23
31
  OverrideableOption,
32
+ identifier_argument,
24
33
  like_option,
25
34
  )
26
35
  from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
27
36
  from snowflake.cli.api.constants import ObjectType
37
+ from snowflake.cli.api.identifiers import FQN
28
38
  from snowflake.cli.api.output.types import CommandResult, SingleQueryResult
29
39
  from snowflake.cli.api.project.util import is_valid_object_name
30
- from snowflake.cli.plugins.object.command_aliases import (
31
- add_object_command_aliases,
32
- )
33
- from snowflake.cli.plugins.object.common import CommentOption
34
- from snowflake.cli.plugins.spcs.common import (
35
- validate_and_set_instances,
36
- )
37
- from snowflake.cli.plugins.spcs.compute_pool.manager import ComputePoolManager
38
40
 
39
41
  app = SnowTyperFactory(
40
42
  name="compute-pool",
@@ -43,22 +45,21 @@ app = SnowTyperFactory(
43
45
  )
44
46
 
45
47
 
46
- def _compute_pool_name_callback(name: str) -> str:
48
+ def _compute_pool_name_callback(name: FQN) -> FQN:
47
49
  """
48
50
  Verifies that compute pool name is a single valid identifier.
49
51
  """
50
- if not is_valid_object_name(name, max_depth=0, allow_quoted=False):
52
+ if not is_valid_object_name(name.identifier, max_depth=0, allow_quoted=False):
51
53
  raise ClickException(
52
54
  f"'{name}' is not a valid compute pool name. Note that compute pool names must be unquoted identifiers."
53
55
  )
54
56
  return name
55
57
 
56
58
 
57
- ComputePoolNameArgument = typer.Argument(
58
- ...,
59
- help="Name of the compute pool.",
59
+ ComputePoolNameArgument = identifier_argument(
60
+ sf_object="compute pool",
61
+ example="my_compute_pool",
60
62
  callback=_compute_pool_name_callback,
61
- show_default=False,
62
63
  )
63
64
 
64
65
 
@@ -106,7 +107,7 @@ add_object_command_aliases(
106
107
 
107
108
  @app.command(requires_connection=True)
108
109
  def create(
109
- name: str = ComputePoolNameArgument,
110
+ name: FQN = ComputePoolNameArgument,
110
111
  instance_family: str = typer.Option(
111
112
  ...,
112
113
  "--family",
@@ -131,7 +132,7 @@ def create(
131
132
  """
132
133
  max_nodes = validate_and_set_instances(min_nodes, max_nodes, "nodes")
133
134
  cursor = ComputePoolManager().create(
134
- pool_name=name,
135
+ pool_name=name.identifier,
135
136
  min_nodes=min_nodes,
136
137
  max_nodes=max_nodes,
137
138
  instance_family=instance_family,
@@ -145,33 +146,33 @@ def create(
145
146
 
146
147
 
147
148
  @app.command("stop-all", requires_connection=True)
148
- def stop_all(name: str = ComputePoolNameArgument, **options) -> CommandResult:
149
+ def stop_all(name: FQN = ComputePoolNameArgument, **options) -> CommandResult:
149
150
  """
150
151
  Deletes all services running on the compute pool.
151
152
  """
152
- cursor = ComputePoolManager().stop(pool_name=name)
153
+ cursor = ComputePoolManager().stop(pool_name=name.identifier)
153
154
  return SingleQueryResult(cursor)
154
155
 
155
156
 
156
157
  @app.command(requires_connection=True)
157
- def suspend(name: str = ComputePoolNameArgument, **options) -> CommandResult:
158
+ def suspend(name: FQN = ComputePoolNameArgument, **options) -> CommandResult:
158
159
  """
159
160
  Suspends the compute pool by suspending all currently running services and then releasing compute pool nodes.
160
161
  """
161
- return SingleQueryResult(ComputePoolManager().suspend(name))
162
+ return SingleQueryResult(ComputePoolManager().suspend(name.identifier))
162
163
 
163
164
 
164
165
  @app.command(requires_connection=True)
165
- def resume(name: str = ComputePoolNameArgument, **options) -> CommandResult:
166
+ def resume(name: FQN = ComputePoolNameArgument, **options) -> CommandResult:
166
167
  """
167
168
  Resumes the compute pool from a SUSPENDED state.
168
169
  """
169
- return SingleQueryResult(ComputePoolManager().resume(name))
170
+ return SingleQueryResult(ComputePoolManager().resume(name.identifier))
170
171
 
171
172
 
172
173
  @app.command("set", requires_connection=True)
173
174
  def set_property(
174
- name: str = ComputePoolNameArgument,
175
+ name: FQN = ComputePoolNameArgument,
175
176
  min_nodes: Optional[int] = MinNodesOption(default=None, show_default=False),
176
177
  max_nodes: Optional[int] = MaxNodesOption(show_default=False),
177
178
  auto_resume: Optional[bool] = AutoResumeOption(default=None, show_default=False),
@@ -187,7 +188,7 @@ def set_property(
187
188
  Sets one or more properties for the compute pool.
188
189
  """
189
190
  cursor = ComputePoolManager().set_property(
190
- pool_name=name,
191
+ pool_name=name.identifier,
191
192
  min_nodes=min_nodes,
192
193
  max_nodes=max_nodes,
193
194
  auto_resume=auto_resume,
@@ -199,7 +200,7 @@ def set_property(
199
200
 
200
201
  @app.command("unset", requires_connection=True)
201
202
  def unset_property(
202
- name: str = ComputePoolNameArgument,
203
+ name: FQN = ComputePoolNameArgument,
203
204
  auto_resume: bool = AutoResumeOption(
204
205
  default=False,
205
206
  param_decls=["--auto-resume"],
@@ -223,7 +224,7 @@ def unset_property(
223
224
  Resets one or more properties for the compute pool to their default value(s).
224
225
  """
225
226
  cursor = ComputePoolManager().unset_property(
226
- pool_name=name,
227
+ pool_name=name.identifier,
227
228
  auto_resume=auto_resume,
228
229
  auto_suspend_secs=auto_suspend_secs,
229
230
  comment=comment,
@@ -232,9 +233,9 @@ def unset_property(
232
233
 
233
234
 
234
235
  @app.command(requires_connection=True)
235
- def status(pool_name: str = ComputePoolNameArgument, **options) -> CommandResult:
236
+ def status(pool_name: FQN = ComputePoolNameArgument, **options) -> CommandResult:
236
237
  """
237
238
  Retrieves the status of a compute pool along with a relevant message, if one exists.
238
239
  """
239
- cursor = ComputePoolManager().status(pool_name=pool_name)
240
+ cursor = ComputePoolManager().status(pool_name=pool_name.identifier)
240
241
  return SingleQueryResult(cursor)
@@ -16,13 +16,13 @@ from __future__ import annotations
16
16
 
17
17
  from typing import List, Optional
18
18
 
19
- from snowflake.cli.api.constants import ObjectType
20
- from snowflake.cli.api.sql_execution import SqlExecutionMixin
21
- from snowflake.cli.plugins.spcs.common import (
19
+ from snowflake.cli._plugins.spcs.common import (
22
20
  NoPropertiesProvidedError,
23
21
  handle_object_already_exists,
24
22
  strip_empty_lines,
25
23
  )
24
+ from snowflake.cli.api.constants import ObjectType
25
+ from snowflake.cli.api.sql_execution import SqlExecutionMixin
26
26
  from snowflake.connector.cursor import SnowflakeCursor
27
27
  from snowflake.connector.errors import ProgrammingError
28
28
 
@@ -12,11 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
16
- from snowflake.cli.api.output.types import MessageResult, ObjectResult
17
- from snowflake.cli.plugins.spcs.image_registry.manager import (
15
+ from snowflake.cli._plugins.spcs.image_registry.manager import (
18
16
  RegistryManager,
19
17
  )
18
+ from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
19
+ from snowflake.cli.api.output.types import MessageResult, ObjectResult
20
20
 
21
21
  app = SnowTyperFactory(
22
22
  name="image-registry",
@@ -20,26 +20,28 @@ from typing import Optional
20
20
  import requests
21
21
  import typer
22
22
  from click import ClickException
23
+ from snowflake.cli._plugins.object.command_aliases import (
24
+ add_object_command_aliases,
25
+ scope_option,
26
+ )
27
+ from snowflake.cli._plugins.spcs.image_registry.manager import RegistryManager
28
+ from snowflake.cli._plugins.spcs.image_repository.manager import ImageRepositoryManager
23
29
  from snowflake.cli.api.commands.flags import (
24
30
  IfNotExistsOption,
25
31
  ReplaceOption,
32
+ identifier_argument,
26
33
  like_option,
27
34
  )
28
35
  from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
29
36
  from snowflake.cli.api.console import cli_console
30
37
  from snowflake.cli.api.constants import ObjectType
38
+ from snowflake.cli.api.identifiers import FQN
31
39
  from snowflake.cli.api.output.types import (
32
40
  CollectionResult,
33
41
  MessageResult,
34
42
  SingleQueryResult,
35
43
  )
36
44
  from snowflake.cli.api.project.util import is_valid_object_name
37
- from snowflake.cli.plugins.object.command_aliases import (
38
- add_object_command_aliases,
39
- scope_option,
40
- )
41
- from snowflake.cli.plugins.spcs.image_registry.manager import RegistryManager
42
- from snowflake.cli.plugins.spcs.image_repository.manager import ImageRepositoryManager
43
45
 
44
46
  app = SnowTyperFactory(
45
47
  name="image-repository",
@@ -48,18 +50,18 @@ app = SnowTyperFactory(
48
50
  )
49
51
 
50
52
 
51
- def _repo_name_callback(name: str):
52
- if not is_valid_object_name(name, max_depth=2, allow_quoted=False):
53
+ def _repo_name_callback(name: FQN):
54
+ if not is_valid_object_name(name.identifier, max_depth=2, allow_quoted=False):
53
55
  raise ClickException(
54
56
  f"'{name}' is not a valid image repository name. Note that image repository names must be unquoted identifiers. The same constraint also applies to database and schema names where you create an image repository."
55
57
  )
56
58
  return name
57
59
 
58
60
 
59
- REPO_NAME_ARGUMENT = typer.Argument(
60
- help="Name of the image repository.",
61
+ REPO_NAME_ARGUMENT = identifier_argument(
62
+ sf_object="image repository",
63
+ example="my_repository",
61
64
  callback=_repo_name_callback,
62
- show_default=False,
63
65
  )
64
66
 
65
67
  add_object_command_aliases(
@@ -76,7 +78,7 @@ add_object_command_aliases(
76
78
 
77
79
  @app.command(requires_connection=True)
78
80
  def create(
79
- name: str = REPO_NAME_ARGUMENT,
81
+ name: FQN = REPO_NAME_ARGUMENT,
80
82
  replace: bool = ReplaceOption(),
81
83
  if_not_exists: bool = IfNotExistsOption(),
82
84
  **options,
@@ -86,21 +88,21 @@ def create(
86
88
  """
87
89
  return SingleQueryResult(
88
90
  ImageRepositoryManager().create(
89
- name=name, replace=replace, if_not_exists=if_not_exists
91
+ name=name.identifier, replace=replace, if_not_exists=if_not_exists
90
92
  )
91
93
  )
92
94
 
93
95
 
94
96
  @app.command("list-images", requires_connection=True)
95
97
  def list_images(
96
- name: str = REPO_NAME_ARGUMENT,
98
+ name: FQN = REPO_NAME_ARGUMENT,
97
99
  **options,
98
100
  ) -> CollectionResult:
99
101
  """Lists images in the given repository."""
100
102
  repository_manager = ImageRepositoryManager()
101
103
  database = repository_manager.get_database()
102
104
  schema = repository_manager.get_schema()
103
- url = repository_manager.get_repository_url(name)
105
+ url = repository_manager.get_repository_url(name.identifier)
104
106
  api_url = repository_manager.get_repository_api_url(url)
105
107
  bearer_login = RegistryManager().login_to_registry(api_url)
106
108
  repos = []
@@ -136,7 +138,7 @@ def list_images(
136
138
 
137
139
  @app.command("list-tags", requires_connection=True)
138
140
  def list_tags(
139
- name: str = REPO_NAME_ARGUMENT,
141
+ name: FQN = REPO_NAME_ARGUMENT,
140
142
  image_name: str = typer.Option(
141
143
  ...,
142
144
  "--image-name",
@@ -150,7 +152,7 @@ def list_tags(
150
152
  """Lists tags for the given image in a repository."""
151
153
 
152
154
  repository_manager = ImageRepositoryManager()
153
- url = repository_manager.get_repository_url(name)
155
+ url = repository_manager.get_repository_url(name.identifier)
154
156
  api_url = repository_manager.get_repository_api_url(url)
155
157
  bearer_login = RegistryManager().login_to_registry(api_url)
156
158
 
@@ -187,10 +189,14 @@ def list_tags(
187
189
 
188
190
  @app.command("url", requires_connection=True)
189
191
  def repo_url(
190
- name: str = REPO_NAME_ARGUMENT,
192
+ name: FQN = REPO_NAME_ARGUMENT,
191
193
  **options,
192
194
  ):
193
195
  """Returns the URL for the given repository."""
194
196
  return MessageResult(
195
- (ImageRepositoryManager().get_repository_url(repo_name=name, with_scheme=False))
197
+ (
198
+ ImageRepositoryManager().get_repository_url(
199
+ repo_name=name.identifier, with_scheme=False
200
+ )
201
+ )
196
202
  )
@@ -14,10 +14,10 @@
14
14
 
15
15
  from urllib.parse import urlparse
16
16
 
17
+ from snowflake.cli._plugins.spcs.common import handle_object_already_exists
17
18
  from snowflake.cli.api.constants import ObjectType
18
19
  from snowflake.cli.api.identifiers import FQN
19
20
  from snowflake.cli.api.sql_execution import SqlExecutionMixin
20
- from snowflake.cli.plugins.spcs.common import handle_object_already_exists
21
21
  from snowflake.connector.errors import ProgrammingError
22
22
 
23
23
 
@@ -12,13 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from snowflake.cli._plugins.spcs import app
15
16
  from snowflake.cli.api.plugins.command import (
16
17
  SNOWCLI_ROOT_COMMAND_PATH,
17
18
  CommandSpec,
18
19
  CommandType,
19
20
  plugin_hook_impl,
20
21
  )
21
- from snowflake.cli.plugins.spcs import app
22
22
 
23
23
 
24
24
  @plugin_hook_impl
@@ -20,13 +20,25 @@ from typing import List, Optional
20
20
 
21
21
  import typer
22
22
  from click import ClickException
23
+ from snowflake.cli._plugins.object.command_aliases import (
24
+ add_object_command_aliases,
25
+ scope_option,
26
+ )
27
+ from snowflake.cli._plugins.object.common import CommentOption, Tag, TagOption
28
+ from snowflake.cli._plugins.spcs.common import (
29
+ print_log_lines,
30
+ validate_and_set_instances,
31
+ )
32
+ from snowflake.cli._plugins.spcs.services.manager import ServiceManager
23
33
  from snowflake.cli.api.commands.flags import (
24
34
  IfNotExistsOption,
25
35
  OverrideableOption,
36
+ identifier_argument,
26
37
  like_option,
27
38
  )
28
39
  from snowflake.cli.api.commands.snow_typer import SnowTyperFactory
29
40
  from snowflake.cli.api.constants import ObjectType
41
+ from snowflake.cli.api.identifiers import FQN
30
42
  from snowflake.cli.api.output.types import (
31
43
  CommandResult,
32
44
  QueryJsonValueResult,
@@ -34,16 +46,6 @@ from snowflake.cli.api.output.types import (
34
46
  SingleQueryResult,
35
47
  )
36
48
  from snowflake.cli.api.project.util import is_valid_object_name
37
- from snowflake.cli.plugins.object.command_aliases import (
38
- add_object_command_aliases,
39
- scope_option,
40
- )
41
- from snowflake.cli.plugins.object.common import CommentOption, Tag, TagOption
42
- from snowflake.cli.plugins.spcs.common import (
43
- print_log_lines,
44
- validate_and_set_instances,
45
- )
46
- from snowflake.cli.plugins.spcs.services.manager import ServiceManager
47
49
 
48
50
  app = SnowTyperFactory(
49
51
  name="service",
@@ -52,19 +54,18 @@ app = SnowTyperFactory(
52
54
  )
53
55
 
54
56
 
55
- def _service_name_callback(name: str) -> str:
56
- if not is_valid_object_name(name, max_depth=2, allow_quoted=False):
57
+ def _service_name_callback(name: FQN) -> FQN:
58
+ if not is_valid_object_name(name.identifier, max_depth=2, allow_quoted=False):
57
59
  raise ClickException(
58
60
  f"'{name}' is not a valid service name. Note service names must be unquoted identifiers. The same constraint also applies to database and schema names where you create a service."
59
61
  )
60
62
  return name
61
63
 
62
64
 
63
- ServiceNameArgument = typer.Argument(
64
- ...,
65
- help="Name of the service.",
65
+ ServiceNameArgument = identifier_argument(
66
+ sf_object="service",
67
+ example="my_service",
66
68
  callback=_service_name_callback,
67
- show_default=False,
68
69
  )
69
70
 
70
71
  SpecPathOption = typer.Option(
@@ -116,7 +117,7 @@ add_object_command_aliases(
116
117
 
117
118
  @app.command(requires_connection=True)
118
119
  def create(
119
- name: str = ServiceNameArgument,
120
+ name: FQN = ServiceNameArgument,
120
121
  compute_pool: str = typer.Option(
121
122
  ...,
122
123
  "--compute-pool",
@@ -145,7 +146,7 @@ def create(
145
146
  min_instances, max_instances, "instances"
146
147
  )
147
148
  cursor = ServiceManager().create(
148
- service_name=name,
149
+ service_name=name.identifier,
149
150
  min_instances=min_instances,
150
151
  max_instances=max_instances,
151
152
  compute_pool=compute_pool,
@@ -161,17 +162,50 @@ def create(
161
162
 
162
163
 
163
164
  @app.command(requires_connection=True)
164
- def status(name: str = ServiceNameArgument, **options) -> CommandResult:
165
+ def execute_job(
166
+ name: FQN = ServiceNameArgument,
167
+ compute_pool: str = typer.Option(
168
+ ...,
169
+ "--compute-pool",
170
+ help="Compute pool to run the job service on.",
171
+ show_default=False,
172
+ ),
173
+ spec_path: Path = SpecPathOption,
174
+ external_access_integrations: Optional[List[str]] = typer.Option(
175
+ None,
176
+ "--eai-name",
177
+ help="Identifies External Access Integrations(EAI) that the job service can access. This option may be specified multiple times for multiple EAIs.",
178
+ ),
179
+ query_warehouse: Optional[str] = QueryWarehouseOption(),
180
+ comment: Optional[str] = CommentOption(help=_COMMENT_HELP),
181
+ **options,
182
+ ) -> CommandResult:
183
+ """
184
+ Creates and executes a job service in the current schema.
185
+ """
186
+ cursor = ServiceManager().execute_job(
187
+ job_service_name=name.identifier,
188
+ compute_pool=compute_pool,
189
+ spec_path=spec_path,
190
+ external_access_integrations=external_access_integrations,
191
+ query_warehouse=query_warehouse,
192
+ comment=comment,
193
+ )
194
+ return SingleQueryResult(cursor)
195
+
196
+
197
+ @app.command(requires_connection=True)
198
+ def status(name: FQN = ServiceNameArgument, **options) -> CommandResult:
165
199
  """
166
200
  Retrieves the status of a service.
167
201
  """
168
- cursor = ServiceManager().status(service_name=name)
202
+ cursor = ServiceManager().status(service_name=name.identifier)
169
203
  return QueryJsonValueResult(cursor)
170
204
 
171
205
 
172
206
  @app.command(requires_connection=True)
173
207
  def logs(
174
- name: str = ServiceNameArgument,
208
+ name: FQN = ServiceNameArgument,
175
209
  container_name: str = typer.Option(
176
210
  ...,
177
211
  "--container-name",
@@ -193,7 +227,7 @@ def logs(
193
227
  Retrieves local logs from a service container.
194
228
  """
195
229
  results = ServiceManager().logs(
196
- service_name=name,
230
+ service_name=name.identifier,
197
231
  instance_id=instance_id,
198
232
  container_name=container_name,
199
233
  num_lines=num_lines,
@@ -205,7 +239,7 @@ def logs(
205
239
 
206
240
  @app.command(requires_connection=True)
207
241
  def upgrade(
208
- name: str = ServiceNameArgument,
242
+ name: FQN = ServiceNameArgument,
209
243
  spec_path: Path = SpecPathOption,
210
244
  **options,
211
245
  ):
@@ -213,20 +247,20 @@ def upgrade(
213
247
  Updates an existing service with a new specification file.
214
248
  """
215
249
  return SingleQueryResult(
216
- ServiceManager().upgrade_spec(service_name=name, spec_path=spec_path)
250
+ ServiceManager().upgrade_spec(service_name=name.identifier, spec_path=spec_path)
217
251
  )
218
252
 
219
253
 
220
254
  @app.command("list-endpoints", requires_connection=True)
221
- def list_endpoints(name: str = ServiceNameArgument, **options):
255
+ def list_endpoints(name: FQN = ServiceNameArgument, **options):
222
256
  """
223
257
  Lists the endpoints in a service.
224
258
  """
225
- return QueryResult(ServiceManager().list_endpoints(service_name=name))
259
+ return QueryResult(ServiceManager().list_endpoints(service_name=name.identifier))
226
260
 
227
261
 
228
262
  @app.command(requires_connection=True)
229
- def suspend(name: str = ServiceNameArgument, **options) -> CommandResult:
263
+ def suspend(name: FQN = ServiceNameArgument, **options) -> CommandResult:
230
264
  """
231
265
  Suspends the service, shutting down and deleting all its containers.
232
266
  """
@@ -234,7 +268,7 @@ def suspend(name: str = ServiceNameArgument, **options) -> CommandResult:
234
268
 
235
269
 
236
270
  @app.command(requires_connection=True)
237
- def resume(name: str = ServiceNameArgument, **options) -> CommandResult:
271
+ def resume(name: FQN = ServiceNameArgument, **options) -> CommandResult:
238
272
  """
239
273
  Resumes the service from a SUSPENDED state.
240
274
  """
@@ -243,7 +277,7 @@ def resume(name: str = ServiceNameArgument, **options) -> CommandResult:
243
277
 
244
278
  @app.command("set", requires_connection=True)
245
279
  def set_property(
246
- name: str = ServiceNameArgument,
280
+ name: FQN = ServiceNameArgument,
247
281
  min_instances: Optional[int] = MinInstancesOption(default=None, show_default=False),
248
282
  max_instances: Optional[int] = MaxInstancesOption(show_default=False),
249
283
  query_warehouse: Optional[str] = QueryWarehouseOption(show_default=False),
@@ -255,7 +289,7 @@ def set_property(
255
289
  Sets one or more properties for the service.
256
290
  """
257
291
  cursor = ServiceManager().set_property(
258
- service_name=name,
292
+ service_name=name.identifier,
259
293
  min_instances=min_instances,
260
294
  max_instances=max_instances,
261
295
  query_warehouse=query_warehouse,
@@ -267,7 +301,7 @@ def set_property(
267
301
 
268
302
  @app.command("unset", requires_connection=True)
269
303
  def unset_property(
270
- name: str = ServiceNameArgument,
304
+ name: FQN = ServiceNameArgument,
271
305
  min_instances: bool = MinInstancesOption(
272
306
  default=False,
273
307
  help=f"Reset the MIN_INSTANCES property - {_MIN_INSTANCES_HELP}",
@@ -301,7 +335,7 @@ def unset_property(
301
335
  Resets one or more properties for the service to their default value(s).
302
336
  """
303
337
  cursor = ServiceManager().unset_property(
304
- service_name=name,
338
+ service_name=name.identifier,
305
339
  min_instances=min_instances,
306
340
  max_instances=max_instances,
307
341
  query_warehouse=query_warehouse,