fred-oss 0.37.0__tar.gz → 0.38.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 (92) hide show
  1. {fred_oss-0.37.0/src/main/fred_oss.egg-info → fred_oss-0.38.0}/PKG-INFO +1 -1
  2. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/impl.py +25 -2
  3. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/result.py +23 -2
  4. fred_oss-0.38.0/src/main/fred/version +1 -0
  5. {fred_oss-0.37.0 → fred_oss-0.38.0/src/main/fred_oss.egg-info}/PKG-INFO +1 -1
  6. fred_oss-0.37.0/src/main/fred/version +0 -1
  7. {fred_oss-0.37.0 → fred_oss-0.38.0}/MANIFEST.in +0 -0
  8. {fred_oss-0.37.0 → fred_oss-0.38.0}/NOTICE.txt +0 -0
  9. {fred_oss-0.37.0 → fred_oss-0.38.0}/README.md +0 -0
  10. {fred_oss-0.37.0 → fred_oss-0.38.0}/requirements.txt +0 -0
  11. {fred_oss-0.37.0 → fred_oss-0.38.0}/setup.cfg +0 -0
  12. {fred_oss-0.37.0 → fred_oss-0.38.0}/setup.py +0 -0
  13. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/cli/__init__.py +0 -0
  14. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/cli/__main__.py +0 -0
  15. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/cli/interface.py +0 -0
  16. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/cli/main.py +0 -0
  17. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/__init__.py +0 -0
  18. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/comp/__init__.py +0 -0
  19. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/comp/_keyval.py +0 -0
  20. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/comp/_queue.py +0 -0
  21. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/comp/catalog.py +0 -0
  22. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/comp/interface.py +0 -0
  23. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/__init__.py +0 -0
  24. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/_redis.py +0 -0
  25. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/_stdlib.py +0 -0
  26. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/catalog.py +0 -0
  27. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/interface.py +0 -0
  28. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/dao/service/utils.py +0 -0
  29. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/__init__.py +0 -0
  30. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/callback/__init__.py +0 -0
  31. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/callback/_function.py +0 -0
  32. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/callback/catalog.py +0 -0
  33. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/callback/interface.py +0 -0
  34. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/settings.py +0 -0
  35. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/future/utils.py +0 -0
  36. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/__init__.py +0 -0
  37. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/cli_ext.py +0 -0
  38. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/runtime.py +0 -0
  39. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/runtimes/__init__.py +0 -0
  40. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/runtimes/scanner.py +0 -0
  41. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/runtimes/sync.py +0 -0
  42. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/wrappers/__init__.py +0 -0
  43. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/databricks/wrappers/dbutils.py +0 -0
  44. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/runpod/__init__.py +0 -0
  45. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/runpod/cli_ext.py +0 -0
  46. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/integrations/runpod/helper.py +0 -0
  47. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/maturity.py +0 -0
  48. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/monad/__init__.py +0 -0
  49. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/monad/_either.py +0 -0
  50. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/monad/catalog.py +0 -0
  51. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/monad/interface.py +0 -0
  52. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/settings.py +0 -0
  53. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/utils/__init__.py +0 -0
  54. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/utils/dateops.py +0 -0
  55. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/utils/runtime.py +0 -0
  56. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/version.py +0 -0
  57. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/__init__.py +0 -0
  58. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/interface.py +0 -0
  59. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/__init__.py +0 -0
  60. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/backend.py +0 -0
  61. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/client.py +0 -0
  62. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/handler.py +0 -0
  63. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/__init__.py +0 -0
  64. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/_handler.py +0 -0
  65. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/_item.py +0 -0
  66. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/_request.py +0 -0
  67. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/_runner_spec.py +0 -0
  68. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/catalog.py +0 -0
  69. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/model/interface.py +0 -0
  70. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/plugins/__init__.py +0 -0
  71. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/plugins/_local.py +0 -0
  72. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/plugins/_runpod.py +0 -0
  73. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/plugins/catalog.py +0 -0
  74. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/plugins/interface.py +0 -0
  75. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/__init__.py +0 -0
  76. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/auth.py +0 -0
  77. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/cli_ext.py +0 -0
  78. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/routers/__init__.py +0 -0
  79. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/routers/_runner.py +0 -0
  80. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/routers/catalog.py +0 -0
  81. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/routers/interface.py +0 -0
  82. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/server.py +0 -0
  83. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/rest/settings.py +0 -0
  84. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/settings.py +0 -0
  85. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/signal.py +0 -0
  86. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/status.py +0 -0
  87. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred/worker/runner/utils.py +0 -0
  88. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred_oss.egg-info/SOURCES.txt +0 -0
  89. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred_oss.egg-info/dependency_links.txt +0 -0
  90. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred_oss.egg-info/entry_points.txt +0 -0
  91. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred_oss.egg-info/requires.txt +0 -0
  92. {fred_oss-0.37.0 → fred_oss-0.38.0}/src/main/fred_oss.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fred-oss
3
- Version: 0.37.0
3
+ Version: 0.38.0
4
4
  Summary: FREDOSS
5
5
  Home-page: https://fred.fahera.mx
6
6
  Author: Fahera Research, Education, and Development
@@ -62,6 +62,7 @@ class Future(MonadInterface[A]):
62
62
  function: Callable[..., A],
63
63
  on_start: Optional[CallbackInterface] = None,
64
64
  on_complete: Optional[CallbackInterface] = None,
65
+ parent_id: Optional[str] = None,
65
66
  **kwargs
66
67
  ):
67
68
  """Initializes a Future with the provided function to be executed asynchronously.
@@ -76,11 +77,12 @@ class Future(MonadInterface[A]):
76
77
  All keyword arguments except 'future_id' are forwarded to the target function.
77
78
  """
78
79
  # Create a new available future
79
- future = FutureUndefinedPending.auto(future_id=kwargs.pop("future_id", None))
80
+ future = FutureUndefinedPending.auto(parent_id=parent_id, future_id=kwargs.pop("future_id", None))
80
81
  # Register the Future-ID and define the available future via the provided function.
81
82
  # Note: The 'apply' method is blocking by itself; thus, we run it in a separate thread.
82
83
  # Note: The thread is a daemon to ensure it does not block program exit.
83
84
  self.future_id = future.future_id
85
+ self.parent_id = parent_id
84
86
  self.thread = Thread(
85
87
  target=lambda: future.apply(
86
88
  function=function,
@@ -220,6 +222,7 @@ class Future(MonadInterface[A]):
220
222
  Future[B]: A new Future representing the chained operation."""
221
223
  # TODO: Is there a more efficient implementation?
222
224
  return Future(
225
+ parent_id=self.future_id,
223
226
  function=lambda:
224
227
  function(self.wait_and_resolve(timeout=timeout))
225
228
  .wait_and_resolve(timeout=timeout)
@@ -241,7 +244,10 @@ class Future(MonadInterface[A]):
241
244
  and returns a new value.
242
245
  Returns: Future[B]: A new Future containing the transformed result.
243
246
  """
244
- return Future(function=lambda: function(self.wait_and_resolve()))
247
+ return Future(
248
+ function=lambda: function(self.wait_and_resolve()),
249
+ parent_id=self.future_id,
250
+ )
245
251
 
246
252
  @classmethod
247
253
  def pullsync(
@@ -283,3 +289,20 @@ class Future(MonadInterface[A]):
283
289
  on_complete=on_complete,
284
290
  **kwargs
285
291
  )
292
+ def lineage(self) -> list[str]:
293
+ """Retrieves the lineage of the future, tracing back through its parent futures.
294
+ This method is useful for debugging and understanding the sequence of computations
295
+ that led to the current future.
296
+ Returns:
297
+ list[str]: A list of future IDs representing the lineage, starting from the current future
298
+ and tracing back through its parents.
299
+ """
300
+ logger.warning(
301
+ "The 'lineage' method should only be used for debugging purposes "
302
+ "as it may have performance implications and unreliable lineage due to "
303
+ "possible missing parent_id values caused by cleanup or TTL expiration."
304
+ )
305
+ if not (fr := FutureResult.from_backend(future_id=self.future_id)):
306
+ logger.error(f"Current future_id '{self.future_id}' does not exist in backend.")
307
+ return []
308
+ return fr._lineage()
@@ -79,6 +79,7 @@ class FutureResult(Generic[A], FutureBackend.infer_backend()):
79
79
  It uses a key-value store to persist the state and result of the Future, allowing for
80
80
  retrieval and management of asynchronous tasks."""
81
81
  future_id: str
82
+ parent_id: Optional[str]
82
83
 
83
84
  @staticmethod
84
85
  def _get_future_keyname(future_id: str) -> str:
@@ -131,7 +132,24 @@ class FutureResult(Generic[A], FutureBackend.infer_backend()):
131
132
 
132
133
  @classmethod
133
134
  def from_backend(cls, future_id: str) -> Optional['FutureResult[A]']:
134
- return FutureResult(future_id=future_id)._from_backend()
135
+ return FutureResult(future_id=future_id, parent_id=None)._from_backend()
136
+
137
+ @property
138
+ def _pre(self) -> Optional['FutureResult']:
139
+ if not self.parent_id:
140
+ return None
141
+ return FutureResult.from_backend(future_id=self.parent_id)
142
+
143
+ def _lineage(self) -> list[str]:
144
+ if not self.parent_id:
145
+ return [self.future_id]
146
+ if not (parent := self._pre):
147
+ logger.warning(
148
+ f"Cannot retrieve full lineage for Future[{self.future_id}] "
149
+ f"due to missing parent_id '{self.parent_id}'"
150
+ )
151
+ return [self.future_id, self.parent_id]
152
+ return [self.future_id, *parent._lineage()]
135
153
 
136
154
 
137
155
  @dataclass(frozen=True, slots=False)
@@ -149,8 +167,9 @@ class FutureUndefinedPending(FutureResult[A]):
149
167
  FutureUndefinedPending[A]: A new instance of FutureUndefinedPending with a unique future_id.
150
168
  """
151
169
  import uuid
170
+ parent_id = kwargs.pop("parent_id", None)
152
171
  future_id = kwargs.pop("future_id", None) or str(uuid.uuid4())
153
- return FutureUndefinedPending[A](future_id=future_id, **kwargs)
172
+ return FutureUndefinedPending[A](future_id=future_id, parent_id=parent_id, **kwargs)
154
173
 
155
174
  def __post_init__(self):
156
175
  logger.debug(f"Future[{self.future_id}] initialized and pending execution")
@@ -183,6 +202,7 @@ class FutureUndefinedPending(FutureResult[A]):
183
202
  """
184
203
  fip = FutureUndefinedInProgress[A](
185
204
  future_id=self.future_id,
205
+ parent_id=self.parent_id,
186
206
  started_at=perf_counter(),
187
207
  function_name=function.__name__,
188
208
  )
@@ -257,6 +277,7 @@ class FutureUndefinedInProgress(FutureResult[A]):
257
277
  raise e
258
278
  future_defined = FutureDefined(
259
279
  future_id=self.future_id,
280
+ parent_id=self.parent_id,
260
281
  value=value,
261
282
  ok=ok,
262
283
  )
@@ -0,0 +1 @@
1
+ 0.38.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fred-oss
3
- Version: 0.37.0
3
+ Version: 0.38.0
4
4
  Summary: FREDOSS
5
5
  Home-page: https://fred.fahera.mx
6
6
  Author: Fahera Research, Education, and Development
@@ -1 +0,0 @@
1
- 0.37.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes