Data Pipeline Patterns
Pipeline Stages
A small pipeline can name each intermediate result so the data movement stays visible.
staged pipelines
Named stages make filtering, transforming, and summarizing easier to inspect.
Pipeline Stages
pipeline_stages.py
Replay: real traced execution (multi-file project)
tasks = [
{"title": "docs", "done": True},
{"title": "tests", "done": False},
{"title": "deploy", "done": False},
]
show_done = False
selected = []
for task in tasks:
if show_done or not task["done"]:
selected.append(task)
titles = []
for task in selected:
titles.append(task["title"].upper())
print("tasks=" + ",".join(titles))
tasks = [
{"title": "docs", "done": True},
{"title": "tests", "done": False},
{"title": "deploy", "done": False},
]
show_done = True
selected = []
for task in tasks:
if show_done or not task["done"]:
selected.append(task)
titles = []
for task in selected:
titles.append(task["title"].upper())
print("tasks=" + ",".join(titles))
tasks ← [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]
1tasks→ [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}] = [2 {"title": "docs", "done": True},3 {"title": "tests", "done": False},4 {"title": "deploy", "done": False},5]67show_done→ False = False #@show_done=True89selected→ [] = []10for task in tasks:for task in tasks:
pass 1 of 39selected = []10for task{'title': 'docs', 'done': True} in tasks[{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]:11 if show_done or not task["done"]:12 selected.append(task)All 3 passes — pass 1 is the card above pass taskshow_donetask[”done”]selected1 {'title': 'docs', 'done': True} — — — 2 {'title': 'tests', 'done': False} False False [] → [{'title': 'tests', 'done': False}] 3 {'title': 'deploy', 'done': False} False False [{'title': 'tests', 'done': False}] → [{'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}] selected ← [{'title': 'tests', 'done': False}]
pass 1 of 210for task in tasks:11 if show_doneFalse or not task["done"]False:12 selected→ [{'title': 'tests', 'done': False}].append(task{'title': 'tests', 'done': False})selected ← [{'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]
pass 2 of 210for task in tasks:11 if show_doneFalse or not task["done"]False:12 selected→ [{'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}].append(task{'title': 'deploy', 'done': False})titles ← []
14titles→ [] = []15for task in selected:titles ← ['TESTS']
pass 1 of 214titles = []15for task{'title': 'tests', 'done': False} in selected[{'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]:16 titles→ ['TESTS'].append(task["title"]tests.upper())titles ← ['TESTS', 'DEPLOY']
pass 2 of 214titles = []15for task{'title': 'deploy', 'done': False} in selected[{'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]:16 titles→ ['TESTS', 'DEPLOY'].append(task["title"]deploy.upper())print("tasks=" + ",".join(titles))
18print("tasks=" + ",".join(titles['TESTS', 'DEPLOY']))outputtasks=TESTS,DEPLOY
tasks ← [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]
1tasks→ [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}] = [2 {"title": "docs", "done": True},3 {"title": "tests", "done": False},4 {"title": "deploy", "done": False},5]67show_done→ True = True89selected→ [] = []10for task in tasks:for task in tasks:
pass 1 of 39selected = []10for task{'title': 'docs', 'done': True} in tasks[{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]:11 if show_done or not task["done"]:12 selected.append(task)All 3 passes — pass 1 is the card above pass task1 {'title': 'docs', 'done': True} 2 {'title': 'tests', 'done': False} 3 {'title': 'deploy', 'done': False} selected ← [{'title': 'docs', 'done': True}]
pass 1 of 310for task in tasks:11 if show_doneTrue or not task["done"]True:12 selected→ [{'title': 'docs', 'done': True}].append(task{'title': 'docs', 'done': True})All 3 passes — pass 1 is the card above pass task[”done”]taskselected1 True {'title': 'docs', 'done': True} [] → [{'title': 'docs', 'done': True}] 2 False {'title': 'tests', 'done': False} [{'title': 'docs', 'done': True}] → [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}] 3 False {'title': 'deploy', 'done': False} [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}] → [{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}] titles ← []
14titles→ [] = []15for task in selected:titles ← ['DOCS']
pass 1 of 314titles = []15for task{'title': 'docs', 'done': True} in selected[{'title': 'docs', 'done': True}, {'title': 'tests', 'done': False}, {'title': 'deploy', 'done': False}]:16 titles→ ['DOCS'].append(task["title"]docs.upper())All 3 passes — pass 1 is the card above pass tasktask[”title”]titles1 {'title': 'docs', 'done': True} docs [] → ['DOCS'] 2 {'title': 'tests', 'done': False} tests ['DOCS'] → ['DOCS', 'TESTS'] 3 {'title': 'deploy', 'done': False} deploy ['DOCS', 'TESTS'] → ['DOCS', 'TESTS', 'DEPLOY'] print("tasks=" + ",".join(titles))
18print("tasks=" + ",".join(titles['DOCS', 'TESTS', 'DEPLOY']))outputtasks=DOCS,TESTS,DEPLOY