snowflake-cli 3.5.0__py3-none-any.whl → 3.6.0__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 (34) hide show
  1. snowflake/cli/__about__.py +13 -1
  2. snowflake/cli/_app/commands_registration/builtin_plugins.py +2 -0
  3. snowflake/cli/_app/snow_connector.py +5 -4
  4. snowflake/cli/_app/telemetry.py +3 -15
  5. snowflake/cli/_app/version_check.py +4 -4
  6. snowflake/cli/_plugins/auth/__init__.py +11 -0
  7. snowflake/cli/_plugins/auth/keypair/__init__.py +0 -0
  8. snowflake/cli/_plugins/auth/keypair/commands.py +151 -0
  9. snowflake/cli/_plugins/auth/keypair/manager.py +331 -0
  10. snowflake/cli/_plugins/auth/keypair/plugin_spec.py +30 -0
  11. snowflake/cli/_plugins/connection/commands.py +77 -1
  12. snowflake/cli/_plugins/nativeapp/entities/application.py +4 -1
  13. snowflake/cli/_plugins/nativeapp/sf_sql_facade.py +33 -6
  14. snowflake/cli/_plugins/object/command_aliases.py +3 -1
  15. snowflake/cli/_plugins/object/manager.py +4 -2
  16. snowflake/cli/_plugins/project/commands.py +16 -0
  17. snowflake/cli/_plugins/spcs/compute_pool/commands.py +17 -5
  18. snowflake/cli/_plugins/sql/manager.py +42 -51
  19. snowflake/cli/_plugins/sql/source_reader.py +230 -0
  20. snowflake/cli/_plugins/stage/manager.py +8 -2
  21. snowflake/cli/api/commands/flags.py +12 -2
  22. snowflake/cli/api/constants.py +2 -0
  23. snowflake/cli/api/errno.py +1 -0
  24. snowflake/cli/api/exceptions.py +7 -0
  25. snowflake/cli/api/feature_flags.py +1 -0
  26. snowflake/cli/api/rest_api.py +2 -3
  27. snowflake/cli/{_app → api}/secret.py +4 -1
  28. snowflake/cli/api/secure_path.py +16 -4
  29. snowflake/cli/api/sql_execution.py +7 -3
  30. {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/METADATA +7 -7
  31. {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/RECORD +34 -28
  32. {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/WHEEL +0 -0
  33. {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/entry_points.txt +0 -0
  34. {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,230 @@
1
+ import enum
2
+ import io
3
+ import re
4
+ import urllib.error
5
+ from typing import Any, Callable, Generator, Literal, Sequence
6
+ from urllib.request import urlopen
7
+
8
+ from jinja2 import UndefinedError
9
+ from snowflake.cli.api.secure_path import UNLIMITED, SecurePath
10
+ from snowflake.connector.util_text import split_statements
11
+
12
+ SOURCE_PATTERN = re.compile(
13
+ r"^!(source|load)\s+[\"']?(.*?)[\"']?\s*(?:;|$)",
14
+ flags=re.IGNORECASE,
15
+ )
16
+
17
+ URL_PATTERN = re.compile(r"^(\w+?):\/(\/.*)", flags=re.IGNORECASE)
18
+
19
+ SplitedStatements = Generator[
20
+ tuple[str, bool | None] | tuple[str, Literal[False]],
21
+ Any,
22
+ None,
23
+ ]
24
+
25
+ SqlTransformFunc = Callable[[str], str]
26
+ OperatorFunctions = Sequence[SqlTransformFunc]
27
+
28
+
29
+ class SourceType(enum.Enum):
30
+ FILE = "file"
31
+ QUERY = "query"
32
+ UNKNOWN = "unknown"
33
+ URL = "url"
34
+
35
+
36
+ class ParsedSource:
37
+ """Container for parsed statement.
38
+
39
+ Holds:
40
+ - source: statement on command content
41
+ - source_type: type of source
42
+ - source_path: in case of URL or FILE path of the origin
43
+ - error: optional message
44
+ """
45
+
46
+ __slots__ = ("source", "source_type", "source_path", "error")
47
+ __match_args__ = ("source_type", "error")
48
+
49
+ source: io.StringIO
50
+ source_type: SourceType | None
51
+ source_path: str | None
52
+ error: str | None
53
+
54
+ def __init__(
55
+ self,
56
+ source: str,
57
+ source_type: SourceType,
58
+ source_path: str | None,
59
+ error: str | None = None,
60
+ ):
61
+ self.source = io.StringIO(source)
62
+ self.source_type = source_type
63
+ self.source_path = source_path
64
+ self.error = error
65
+
66
+ def __bool__(self):
67
+ return not self.error
68
+
69
+ def __eq__(self, other):
70
+ result = (
71
+ self.source_type == other.source_type,
72
+ self.source_path == other.source_path,
73
+ self.error == other.error,
74
+ self.source.read() == other.source.read(),
75
+ )
76
+ self.source.seek(0)
77
+ other.source.seek(0)
78
+ return all(result)
79
+
80
+ def __repr__(self):
81
+ return f"{self.__class__.__name__}(source_type={self.source_type}, source_path={self.source_path}, error={self.error})"
82
+
83
+ @classmethod
84
+ def from_url(cls, path_part: str, raw_source: str) -> "ParsedSource":
85
+ """Constructor for loading from URL."""
86
+ try:
87
+ payload = urlopen(path_part, timeout=10.0).read().decode()
88
+ return cls(payload, SourceType.URL, path_part)
89
+
90
+ except urllib.error.HTTPError as err:
91
+ error = f"Could not fetch {path_part}: {err}"
92
+ return cls(path_part, SourceType.URL, raw_source, error)
93
+
94
+ @classmethod
95
+ def from_file(cls, path_part: str, raw_source: str) -> "ParsedSource":
96
+ """Constructor for loading from file."""
97
+ path = SecurePath(path_part)
98
+
99
+ if path.is_file():
100
+ payload = path.read_text(file_size_limit_mb=UNLIMITED)
101
+ return cls(payload, SourceType.FILE, path.as_posix())
102
+
103
+ error_msg = f"Could not read: {path_part}"
104
+ return cls(path_part, SourceType.FILE, raw_source, error_msg)
105
+
106
+
107
+ RecursiveStatementReader = Generator[ParsedSource, Any, Any]
108
+
109
+
110
+ def parse_source(source: str, operators: OperatorFunctions) -> ParsedSource:
111
+ """Evaluates templating and source commands.
112
+
113
+ Returns parsed source according to origin."""
114
+ try:
115
+ statement = source
116
+ for operator in operators:
117
+ statement = operator(statement)
118
+ except UndefinedError as e:
119
+ error_msg = f"SQL template rendering error: {e}"
120
+ return ParsedSource(source, SourceType.UNKNOWN, source, error_msg)
121
+
122
+ split_result = SOURCE_PATTERN.split(statement, maxsplit=1)
123
+ split_result = [p.strip() for p in split_result]
124
+
125
+ if len(split_result) == 1:
126
+ return ParsedSource(statement, SourceType.QUERY, None)
127
+
128
+ _, command, source_path, *_ = split_result
129
+ _path_match = URL_PATTERN.split(source_path.lower())
130
+
131
+ match command.lower(), _path_match:
132
+ # load content from an URL
133
+ case "source" | "load", ("", "http" | "https", *_):
134
+ return ParsedSource.from_url(source_path, statement)
135
+
136
+ # load content from a local file
137
+ case "source" | "load", (str(),):
138
+ return ParsedSource.from_file(source_path, statement)
139
+
140
+ case _:
141
+ error_msg = f"Unknown source: {source_path}"
142
+
143
+ return ParsedSource(source_path, SourceType.UNKNOWN, source, error_msg)
144
+
145
+
146
+ def recursive_source_reader(
147
+ source: SplitedStatements,
148
+ seen_files: list,
149
+ operators: OperatorFunctions,
150
+ remove_comments: bool,
151
+ ) -> RecursiveStatementReader:
152
+ """Based on detected source command reads content of the source and tracks for recursion cycles."""
153
+ for stmt, _ in source:
154
+ if not stmt:
155
+ continue
156
+ parsed_source = parse_source(stmt, operators)
157
+
158
+ match parsed_source:
159
+ case ParsedSource(SourceType.FILE | SourceType.URL, None):
160
+ if parsed_source.source_path in seen_files:
161
+ error = f"Recursion detected: {' -> '.join(seen_files)}"
162
+ parsed_source.error = error
163
+ yield parsed_source
164
+ continue
165
+
166
+ seen_files.append(parsed_source.source_path)
167
+
168
+ yield from recursive_source_reader(
169
+ split_statements(parsed_source.source, remove_comments),
170
+ seen_files,
171
+ operators,
172
+ remove_comments,
173
+ )
174
+
175
+ seen_files.pop()
176
+
177
+ case ParsedSource(SourceType.URL, error) if error:
178
+ yield parsed_source
179
+
180
+ case _:
181
+ yield parsed_source
182
+ return
183
+
184
+
185
+ def files_reader(
186
+ paths: Sequence[SecurePath],
187
+ operators: OperatorFunctions,
188
+ remove_comments: bool = False,
189
+ ) -> RecursiveStatementReader:
190
+ """Entry point for reading statements from files.
191
+
192
+ Returns a generator with statements."""
193
+ for path in paths:
194
+ with path.open(read_file_limit_mb=UNLIMITED) as f:
195
+ stmts = split_statements(io.StringIO(f.read()), remove_comments)
196
+ yield from recursive_source_reader(
197
+ stmts,
198
+ [path.as_posix()],
199
+ operators,
200
+ remove_comments,
201
+ )
202
+
203
+
204
+ def query_reader(
205
+ source: str,
206
+ operators: OperatorFunctions,
207
+ remove_comments: bool = False,
208
+ ) -> RecursiveStatementReader:
209
+ """Entry point for reading statements from query.
210
+
211
+ Returns a generator with statements."""
212
+ stmts = split_statements(io.StringIO(source), remove_comments)
213
+ yield from recursive_source_reader(stmts, [], operators, remove_comments)
214
+
215
+
216
+ def compile_statements(source: RecursiveStatementReader):
217
+ """Tracks statements evaluation and collects errors."""
218
+ errors = []
219
+ cnt = 0
220
+ compiled = []
221
+
222
+ for stmt in source:
223
+ if stmt.source_type == SourceType.QUERY:
224
+ cnt += 1
225
+ if not stmt.error:
226
+ compiled.append(stmt.source.read())
227
+ if stmt.error:
228
+ errors.append(stmt.error)
229
+
230
+ return errors, cnt, compiled
@@ -439,9 +439,13 @@ class StageManager(SqlExecutionMixin):
439
439
  # We end if we reach the root directory
440
440
  if directory == temp_dir_with_copy:
441
441
  break
442
-
443
442
  # Add parent directory to the list if it's not already there
444
- if directory.parent not in deepest_dirs_list:
443
+ if directory.parent not in deepest_dirs_list and not any(
444
+ (
445
+ existing_dir.is_relative_to(directory.parent)
446
+ for existing_dir in deepest_dirs_list
447
+ )
448
+ ):
445
449
  deepest_dirs_list.append(directory.parent)
446
450
 
447
451
  # Remove the directory so the parent directory will contain only files
@@ -703,6 +707,7 @@ class StageManager(SqlExecutionMixin):
703
707
  original_file: str,
704
708
  ) -> Dict:
705
709
  try:
710
+ log.info("Executing SQL file: %s", file_stage_path)
706
711
  query = f"execute immediate from {self.quote_stage_name(file_stage_path)}"
707
712
  if variables:
708
713
  query += variables
@@ -816,6 +821,7 @@ class StageManager(SqlExecutionMixin):
816
821
  from snowflake.snowpark.exceptions import SnowparkSQLException
817
822
 
818
823
  try:
824
+ log.info("Executing Python file: %s", file_stage_path)
819
825
  self._python_exe_procedure(self.get_standard_stage_prefix(file_stage_path), variables, session=self.snowpark_session) # type: ignore
820
826
  return StageManager._success_result(file=original_file)
821
827
  except SnowparkSQLException as e:
@@ -32,6 +32,7 @@ from snowflake.cli.api.connections import ConnectionContext
32
32
  from snowflake.cli.api.console import cli_console
33
33
  from snowflake.cli.api.identifiers import FQN
34
34
  from snowflake.cli.api.output.formats import OutputFormat
35
+ from snowflake.cli.api.secret import SecretType
35
36
  from snowflake.cli.api.stage_path import StagePath
36
37
 
37
38
  DEFAULT_CONTEXT_SETTINGS = {"help_option_names": ["--help", "-h"]}
@@ -214,7 +215,7 @@ MasterTokenOption = typer.Option(
214
215
  TokenFilePathOption = typer.Option(
215
216
  None,
216
217
  "--token-file-path",
217
- help="Path to file with an OAuth token that should be used when connecting to Snowflake",
218
+ help="Path to file with an OAuth token to use when connecting to Snowflake.",
218
219
  callback=_connection_callback("token_file_path"),
219
220
  show_default=False,
220
221
  rich_help_panel=_CONNECTION_SECTION,
@@ -324,7 +325,7 @@ def _diag_log_allowlist_path_callback(path: str):
324
325
  DiagAllowlistPathOption: Path = typer.Option(
325
326
  None,
326
327
  "--diag-allowlist-path",
327
- help="Path to a JSON file containing allowlist parameters.",
328
+ help="Path to a JSON file that contains allowlist parameters.",
328
329
  callback=_diag_log_allowlist_path_callback,
329
330
  show_default=False,
330
331
  rich_help_panel=_CONNECTION_SECTION,
@@ -501,6 +502,15 @@ class IdentifierStagePathType(click.ParamType):
501
502
  return StagePath.from_stage_str(value)
502
503
 
503
504
 
505
+ class SecretTypeParser(click.ParamType):
506
+ name = "TEXT"
507
+
508
+ def convert(self, value, param, ctx):
509
+ if not isinstance(value, SecretType):
510
+ return SecretType(value)
511
+ return value
512
+
513
+
504
514
  def identifier_argument(
505
515
  sf_object: str,
506
516
  example: str,
@@ -47,6 +47,7 @@ class ObjectType(Enum):
47
47
  NETWORK_RULE = ObjectNames("network-rule", "network rule", "network rules")
48
48
  NOTEBOOK = ObjectNames("notebook", "notebook", "notebooks")
49
49
  PROCEDURE = ObjectNames("procedure", "procedure", "procedures")
50
+ PROJECT = ObjectNames("project", "project", "projects")
50
51
  ROLE = ObjectNames("role", "role", "roles")
51
52
  SCHEMA = ObjectNames("schema", "schema", "schemas")
52
53
  SERVICE = ObjectNames("service", "service", "services")
@@ -77,6 +78,7 @@ OBJECT_TO_NAMES = {o.value.cli_name: o.value for o in ObjectType}
77
78
  UNSUPPORTED_OBJECTS = {
78
79
  ObjectType.APPLICATION.value.cli_name,
79
80
  ObjectType.APPLICATION_PACKAGE.value.cli_name,
81
+ ObjectType.PROJECT.value.cli_name,
80
82
  }
81
83
  SUPPORTED_OBJECTS = sorted(OBJECT_TO_NAMES.keys() - UNSUPPORTED_OBJECTS)
82
84
 
@@ -78,6 +78,7 @@ MAX_VERSIONS_IN_RELEASE_CHANNEL_REACHED = 512004
78
78
  MAX_UNBOUND_VERSIONS_REACHED = 512023
79
79
  CANNOT_DEREGISTER_VERSION_ASSOCIATED_WITH_CHANNEL = 512021
80
80
  TARGET_ACCOUNT_USED_BY_OTHER_RELEASE_DIRECTIVE = 93091
81
+ CANNOT_SET_DEBUG_MODE_WITH_MANIFEST_VERSION = 93362
81
82
 
82
83
 
83
84
  ERR_JAVASCRIPT_EXECUTION = 100132
@@ -236,3 +236,10 @@ class ShowSpecificObjectMultipleRowsError(RuntimeError):
236
236
  super().__init__(
237
237
  f"Received multiple rows from result of SQL statement: {show_obj_query}. Usage of 'show_specific_object' may not be properly scoped."
238
238
  )
239
+
240
+
241
+ class CouldNotSetKeyPairError(ClickException):
242
+ def __init__(self):
243
+ super().__init__(
244
+ "The public key is set already. Use the rotate command instead."
245
+ )
@@ -68,3 +68,4 @@ class FeatureFlag(FeatureFlagMixin):
68
68
  )
69
69
  ENABLE_SNOWPARK_GLOB_SUPPORT = BooleanFlag("ENABLE_SNOWPARK_GLOB_SUPPORT", False)
70
70
  ENABLE_SPCS_SERVICE_EVENTS = BooleanFlag("ENABLE_SPCS_SERVICE_EVENTS", False)
71
+ ENABLE_AUTH_KEYPAIR = BooleanFlag("ENABLE_AUTH_KEYPAIR", False)
@@ -155,9 +155,8 @@ class RestApi:
155
155
  raise SchemaNotDefinedException(
156
156
  "Schema not defined in connection. Please try again with `--schema` flag."
157
157
  )
158
- # temporarily disable this check due to an issue on server side: SNOW-1747450
159
- # if not self._schema_exists(db_name=db, schema_name=schema):
160
- # raise SchemaNotExistsException(f"Schema '{schema}' does not exist.")
158
+ if not self._schema_exists(db_name=db, schema_name=schema):
159
+ raise SchemaNotExistsException(f"Schema '{schema}' does not exist.")
161
160
  if self.get_endpoint_exists(
162
161
  url := f"{SF_REST_API_URL_PREFIX}/databases/{self.conn.database}/schemas/{self.conn.schema}/{plural_object_type}/"
163
162
  ):
@@ -5,5 +5,8 @@ class SecretType:
5
5
  def __repr__(self):
6
6
  return "SecretType(***)"
7
7
 
8
- def __str___(self):
8
+ def __str__(self):
9
9
  return "***"
10
+
11
+ def __bool__(self):
12
+ return self.value is not None and self.value != ""
@@ -21,7 +21,7 @@ import shutil
21
21
  import tempfile
22
22
  from contextlib import contextmanager
23
23
  from pathlib import Path
24
- from typing import Optional, Union
24
+ from typing import IO, Any, Generator, Optional, Union
25
25
 
26
26
  from snowflake.cli.api.exceptions import DirectoryIsNotEmptyError, FileTooLargeError
27
27
  from snowflake.cli.api.secure_utils import (
@@ -38,7 +38,7 @@ UNLIMITED = -1
38
38
 
39
39
  class SecurePath:
40
40
  def __init__(self, path: Union[Path, str]):
41
- self._path = Path(path)
41
+ self._path = Path(os.path.expanduser(path))
42
42
 
43
43
  def __repr__(self):
44
44
  return f'SecurePath("{self._path}")'
@@ -72,6 +72,12 @@ class SecurePath:
72
72
  """
73
73
  return SecurePath(self._path.absolute())
74
74
 
75
+ def resolve(self):
76
+ """
77
+ Make the path absolute, resolving symlinks
78
+ """
79
+ return SecurePath(self._path.resolve())
80
+
75
81
  def iterdir(self):
76
82
  """
77
83
  When the path points to a directory, yield path objects of the directory contents.
@@ -102,7 +108,7 @@ class SecurePath:
102
108
  Return True if the path points to a regular file (or a symbolic link pointing to a regular file),
103
109
  False if it points to another kind of file.
104
110
  """
105
- return self._path.is_file()
111
+ return self._path.expanduser().absolute().is_file()
106
112
 
107
113
  def glob(self, pattern: str):
108
114
  """
@@ -110,6 +116,12 @@ class SecurePath:
110
116
  """
111
117
  return self._path.glob(pattern)
112
118
 
119
+ def as_posix(self) -> str:
120
+ """
121
+ Return the string representation of the path with forward slashes (/) as the path separator.
122
+ """
123
+ return self._path.as_posix()
124
+
113
125
  @property
114
126
  def name(self) -> str:
115
127
  """A string representing the final path component."""
@@ -172,7 +184,7 @@ class SecurePath:
172
184
  mode="r",
173
185
  read_file_limit_mb: Optional[int] = None,
174
186
  **open_kwargs,
175
- ):
187
+ ) -> Generator[IO[Any], None, None]:
176
188
  """
177
189
  Open the file pointed by this path and return a file object, as
178
190
  the built-in open() function does.
@@ -85,9 +85,13 @@ class BaseSqlExecutor:
85
85
  )
86
86
  return stream_generator if return_cursors else list()
87
87
 
88
+ def execute_string(self, query: str, **kwargs) -> Iterable[SnowflakeCursor]:
89
+ """Executes a single SQL query and returns the results"""
90
+ return self._execute_string(query, **kwargs)
91
+
88
92
  def execute_query(self, query: str, **kwargs):
89
- """Executes a single SQL query and returns the result"""
90
- *_, last_result = list(self._execute_string(dedent(query), **kwargs))
93
+ """Executes a single SQL query and returns the last result"""
94
+ *_, last_result = list(self.execute_string(dedent(query), **kwargs))
91
95
  return last_result
92
96
 
93
97
  def execute_queries(self, queries: str, **kwargs):
@@ -95,7 +99,7 @@ class BaseSqlExecutor:
95
99
 
96
100
  # Without remove_comments=True, connectors might throw an error if there is a comment at the end of the file
97
101
  return list(
98
- self._execute_string(dedent(queries), remove_comments=True, **kwargs)
102
+ self.execute_string(dedent(queries), remove_comments=True, **kwargs)
99
103
  )
100
104
 
101
105
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-cli
3
- Version: 3.5.0
3
+ Version: 3.6.0
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
@@ -227,23 +227,23 @@ Requires-Dist: pyyaml==6.0.2
227
227
  Requires-Dist: requests==2.32.3
228
228
  Requires-Dist: requirements-parser==0.11.0
229
229
  Requires-Dist: rich==13.9.4
230
- Requires-Dist: setuptools==75.8.0
230
+ Requires-Dist: setuptools==76.0.0
231
231
  Requires-Dist: snowflake-connector-python[secure-local-storage]==3.14.0
232
232
  Requires-Dist: snowflake-core==1.0.2; python_version < '3.12'
233
233
  Requires-Dist: snowflake-snowpark-python<1.26.0,>=1.15.0; python_version < '3.12'
234
234
  Requires-Dist: tomlkit==0.13.2
235
- Requires-Dist: typer==0.15.1
235
+ Requires-Dist: typer==0.15.2
236
236
  Requires-Dist: urllib3<2.4,>=1.24.3
237
237
  Provides-Extra: development
238
238
  Requires-Dist: coverage==7.6.12; extra == 'development'
239
239
  Requires-Dist: factory-boy==3.3.3; extra == 'development'
240
- Requires-Dist: faker==36.1.1; extra == 'development'
240
+ Requires-Dist: faker==37.0.0; extra == 'development'
241
241
  Requires-Dist: pre-commit>=3.5.0; extra == 'development'
242
+ Requires-Dist: pytest-httpserver==1.1.2; extra == 'development'
242
243
  Requires-Dist: pytest-randomly==3.16.0; extra == 'development'
243
- Requires-Dist: pytest==8.3.4; extra == 'development'
244
- Requires-Dist: syrupy==4.8.2; extra == 'development'
244
+ Requires-Dist: pytest==8.3.5; extra == 'development'
245
+ Requires-Dist: syrupy==4.9.0; extra == 'development'
245
246
  Provides-Extra: packaging
246
- Requires-Dist: pyinstaller~=6.10; extra == 'packaging'
247
247
  Description-Content-Type: text/markdown
248
248
 
249
249
  <!--
@@ -1,4 +1,4 @@
1
- snowflake/cli/__about__.py,sha256=BiZ7IpSob-KQKxhRR7TcCioU1MyRJUk8Xl8jKoQjUvg,633
1
+ snowflake/cli/__about__.py,sha256=w-xPanC9uqx7MEIEsQeRom7XTEpnOWYvgUsl90NYfk8,852
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
@@ -7,12 +7,11 @@ snowflake/cli/_app/constants.py,sha256=6beY5gmfXqBOHPqr6T4HXD2BFmSn3Mvjq7m_lpZIe
7
7
  snowflake/cli/_app/loggers.py,sha256=anPJsFA4H8qV928LTxU_sQ5Ci8MWphFb14GSSBly-XA,6638
8
8
  snowflake/cli/_app/main_typer.py,sha256=v2n7moen3CkP-SfsGrTh-MzFgqG6Ak8bJa8E2dGKzFw,2111
9
9
  snowflake/cli/_app/printing.py,sha256=Q2EKlkd7dbEiGrOaOIr0EgK_C0EUidTfIY3uRlRqSo0,5834
10
- snowflake/cli/_app/secret.py,sha256=43pHy-iJdWDvkpEV3ShgdwNV94mVi0T2EfN_o-5_KYk,180
11
- snowflake/cli/_app/snow_connector.py,sha256=Ah-dUJEibDZdsRGd1VSxO6VxGgAQwaR6ML49MSeJSp8,11677
12
- snowflake/cli/_app/telemetry.py,sha256=PHrXFPVDx8aSo4l_qwJRtBRDelEh-kQXnEF8BlLUuwg,9821
13
- snowflake/cli/_app/version_check.py,sha256=6dxv6gCKIpoBehF2tymFx9-a2X0M6J5zgY2uOiyLGSc,2353
10
+ snowflake/cli/_app/snow_connector.py,sha256=ed4t85jQZ6Wx7ZJXxLDlxLMOjPwF3tcPCZ2Ns27W3Rc,11702
11
+ snowflake/cli/_app/telemetry.py,sha256=PEWBNQmYJR3Qdej3DLPumq1wkemyXRgA8S47oe_hLp0,9533
12
+ snowflake/cli/_app/version_check.py,sha256=d0bdXOc2IY5SB1xM0A1DDKXW3AiF28nq0fYhGDsQeEM,2379
14
13
  snowflake/cli/_app/commands_registration/__init__.py,sha256=HhP1c8GDRqUtZMeYVNuYwc1_524q9jH18bxJJk1JKWU,918
15
- snowflake/cli/_app/commands_registration/builtin_plugins.py,sha256=g8m3zN0uE5UOzKtFn1lLzOIVi4H2bbOevqbjpbCGHoY,2558
14
+ snowflake/cli/_app/commands_registration/builtin_plugins.py,sha256=UVQXCGGBwqerHWpYxQRzAiK__jozZ78x1-wMPq8tGIg,2672
16
15
  snowflake/cli/_app/commands_registration/command_plugins_loader.py,sha256=4pRKUYBmIVsBxDvaztgFbIBZKSaGseAMJMEHSkg0Nag,6297
17
16
  snowflake/cli/_app/commands_registration/commands_registration_with_callbacks.py,sha256=VvGFd_q0-xe8HU_BP5l1OkVld4PYfNJ45YAWjuIydPE,3038
18
17
  snowflake/cli/_app/commands_registration/exception_logging.py,sha256=4B_OuXo6BJXhchs1c4zlmhnN3fN-LV6jdv6LZ227Lr8,985
@@ -31,8 +30,13 @@ snowflake/cli/_app/dev/docs/templates/definition_description.rst.jinja2,sha256=h
31
30
  snowflake/cli/_app/dev/docs/templates/overview.rst.jinja2,sha256=qsv0ZphFs9ZbDQhGGBlTc_D2jHhf84mBsxoev54KCuU,430
32
31
  snowflake/cli/_app/dev/docs/templates/usage.rst.jinja2,sha256=-ZyfvCUwjkorhPcFA_a7Dy2WbRhcMdZ13ZAQsPMvynE,2444
33
32
  snowflake/cli/_plugins/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
33
+ snowflake/cli/_plugins/auth/__init__.py,sha256=3ncenrLbz6nZ_l26CCzWxofCgbWJX92yX0Yot3CyEhk,384
34
+ snowflake/cli/_plugins/auth/keypair/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ snowflake/cli/_plugins/auth/keypair/commands.py,sha256=hx-QPTxHU_O1bbogbIcaUqW74EKHPyArR9P1InS_S2Q,4049
36
+ snowflake/cli/_plugins/auth/keypair/manager.py,sha256=dcM3zhVr8i6roSagqw8sK1yvawL9XrVva9rrkPrRgy4,11835
37
+ snowflake/cli/_plugins/auth/keypair/plugin_spec.py,sha256=6TwDEeIavB4x8B5WXQfeUhsrAAupdTmAVhmsv3I26u8,979
34
38
  snowflake/cli/_plugins/connection/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
35
- snowflake/cli/_plugins/connection/commands.py,sha256=PYQ5UWNujJQT8wZ3Si6f2AtkHi7vkbu-izJ-FW3ciUM,12382
39
+ snowflake/cli/_plugins/connection/commands.py,sha256=Buba_Dli9wG6esIE2yTr6yjA38hV1tq63kHnMlazKUU,15152
36
40
  snowflake/cli/_plugins/connection/plugin_spec.py,sha256=A50dPnOAjPLwgp4CDXL6EkrEKSivGZ324GPFeG023sw,999
37
41
  snowflake/cli/_plugins/connection/util.py,sha256=OjpezcayWVVUhNLzcs8UB6nJ0PIiokMQeX0meaW_6f8,7777
38
42
  snowflake/cli/_plugins/cortex/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
@@ -65,7 +69,7 @@ snowflake/cli/_plugins/nativeapp/same_account_install_method.py,sha256=97Q7tWWcN
65
69
  snowflake/cli/_plugins/nativeapp/sf_facade.py,sha256=Ng5-fZuPyCtOCsUdeeAgIt4k7S0oNXqB-sUTbII9mJ4,1047
66
70
  snowflake/cli/_plugins/nativeapp/sf_facade_constants.py,sha256=nVWM_gbvW53hEPYwmySw43BbPixivv_qegMAcHQ7wxU,774
67
71
  snowflake/cli/_plugins/nativeapp/sf_facade_exceptions.py,sha256=YzUIgAvcGUxJ8hOvLnLdM-PR2gD0pWmIvNi0tTRAofo,7245
68
- snowflake/cli/_plugins/nativeapp/sf_sql_facade.py,sha256=pcwVHgJTmmjV-ESHaJFXBs1g6L8sCe30XAVUPkIGwnE,74114
72
+ snowflake/cli/_plugins/nativeapp/sf_sql_facade.py,sha256=c-e17Z1Lbmke-xssAbL8JFzlmFS-n3pgT9BXDKAy_u4,75279
69
73
  snowflake/cli/_plugins/nativeapp/utils.py,sha256=2sSZKKjaSbRebQ28oMWNsopeAMQh5ce3aDO93dSIPLs,3380
70
74
  snowflake/cli/_plugins/nativeapp/codegen/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
71
75
  snowflake/cli/_plugins/nativeapp/codegen/artifact_processor.py,sha256=sQ3dmbm0PkDT_V5kIDT5Z4BlFHFNFRS7wTXopdTk3PA,2935
@@ -79,7 +83,7 @@ snowflake/cli/_plugins/nativeapp/codegen/snowpark/models.py,sha256=7TlcAD29k5daz
79
83
  snowflake/cli/_plugins/nativeapp/codegen/snowpark/python_processor.py,sha256=LtwJzeZonL9EhG13RekiZE8qAlprSKV6p0QtYQ9Z-ZM,20128
80
84
  snowflake/cli/_plugins/nativeapp/codegen/templates/templates_processor.py,sha256=ycaMiMfJuyW8QntKlfXOrKOxfGsk4zngGbTFuwZDfVU,4704
81
85
  snowflake/cli/_plugins/nativeapp/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- snowflake/cli/_plugins/nativeapp/entities/application.py,sha256=B6MqURxN9cl0GSE8I5osqcL71ldka4-wKVW_U4mGU4A,40342
86
+ snowflake/cli/_plugins/nativeapp/entities/application.py,sha256=p5DrEKoO5ojvBSm0LB13ubFLMCM4MV1rbX5wZqbTO-s,40473
83
87
  snowflake/cli/_plugins/nativeapp/entities/application_package.py,sha256=qMMCv6SWmMPrdAIORRepoD-wQs8SdihdTGU2FUgr3RA,69766
84
88
  snowflake/cli/_plugins/nativeapp/entities/application_package_child_interface.py,sha256=tN5UmU6wD_P14k7_MtOFNJwNUi6LfwFAUdnyZ4_O9hk,1527
85
89
  snowflake/cli/_plugins/nativeapp/entities/models/event_sharing_telemetry.py,sha256=ASfuzBheevYrKzP8_mvbq1SR1gSaui1xlZVg4dD0hpg,2364
@@ -100,17 +104,17 @@ snowflake/cli/_plugins/notebook/notebook_project_paths.py,sha256=bAZjqjuN4wWhHu0
100
104
  snowflake/cli/_plugins/notebook/plugin_spec.py,sha256=RZEJMGIYpNXRBeSnJxQ8p1hNRPsjYw6EUk1eRwkAnnU,997
101
105
  snowflake/cli/_plugins/notebook/types.py,sha256=BaW2rHQ_kIEG5lilltUBGq1g8a68_nFbh1oYdINT3fE,654
102
106
  snowflake/cli/_plugins/object/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
103
- snowflake/cli/_plugins/object/command_aliases.py,sha256=KQK73mwhDQWAIf7qSB6ZExae5LSdq4Xpjybq0863uSk,3158
107
+ snowflake/cli/_plugins/object/command_aliases.py,sha256=SQtucSfQnIvOvlqOJprhdlUAw4keE18i8u3bEIqPcZw,3233
104
108
  snowflake/cli/_plugins/object/commands.py,sha256=Omf4o1OOm_8eg7XpwdHQOT0X9zwlLn6whJRHIfq1VRs,6178
105
109
  snowflake/cli/_plugins/object/common.py,sha256=x1V8fiVnh7ohHHq0_NaGFtUvTz0soVRSGm-oCIuhJHs,2608
106
- snowflake/cli/_plugins/object/manager.py,sha256=6FcXgyNEhxsQt5aCUmPBcHCXn8plo34bTzQRaTCZajI,5034
110
+ snowflake/cli/_plugins/object/manager.py,sha256=s86rqftu4vONGbDjqKrfInOf69OeqzK9FMRNkeRE6-4,5076
107
111
  snowflake/cli/_plugins/object/plugin_spec.py,sha256=O8k6hSD48w4Uhkho0KpcTDkZ2iNjiU5jCPvEVitDzeo,995
108
112
  snowflake/cli/_plugins/plugin/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
109
113
  snowflake/cli/_plugins/plugin/commands.py,sha256=JoDeE-ggxYE6FKulNGJQrfl7nao7lg8FCsEw2s-WdF8,2433
110
114
  snowflake/cli/_plugins/plugin/manager.py,sha256=eeW5b0zAvvsZREgIVH7afAQbKHI2YqqdIjqo0hqFfHs,2641
111
115
  snowflake/cli/_plugins/plugin/plugin_spec.py,sha256=5XZJPT42ZIEARYvthic3jLEB4CvDUdMeWTM6YfDkD9k,995
112
116
  snowflake/cli/_plugins/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- snowflake/cli/_plugins/project/commands.py,sha256=FW2QAKgBXarEsT-VlDJHnQ_q3Koxkx9E9NNjuQVzLkM,5138
117
+ snowflake/cli/_plugins/project/commands.py,sha256=Cr0oo8o32kIO1Gr3gBsXxLAt-FgjlcSvbFD2akYP67o,5722
114
118
  snowflake/cli/_plugins/project/feature_flags.py,sha256=wcogqMHGLVo4T83nmPOKTlO0Oz02i6d887KRLbHnUS0,805
115
119
  snowflake/cli/_plugins/project/manager.py,sha256=K2EBe3yU2tYpCVS4EaeHEKGYjhTbC9_5e6sx_OSDRHE,2617
116
120
  snowflake/cli/_plugins/project/plugin_spec.py,sha256=wlRaaVR5pSq2qzty_E__LuRmgWoz5QKsVoijT3pbeTE,996
@@ -135,7 +139,7 @@ snowflake/cli/_plugins/spcs/__init__.py,sha256=WtfeiPqu_hLaMnc7twQRTs9Uy-207T8Up
135
139
  snowflake/cli/_plugins/spcs/common.py,sha256=DMButLIepSuLok-jY7L_E3ah9KrHSsvS2ua8kMDvsHg,8795
136
140
  snowflake/cli/_plugins/spcs/plugin_spec.py,sha256=E1wM0qvBsfh7DrD2ygjfXFJBaQSaxSw3u5sijTM5YqQ,979
137
141
  snowflake/cli/_plugins/spcs/compute_pool/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
138
- snowflake/cli/_plugins/spcs/compute_pool/commands.py,sha256=9Ly4m7ZaoBs9ijWRVOcvt5cwckOKSvHggpNadFOQ6Mk,9529
142
+ snowflake/cli/_plugins/spcs/compute_pool/commands.py,sha256=ecgW2cLe39Vf9cGAGmjs4a8rWKE1m92sb7gdgcO55z4,9985
139
143
  snowflake/cli/_plugins/spcs/compute_pool/compute_pool_entity.py,sha256=Uf1B26_ARgIKKIKjZvDgRvC9_KqHUopkPryrwGLLLCI,240
140
144
  snowflake/cli/_plugins/spcs/compute_pool/compute_pool_entity_model.py,sha256=XnI8hPeaXQ7d3AtOQVtYVnvWhGuDz6bhYSD2Uji1HqU,1639
141
145
  snowflake/cli/_plugins/spcs/compute_pool/manager.py,sha256=pf8fXBf84Snw6grHE31Rdj0HYNYKAQHRxgGQ7cnSNlk,6013
@@ -155,13 +159,14 @@ snowflake/cli/_plugins/spcs/services/service_entity_model.py,sha256=VQ1b6ij2x4eA
155
159
  snowflake/cli/_plugins/spcs/services/service_project_paths.py,sha256=9frP-BzPTs3I2C2Rt9MsuYBMvUdXomOzI7AW4ciXK9U,389
156
160
  snowflake/cli/_plugins/sql/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
157
161
  snowflake/cli/_plugins/sql/commands.py,sha256=74eNDCKWxu_ELrjqB30pp9JOx7AP_sq-rdWp3eGP5I0,3390
158
- snowflake/cli/_plugins/sql/manager.py,sha256=pEdMNY5P0ox89JSTG1e-if2A50oFzw3AXQw04EvYbXQ,3695
162
+ snowflake/cli/_plugins/sql/manager.py,sha256=2mH08FXd046jfLpEQR8M8Ld1Lad-sJUIc0i1LVOR_b4,3205
159
163
  snowflake/cli/_plugins/sql/plugin_spec.py,sha256=7wcy3fW00uBZL4qGnAC_UKBIksJg6GJcZfZsY8Izz-A,993
160
164
  snowflake/cli/_plugins/sql/snowsql_templating.py,sha256=VTPvFzZihZnu6R5L1JMaVdzxfviSRoMLlNyxK87sE5E,881
165
+ snowflake/cli/_plugins/sql/source_reader.py,sha256=kItog6-l3BW8yVXD4Aa-Gw2PAxACzTOe9pC1GDqBU8w,7070
161
166
  snowflake/cli/_plugins/stage/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
162
167
  snowflake/cli/_plugins/stage/commands.py,sha256=5vAoX1HOdOUwrG_kjVSq5NHkSu-Qz7-UgrBGeUzgxHA,8784
163
168
  snowflake/cli/_plugins/stage/diff.py,sha256=Xq9cEnHs_Ee4JHrFMhAO_aHO_IGcGV9_zX8cMHuguZk,10462
164
- snowflake/cli/_plugins/stage/manager.py,sha256=OvDbOWXDfWPe5ztNx9CK6h0sRDtLZ6ZwYo-jfKxGBjk,31045
169
+ snowflake/cli/_plugins/stage/manager.py,sha256=hwlg9rvtWnhlAVMeFO56wWv21tIiLsKqgB-FDsAbqrs,31382
165
170
  snowflake/cli/_plugins/stage/md5.py,sha256=9B9jt3DVbSL4XyL7-4j7Tf8sI_u5CAO2LILS9xuq7fw,6303
166
171
  snowflake/cli/_plugins/stage/plugin_spec.py,sha256=2APmhjF1Emtdx1Ir9vLwJ1PLgLbnu7Or8lijOi_AM2U,994
167
172
  snowflake/cli/_plugins/stage/utils.py,sha256=RiJ7bDFx92U8ffqzS0djrT_KbtWy-nk-tRbXbkaq5qI,1760
@@ -180,17 +185,18 @@ snowflake/cli/_plugins/workspace/plugin_spec.py,sha256=DvjilAunPuBuSIgKHOPcAVfk8
180
185
  snowflake/cli/api/cli_global_context.py,sha256=U51xumGWwRaxxMNx9zALy40s-sA_tAPBKMI40ZLzWto,9505
181
186
  snowflake/cli/api/config.py,sha256=umewTjwJMniIYu-R3WeS4TFl5efvvnD719BRKlyqqyk,13534
182
187
  snowflake/cli/api/connections.py,sha256=aH0g8DRBzEfz9pcInek_OKombgdEUU5xah2T9fsMzQc,8886
183
- snowflake/cli/api/constants.py,sha256=YS0RdAL6-3ZchhQ_o9m6OTDHQ34Kc95jcylIjSNX3Aw,3637
184
- snowflake/cli/api/errno.py,sha256=7MKvTyZlIIvQB_dZU8koeyVDmRjNWhYSucF7TwlfPa8,3819
185
- snowflake/cli/api/exceptions.py,sha256=oQwbNdhHkhQXrP8V2Q-VEgIC0Z11p7rrQx0hQhd--xk,8183
186
- snowflake/cli/api/feature_flags.py,sha256=-S9d9xoMgZ5dMVp73ZrYIqp-72K49Q1iihDQeZ3pyTw,2224
188
+ snowflake/cli/api/constants.py,sha256=ipvBqTW-UUZffXUqmes9C8d0ujYxDlEWYi9lG5FAgPc,3736
189
+ snowflake/cli/api/errno.py,sha256=nVQ2kO9nPaA1uGB4yZiKTwtE2LiQmINHTutziA37c6s,3871
190
+ snowflake/cli/api/exceptions.py,sha256=JEOiU8xIkQpc7inXVe7sL1ul42L9E3XmZNd3KaPXVvE,8369
191
+ snowflake/cli/api/feature_flags.py,sha256=l5CbM9wtTB2FOLsYnr4lAjspZgHwyzCZS7XZRpX4eBU,2292
187
192
  snowflake/cli/api/identifiers.py,sha256=QdYSWzJ0XzNWdIue62QQUwr4yvTvjDB-rjtIvaihyck,6792
188
193
  snowflake/cli/api/metrics.py,sha256=l-khpKWvRF8OB86OhJ2H61jrcTdMDGZe_QM1_-yqWT8,10694
189
- snowflake/cli/api/rest_api.py,sha256=hn3oCUAFtH5P_T_oaFg-sPwKkQaajVL5KuX1bE9fMxE,7297
194
+ snowflake/cli/api/rest_api.py,sha256=WklAb_2Z95sfC8JAtY5FPzSAZqpxHtKaKU49zMfiTMU,7207
190
195
  snowflake/cli/api/sanitizers.py,sha256=7EKqVQ3KOob0IFFoc_GmXPYpRhgnmIqhnJSvHPgxM5I,1211
191
- snowflake/cli/api/secure_path.py,sha256=CiHXSCUJv0MjhO2ILWTFHyCWbm6qxgNiyA1bt1Qk_s0,13087
196
+ snowflake/cli/api/secret.py,sha256=9Jg30dAVcV95tCxTY6RPdaKYTsiG39sld_bwUXXxF2A,263
197
+ snowflake/cli/api/secure_path.py,sha256=nVoCrH6A6SFw-wJHNJDqGnNJiQ2CNeNK6171uPtwn6M,13526
192
198
  snowflake/cli/api/secure_utils.py,sha256=w3f1JU2ntOXGQ2STeqU0QiAVx_sLLEfgPwIvpprqevY,4000
193
- snowflake/cli/api/sql_execution.py,sha256=Sp7_KDHBDAvyn0gBSrXpOVyXJUZe_tRe1QZxmirC9RM,11506
199
+ snowflake/cli/api/sql_execution.py,sha256=0yck5SNK9cAnD_bQyteJWkdEIcTEXnaCHE3PzDsXJ2M,11710
194
200
  snowflake/cli/api/stage_path.py,sha256=riSrqbjvuqz6PK88VfCeXqJh1kqsmIsT5MTKC_idIZs,7249
195
201
  snowflake/cli/api/artifacts/__init__.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh9ou8J439uU,578
196
202
  snowflake/cli/api/artifacts/bundle_map.py,sha256=df1wos2OgThV65gSuT-7wbF4oiDBOpU7Qqs5qs7FuVg,21808
@@ -203,7 +209,7 @@ snowflake/cli/api/commands/common.py,sha256=6CrJqhQl-Mu0jwFmWyNKvvB7jFQ1EJdnKFW9
203
209
  snowflake/cli/api/commands/decorators.py,sha256=fdKdBqEBn2GrerLekKyUCMUTKTQynHMGGi_e5-0y77Y,10586
204
210
  snowflake/cli/api/commands/execution_metadata.py,sha256=9tz1dbzdVRLFprGi_y8TeTfv36VewFeGdhQX6NfwAXM,1231
205
211
  snowflake/cli/api/commands/experimental_behaviour.py,sha256=HFTw0d46B1QJpiCy0MeeJhWXrPF_bnmgUGaEWkWXw98,733
206
- snowflake/cli/api/commands/flags.py,sha256=Xjat1kfbjIi5akXpiX8IzkGV5Mcetotc1ZvsmVxtA20,17916
212
+ snowflake/cli/api/commands/flags.py,sha256=nTksWDMYIKXipOJLJMeP_7bA2PfctyP0bBICJ06BLwM,18163
207
213
  snowflake/cli/api/commands/overrideable_parameter.py,sha256=LDiRQudkTeoWu5y_qTCVmtseEvO6U9LuSiuLZt5oFq8,6353
208
214
  snowflake/cli/api/commands/snow_typer.py,sha256=4gH2eOHoVpsPgUNuL5GvIHf_yTpU2e_lUzaBOZc-GNo,9266
209
215
  snowflake/cli/api/commands/utils.py,sha256=vZcVtPZsuH312FPf9yw-JooNWE7Tli-zVWh4u-gQk7c,1605
@@ -265,8 +271,8 @@ snowflake/cli/api/utils/naming_utils.py,sha256=uGA_QRGW3iGwaegpFsLgOhup0zBliBSXh
265
271
  snowflake/cli/api/utils/path_utils.py,sha256=5-9_tMkhMMejR_vn7RiFN_VKx56Kw36TwgzPPmYD34E,1905
266
272
  snowflake/cli/api/utils/templating_functions.py,sha256=DlmpGAEY6OBArtIap6kN1aaILPwx2ynqKflPwjj7BbU,4935
267
273
  snowflake/cli/api/utils/types.py,sha256=fVKuls8axKSsBzPqWwrkwkwoXXmedqxNJKqfXrrGyBM,1190
268
- snowflake_cli-3.5.0.dist-info/METADATA,sha256=bA5btgDfvjBWMu9nk3yneT9-bR3VMS5gc5DC6IYfTJs,18057
269
- snowflake_cli-3.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
270
- snowflake_cli-3.5.0.dist-info/entry_points.txt,sha256=6QmSI0wUX6p7f-dGvrPdswlQyVAVGi1AtOUbE8X6bho,58
271
- snowflake_cli-3.5.0.dist-info/licenses/LICENSE,sha256=mJMA3Uz2AbjU_kVggo1CAx01XhBsI7BSi2H7ggUg_-c,11344
272
- snowflake_cli-3.5.0.dist-info/RECORD,,
274
+ snowflake_cli-3.6.0.dist-info/METADATA,sha256=VG5ZTlaq7gYPeFgYp8Qibio5OXfPPhJ1cB-WNCuk_7g,18066
275
+ snowflake_cli-3.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
276
+ snowflake_cli-3.6.0.dist-info/entry_points.txt,sha256=6QmSI0wUX6p7f-dGvrPdswlQyVAVGi1AtOUbE8X6bho,58
277
+ snowflake_cli-3.6.0.dist-info/licenses/LICENSE,sha256=mJMA3Uz2AbjU_kVggo1CAx01XhBsI7BSi2H7ggUg_-c,11344
278
+ snowflake_cli-3.6.0.dist-info/RECORD,,