datashare-python 0.10.6__tar.gz → 0.10.7__tar.gz
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.
- {datashare_python-0.10.6 → datashare_python-0.10.7}/PKG-INFO +1 -1
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/objects.py +8 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/utils.py +30 -9
- datashare_python-0.10.7/datashare_python/worker-template.tar.gz +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/pyproject.toml +1 -1
- datashare_python-0.10.6/datashare_python/worker-template.tar.gz +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/.gitignore +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/README.md +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/.gitignore +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/__init__.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/__main__.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/cli/__init__.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/cli/project.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/cli/task.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/cli/utils.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/cli/worker.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/config.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/conftest.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/constants.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/dependencies.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/discovery.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/exceptions.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/interceptors.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/logging_.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/mimetypes_.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/task_client.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/template.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/types_.py +0 -0
- {datashare_python-0.10.6 → datashare_python-0.10.7}/datashare_python/worker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: datashare-python
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.7
|
|
4
4
|
Summary: Manage Python tasks and local resources in Datashare
|
|
5
5
|
Project-URL: Homepage, https://icij.github.io/datashare-python/
|
|
6
6
|
Project-URL: Documentation, https://icij.github.io/datashare-python/
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
1
3
|
import logging
|
|
2
4
|
import os
|
|
3
5
|
from abc import ABC
|
|
@@ -63,6 +65,12 @@ Predicate = Callable[[T], bool] | Callable[[T], Awaitable[bool]]
|
|
|
63
65
|
class BaseModel(_BaseModel):
|
|
64
66
|
model_config = merge_configs(icij_config(), no_enum_values_config())
|
|
65
67
|
|
|
68
|
+
def __hash__(self) -> int:
|
|
69
|
+
digest = hashlib.md5(
|
|
70
|
+
json.dumps(self.model_dump(mode="json"), sort_keys=True).encode()
|
|
71
|
+
).digest()
|
|
72
|
+
return int.from_bytes(digest[:8])
|
|
73
|
+
|
|
66
74
|
|
|
67
75
|
class DatashareModel(BaseModel):
|
|
68
76
|
model_config = merge_configs(BaseModel.model_config, lowercamel_case_config())
|
|
@@ -32,6 +32,7 @@ import temporalio
|
|
|
32
32
|
from aiofile import async_open
|
|
33
33
|
from lru import LRU
|
|
34
34
|
from pydantic import ValidationError
|
|
35
|
+
from pydantic.alias_generators import to_snake
|
|
35
36
|
from temporalio import activity, workflow
|
|
36
37
|
from temporalio.api.common.v1 import Payload
|
|
37
38
|
from temporalio.client import Client
|
|
@@ -62,6 +63,8 @@ from .objects import (
|
|
|
62
63
|
)
|
|
63
64
|
from .types_ import RawAsyncProgressHandler
|
|
64
65
|
|
|
66
|
+
_CACHE_DIR = "__cache__"
|
|
67
|
+
|
|
65
68
|
logger = logging.getLogger(__name__)
|
|
66
69
|
|
|
67
70
|
DependencyLabel = str | None
|
|
@@ -533,7 +536,11 @@ activity_contextual_id = contextual_id
|
|
|
533
536
|
|
|
534
537
|
|
|
535
538
|
def _contextual_path(
|
|
536
|
-
*,
|
|
539
|
+
*,
|
|
540
|
+
wf_context: bool = True,
|
|
541
|
+
act_context: bool = True,
|
|
542
|
+
run_context: bool = False,
|
|
543
|
+
caching_key: str | None = None,
|
|
537
544
|
) -> Path:
|
|
538
545
|
act_info = activity.info()
|
|
539
546
|
path = []
|
|
@@ -541,14 +548,18 @@ def _contextual_path(
|
|
|
541
548
|
raise ValueError("at least one of wf_context and act_context must be True")
|
|
542
549
|
if wf_context:
|
|
543
550
|
path = [act_info.workflow_type]
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
551
|
+
if not caching_key:
|
|
552
|
+
path.append(act_info.workflow_id)
|
|
553
|
+
if run_context:
|
|
554
|
+
path.append(act_info.workflow_run_id)
|
|
547
555
|
if act_context:
|
|
548
556
|
path.append(act_info.activity_type)
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
557
|
+
if not caching_key:
|
|
558
|
+
path.append(act_info.activity_id)
|
|
559
|
+
if run_context:
|
|
560
|
+
path.append(act_info.activity_run_id)
|
|
561
|
+
if caching_key:
|
|
562
|
+
path += [_CACHE_DIR, caching_key]
|
|
552
563
|
return Path(*path)
|
|
553
564
|
|
|
554
565
|
|
|
@@ -559,9 +570,13 @@ def activity_workdir(
|
|
|
559
570
|
wf_context: bool = True,
|
|
560
571
|
act_context: bool = True,
|
|
561
572
|
run_context: bool = False,
|
|
573
|
+
caching_key: str | None = None,
|
|
562
574
|
) -> Path:
|
|
563
575
|
ctx_path = _contextual_path(
|
|
564
|
-
wf_context=wf_context,
|
|
576
|
+
wf_context=wf_context,
|
|
577
|
+
act_context=act_context,
|
|
578
|
+
run_context=run_context,
|
|
579
|
+
caching_key=caching_key,
|
|
565
580
|
)
|
|
566
581
|
return workdir.joinpath(project, ctx_path)
|
|
567
582
|
|
|
@@ -808,4 +823,10 @@ def async_enter_cm(
|
|
|
808
823
|
|
|
809
824
|
|
|
810
825
|
def config_cache_key(config: BaseModel) -> str:
|
|
811
|
-
|
|
826
|
+
# BaseModel support deterministic hash we can call hash on it
|
|
827
|
+
config_label = (
|
|
828
|
+
to_snake(config.__class__.__name__.replace("Config", ""))
|
|
829
|
+
.lower()
|
|
830
|
+
.replace("_", "-")
|
|
831
|
+
)
|
|
832
|
+
return f"{config_label}-{str(hash(config))}"
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|