runnable 0.36.1__tar.gz → 0.37.0__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.
Files changed (72) hide show
  1. {runnable-0.36.1 → runnable-0.37.0}/.gitignore +1 -0
  2. {runnable-0.36.1 → runnable-0.37.0}/PKG-INFO +1 -1
  3. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/any_path.py +13 -2
  4. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/__init__.py +4 -1
  5. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/__init__.py +3 -1
  6. {runnable-0.36.1 → runnable-0.37.0}/pyproject.toml +4 -1
  7. {runnable-0.36.1 → runnable-0.37.0}/runnable/catalog.py +5 -2
  8. {runnable-0.36.1 → runnable-0.37.0}/runnable/context.py +1 -0
  9. {runnable-0.36.1 → runnable-0.37.0}/runnable/nodes.py +2 -0
  10. {runnable-0.36.1 → runnable-0.37.0}/runnable/sdk.py +8 -0
  11. {runnable-0.36.1 → runnable-0.37.0}/LICENSE +0 -0
  12. {runnable-0.36.1 → runnable-0.37.0}/README.md +0 -0
  13. {runnable-0.36.1 → runnable-0.37.0}/extensions/README.md +0 -0
  14. {runnable-0.36.1 → runnable-0.37.0}/extensions/__init__.py +0 -0
  15. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/README.md +0 -0
  16. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/file_system.py +0 -0
  17. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/minio.py +0 -0
  18. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/pyproject.toml +0 -0
  19. {runnable-0.36.1 → runnable-0.37.0}/extensions/catalog/s3.py +0 -0
  20. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/README.md +0 -0
  21. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/emulate.py +0 -0
  22. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/k8s.py +0 -0
  23. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/k8s_job_spec.yaml +0 -0
  24. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/local.py +0 -0
  25. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/local_container.py +0 -0
  26. {runnable-0.36.1 → runnable-0.37.0}/extensions/job_executor/pyproject.toml +0 -0
  27. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/README.md +0 -0
  28. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/__init__.py +0 -0
  29. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/conditional.py +0 -0
  30. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/fail.py +0 -0
  31. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/map.py +0 -0
  32. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/parallel.py +0 -0
  33. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/pyproject.toml +0 -0
  34. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/stub.py +0 -0
  35. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/success.py +0 -0
  36. {runnable-0.36.1 → runnable-0.37.0}/extensions/nodes/task.py +0 -0
  37. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/README.md +0 -0
  38. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/argo.py +0 -0
  39. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/emulate.py +0 -0
  40. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/local.py +0 -0
  41. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/local_container.py +0 -0
  42. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/mocked.py +0 -0
  43. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/pyproject.toml +0 -0
  44. {runnable-0.36.1 → runnable-0.37.0}/extensions/pipeline_executor/retry.py +0 -0
  45. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/README.md +0 -0
  46. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/__init__.py +0 -0
  47. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/any_path.py +0 -0
  48. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/chunked_fs.py +0 -0
  49. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/chunked_minio.py +0 -0
  50. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/db/implementation_FF.py +0 -0
  51. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/db/integration_FF.py +0 -0
  52. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/file_system.py +0 -0
  53. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/generic_chunked.py +0 -0
  54. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/minio.py +0 -0
  55. {runnable-0.36.1 → runnable-0.37.0}/extensions/run_log_store/pyproject.toml +0 -0
  56. {runnable-0.36.1 → runnable-0.37.0}/extensions/secrets/README.md +0 -0
  57. {runnable-0.36.1 → runnable-0.37.0}/extensions/secrets/dotenv.py +0 -0
  58. {runnable-0.36.1 → runnable-0.37.0}/extensions/secrets/pyproject.toml +0 -0
  59. {runnable-0.36.1 → runnable-0.37.0}/runnable/__init__.py +0 -0
  60. {runnable-0.36.1 → runnable-0.37.0}/runnable/cli.py +0 -0
  61. {runnable-0.36.1 → runnable-0.37.0}/runnable/datastore.py +0 -0
  62. {runnable-0.36.1 → runnable-0.37.0}/runnable/defaults.py +0 -0
  63. {runnable-0.36.1 → runnable-0.37.0}/runnable/entrypoints.py +0 -0
  64. {runnable-0.36.1 → runnable-0.37.0}/runnable/exceptions.py +0 -0
  65. {runnable-0.36.1 → runnable-0.37.0}/runnable/executor.py +0 -0
  66. {runnable-0.36.1 → runnable-0.37.0}/runnable/graph.py +0 -0
  67. {runnable-0.36.1 → runnable-0.37.0}/runnable/names.py +0 -0
  68. {runnable-0.36.1 → runnable-0.37.0}/runnable/parameters.py +0 -0
  69. {runnable-0.36.1 → runnable-0.37.0}/runnable/pickler.py +0 -0
  70. {runnable-0.36.1 → runnable-0.37.0}/runnable/secrets.py +0 -0
  71. {runnable-0.36.1 → runnable-0.37.0}/runnable/tasks.py +0 -0
  72. {runnable-0.36.1 → runnable-0.37.0}/runnable/utils.py +0 -0
@@ -157,3 +157,4 @@ cov.xml
157
157
  data/
158
158
 
159
159
  minikube/
160
+ .pth # For model saving and loading
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runnable
3
- Version: 0.36.1
3
+ Version: 0.37.0
4
4
  Summary: Add your description here
5
5
  Author-email: "Vammi, Vijay" <vijay.vammi@astrazeneca.com>
6
6
  License-File: LICENSE
@@ -95,7 +95,10 @@ class AnyPathCatalog(BaseCatalog):
95
95
  return data_catalogs
96
96
 
97
97
  def put(
98
- self, name: str, allow_file_not_found_exc: bool = False
98
+ self,
99
+ name: str,
100
+ allow_file_not_found_exc: bool = False,
101
+ store_copy: bool = True,
99
102
  ) -> List[DataCatalog]:
100
103
  """
101
104
  Put the files matching the glob pattern into the catalog.
@@ -154,7 +157,15 @@ class AnyPathCatalog(BaseCatalog):
154
157
  data_catalogs.append(data_catalog)
155
158
 
156
159
  # TODO: Think about syncing only if the file is changed
157
- self.upload_to_catalog(file)
160
+ if store_copy:
161
+ logger.debug(
162
+ f"Copying file {file} to the catalog location for run_id: {run_id}"
163
+ )
164
+ self.upload_to_catalog(file)
165
+ else:
166
+ logger.debug(
167
+ f"Not copying file {file} to the catalog location for run_id: {run_id}"
168
+ )
158
169
 
159
170
  if not data_catalogs and not allow_file_not_found_exc:
160
171
  raise Exception(f"Did not find any files matching {name} in {copy_from}")
@@ -29,6 +29,7 @@ class GenericJobExecutor(BaseJobExecutor):
29
29
  @property
30
30
  def _context(self):
31
31
  assert context.run_context
32
+ assert isinstance(context.run_context, context.JobContext)
32
33
  return context.run_context
33
34
 
34
35
  def _get_parameters(self) -> Dict[str, JsonParameter]:
@@ -147,7 +148,9 @@ class GenericJobExecutor(BaseJobExecutor):
147
148
  data_catalogs = []
148
149
  for name_pattern in catalog_settings:
149
150
  data_catalog = self._context.catalog.put(
150
- name=name_pattern, allow_file_not_found_exc=allow_file_not_found_exc
151
+ name=name_pattern,
152
+ allow_file_not_found_exc=allow_file_not_found_exc,
153
+ store_copy=self._context.catalog_store_copy,
151
154
  )
152
155
 
153
156
  logger.debug(f"Added data catalog: {data_catalog} to job log")
@@ -160,7 +160,9 @@ class GenericPipelineExecutor(BasePipelineExecutor):
160
160
 
161
161
  elif stage == "put":
162
162
  data_catalog = self._context.catalog.put(
163
- name=name_pattern, allow_file_not_found_exc=allow_file_no_found_exc
163
+ name=name_pattern,
164
+ allow_file_not_found_exc=allow_file_no_found_exc,
165
+ store_copy=node_catalog_settings.get("store_copy", True),
164
166
  )
165
167
  else:
166
168
  raise Exception(f"Stage {stage} not supported")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runnable"
3
- version = "0.36.1"
3
+ version = "0.37.0"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -58,6 +58,9 @@ docs = [
58
58
  release = [
59
59
  "python-semantic-release>=9.15.2",
60
60
  ]
61
+ examples-torch = [
62
+ "torch>=2.7.1",
63
+ ]
61
64
 
62
65
  [tool.uv.workspace]
63
66
  members = ["extensions/catalog",
@@ -57,7 +57,7 @@ class BaseCatalog(ABC, BaseModel):
57
57
 
58
58
  @abstractmethod
59
59
  def put(
60
- self, name: str, allow_file_not_found_exc: bool = False
60
+ self, name: str, allow_file_not_found_exc: bool = False, store_copy: bool = True
61
61
  ) -> List[DataCatalog]:
62
62
  """
63
63
  Put the file by 'name' from the 'compute_data_folder' in the catalog for the run_id.
@@ -120,7 +120,10 @@ class DoNothingCatalog(BaseCatalog):
120
120
  return []
121
121
 
122
122
  def put(
123
- self, name: str, allow_file_not_found_exc: bool = False
123
+ self,
124
+ name: str,
125
+ allow_file_not_found_exc: bool = False,
126
+ store_copy: bool = True,
124
127
  ) -> List[DataCatalog]:
125
128
  """
126
129
  Does nothing
@@ -475,6 +475,7 @@ class JobContext(RunnableContext):
475
475
  default=None,
476
476
  description="Catalog settings to be used for the job.",
477
477
  )
478
+ catalog_store_copy: bool = Field(default=True, alias="catalog_store_copy")
478
479
 
479
480
  @computed_field # type: ignore
480
481
  @cached_property
@@ -411,11 +411,13 @@ class TraversalNode(BaseNode):
411
411
  return self.overrides.get(executor_type) or ""
412
412
 
413
413
 
414
+ # Unfortunately, this is defined in 2 places. Look in SDK
414
415
  class CatalogStructure(BaseModel):
415
416
  model_config = ConfigDict(extra="forbid") # Need to forbid
416
417
 
417
418
  get: List[str] = Field(default_factory=list)
418
419
  put: List[str] = Field(default_factory=list)
420
+ store_copy: bool = Field(default=True, alias="store_copy")
419
421
 
420
422
 
421
423
  class ExecutableNode(TraversalNode):
@@ -60,6 +60,7 @@ class Catalog(BaseModel):
60
60
  Attributes:
61
61
  get (List[str]): List of glob patterns to get from central catalog to the compute data folder.
62
62
  put (List[str]): List of glob patterns to put into central catalog from the compute data folder.
63
+ store_copy (bool): Whether to store a copy of the data in the central catalog.
63
64
 
64
65
  Examples:
65
66
  >>> from runnable import Catalog
@@ -74,6 +75,7 @@ class Catalog(BaseModel):
74
75
  # compute_data_folder: str = Field(default="", alias="compute_data_folder")
75
76
  get: List[str] = Field(default_factory=list, alias="get")
76
77
  put: List[str] = Field(default_factory=list, alias="put")
78
+ store_copy: bool = Field(default=True, alias="store_copy")
77
79
 
78
80
 
79
81
  class BaseTraversal(ABC, BaseModel):
@@ -845,6 +847,11 @@ class BaseJob(BaseModel):
845
847
  return []
846
848
  return self.catalog.put
847
849
 
850
+ def return_bool_catalog_store_copy(self) -> bool:
851
+ if self.catalog is None:
852
+ return True
853
+ return self.catalog.store_copy
854
+
848
855
  def _is_called_for_definition(self) -> bool:
849
856
  """
850
857
  If the run context is set, we are coming in only to get the pipeline definition.
@@ -888,6 +895,7 @@ class BaseJob(BaseModel):
888
895
  }
889
896
 
890
897
  run_context = context.JobContext.model_validate(configurations)
898
+ run_context.catalog_store_copy = self.return_bool_catalog_store_copy()
891
899
 
892
900
  assert isinstance(run_context.job_executor, BaseJobExecutor)
893
901
 
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