ygg 0.1.25__py3-none-any.whl → 0.1.27__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.
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/METADATA +1 -1
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/RECORD +8 -8
- yggdrasil/databricks/sql/engine.py +1 -2
- yggdrasil/databricks/workspaces/databricks_path.py +94 -44
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/WHEEL +0 -0
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/entry_points.txt +0 -0
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/licenses/LICENSE +0 -0
- {ygg-0.1.25.dist-info → ygg-0.1.27.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
ygg-0.1.
|
|
1
|
+
ygg-0.1.27.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
|
2
2
|
yggdrasil/__init__.py,sha256=6OPibApplA5TF4TeixkQO_qewpaAidYX-fSDvvKYcTI,91
|
|
3
3
|
yggdrasil/databricks/__init__.py,sha256=aGVve5mpoQtxSK2nfzrexjRPoutCIyaOnKZijkG4_QE,92
|
|
4
4
|
yggdrasil/databricks/compute/__init__.py,sha256=TVDwPmW2SOmHmnhzZhsvrWbrxZ_lEcgqe3l9BeB-oxM,218
|
|
@@ -8,12 +8,12 @@ yggdrasil/databricks/compute/remote.py,sha256=sVWBb_1YR-e33on6F5QYMLKwT6end6rolC
|
|
|
8
8
|
yggdrasil/databricks/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
yggdrasil/databricks/jobs/config.py,sha256=8Slfw4Wl7vu0kIlaUUqVqjjOgPwuULoo0rroENCbC20,11494
|
|
10
10
|
yggdrasil/databricks/sql/__init__.py,sha256=JZpQ9eCphDf1l4yzIZ7a7OLigxqXkqOgb0Mio7Rj09A,181
|
|
11
|
-
yggdrasil/databricks/sql/engine.py,sha256=
|
|
11
|
+
yggdrasil/databricks/sql/engine.py,sha256=bmkMoBij-8M-xohQK-sYb22OgBc1VIZRRVjw62CMWHk,30810
|
|
12
12
|
yggdrasil/databricks/sql/exceptions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
yggdrasil/databricks/sql/statement_result.py,sha256=L-hrK5MVnH3XG57BpGmaETtRzYjAtYGQthgAPGVj618,12610
|
|
14
14
|
yggdrasil/databricks/sql/types.py,sha256=YgasSyq8sygk1h6ZOTcRwXAZWNKSuk-9g9VqlR8kJl4,5324
|
|
15
15
|
yggdrasil/databricks/workspaces/__init__.py,sha256=tNNS3A_Pl9FYkQ8nGERhr4VF-hwKrvh8k1W8vTaR0uo,58
|
|
16
|
-
yggdrasil/databricks/workspaces/databricks_path.py,sha256=
|
|
16
|
+
yggdrasil/databricks/workspaces/databricks_path.py,sha256=xqK-dMMZJ0JE58FfKa5j6b-6owbSeeisPF8L4efV35E,32473
|
|
17
17
|
yggdrasil/databricks/workspaces/workspace.py,sha256=8T-d0DTq-s2zTkmMbaEeS_7AiZwcUDxorch9IbZACko,33333
|
|
18
18
|
yggdrasil/dataclasses/__init__.py,sha256=QVAvZnNl7gFYTLOVTfMkdQZf6o_WL8_UuDV1uTZ7Aeg,67
|
|
19
19
|
yggdrasil/dataclasses/dataclass.py,sha256=ln-D1-bbiCLBd2khRMGs4dFoxzJEEGzHTKekWCnF2uk,5436
|
|
@@ -49,8 +49,8 @@ yggdrasil/types/cast/registry.py,sha256=-88mq-U1pDSGbEC9PRY0zJCzloyBodXgeSRBPb6h
|
|
|
49
49
|
yggdrasil/types/cast/spark_cast.py,sha256=IHthM78dugabGXxNNW9sSHn-olDwzXcFdIFcPo9IiXU,23021
|
|
50
50
|
yggdrasil/types/cast/spark_pandas_cast.py,sha256=8PgJItF_XbyBcNuBnXkMQU3PBy3sAPEXZT9SXL2WbU4,4200
|
|
51
51
|
yggdrasil/types/cast/spark_polars_cast.py,sha256=ba1UOvY1ouGCro1Np9slXmJ4TEyWnUtwVEAwxGvPLlk,8336
|
|
52
|
-
ygg-0.1.
|
|
53
|
-
ygg-0.1.
|
|
54
|
-
ygg-0.1.
|
|
55
|
-
ygg-0.1.
|
|
56
|
-
ygg-0.1.
|
|
52
|
+
ygg-0.1.27.dist-info/METADATA,sha256=wa7LF8bvOiQ5MWX9IwFFqDBxwVlB6bkebU6ZOGCr3Vs,19204
|
|
53
|
+
ygg-0.1.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
54
|
+
ygg-0.1.27.dist-info/entry_points.txt,sha256=D0JDw2s-ZfU1GjXfniv6PvXwcyn5v9WBk4ya623Cti8,71
|
|
55
|
+
ygg-0.1.27.dist-info/top_level.txt,sha256=iBe9Kk4VIVbLpgv_p8OZUIfxgj4dgJ5wBg6vO3rigso,10
|
|
56
|
+
ygg-0.1.27.dist-info/RECORD,,
|
|
@@ -439,8 +439,7 @@ FROM parquet.`{databricks_tmp_folder}`"""
|
|
|
439
439
|
try:
|
|
440
440
|
databricks_tmp_folder.rmdir(recursive=True)
|
|
441
441
|
except Exception as e:
|
|
442
|
-
|
|
443
|
-
logger.error(e)
|
|
442
|
+
logger.warning(e)
|
|
444
443
|
|
|
445
444
|
# Optionally run OPTIMIZE / ZORDER / VACUUM if requested (Databricks SQL)
|
|
446
445
|
if zorder_by:
|
|
@@ -108,33 +108,6 @@ class DatabricksPath(SysPath, PurePosixPath):
|
|
|
108
108
|
|
|
109
109
|
return str(PurePosixPath(*(_seg_to_str(s) for s in pathsegments)))
|
|
110
110
|
|
|
111
|
-
def _init(self, template: Optional["DatabricksPath"] = None) -> None:
|
|
112
|
-
"""
|
|
113
|
-
pathlib creates derived paths (parent, /, joinpath, with_name, etc.) via _from_parts
|
|
114
|
-
which bypasses __new__. _init(template=...) is the hook to carry our metadata forward.
|
|
115
|
-
"""
|
|
116
|
-
if isinstance(template, DatabricksPath):
|
|
117
|
-
# Recompute kind for the NEW path string (don’t blindly copy _kind)
|
|
118
|
-
kind, ws, _ = DatabricksPathKind.parse(str(self), workspace=getattr(template, "_workspace", None))
|
|
119
|
-
|
|
120
|
-
self._kind = kind
|
|
121
|
-
self._workspace = ws if ws is not None else getattr(template, "_workspace", None)
|
|
122
|
-
|
|
123
|
-
# Never inherit caches from template
|
|
124
|
-
self._is_file = None
|
|
125
|
-
self._is_dir = None
|
|
126
|
-
self._raw_status = None
|
|
127
|
-
self._raw_status_refresh_time = 0.0
|
|
128
|
-
else:
|
|
129
|
-
kind, ws, _ = DatabricksPathKind.parse(str(self))
|
|
130
|
-
self._kind = kind
|
|
131
|
-
self._workspace = ws
|
|
132
|
-
|
|
133
|
-
self._is_file = None
|
|
134
|
-
self._is_dir = None
|
|
135
|
-
self._raw_status = None
|
|
136
|
-
self._raw_status_refresh_time = 0.0
|
|
137
|
-
|
|
138
111
|
def __new__(
|
|
139
112
|
cls,
|
|
140
113
|
*pathsegments: Any,
|
|
@@ -171,6 +144,22 @@ class DatabricksPath(SysPath, PurePosixPath):
|
|
|
171
144
|
# pathlib paths are effectively immutable; all init happens in __new__ / _init
|
|
172
145
|
pass
|
|
173
146
|
|
|
147
|
+
def __truediv__(self, other):
|
|
148
|
+
if not other:
|
|
149
|
+
return self
|
|
150
|
+
|
|
151
|
+
built = super().__truediv__(other)
|
|
152
|
+
|
|
153
|
+
built._kind = self._kind
|
|
154
|
+
built._workspace = self._workspace
|
|
155
|
+
|
|
156
|
+
built._is_file = None
|
|
157
|
+
built._is_dir = None
|
|
158
|
+
built._raw_status = None
|
|
159
|
+
built._raw_status_refresh_time = 0.0
|
|
160
|
+
|
|
161
|
+
return built
|
|
162
|
+
|
|
174
163
|
def __enter__(self):
|
|
175
164
|
self.workspace.__enter__()
|
|
176
165
|
return self
|
|
@@ -178,32 +167,92 @@ class DatabricksPath(SysPath, PurePosixPath):
|
|
|
178
167
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
179
168
|
return self.workspace.__exit__(exc_type, exc_val, exc_tb)
|
|
180
169
|
|
|
170
|
+
def _clone_meta_from(self, template: "DatabricksPath") -> None:
|
|
171
|
+
"""
|
|
172
|
+
Copy *connection/meta* state, but never copy caches.
|
|
173
|
+
Centralizes the logic so every creation path stays consistent.
|
|
174
|
+
"""
|
|
175
|
+
# Keep workspace threading; kind should match the NEW path string.
|
|
176
|
+
kind, ws, _ = DatabricksPathKind.parse(str(self), workspace=getattr(template, "_workspace", None))
|
|
177
|
+
self._kind = kind
|
|
178
|
+
self._workspace = ws if ws is not None else getattr(template, "_workspace", None)
|
|
179
|
+
|
|
180
|
+
# Reset caches
|
|
181
|
+
self._is_file = None
|
|
182
|
+
self._is_dir = None
|
|
183
|
+
self._raw_status = None
|
|
184
|
+
self._raw_status_refresh_time = 0.0
|
|
185
|
+
|
|
181
186
|
@property
|
|
182
|
-
def
|
|
183
|
-
|
|
184
|
-
if self._workspace is None:
|
|
185
|
-
from .workspace import Workspace
|
|
187
|
+
def parent(self):
|
|
188
|
+
built = super().parent
|
|
186
189
|
|
|
187
|
-
|
|
188
|
-
except AttributeError:
|
|
189
|
-
self._init(template=self)
|
|
190
|
+
built._clone_meta_from(self)
|
|
190
191
|
|
|
191
|
-
|
|
192
|
+
return built
|
|
193
|
+
|
|
194
|
+
@classmethod
|
|
195
|
+
def _from_parsed_parts(cls, drv, root, parts):
|
|
196
|
+
"""
|
|
197
|
+
pathlib internal factory. It may pass a template in some Python versions,
|
|
198
|
+
but if not, we still return a valid DatabricksPath with initialized state.
|
|
199
|
+
"""
|
|
200
|
+
built = super()._from_parsed_parts(drv, root, parts) # type: ignore[misc]
|
|
201
|
+
|
|
202
|
+
# Best effort: if pathlib gave us a template on the object, use it.
|
|
203
|
+
# Otherwise ensure we at least have valid defaults.
|
|
204
|
+
if isinstance(built, DatabricksPath) and isinstance(getattr(built, "_workspace", None), object):
|
|
205
|
+
# If the object already has workspace/kind via _init, don't stomp it.
|
|
206
|
+
# But if it's missing _kind (common failure), derive it.
|
|
207
|
+
if not hasattr(built, "_kind"):
|
|
208
|
+
kind, ws, _ = DatabricksPathKind.parse(str(built), workspace=getattr(built, "_workspace", None))
|
|
209
|
+
built._kind = kind
|
|
210
|
+
built._workspace = ws if ws is not None else getattr(built, "_workspace", None)
|
|
211
|
+
|
|
212
|
+
# Always reset caches (derived path => cache invalid)
|
|
213
|
+
built._is_file = None
|
|
214
|
+
built._is_dir = None
|
|
215
|
+
built._raw_status = None
|
|
216
|
+
built._raw_status_refresh_time = 0.0
|
|
217
|
+
else:
|
|
218
|
+
# Safety defaults (should be rare)
|
|
219
|
+
kind, ws, _ = DatabricksPathKind.parse(str(built))
|
|
220
|
+
built._kind = kind
|
|
221
|
+
built._workspace = ws
|
|
222
|
+
built._is_file = None
|
|
223
|
+
built._is_dir = None
|
|
224
|
+
built._raw_status = None
|
|
225
|
+
built._raw_status_refresh_time = 0.0
|
|
226
|
+
|
|
227
|
+
return built
|
|
228
|
+
|
|
229
|
+
def _make_child(self, args):
|
|
230
|
+
built = super()._make_child(args) # type: ignore[misc]
|
|
231
|
+
|
|
232
|
+
# Ensure type + meta carryover
|
|
233
|
+
if isinstance(built, DatabricksPath):
|
|
234
|
+
built._clone_meta_from(self)
|
|
235
|
+
else:
|
|
236
|
+
# if for some reason super didn't return our type, try to coerce
|
|
237
|
+
built = type(self)(built, workspace=getattr(self, "_workspace", None))
|
|
192
238
|
|
|
193
|
-
|
|
194
|
-
from .workspace import Workspace
|
|
239
|
+
return built
|
|
195
240
|
|
|
196
|
-
|
|
241
|
+
@property
|
|
242
|
+
def workspace(self):
|
|
243
|
+
if self._workspace is None:
|
|
244
|
+
from .workspace import Workspace
|
|
197
245
|
|
|
246
|
+
self._workspace = Workspace()
|
|
198
247
|
return self._workspace
|
|
199
248
|
|
|
249
|
+
@workspace.setter
|
|
250
|
+
def workspace(self, value):
|
|
251
|
+
self._workspace = value
|
|
252
|
+
|
|
200
253
|
@property
|
|
201
254
|
def kind(self):
|
|
202
|
-
|
|
203
|
-
return self._kind
|
|
204
|
-
except AttributeError:
|
|
205
|
-
self._init(template=self)
|
|
206
|
-
return self._kind
|
|
255
|
+
return self._kind
|
|
207
256
|
|
|
208
257
|
@kind.setter
|
|
209
258
|
def kind(self, value: DatabricksPathKind):
|
|
@@ -606,7 +655,8 @@ class DatabricksPath(SysPath, PurePosixPath):
|
|
|
606
655
|
|
|
607
656
|
try:
|
|
608
657
|
# FIX: DBFS listing should use DBFS-normalized path, not workspace path
|
|
609
|
-
|
|
658
|
+
p = "/dbfs/" + self.as_dbfs_api_path() + "/"
|
|
659
|
+
for info in sdk.dbfs.list(p, recursive=recursive):
|
|
610
660
|
base = DatabricksPath(
|
|
611
661
|
info.path,
|
|
612
662
|
workspace=self.workspace,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|