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.
- snowflake/cli/__about__.py +13 -1
- snowflake/cli/_app/commands_registration/builtin_plugins.py +2 -0
- snowflake/cli/_app/snow_connector.py +5 -4
- snowflake/cli/_app/telemetry.py +3 -15
- snowflake/cli/_app/version_check.py +4 -4
- snowflake/cli/_plugins/auth/__init__.py +11 -0
- snowflake/cli/_plugins/auth/keypair/__init__.py +0 -0
- snowflake/cli/_plugins/auth/keypair/commands.py +151 -0
- snowflake/cli/_plugins/auth/keypair/manager.py +331 -0
- snowflake/cli/_plugins/auth/keypair/plugin_spec.py +30 -0
- snowflake/cli/_plugins/connection/commands.py +77 -1
- snowflake/cli/_plugins/nativeapp/entities/application.py +4 -1
- snowflake/cli/_plugins/nativeapp/sf_sql_facade.py +33 -6
- snowflake/cli/_plugins/object/command_aliases.py +3 -1
- snowflake/cli/_plugins/object/manager.py +4 -2
- snowflake/cli/_plugins/project/commands.py +16 -0
- snowflake/cli/_plugins/spcs/compute_pool/commands.py +17 -5
- snowflake/cli/_plugins/sql/manager.py +42 -51
- snowflake/cli/_plugins/sql/source_reader.py +230 -0
- snowflake/cli/_plugins/stage/manager.py +8 -2
- snowflake/cli/api/commands/flags.py +12 -2
- snowflake/cli/api/constants.py +2 -0
- snowflake/cli/api/errno.py +1 -0
- snowflake/cli/api/exceptions.py +7 -0
- snowflake/cli/api/feature_flags.py +1 -0
- snowflake/cli/api/rest_api.py +2 -3
- snowflake/cli/{_app → api}/secret.py +4 -1
- snowflake/cli/api/secure_path.py +16 -4
- snowflake/cli/api/sql_execution.py +7 -3
- {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/METADATA +7 -7
- {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/RECORD +34 -28
- {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/WHEEL +0 -0
- {snowflake_cli-3.5.0.dist-info → snowflake_cli-3.6.0.dist-info}/entry_points.txt +0 -0
- {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
|
|
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
|
|
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,
|
snowflake/cli/api/constants.py
CHANGED
|
@@ -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
|
|
snowflake/cli/api/errno.py
CHANGED
|
@@ -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
|
snowflake/cli/api/exceptions.py
CHANGED
|
@@ -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)
|
snowflake/cli/api/rest_api.py
CHANGED
|
@@ -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
|
-
|
|
159
|
-
|
|
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
|
):
|
snowflake/cli/api/secure_path.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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==
|
|
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.
|
|
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==
|
|
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.
|
|
244
|
-
Requires-Dist: syrupy==4.
|
|
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=
|
|
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/
|
|
11
|
-
snowflake/cli/_app/
|
|
12
|
-
snowflake/cli/_app/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
184
|
-
snowflake/cli/api/errno.py,sha256=
|
|
185
|
-
snowflake/cli/api/exceptions.py,sha256=
|
|
186
|
-
snowflake/cli/api/feature_flags.py,sha256
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
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.
|
|
269
|
-
snowflake_cli-3.
|
|
270
|
-
snowflake_cli-3.
|
|
271
|
-
snowflake_cli-3.
|
|
272
|
-
snowflake_cli-3.
|
|
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,,
|
|
File without changes
|