snowflake-cli 3.10.0__py3-none-any.whl → 3.10.1__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.
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  from enum import Enum, unique
18
18
 
19
- VERSION = "3.10.0"
19
+ VERSION = "3.10.1"
20
20
 
21
21
 
22
22
  @unique
@@ -16,6 +16,7 @@ from snowflake.cli._plugins.auth.keypair import plugin_spec as auth_plugin_spec
16
16
  from snowflake.cli._plugins.connection import plugin_spec as connection_plugin_spec
17
17
  from snowflake.cli._plugins.cortex import plugin_spec as cortex_plugin_spec
18
18
  from snowflake.cli._plugins.dbt import plugin_spec as dbt_plugin_spec
19
+ from snowflake.cli._plugins.dcm import plugin_spec as dcm_project_plugin_spec
19
20
  from snowflake.cli._plugins.git import plugin_spec as git_plugin_spec
20
21
  from snowflake.cli._plugins.helpers import plugin_spec as migrate_plugin_spec
21
22
  from snowflake.cli._plugins.init import plugin_spec as init_plugin_spec
@@ -24,7 +25,6 @@ from snowflake.cli._plugins.nativeapp import plugin_spec as nativeapp_plugin_spe
24
25
  from snowflake.cli._plugins.notebook import plugin_spec as notebook_plugin_spec
25
26
  from snowflake.cli._plugins.object import plugin_spec as object_plugin_spec
26
27
  from snowflake.cli._plugins.plugin import plugin_spec as plugin_plugin_spec
27
- from snowflake.cli._plugins.project import plugin_spec as project_plugin_spec
28
28
  from snowflake.cli._plugins.snowpark import plugin_spec as snowpark_plugin_spec
29
29
  from snowflake.cli._plugins.spcs import plugin_spec as spcs_plugin_spec
30
30
  from snowflake.cli._plugins.sql import plugin_spec as sql_plugin_spec
@@ -42,7 +42,7 @@ def get_builtin_plugin_name_to_plugin_spec():
42
42
  "spcs": spcs_plugin_spec,
43
43
  "app": nativeapp_plugin_spec,
44
44
  "object": object_plugin_spec,
45
- "project": project_plugin_spec,
45
+ "dcm": dcm_project_plugin_spec,
46
46
  "snowpark": snowpark_plugin_spec,
47
47
  "stage": stage_plugin_spec,
48
48
  "sql": sql_plugin_spec,
@@ -26,6 +26,7 @@ from snowflake.cli.api.console import cli_console
26
26
  from snowflake.cli.api.constants import DEFAULT_SIZE_LIMIT_MB, ObjectType
27
27
  from snowflake.cli.api.exceptions import CliError
28
28
  from snowflake.cli.api.identifiers import FQN
29
+ from snowflake.cli.api.project.util import unquote_identifier
29
30
  from snowflake.cli.api.secure_path import SecurePath
30
31
  from snowflake.cli.api.sql_execution import SqlExecutionMixin
31
32
  from snowflake.connector.cursor import SnowflakeCursor
@@ -44,7 +45,7 @@ class DBTManager(SqlExecutionMixin):
44
45
 
45
46
  def deploy(
46
47
  self,
47
- name: FQN,
48
+ fqn: FQN,
48
49
  path: SecurePath,
49
50
  profiles_path: SecurePath,
50
51
  force: bool,
@@ -66,7 +67,8 @@ class DBTManager(SqlExecutionMixin):
66
67
 
67
68
  with cli_console.phase("Creating temporary stage"):
68
69
  stage_manager = StageManager()
69
- stage_fqn = FQN.from_string(f"dbt_{name}_stage").using_context()
70
+ unquoted_name = unquote_identifier(fqn.name)
71
+ stage_fqn = FQN.from_string(f"DBT_{unquoted_name}_STAGE").using_context()
70
72
  stage_name = stage_manager.get_standard_stage_prefix(stage_fqn)
71
73
  stage_manager.create(stage_fqn, temporary=True)
72
74
 
@@ -86,11 +88,11 @@ class DBTManager(SqlExecutionMixin):
86
88
 
87
89
  with cli_console.phase("Creating DBT project"):
88
90
  if force is True:
89
- query = f"CREATE OR REPLACE DBT PROJECT {name}"
90
- elif self.exists(name=name):
91
- query = f"ALTER DBT PROJECT {name} ADD VERSION"
91
+ query = f"CREATE OR REPLACE DBT PROJECT {fqn}"
92
+ elif self.exists(name=fqn):
93
+ query = f"ALTER DBT PROJECT {fqn} ADD VERSION"
92
94
  else:
93
- query = f"CREATE DBT PROJECT {name}"
95
+ query = f"CREATE DBT PROJECT {fqn}"
94
96
  query += f"\nFROM {stage_name}"
95
97
  return self.execute_query(query)
96
98
 
@@ -174,7 +176,7 @@ class DBTManager(SqlExecutionMixin):
174
176
  yaml.safe_dump(yaml.safe_load(sfd), tfd)
175
177
 
176
178
  def execute(
177
- self, dbt_command: str, name: str, run_async: bool, *dbt_cli_args
179
+ self, dbt_command: str, name: FQN, run_async: bool, *dbt_cli_args
178
180
  ) -> SnowflakeCursor:
179
181
  if dbt_cli_args:
180
182
  dbt_command = " ".join([dbt_command, *dbt_cli_args]).strip()
@@ -15,13 +15,13 @@
15
15
  from typing import List, Optional
16
16
 
17
17
  import typer
18
+ from snowflake.cli._plugins.dcm.dcm_project_entity_model import (
19
+ DCMProjectEntityModel,
20
+ )
21
+ from snowflake.cli._plugins.dcm.manager import DCMProjectManager
18
22
  from snowflake.cli._plugins.object.command_aliases import add_object_command_aliases
19
23
  from snowflake.cli._plugins.object.commands import scope_option
20
24
  from snowflake.cli._plugins.object.manager import ObjectManager
21
- from snowflake.cli._plugins.project.manager import ProjectManager
22
- from snowflake.cli._plugins.project.project_entity_model import (
23
- ProjectEntityModel,
24
- )
25
25
  from snowflake.cli.api.cli_global_context import get_cli_context
26
26
  from snowflake.cli.api.commands.decorators import with_project_definition
27
27
  from snowflake.cli.api.commands.flags import (
@@ -48,16 +48,16 @@ from snowflake.cli.api.output.types import (
48
48
  )
49
49
 
50
50
  app = SnowTyperFactory(
51
- name="project",
52
- help="Manages projects in Snowflake.",
51
+ name="dcm",
52
+ help="Manages DCM Projects in Snowflake.",
53
53
  is_hidden=FeatureFlag.ENABLE_SNOWFLAKE_PROJECTS.is_disabled,
54
54
  )
55
55
 
56
- project_identifier = identifier_argument(sf_object="project", example="MY_PROJECT")
56
+ dcm_identifier = identifier_argument(sf_object="DCM Project", example="MY_PROJECT")
57
57
  version_flag = typer.Option(
58
58
  None,
59
59
  "--version",
60
- help="Version of the project to use. If not specified default version is used. For names containing '$', use single quotes to prevent shell expansion (e.g., 'VERSION$1').",
60
+ help="Version of the DCM Project to use. If not specified default version is used. For names containing '$', use single quotes to prevent shell expansion (e.g., 'VERSION$1').",
61
61
  show_default=False,
62
62
  )
63
63
  variables_flag = variables_option(
@@ -66,7 +66,7 @@ variables_flag = variables_option(
66
66
  configuration_flag = typer.Option(
67
67
  None,
68
68
  "--configuration",
69
- help="Configuration of the project to use. If not specified default configuration is used.",
69
+ help="Configuration of the DCM Project to use. If not specified default configuration is used.",
70
70
  show_default=False,
71
71
  )
72
72
  from_option = OverrideableOption(
@@ -78,34 +78,34 @@ from_option = OverrideableOption(
78
78
 
79
79
  add_object_command_aliases(
80
80
  app=app,
81
- object_type=ObjectType.PROJECT,
82
- name_argument=project_identifier,
81
+ object_type=ObjectType.DCM_PROJECT,
82
+ name_argument=dcm_identifier,
83
83
  like_option=like_option(
84
- help_example='`list --like "my%"` lists all projects that begin with "my"'
84
+ help_example='`list --like "my%"` lists all DCM Projects that begin with "my"'
85
85
  ),
86
86
  scope_option=scope_option(help_example="`list --in database my_db`"),
87
- ommit_commands=["create", "describe"],
87
+ ommit_commands=["create"],
88
88
  )
89
89
 
90
90
 
91
91
  @app.command(requires_connection=True)
92
- def execute(
93
- identifier: FQN = project_identifier,
92
+ def deploy(
93
+ identifier: FQN = dcm_identifier,
94
94
  version: Optional[str] = version_flag,
95
95
  from_stage: Optional[str] = from_option(
96
- help="Execute project from given stage instead of using a specific version."
96
+ help="Apply changes defined in given stage instead of using a specific project version."
97
97
  ),
98
98
  variables: Optional[List[str]] = variables_flag,
99
99
  configuration: Optional[str] = configuration_flag,
100
100
  **options,
101
101
  ):
102
102
  """
103
- Executes a project.
103
+ Applies changes defined in DCM Project to Snowflake.
104
104
  """
105
105
  if version and from_stage:
106
106
  raise CliError("--version and --from are mutually exclusive.")
107
107
 
108
- result = ProjectManager().execute(
108
+ result = DCMProjectManager().execute(
109
109
  project_name=identifier,
110
110
  configuration=configuration,
111
111
  version=version,
@@ -116,23 +116,23 @@ def execute(
116
116
 
117
117
 
118
118
  @app.command(requires_connection=True)
119
- def dry_run(
120
- identifier: FQN = project_identifier,
119
+ def plan(
120
+ identifier: FQN = dcm_identifier,
121
121
  version: Optional[str] = version_flag,
122
122
  from_stage: Optional[str] = from_option(
123
- help="Execute project from given stage instead of using a specific version."
123
+ help="Plan DCM Project deployment from given stage instead of using a specific version."
124
124
  ),
125
125
  variables: Optional[List[str]] = variables_flag,
126
126
  configuration: Optional[str] = configuration_flag,
127
127
  **options,
128
128
  ):
129
129
  """
130
- Validates a project.
130
+ Plans a DCM Project deployment (validates without executing).
131
131
  """
132
132
  if version and from_stage:
133
133
  raise CliError("--version and --from are mutually exclusive.")
134
134
 
135
- result = ProjectManager().execute(
135
+ result = DCMProjectManager().execute(
136
136
  project_name=identifier,
137
137
  configuration=configuration,
138
138
  version=version,
@@ -146,11 +146,11 @@ def dry_run(
146
146
  @app.command(requires_connection=True)
147
147
  @with_project_definition()
148
148
  def create(
149
- entity_id: str = entity_argument("project"),
149
+ entity_id: str = entity_argument("dcm"),
150
150
  no_version: bool = typer.Option(
151
151
  False,
152
152
  "--no-version",
153
- help="Do not initialize project with a new version, only create the snowflake object.",
153
+ help="Do not initialize DCM Project with a new version, only create the snowflake object.",
154
154
  ),
155
155
  if_not_exists: bool = IfNotExistsOption(
156
156
  help="Do nothing if the project already exists."
@@ -158,19 +158,19 @@ def create(
158
158
  **options,
159
159
  ):
160
160
  """
161
- Creates a project in Snowflake.
162
- By default, the project is initialized with a new version created from local files.
161
+ Creates a DCM Project in Snowflake.
162
+ By default, the DCM Project is initialized with a new version created from local files.
163
163
  """
164
164
  cli_context = get_cli_context()
165
- project: ProjectEntityModel = get_entity_for_operation(
165
+ project: DCMProjectEntityModel = get_entity_for_operation(
166
166
  cli_context=cli_context,
167
167
  entity_id=entity_id,
168
168
  project_definition=cli_context.project_definition,
169
- entity_type="project",
169
+ entity_type="dcm",
170
170
  )
171
171
  om = ObjectManager()
172
- if om.object_exists(object_type="project", fqn=project.fqn):
173
- message = f"Project '{project.fqn}' already exists."
172
+ if om.object_exists(object_type="dcm", fqn=project.fqn):
173
+ message = f"DCM Project '{project.fqn}' already exists."
174
174
  if if_not_exists:
175
175
  return MessageResult(message)
176
176
  raise CliError(message)
@@ -180,21 +180,21 @@ def create(
180
180
  ):
181
181
  raise CliError(f"Stage '{project.stage}' already exists.")
182
182
 
183
- pm = ProjectManager()
184
- with cli_console.phase(f"Creating project '{project.fqn}'"):
185
- pm.create(project=project, initialize_version_from_local_files=not no_version)
183
+ dpm = DCMProjectManager()
184
+ with cli_console.phase(f"Creating DCM Project '{project.fqn}'"):
185
+ dpm.create(project=project, initialize_version_from_local_files=not no_version)
186
186
 
187
187
  if no_version:
188
- return MessageResult(f"Project '{project.fqn}' successfully created.")
188
+ return MessageResult(f"DCM Project '{project.fqn}' successfully created.")
189
189
  return MessageResult(
190
- f"Project '{project.fqn}' successfully created and initial version is added."
190
+ f"DCM Project '{project.fqn}' successfully created and initial version is added."
191
191
  )
192
192
 
193
193
 
194
194
  @app.command(requires_connection=True)
195
195
  @with_project_definition()
196
196
  def add_version(
197
- entity_id: str = entity_argument("project"),
197
+ entity_id: str = entity_argument("dcm"),
198
198
  _from: Optional[str] = from_option(
199
199
  help="Create a new version using given stage instead of uploading local files."
200
200
  ),
@@ -207,25 +207,25 @@ def add_version(
207
207
  prune: bool = PruneOption(default=True),
208
208
  **options,
209
209
  ):
210
- """Uploads local files to Snowflake and cerates a new project version."""
210
+ """Uploads local files to Snowflake and cerates a new DCM Project version."""
211
211
  if _from is not None and prune:
212
212
  cli_console.warning(
213
213
  "When `--from` option is used, `--prune` option will be ignored and files from stage will be used as they are."
214
214
  )
215
215
  prune = False
216
216
  cli_context = get_cli_context()
217
- project: ProjectEntityModel = get_entity_for_operation(
217
+ project: DCMProjectEntityModel = get_entity_for_operation(
218
218
  cli_context=cli_context,
219
219
  entity_id=entity_id,
220
220
  project_definition=cli_context.project_definition,
221
- entity_type="project",
221
+ entity_type="dcm",
222
222
  )
223
223
  om = ObjectManager()
224
- if not om.object_exists(object_type="project", fqn=project.fqn):
224
+ if not om.object_exists(object_type="dcm", fqn=project.fqn):
225
225
  raise CliError(
226
- f"Project '{project.fqn}' does not exist. Use `project create` command first."
226
+ f"DCM Project '{project.fqn}' does not exist. Use `dcm create` command first."
227
227
  )
228
- ProjectManager().add_version(
228
+ DCMProjectManager().add_version(
229
229
  project=project,
230
230
  prune=prune,
231
231
  from_stage=_from,
@@ -234,26 +234,26 @@ def add_version(
234
234
  )
235
235
  alias_str = "" if _alias is None else f"'{_alias}' "
236
236
  return MessageResult(
237
- f"New project version {alias_str}added to project '{project.fqn}'."
237
+ f"New version {alias_str}added to DCM Project '{project.fqn}'."
238
238
  )
239
239
 
240
240
 
241
241
  @app.command(requires_connection=True)
242
242
  def list_versions(
243
- identifier: FQN = project_identifier,
243
+ identifier: FQN = dcm_identifier,
244
244
  **options,
245
245
  ):
246
246
  """
247
- Lists versions of given project.
247
+ Lists versions of given DCM Project.
248
248
  """
249
- pm = ProjectManager()
249
+ pm = DCMProjectManager()
250
250
  results = pm.list_versions(project_name=identifier)
251
251
  return QueryResult(results)
252
252
 
253
253
 
254
254
  @app.command(requires_connection=True)
255
255
  def drop_version(
256
- identifier: FQN = project_identifier,
256
+ identifier: FQN = dcm_identifier,
257
257
  version_name: str = typer.Argument(
258
258
  help="Name or alias of the version to drop. For names containing '$', use single quotes to prevent shell expansion (e.g., 'VERSION$1').",
259
259
  show_default=False,
@@ -262,7 +262,7 @@ def drop_version(
262
262
  **options,
263
263
  ):
264
264
  """
265
- Drops a version from the project.
265
+ Drops a version from the DCM Project.
266
266
  """
267
267
  # Detect potential shell expansion issues
268
268
  if version_name and version_name.upper() == "VERSION":
@@ -271,12 +271,12 @@ def drop_version(
271
271
  f"If you meant to use a version like 'VERSION$1', try using single quotes: 'VERSION$1'."
272
272
  )
273
273
 
274
- pm = ProjectManager()
275
- pm.drop_version(
274
+ dpm = DCMProjectManager()
275
+ dpm.drop_version(
276
276
  project_name=identifier,
277
277
  version_name=version_name,
278
278
  if_exists=if_exists,
279
279
  )
280
280
  return MessageResult(
281
- f"Version '{version_name}' dropped from project '{identifier}'."
281
+ f"Version '{version_name}' dropped from DCM Project '{identifier}'."
282
282
  )
@@ -35,10 +35,10 @@ T = TypeVar("T")
35
35
  MANIFEST_FILE_NAME = "manifest.yml"
36
36
 
37
37
 
38
- class ProjectEntityModel(EntityModelBaseWithArtifacts):
39
- type: Literal["project"] = DiscriminatorField() # noqa: A003
38
+ class DCMProjectEntityModel(EntityModelBaseWithArtifacts):
39
+ type: Literal["dcm"] = DiscriminatorField() # noqa: A003
40
40
  stage: Optional[str] = Field(
41
- title="Stage in which the project artifacts will be stored", default=None
41
+ title="Stage in which the DCM Project artifacts will be stored", default=None
42
42
  )
43
43
 
44
44
  @field_validator("artifacts")
@@ -54,6 +54,6 @@ class ProjectEntityModel(EntityModelBaseWithArtifacts):
54
54
  return super().transform_artifacts(orig_artifacts)
55
55
 
56
56
 
57
- @attach_spans_to_entity_actions(entity_name="project")
58
- class ProjectEntity(EntityBase[ProjectEntityModel]):
57
+ @attach_spans_to_entity_actions(entity_name="dcm")
58
+ class DCMProjectEntity(EntityBase[DCMProjectEntityModel]):
59
59
  """Placeholder for project entity"""
@@ -14,7 +14,7 @@
14
14
  from textwrap import dedent
15
15
  from typing import List, Optional
16
16
 
17
- from snowflake.cli._plugins.project.project_entity_model import ProjectEntityModel
17
+ from snowflake.cli._plugins.dcm.dcm_project_entity_model import DCMProjectEntityModel
18
18
  from snowflake.cli._plugins.stage.manager import StageManager
19
19
  from snowflake.cli.api.artifacts.upload import sync_artifacts_with_stage
20
20
  from snowflake.cli.api.cli_global_context import get_cli_context
@@ -27,7 +27,7 @@ from snowflake.cli.api.stage_path import StagePath
27
27
  from snowflake.connector.cursor import SnowflakeCursor
28
28
 
29
29
 
30
- class ProjectManager(SqlExecutionMixin):
30
+ class DCMProjectManager(SqlExecutionMixin):
31
31
  def execute(
32
32
  self,
33
33
  project_name: FQN,
@@ -37,7 +37,11 @@ class ProjectManager(SqlExecutionMixin):
37
37
  variables: List[str] | None = None,
38
38
  dry_run: bool = False,
39
39
  ):
40
- query = f"EXECUTE PROJECT {project_name.sql_identifier}"
40
+ query = f"EXECUTE DCM PROJECT {project_name.sql_identifier}"
41
+ if dry_run:
42
+ query += " PLAN"
43
+ else:
44
+ query += " DEPLOY"
41
45
  if configuration or variables:
42
46
  query += f" USING"
43
47
  if configuration:
@@ -51,16 +55,14 @@ class ProjectManager(SqlExecutionMixin):
51
55
  elif from_stage:
52
56
  stage_path = StagePath.from_stage_str(from_stage)
53
57
  query += f" FROM {stage_path.absolute_path()}"
54
- if dry_run:
55
- query += " DRY_RUN=TRUE"
56
58
  return self.execute_query(query=query)
57
59
 
58
60
  def _create_object(self, project_name: FQN) -> SnowflakeCursor:
59
- query = dedent(f"CREATE PROJECT {project_name.sql_identifier}")
61
+ query = dedent(f"CREATE DCM PROJECT {project_name.sql_identifier}")
60
62
  return self.execute_query(query)
61
63
 
62
64
  def create(
63
- self, project: ProjectEntityModel, initialize_version_from_local_files: bool
65
+ self, project: DCMProjectEntityModel, initialize_version_from_local_files: bool
64
66
  ) -> None:
65
67
  self._create_object(project.fqn)
66
68
  if initialize_version_from_local_files:
@@ -74,7 +76,7 @@ class ProjectManager(SqlExecutionMixin):
74
76
  comment: str | None = None,
75
77
  ):
76
78
  stage_path = StagePath.from_stage_str(from_stage)
77
- query = f"ALTER PROJECT {project_name.identifier} ADD VERSION"
79
+ query = f"ALTER DCM PROJECT {project_name.identifier} ADD VERSION"
78
80
  if alias:
79
81
  query += f" IF NOT EXISTS {alias}"
80
82
  query += f" FROM {stage_path.absolute_path(at_prefix=True)}"
@@ -84,15 +86,15 @@ class ProjectManager(SqlExecutionMixin):
84
86
 
85
87
  def add_version(
86
88
  self,
87
- project: ProjectEntityModel,
89
+ project: DCMProjectEntityModel,
88
90
  prune: bool = False,
89
91
  from_stage: Optional[str] = None,
90
92
  alias: Optional[str] = None,
91
93
  comment: Optional[str] = None,
92
94
  ):
93
95
  """
94
- Adds a version to project. If [from_stage] is not defined,
95
- uploads local files to the stage defined in project definition.
96
+ Adds a version to DCM Project. If [from_stage] is not defined,
97
+ uploads local files to the stage defined in DCM Project definition.
96
98
  """
97
99
 
98
100
  if not from_stage:
@@ -106,7 +108,7 @@ class ProjectManager(SqlExecutionMixin):
106
108
  prune=prune,
107
109
  )
108
110
 
109
- with cli_console.phase(f"Creating project version from stage {from_stage}"):
111
+ with cli_console.phase(f"Creating DCM Project version from stage {from_stage}"):
110
112
  return self._create_version(
111
113
  project_name=project.fqn,
112
114
  from_stage=from_stage, # type:ignore
@@ -115,7 +117,7 @@ class ProjectManager(SqlExecutionMixin):
115
117
  )
116
118
 
117
119
  def list_versions(self, project_name: FQN):
118
- query = f"SHOW VERSIONS IN PROJECT {project_name.identifier}"
120
+ query = f"SHOW VERSIONS IN DCM PROJECT {project_name.identifier}"
119
121
  return self.execute_query(query=query)
120
122
 
121
123
  def drop_version(
@@ -125,9 +127,9 @@ class ProjectManager(SqlExecutionMixin):
125
127
  if_exists: bool = False,
126
128
  ):
127
129
  """
128
- Drops a version from the project.
130
+ Drops a version from the DCM Project.
129
131
  """
130
- query = f"ALTER PROJECT {project_name.identifier} DROP VERSION"
132
+ query = f"ALTER DCM PROJECT {project_name.identifier} DROP VERSION"
131
133
  if if_exists:
132
134
  query += " IF EXISTS"
133
135
  query += f" {version_name}"
@@ -12,7 +12,7 @@
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.project import commands
15
+ from snowflake.cli._plugins.dcm import commands
16
16
  from snowflake.cli.api.plugins.command import (
17
17
  SNOWCLI_ROOT_COMMAND_PATH,
18
18
  CommandSpec,
@@ -36,6 +36,7 @@ class ObjectNames:
36
36
  class ObjectType(Enum):
37
37
  COMPUTE_POOL = ObjectNames("compute-pool", "compute pool", "compute pools")
38
38
  DBT_PROJECT = ObjectNames("dbt-project", "dbt project", "dbt projects")
39
+ DCM_PROJECT = ObjectNames("dcm", "DCM Project", "DCM Projects")
39
40
  DATABASE = ObjectNames("database", "database", "databases")
40
41
  FUNCTION = ObjectNames("function", "function", "functions")
41
42
  INTEGRATION = ObjectNames("integration", "integration", "integrations")
@@ -48,7 +49,6 @@ class ObjectType(Enum):
48
49
  NETWORK_RULE = ObjectNames("network-rule", "network rule", "network rules")
49
50
  NOTEBOOK = ObjectNames("notebook", "notebook", "notebooks")
50
51
  PROCEDURE = ObjectNames("procedure", "procedure", "procedures")
51
- PROJECT = ObjectNames("project", "project", "projects")
52
52
  ROLE = ObjectNames("role", "role", "roles")
53
53
  SCHEMA = ObjectNames("schema", "schema", "schemas")
54
54
  SERVICE = ObjectNames("service", "service", "services")
@@ -79,7 +79,7 @@ OBJECT_TO_NAMES = {o.value.cli_name: o.value for o in ObjectType}
79
79
  UNSUPPORTED_OBJECTS = {
80
80
  ObjectType.APPLICATION.value.cli_name,
81
81
  ObjectType.APPLICATION_PACKAGE.value.cli_name,
82
- ObjectType.PROJECT.value.cli_name,
82
+ ObjectType.DCM_PROJECT.value.cli_name,
83
83
  ObjectType.DBT_PROJECT.value.cli_name,
84
84
  }
85
85
  SUPPORTED_OBJECTS = sorted(OBJECT_TO_NAMES.keys() - UNSUPPORTED_OBJECTS)
@@ -16,6 +16,10 @@ from __future__ import annotations
16
16
 
17
17
  from typing import Dict, List, Union, get_args
18
18
 
19
+ from snowflake.cli._plugins.dcm.dcm_project_entity_model import (
20
+ DCMProjectEntity,
21
+ DCMProjectEntityModel,
22
+ )
19
23
  from snowflake.cli._plugins.nativeapp.entities.application import (
20
24
  ApplicationEntity,
21
25
  ApplicationEntityModel,
@@ -26,10 +30,6 @@ from snowflake.cli._plugins.nativeapp.entities.application_package import (
26
30
  )
27
31
  from snowflake.cli._plugins.notebook.notebook_entity import NotebookEntity
28
32
  from snowflake.cli._plugins.notebook.notebook_entity_model import NotebookEntityModel
29
- from snowflake.cli._plugins.project.project_entity_model import (
30
- ProjectEntity,
31
- ProjectEntityModel,
32
- )
33
33
  from snowflake.cli._plugins.snowpark.snowpark_entity import (
34
34
  FunctionEntity,
35
35
  ProcedureEntity,
@@ -62,7 +62,7 @@ Entity = Union[
62
62
  ApplicationPackageEntity,
63
63
  StreamlitEntity,
64
64
  ProcedureEntity,
65
- ProjectEntity,
65
+ DCMProjectEntity,
66
66
  FunctionEntity,
67
67
  ComputePoolEntity,
68
68
  ImageRepositoryEntity,
@@ -79,7 +79,7 @@ EntityModel = Union[
79
79
  ImageRepositoryEntityModel,
80
80
  ServiceEntityModel,
81
81
  NotebookEntityModel,
82
- ProjectEntityModel,
82
+ DCMProjectEntityModel,
83
83
  ]
84
84
 
85
85
  ALL_ENTITIES: List[Entity] = [*get_args(Entity)]
@@ -98,6 +98,7 @@ class RestApi:
98
98
  data=json.dumps(data if data else {}),
99
99
  no_retry=True,
100
100
  raise_raw_http_failure=True,
101
+ external_session_id=None, # workaround for connector 3.16 bug, to be removed SNOW-2226816
101
102
  )
102
103
 
103
104
  def _database_exists(self, db_name: str) -> bool:
@@ -220,9 +220,13 @@ class StagePath:
220
220
  return self._path.name
221
221
 
222
222
  def is_dir(self) -> bool:
223
+ if Path(self.path).exists():
224
+ return Path(self.path).is_dir()
223
225
  return "." not in self.name
224
226
 
225
227
  def is_file(self) -> bool:
228
+ if Path(self.path).exists():
229
+ return Path(self.path).is_file()
226
230
  return not self.is_dir()
227
231
 
228
232
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-cli
3
- Version: 3.10.0
3
+ Version: 3.10.1
4
4
  Summary: Snowflake CLI
5
5
  Project-URL: Source code, https://github.com/snowflakedb/snowflake-cli
6
6
  Project-URL: Bug Tracker, https://github.com/snowflakedb/snowflake-cli/issues
@@ -219,24 +219,24 @@ Classifier: Topic :: Database
219
219
  Requires-Python: >=3.10
220
220
  Requires-Dist: annotated-types==0.7.0
221
221
  Requires-Dist: asn1crypto==1.5.1
222
- Requires-Dist: boto3==1.39.2
223
- Requires-Dist: botocore==1.39.2
224
- Requires-Dist: certifi==2025.6.15
222
+ Requires-Dist: boto3==1.40.9
223
+ Requires-Dist: botocore==1.40.9
224
+ Requires-Dist: certifi==2025.8.3
225
225
  Requires-Dist: cffi==1.17.1
226
226
  Requires-Dist: cfgv==3.4.0
227
- Requires-Dist: charset-normalizer==3.4.2
227
+ Requires-Dist: charset-normalizer==3.4.3
228
228
  Requires-Dist: click==8.1.8
229
- Requires-Dist: cryptography==45.0.5
229
+ Requires-Dist: cryptography==45.0.6
230
230
  Requires-Dist: faker==37.4.0
231
231
  Requires-Dist: filelock==3.18.0
232
232
  Requires-Dist: gitdb==4.0.12
233
233
  Requires-Dist: gitpython==3.1.44
234
- Requires-Dist: identify==2.6.12
234
+ Requires-Dist: identify==2.6.13
235
235
  Requires-Dist: idna==3.10
236
236
  Requires-Dist: iniconfig==2.1.0
237
237
  Requires-Dist: jinja2==3.1.6
238
238
  Requires-Dist: keyring==25.6.0
239
- Requires-Dist: markdown-it-py==3.0.0
239
+ Requires-Dist: markdown-it-py==4.0.0
240
240
  Requires-Dist: markupsafe==3.0.2
241
241
  Requires-Dist: nodeenv==1.9.1
242
242
  Requires-Dist: packaging
@@ -257,16 +257,16 @@ Requires-Dist: requirements-parser==0.13.0
257
257
  Requires-Dist: rich==14.0.0
258
258
  Requires-Dist: setuptools==80.8.0
259
259
  Requires-Dist: shellingham==1.5.4
260
- Requires-Dist: snowflake-connector-python[secure-local-storage]==3.15.0
261
- Requires-Dist: snowflake-core==1.5.1
260
+ Requires-Dist: snowflake-connector-python[secure-local-storage]==3.16.0
261
+ Requires-Dist: snowflake-core==1.6.0
262
262
  Requires-Dist: snowflake-snowpark-python==1.33.0; python_version < '3.12'
263
263
  Requires-Dist: sortedcontainers==2.4.0
264
264
  Requires-Dist: tomlkit==0.13.3
265
265
  Requires-Dist: typer==0.16.0
266
- Requires-Dist: typing-extensions==4.14.0
266
+ Requires-Dist: typing-extensions==4.14.1
267
267
  Requires-Dist: typing-inspection==0.4.1
268
268
  Requires-Dist: urllib3<2.6,>=1.24.3
269
- Requires-Dist: virtualenv==20.31.2
269
+ Requires-Dist: virtualenv==20.34.0
270
270
  Requires-Dist: wcwidth==0.2.13
271
271
  Requires-Dist: werkzeug==3.1.3
272
272
  Provides-Extra: development
@@ -1,4 +1,4 @@
1
- snowflake/cli/__about__.py,sha256=WusWggdt7SKQapjVE4cLuNeYgWQ84PQ0wCtGM7Je7dc,853
1
+ snowflake/cli/__about__.py,sha256=tl711AQi2bmJkVhLoxzuvvrBCL38AhxjPaScTnhS2_s,853
2
2
  snowflake/cli/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
3
3
  snowflake/cli/_app/__init__.py,sha256=CR_uTgoqHnU1XdyRhm5iQsS86yWXGVx5Ht7aGSDNFmc,765
4
4
  snowflake/cli/_app/__main__.py,sha256=ZmcFdFqAtk2mFMz-cqCFdGd0iYzc7UsLH1oT1U40S0k,858
@@ -11,7 +11,7 @@ snowflake/cli/_app/snow_connector.py,sha256=7aveOySLPqPwrbD9RYLAZLC0fzF7aX0hFkk-
11
11
  snowflake/cli/_app/telemetry.py,sha256=Rcl9sSTYEujrLMUvd2SsvmJMbVGE_ErOnnOLdBnpI60,9846
12
12
  snowflake/cli/_app/version_check.py,sha256=tM3j8FmqcONz3nfiv9WZIU01wy4ZWbKgiWH_8GYzCfM,5585
13
13
  snowflake/cli/_app/commands_registration/__init__.py,sha256=HhP1c8GDRqUtZMeYVNuYwc1_524q9jH18bxJJk1JKWU,918
14
- snowflake/cli/_app/commands_registration/builtin_plugins.py,sha256=aVVccHbCGYP2JJB-ISX8o-RNSJ7TFUxSkeQIRu7rShQ,2880
14
+ snowflake/cli/_app/commands_registration/builtin_plugins.py,sha256=xVHqz5urWhm6yKpQhj2KUnBOKKKcg0k9l7_r5ywRIKU,2880
15
15
  snowflake/cli/_app/commands_registration/command_plugins_loader.py,sha256=4pRKUYBmIVsBxDvaztgFbIBZKSaGseAMJMEHSkg0Nag,6297
16
16
  snowflake/cli/_app/commands_registration/commands_registration_with_callbacks.py,sha256=VvGFd_q0-xe8HU_BP5l1OkVld4PYfNJ45YAWjuIydPE,3038
17
17
  snowflake/cli/_app/commands_registration/exception_logging.py,sha256=4B_OuXo6BJXhchs1c4zlmhnN3fN-LV6jdv6LZ227Lr8,985
@@ -48,8 +48,13 @@ snowflake/cli/_plugins/cortex/types.py,sha256=9KQPlQRkoR67ty8VoqsifJfaoeLJPXZzCJ
48
48
  snowflake/cli/_plugins/dbt/__init__.py,sha256=JhO1yb1LCYqYx-Ya-MlhubtiqD82CuvWF09dDMafxRM,578
49
49
  snowflake/cli/_plugins/dbt/commands.py,sha256=foQbTCHeJxtT2nkTRyey8YEfaXUoBwdKO3F8LxsRZeA,6802
50
50
  snowflake/cli/_plugins/dbt/constants.py,sha256=mAwkVchQikcfegHqs-PmziZJRd9-DEAienWxpoHhnPc,962
51
- snowflake/cli/_plugins/dbt/manager.py,sha256=OP5RwX8INs8lFiIp5Khv9PVjeubACGOAVyXZ40yHW9w,7465
51
+ snowflake/cli/_plugins/dbt/manager.py,sha256=jn-RSPj-tmdzi9kSFYBNB9PtVUHMgaz_3XgyaHQ9n2s,7588
52
52
  snowflake/cli/_plugins/dbt/plugin_spec.py,sha256=7yEc3tLgvw3iUhALpmaVpS-iePdSMjFdFSZVybf5KTc,992
53
+ snowflake/cli/_plugins/dcm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ snowflake/cli/_plugins/dcm/commands.py,sha256=NpCsfmJrZ7CBn0dSdh0Q2mts1XJwZ0-Z0pg8wFen0YY,9513
55
+ snowflake/cli/_plugins/dcm/dcm_project_entity_model.py,sha256=YpdLnnbopzMgzIcJaLIiVxGxSDt0u-zisXd39JwrXiU,2143
56
+ snowflake/cli/_plugins/dcm/manager.py,sha256=XS4M90ZJqkeOBbsnbtKPHU5mbbb7DTgfyFuugC0McAw,5108
57
+ snowflake/cli/_plugins/dcm/plugin_spec.py,sha256=U-p1UrjS2QTkk6j5-XfMsehc6gzcFHXVDjI4qnm5aPs,992
53
58
  snowflake/cli/_plugins/git/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
54
59
  snowflake/cli/_plugins/git/commands.py,sha256=87R8Fs_f6BUdfLv85QGlfTTH6K-Y_oDlqJyZ3jUpBVg,11320
55
60
  snowflake/cli/_plugins/git/manager.py,sha256=QSW6ydw4Invl3cWKx8rM_NtzA1cXaiUR0QMCqki76bc,5237
@@ -123,11 +128,6 @@ snowflake/cli/_plugins/plugin/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBS
123
128
  snowflake/cli/_plugins/plugin/commands.py,sha256=JoDeE-ggxYE6FKulNGJQrfl7nao7lg8FCsEw2s-WdF8,2433
124
129
  snowflake/cli/_plugins/plugin/manager.py,sha256=eeW5b0zAvvsZREgIVH7afAQbKHI2YqqdIjqo0hqFfHs,2641
125
130
  snowflake/cli/_plugins/plugin/plugin_spec.py,sha256=5XZJPT42ZIEARYvthic3jLEB4CvDUdMeWTM6YfDkD9k,995
126
- snowflake/cli/_plugins/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
- snowflake/cli/_plugins/project/commands.py,sha256=kZMY1w2ZfgTmKBARvqkFFDMtdrZrYhfkp4ahTboNv8k,9389
128
- snowflake/cli/_plugins/project/manager.py,sha256=K1pghvqiJpzm6K5-QMSpDEvefGDjRI3N34eG5vvHFVI,5023
129
- snowflake/cli/_plugins/project/plugin_spec.py,sha256=wlRaaVR5pSq2qzty_E__LuRmgWoz5QKsVoijT3pbeTE,996
130
- snowflake/cli/_plugins/project/project_entity_model.py,sha256=ibXeeFwB4o4-76q6eJ64pD1_wxyMhccUksRtVkw7Eg8,2138
131
131
  snowflake/cli/_plugins/snowpark/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
132
132
  snowflake/cli/_plugins/snowpark/commands.py,sha256=eLVvUwL64wfSYkmRFHtbwBZG7lXMcvZB5o-0Dx6ZVK0,17744
133
133
  snowflake/cli/_plugins/snowpark/common.py,sha256=85CQ0fpw4W2FibmuSMa3vG8hbZY_1XzCnA1pn45kTgU,13720
@@ -202,19 +202,19 @@ snowflake/cli/_plugins/workspace/plugin_spec.py,sha256=DvjilAunPuBuSIgKHOPcAVfk8
202
202
  snowflake/cli/api/cli_global_context.py,sha256=6qI-jBa_7lyiBQFOYxr4Oap2zgAfQI_C-DDyAOBvkcs,9514
203
203
  snowflake/cli/api/config.py,sha256=kEG5PQcUtQqUgTNesQ5_GBKntD7nJIu1gS94XCo-rKg,14149
204
204
  snowflake/cli/api/connections.py,sha256=w102ap8ANtgvzLhUO-09WeRDZtAX-NcKuOAFZRNDabs,9417
205
- snowflake/cli/api/constants.py,sha256=7hAHmqb_K0kY9q9cBaQq55MG19DR7yhRT8sjf4ijkN0,3855
205
+ snowflake/cli/api/constants.py,sha256=zTDCip-AsSGQIkPq5jZDldnDgva6lMtL0vUJv9mkf6E,3867
206
206
  snowflake/cli/api/errno.py,sha256=nVQ2kO9nPaA1uGB4yZiKTwtE2LiQmINHTutziA37c6s,3871
207
207
  snowflake/cli/api/exceptions.py,sha256=3Esa8gL0D_dsbpjWpBFWt1fQW8u4BgU59kx1B5Vgw9A,9228
208
208
  snowflake/cli/api/feature_flags.py,sha256=31J3qMtt_XOTPxv9R1uHAJO2ckLA1eMWqE7y1oPhetI,2543
209
209
  snowflake/cli/api/identifiers.py,sha256=ro7nCNU5GAgi29-RGzkULWQkLP0VSQRCCG-WoyCa2pM,6861
210
210
  snowflake/cli/api/metrics.py,sha256=l-khpKWvRF8OB86OhJ2H61jrcTdMDGZe_QM1_-yqWT8,10694
211
- snowflake/cli/api/rest_api.py,sha256=XATD2vmi4a5zQI4izZx44_awh0KOiFYuOIDtitCvr-g,7301
211
+ snowflake/cli/api/rest_api.py,sha256=RUo4prPAGmi2iQt1o96co3pWfo2t5PLCVBB2m1jlrNA,7404
212
212
  snowflake/cli/api/sanitizers.py,sha256=7EKqVQ3KOob0IFFoc_GmXPYpRhgnmIqhnJSvHPgxM5I,1211
213
213
  snowflake/cli/api/secret.py,sha256=9Jg30dAVcV95tCxTY6RPdaKYTsiG39sld_bwUXXxF2A,263
214
214
  snowflake/cli/api/secure_path.py,sha256=jNev299e6Zrw_Z1lonN0ReAYXwKQVvD7GAaGyaqvJKk,13750
215
215
  snowflake/cli/api/secure_utils.py,sha256=w3f1JU2ntOXGQ2STeqU0QiAVx_sLLEfgPwIvpprqevY,4000
216
216
  snowflake/cli/api/sql_execution.py,sha256=gfF8ebBCAruqvRX0ftXKr4QOHB6P7djnWOWa-ChcCjo,12155
217
- snowflake/cli/api/stage_path.py,sha256=WLNzq82gfCEhVy_Q7kpZ--S4QBBzgKi9qZmV1WNeiXI,8565
217
+ snowflake/cli/api/stage_path.py,sha256=N-2tNdUGNl8NxORDrBfVJyRo9CupMWtGD0XqLUX6GhE,8728
218
218
  snowflake/cli/api/artifacts/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
219
219
  snowflake/cli/api/artifacts/bundle_map.py,sha256=df1wos2OgThV65gSuT-7wbF4oiDBOpU7Qqs5qs7FuVg,21808
220
220
  snowflake/cli/api/artifacts/common.py,sha256=YTL_CSdAWEB0HMQZ5063nRrdQuFQbLAc5U5ZjNAU7jY,2058
@@ -259,7 +259,7 @@ snowflake/cli/api/project/schemas/template.py,sha256=VJSwVfkWoNJ_OB850n4vLu7WD7y
259
259
  snowflake/cli/api/project/schemas/updatable_model.py,sha256=y_JQSy4E67vdzKbuHmm4fmcSTHjTUgI3ulcHV1_O57M,7621
260
260
  snowflake/cli/api/project/schemas/entities/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
261
261
  snowflake/cli/api/project/schemas/entities/common.py,sha256=clFYkFVUoeG0K4wRe4qSvNb95BQXefax16wtmO3zyjA,10385
262
- snowflake/cli/api/project/schemas/entities/entities.py,sha256=1X7wj52aoWuO9SrMZqYGXQHlAKsFasrqA555hq-P170,3058
262
+ snowflake/cli/api/project/schemas/entities/entities.py,sha256=4ne1lRR1NXxqzKB25FWXofD5kB0cJvCfRhTtGN7vK-U,3070
263
263
  snowflake/cli/api/project/schemas/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
264
264
  snowflake/cli/api/project/schemas/v1/identifier_model.py,sha256=Te0CraVdflIrvNXYljReofBCNfkGDdZ0G_aUY19GFqE,1868
265
265
  snowflake/cli/api/project/schemas/v1/native_app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -289,8 +289,8 @@ snowflake/cli/api/utils/path_utils.py,sha256=OgR7cwbHXqP875RgPJGrAvDC1RRTU-2-Yss
289
289
  snowflake/cli/api/utils/python_api_utils.py,sha256=wTNxXrma78wPvBz-Jo-ixNtP8ZjDCDh4TvciEnhYIAM,300
290
290
  snowflake/cli/api/utils/templating_functions.py,sha256=zu2oK1BEC9yyWtDx17Hr-VAYHvCtagaOdxIrm70JQys,4955
291
291
  snowflake/cli/api/utils/types.py,sha256=fVKuls8axKSsBzPqWwrkwkwoXXmedqxNJKqfXrrGyBM,1190
292
- snowflake_cli-3.10.0.dist-info/METADATA,sha256=VpveQ8BQBcba7Hhu-Q3qUzHB8R4vmR-o1r7nLGCd4lQ,19407
293
- snowflake_cli-3.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
294
- snowflake_cli-3.10.0.dist-info/entry_points.txt,sha256=6QmSI0wUX6p7f-dGvrPdswlQyVAVGi1AtOUbE8X6bho,58
295
- snowflake_cli-3.10.0.dist-info/licenses/LICENSE,sha256=mJMA3Uz2AbjU_kVggo1CAx01XhBsI7BSi2H7ggUg_-c,11344
296
- snowflake_cli-3.10.0.dist-info/RECORD,,
292
+ snowflake_cli-3.10.1.dist-info/METADATA,sha256=hBSbbzDq_Z0rLdz2jx2tMo4t4ftdjfPKRh4RRbbYX80,19406
293
+ snowflake_cli-3.10.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
294
+ snowflake_cli-3.10.1.dist-info/entry_points.txt,sha256=6QmSI0wUX6p7f-dGvrPdswlQyVAVGi1AtOUbE8X6bho,58
295
+ snowflake_cli-3.10.1.dist-info/licenses/LICENSE,sha256=mJMA3Uz2AbjU_kVggo1CAx01XhBsI7BSi2H7ggUg_-c,11344
296
+ snowflake_cli-3.10.1.dist-info/RECORD,,
File without changes