ygg 0.1.26__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ygg
3
- Version: 0.1.26
3
+ Version: 0.1.27
4
4
  Summary: Type-friendly utilities for moving data between Python objects, Arrow, Polars, Pandas, Spark, and Databricks
5
5
  Author: Yggdrasil contributors
6
6
  License: Apache License
@@ -1,4 +1,4 @@
1
- ygg-0.1.26.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
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
@@ -13,7 +13,7 @@ yggdrasil/databricks/sql/exceptions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
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=Ryoza649WRIHzbpIGjhvefwNFdSpe0-Y2ZJX6nImerw,31101
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.26.dist-info/METADATA,sha256=3htWnURwJn36QKT6AYSn9syodfAo3ZdLa6qEN4cuUO8,19204
53
- ygg-0.1.26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
54
- ygg-0.1.26.dist-info/entry_points.txt,sha256=D0JDw2s-ZfU1GjXfniv6PvXwcyn5v9WBk4ya623Cti8,71
55
- ygg-0.1.26.dist-info/top_level.txt,sha256=iBe9Kk4VIVbLpgv_p8OZUIfxgj4dgJ5wBg6vO3rigso,10
56
- ygg-0.1.26.dist-info/RECORD,,
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,,
@@ -108,34 +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
- temp_ws = getattr(template, "_workspace", None)
119
- kind, ws, _ = DatabricksPathKind.parse(str(self), workspace=temp_ws)
120
-
121
- self._kind = kind
122
- self._workspace = ws if ws is not None else temp_ws
123
-
124
- # Never inherit caches from template
125
- self._is_file = None
126
- self._is_dir = None
127
- self._raw_status = None
128
- self._raw_status_refresh_time = 0.0
129
- else:
130
- kind, ws, _ = DatabricksPathKind.parse(str(self))
131
- self._kind = kind
132
- self._workspace = ws
133
-
134
- self._is_file = None
135
- self._is_dir = None
136
- self._raw_status = None
137
- self._raw_status_refresh_time = 0.0
138
-
139
111
  def __new__(
140
112
  cls,
141
113
  *pathsegments: Any,
@@ -195,16 +167,74 @@ class DatabricksPath(SysPath, PurePosixPath):
195
167
  def __exit__(self, exc_type, exc_val, exc_tb):
196
168
  return self.workspace.__exit__(exc_type, exc_val, exc_tb)
197
169
 
198
- def _from_parsed_parts(self, drv, root, parts):
199
- built = super()._from_parsed_parts(drv, root, parts)
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)
200
179
 
201
- built._kind = self._kind
202
- built._workspace = self._workspace
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
203
185
 
204
- built._is_file = None
205
- built._is_dir = None
206
- built._raw_status = None
207
- built._raw_status_refresh_time = 0.0
186
+ @property
187
+ def parent(self):
188
+ built = super().parent
189
+
190
+ built._clone_meta_from(self)
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))
208
238
 
209
239
  return built
210
240
 
File without changes