Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1844d87
docs(pipeline): add pure-descriptor refactor design spec (ENG-493)
kurodo3[bot] May 21, 2026
2d436fa
docs(pipeline): add implementation plan for ENG-493 pure-descriptor r…
kurodo3[bot] May 21, 2026
a82b19f
docs(pipeline): correct FunctionNode/OperatorNode split — proper sibl…
kurodo3[bot] May 22, 2026
65fc68f
refactor(nodes): replace SourceSpec with schema-only SourceNode + add…
kurodo3[bot] May 22, 2026
2c17844
fix(nodes): clear content_hash cache on SourceJobNode._concrete mutat…
kurodo3[bot] May 22, 2026
4f4010b
refactor(nodes): split FunctionNode → FunctionNodeBase + FunctionNode…
kurodo3[bot] May 22, 2026
3e3e2a8
fix(nodes): FunctionJobNode.clear_cache uses super(); as_node forward…
kurodo3[bot] May 22, 2026
7a23d1d
refactor(nodes): split OperatorNode → OperatorNodeBase + OperatorNode…
kurodo3[bot] May 22, 2026
2704d85
refactor(pipeline): remove Pipeline.bind(); add PipelineJob.from_pipe…
kurodo3[bot] May 22, 2026
3153b48
docs(pipeline): update docstrings to reference PipelineJob.from_pipel…
kurodo3[bot] May 22, 2026
694d72d
refactor(pipeline): extract AbstractPipelineBase with shared recordin…
kurodo3[bot] May 22, 2026
df3c785
docs(pipeline): add Google-style docstrings to AbstractPipelineBase a…
kurodo3[bot] May 22, 2026
b3ece05
refactor(pipeline): PipelineJob recording creates FunctionJobNode/Ope…
kurodo3[bot] May 22, 2026
07930dd
refactor(serialization): update Pipeline save/load for SourceNode for…
kurodo3[bot] May 22, 2026
0f1c7ab
refactor(sources): delete SourceSpec; update all references to Source…
kurodo3[bot] May 22, 2026
ed7f7bf
fix(pipeline): address Copilot PR review — validate sources in from_p…
kurodo3[bot] May 22, 2026
72e99e1
test(test-objective): migrate test-objective node tests to job-node API
kurodo3[bot] May 22, 2026
e8d414c
fix(pipeline): address Copilot review comments round 2
kurodo3[bot] May 22, 2026
3bdcfc9
fix(nodes): address Copilot review comments round 3
kurodo3[bot] May 22, 2026
566a935
revert(nodes): restore SourceJobNode.content_hash() hasher override
kurodo3[bot] May 22, 2026
39247a4
refactor(pipeline): address eywalker PR review comments (ENG-493)
kurodo3[bot] May 22, 2026
01119da
docs(operator_node): add Google-style docstring to OperatorNodeBase._…
kurodo3[bot] May 22, 2026
d007dbf
Merge remote-tracking branch 'origin/main' into eywalker/eng-493-refa…
kurodo3[bot] May 23, 2026
3f15577
fix(merge): resolve conflicts from origin/main merge
kurodo3[bot] May 23, 2026
33150c4
fix(nodes): raise RuntimeError from UNAVAILABLE as_node(); invalidate…
kurodo3[bot] May 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/orcapod/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
FunctionPod,
function_pod,
)
from .core.sources.source_spec import SourceSpec
from .core.nodes.source_node import SourceNode
from .pipeline import Pipeline, PipelineJob

# Subpackage re-exports for clean public API
Expand All @@ -18,7 +18,7 @@
"function_pod",
"Pipeline",
"PipelineJob",
"SourceSpec",
"SourceNode",
"databases",
"nodes",
"operators",
Expand Down
20 changes: 20 additions & 0 deletions src/orcapod/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,17 @@ def __eq__(self, other: object) -> bool:

return self.identity_structure() == other.identity_structure()

def _invalidate_content_hash_cache(self) -> None:
"""Invalidate the cached content hash.

Call this after any mutation that changes the object's semantic
content so that the next call to ``content_hash()`` recomputes
from scratch. Subclasses must use this method rather than
accessing ``_content_hash_cache`` directly.
"""
self._content_hash_cache.clear()
self._cached_int_hash = None


class PipelineElementBase(DataContextMixin, ABC):
"""
Expand Down Expand Up @@ -270,6 +281,15 @@ def pipeline_resolver(obj: Any) -> ContentHash:
)
return self._pipeline_hash_cache[cache_key]

def _invalidate_pipeline_hash_cache(self) -> None:
"""Invalidate the cached pipeline hash.

Call this after any structural mutation (e.g. attaching a database)
that changes this element's pipeline identity. Subclasses must use
this method rather than accessing ``_pipeline_hash_cache`` directly.
"""
self._pipeline_hash_cache.clear()


class TemporalMixin:
"""
Expand Down
14 changes: 11 additions & 3 deletions src/orcapod/core/nodes/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
from typing import TypeAlias

from .function_node import FunctionNode
from .operator_node import OperatorNode
from .source_node import SourceNode
from .function_node import FunctionJobNode, FunctionNode, FunctionNodeBase
from .operator_node import OperatorJobNode, OperatorNode, OperatorNodeBase
from .source_node import SourceJobNode, SourceNode, SourceNodeBase

GraphNode: TypeAlias = SourceNode | FunctionNode | OperatorNode
JobNode: TypeAlias = SourceJobNode | FunctionJobNode | OperatorJobNode

__all__ = [
"FunctionJobNode",
"FunctionNode",
"FunctionNodeBase",
"GraphNode",
"JobNode",
"OperatorJobNode",
"OperatorNode",
"OperatorNodeBase",
"SourceJobNode",
"SourceNode",
"SourceNodeBase",
]
Loading
Loading