dagster-shared 1.12.5__py3-none-any.whl → 1.12.7__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.
@@ -60,6 +60,10 @@ class ModelFieldCompat:
60
60
  if hasattr(self.field, "discriminator"):
61
61
  return self.field.discriminator if hasattr(self.field, "discriminator") else None
62
62
 
63
+ @property
64
+ def json_schema_extra(self) -> Optional[dict[str, Any]]:
65
+ return getattr(self.field, "json_schema_extra", None)
66
+
63
67
 
64
68
  def model_fields(model: type[BaseModel]) -> dict[str, ModelFieldCompat]:
65
69
  """Returns a dictionary of fields for a given pydantic model, wrapped
@@ -32,7 +32,7 @@ _NAMED_TUPLE_BASE_NEW_FIELD = "__nt_new__"
32
32
  _REMAPPING_FIELD = "__field_remap__"
33
33
  _ORIGINAL_CLASS_FIELD = "__original_class__"
34
34
  _KW_ONLY_FIELD = "__kw_only__"
35
-
35
+ _REPLACE_NEW_FIELD = "__replace_new__"
36
36
 
37
37
  _sample_nt = namedtuple("_canary", "x")
38
38
  # use a sample to avoid direct private imports (_collections._tuplegetter)
@@ -173,6 +173,7 @@ def _namedtuple_record_transform(
173
173
  _REMAPPING_FIELD: field_to_new_mapping or {},
174
174
  _ORIGINAL_CLASS_FIELD: cls,
175
175
  _KW_ONLY_FIELD: kw_only,
176
+ _REPLACE_NEW_FIELD: generated_new if generated_new else nt_new,
176
177
  "__reduce__": _reduce,
177
178
  # functools doesn't work, so manually update_wrapper
178
179
  "__module__": cls.__module__,
@@ -489,13 +490,8 @@ def replace(obj: TVal, **kwargs) -> TVal:
489
490
  cls = obj.__class__
490
491
 
491
492
  # if we have runtime type checking, go through that to vet new field values
492
- if hasattr(cls, _CHECKED_NEW):
493
- target = _CHECKED_NEW
494
- else:
495
- target = _NAMED_TUPLE_BASE_NEW_FIELD
496
-
497
- return getattr(cls, target)(
498
- obj.__class__,
493
+ return getattr(cls, _REPLACE_NEW_FIELD)(
494
+ cls,
499
495
  **{**as_dict(obj), **kwargs},
500
496
  )
501
497
 
@@ -570,6 +566,7 @@ class JitCheckedNew:
570
566
  for c in cls.__mro__:
571
567
  if c.__new__ is self:
572
568
  c.__new__ = compiled_fn
569
+ setattr(cls, _REPLACE_NEW_FIELD, compiled_fn)
573
570
 
574
571
  return compiled_fn(cls, *args, **kwargs)
575
572
 
@@ -3,8 +3,15 @@ import os
3
3
  import random
4
4
  import socket
5
5
  from collections.abc import Iterator, Mapping
6
+ from pathlib import Path
6
7
  from types import GenericAlias
7
- from typing import TypeGuard, TypeVar
8
+ from typing import Optional, TypeGuard, TypeVar
9
+
10
+ try:
11
+ import tomllib # pyright: ignore[reportMissingImports]
12
+ except ImportError:
13
+ # Python < 3.11 fallback
14
+ import tomli as tomllib
8
15
 
9
16
  T = TypeVar("T")
10
17
 
@@ -88,3 +95,35 @@ def safe_is_subclass(obj, cls: type[T]) -> TypeGuard[type[T]]:
88
95
  and not isinstance(obj, GenericAlias) # prevent exceptions on 3.9
89
96
  and issubclass(obj, cls)
90
97
  )
98
+
99
+
100
+ def _read_pyproject_toml(directory: Path | str) -> Optional[dict]:
101
+ """Read and parse pyproject.toml from a directory. Returns None if not found."""
102
+ if isinstance(directory, str):
103
+ directory = Path(directory)
104
+ pyproject_path = directory / "pyproject.toml"
105
+ if not pyproject_path.exists():
106
+ return None
107
+ with open(pyproject_path, "rb") as f:
108
+ return tomllib.load(f)
109
+
110
+
111
+ def find_uv_workspace_root(start_path: Path | str) -> Optional[tuple[Path, dict]]:
112
+ """Walk up directories to find a uv workspace root.
113
+
114
+ Returns (workspace_root_path, workspace_config) or None if not found.
115
+ A uv workspace is identified by [tool.uv.workspace] in pyproject.toml.
116
+ """
117
+ if isinstance(start_path, str):
118
+ start_path = Path(start_path)
119
+ current = start_path.resolve()
120
+ while True:
121
+ data = _read_pyproject_toml(current)
122
+ if data:
123
+ workspace_config = data.get("tool", {}).get("uv", {}).get("workspace", {})
124
+ if workspace_config:
125
+ return current, workspace_config
126
+ parent = current.parent
127
+ if parent == current:
128
+ return None
129
+ current = parent
dagster_shared/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.12.5"
1
+ __version__ = "1.12.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster_shared
3
- Version: 1.12.5
3
+ Version: 1.12.7
4
4
  Summary: Shared code between dagster and dagster-dg-core.
5
5
  Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-shared
6
6
  Author: Dagster Labs
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
13
14
  Classifier: License :: OSI Approved :: Apache Software License
14
15
  Classifier: Operating System :: OS Independent
15
16
  License-File: LICENSE
@@ -21,7 +22,6 @@ Requires-Dist: typing_extensions<5,>=4.11.0
21
22
  Requires-Dist: tomlkit
22
23
  Provides-Extra: test
23
24
  Requires-Dist: pytest; extra == "test"
24
- Requires-Dist: buildkite-test-collector; extra == "test"
25
25
  Requires-Dist: flaky; extra == "test"
26
26
  Dynamic: author
27
27
  Dynamic: author-email
@@ -5,7 +5,7 @@ dagster_shared/match.py,sha256=P9wQSvzb7a03jXlC-0w9msoX5bV_BE1uSvdYvavNO6M,3444
5
5
  dagster_shared/merger.py,sha256=c9cJTwHtgMXgR9MtB-KwZEMtQSXn13rF08F2ID5aDTg,1758
6
6
  dagster_shared/modules.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  dagster_shared/py.typed,sha256=mDShSrm8qg9qjacQc2F-rI8ATllqP6EdgHuEYxuCXZ0,7
8
- dagster_shared/version.py,sha256=4v8TGQDepA1SecAP1bl6pAHVU5O905enxAg_EyVjJZw,23
8
+ dagster_shared/version.py,sha256=2tyzZYgcForADG3tBrJC4WeSTZ1kx005eqIpHCIE71M,23
9
9
  dagster_shared/check/README.md,sha256=UlxRVMWJEoVAlaHWDvhobUpuNQGBG5-ddqZ6OIfLYnM,1352
10
10
  dagster_shared/check/__init__.py,sha256=CHSOqJpaeWr6skJT7jD8HnN5s4bdnoX4x94sGN55KqA,3482
11
11
  dagster_shared/check/builder.py,sha256=2Ne2EM_2tGm2zYMg0vRxqC5r-KLc746UNnXe1Fk_vRc,17311
@@ -14,13 +14,13 @@ dagster_shared/check/functions.py,sha256=PhFZkMag2q5MKulQjgyIs_O9_t0XqOnzNRdQFZT
14
14
  dagster_shared/check/record.py,sha256=vzwbmxQNQl3_oG74NRKgjlIDM2xpL5ZbKtKhoFNhNq4,412
15
15
  dagster_shared/cli/__init__.py,sha256=y2q8V4gn5IRxq962uGjMkgWqpMK0B3pongr2mMB2vvg,8781
16
16
  dagster_shared/dagster_model/__init__.py,sha256=MoUreIsyzBIjn1w2noiyR0CmBg2kiP2VhUGkXvFI5E8,1296
17
- dagster_shared/dagster_model/pydantic_compat_layer.py,sha256=9c2BmeucYvvfnmeSffOqadKX0Kitx1rBu-WW32A116Y,2892
17
+ dagster_shared/dagster_model/pydantic_compat_layer.py,sha256=nA3s7rOStkjNAOGNBlS3VhukBawRt1FAXkgLarDtxqY,3030
18
18
  dagster_shared/libraries/__init__.py,sha256=VBOVSB2MU2HZzUTarK-3JE-7k7xkhiggPZnaAsEcwNg,4669
19
19
  dagster_shared/plus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  dagster_shared/plus/config.py,sha256=0kAWocZFYh9NmCoOT348YUg0vQe9SEpJ_Ze9R3uyR-w,5756
21
21
  dagster_shared/plus/config_utils.py,sha256=eVvahsrGQdcYL1H3_63kXO2NKsVPtWXhlGFajvJPQ5w,6147
22
22
  dagster_shared/plus/login_server.py,sha256=zRc85NUHtxpgXGfzV1d4hq-n9ZdXTBiSmagUebwxqdE,3630
23
- dagster_shared/record/__init__.py,sha256=bOQHMcYGHKe5d3tasHNIPfXJAJUPvb7B1puZPjzdlFA,22576
23
+ dagster_shared/record/__init__.py,sha256=yfmDqHKt1fgwAzz9ACKicF61eRqcYqBLGY49F6JtliQ,22621
24
24
  dagster_shared/scaffold/__init__.py,sha256=xb5-ZdbZ5wSYYJy8VA1KGDnPodM6bKTCSBPS85Wqi_w,3759
25
25
  dagster_shared/serdes/__init__.py,sha256=BInlrdN_14uwPz0t32Dl1VH4D-7_rG1vUfZ0rw5DQc0,649
26
26
  dagster_shared/serdes/errors.py,sha256=qg_VZqtuYAlAXIjOp96bGs_z309ifDoHuT4sVnxJ6nA,142
@@ -37,7 +37,7 @@ dagster_shared/seven/json.py,sha256=TElHKCmD71QJSDKvFP4e_vLMoSAFsAllPAbmplzSN30,
37
37
  dagster_shared/seven/temp_dir.py,sha256=L03xfE14yxlcmjCI9NrViY36r4MMjaahfexJygMPaJo,354
38
38
  dagster_shared/seven/compat/__init__.py,sha256=8BqkAab5uZGmSyvBFpePjAaXR9seNDobs3TYI45nt5k,105
39
39
  dagster_shared/telemetry/__init__.py,sha256=_SLCyZSLGFmaZLujii-z7FK642ewI78Nm4eV8n-3Xxs,11335
40
- dagster_shared/utils/__init__.py,sha256=GlE5oHRzfRBD1AFV8MGPgSBexYNkVwh0-ODGSQ36D9E,2962
40
+ dagster_shared/utils/__init__.py,sha256=m4QRhlvU_XCN3BWcUr_mead-7Ui4XvQJo3SIDgljirU,4310
41
41
  dagster_shared/utils/cached_method.py,sha256=WQj_xtSTO5qIejFqxnLXpjIMRsiWe8aJ0IcZkkWBWxY,7183
42
42
  dagster_shared/utils/config.py,sha256=np_6pJ6r3xRKfV-cPeR6qVXebhj-Oznw3rhWP67miNM,3536
43
43
  dagster_shared/utils/hash.py,sha256=WA0FegijIAhMphC0gt30tTqpR6BecRk1GhIMtV71qbU,2060
@@ -47,8 +47,8 @@ dagster_shared/utils/warnings.py,sha256=yxiG8ghc3RwyomRItwIKQe6TrUdTlJAUX3BssOwe
47
47
  dagster_shared/yaml_utils/__init__.py,sha256=Ya7qT3aJGPC1TgD-pSkkhLX5U4QbrUkCsrUtZQeACXg,10529
48
48
  dagster_shared/yaml_utils/sample_yaml.py,sha256=YC-1h1P48F3QV-Uwo-MqzEkzlrMliXPfZM_X6ynZvTQ,5461
49
49
  dagster_shared/yaml_utils/source_position.py,sha256=yVSnHUkBYzWzLzqtyGbqRjH2b7oTeiE4K3b-uokYUIQ,9786
50
- dagster_shared-1.12.5.dist-info/licenses/LICENSE,sha256=hgU51ohULAFKZE2la8sartPYoUaAA14jxFAfFC4Tow0,11347
51
- dagster_shared-1.12.5.dist-info/METADATA,sha256=NWO8Qvp5Nwj6N58b5p6TKsZzaerPfhw9TAkmTybDD78,1153
52
- dagster_shared-1.12.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
53
- dagster_shared-1.12.5.dist-info/top_level.txt,sha256=S8ADcO4aTW07ONhLHXDxiuSkDzucgYKOlocB2x3r_dY,15
54
- dagster_shared-1.12.5.dist-info/RECORD,,
50
+ dagster_shared-1.12.7.dist-info/licenses/LICENSE,sha256=hgU51ohULAFKZE2la8sartPYoUaAA14jxFAfFC4Tow0,11347
51
+ dagster_shared-1.12.7.dist-info/METADATA,sha256=FMaGpagh34RNh_wzmfeEFdOIbaRaV0s0kNkikIQrdSg,1147
52
+ dagster_shared-1.12.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
53
+ dagster_shared-1.12.7.dist-info/top_level.txt,sha256=S8ADcO4aTW07ONhLHXDxiuSkDzucgYKOlocB2x3r_dY,15
54
+ dagster_shared-1.12.7.dist-info/RECORD,,