Jerry-Thomas: a stream-first, plugin-friendly data pipeline (mixology-themed CLI)
Project description
Datapipeline Runtime
Jerry Thomas is a time-series data pipeline runtime. It reads source data, maps it into ordered record streams, applies declarative transforms, and serves datasets for analysis or model training.
The runtime is iterator-first: streams are processed on demand, with explicit sorting, artifacts, observability, built-in transforms, and plugin entry points for custom loaders, parsers, mappers, and stream combiners.
Core assumptions
- Every record carries a timezone-aware
timeattribute. Time-zone awareness is a quality gate for correct sample assembly.- Samples are grouped by
sample.cadence, plus optionalsample.keyssuch assecurity_id.partition_byis the complete identity of an independent record series. Datasetsample.keysselect which of those fields identify rows; remaining partition fields are appended to series IDs.
Why You Might Use It
- Materialize canonical time-series datasets from disparate sources.
- Preview and debug each stage of the pipeline without writing ad-hoc scripts.
- Export schema-aware Parquet tables for fast Pandas, Polars, and Arrow research, then reingest derived Parquet series through Jerry's normal validation.
- Enforce coverage/quality gates and publish metadata and scaler statistics for downstream ML teams.
- Extend the runtime with entry-point driven plugins for domain-specific I/O, mapping, combining, and custom operations.
- Consume final samples or bounded, metadata-ordered NumPy batches directly from Python.
Quick Start
From zero to a served dataset:
python -m pip install -U jerry-thomas
jerry demo init
cd demo
python -m pip install -e .
jerry serve --dataset demo --limit 3
The generated demo is a self-contained workspace. Scaffold commands do not
modify a parent jerry.yaml; add a dataset alias explicitly when you want to
integrate a generated project into another workspace.
Create Your Own Plugin + First Stream
jerry plugin init my-datapipeline --out lib/
cd lib/my-datapipeline
# Scaffold source YAML, DTO/parser, domain, mapper, and stream.
jerry inflow create
# Reinstall after commands that update entry points (pyproject.toml).
python -m pip install -e .
# Fill in the generated source and mapping templates, then serve.
jerry serve --limit 3
Import paths use the normalized package name: my_datapipeline for a
my-datapipeline distribution. Reinstall the plugin after scaffolding or
manually changing entry points.
Preview a Pipeline
jerry serve --preview <stage> stops at one stable boundary: input,
canonical, records, series, samples, or postprocess. Preview bypasses
split output so the selected stage can be inspected directly. Sequence
construction runs before dataset routing and should remain causal; scaling is
applied only when a full serve selects a fold output.
See the CLI reference for the exact value emitted at each boundary and Artifacts for split and scaler behavior.
CLI Cheat Sheet
Profile commands run enabled profiles by default. --profile <name> selects
that profile explicitly, including one configured with enabled: false.
jerry demo init: create the standalone demo plugin.jerry plugin init <name> --out lib/: create a plugin workspace.jerry inflow create: scaffold one source-backed stream end to end.jerry serve: stream enabled serve profiles.jerry build: build the series artifact, scaler statistics, and metadata.jerry inspect: run coverage, matrix, or custom inspection profiles.jerry materialize: write configured streams to durable.jsonlor gzip-compressed.jsonl.gzfiles.jerry clean [--yes] [--older-than <age>]: lists or removes stale sort spill directories. It does not delete materialized outputs.
Use jerry <command> --help for current flags and the
CLI reference for command behavior.
MLOps & Reproducibility
jerry buildbuilds deterministic series, scaler, and metadata artifacts. Builds are keyed by configuration and local-source snapshots, and skip work when nothing changed unless you pass--force.- Filesystem serve output is run-scoped under
<output-directory>/runs/<run_id>/dataset/. Normal profiles write<profile>.<ext>; split profiles write<profile>.<fold-id>.<role>.<ext>. - Versioning: tag the project config + plugin code in Git and pair with a data versioning tool like DVC for raw sources. With those inputs pinned, interim datasets and artifacts can be regenerated instead of stored.
Concepts
Workspace (jerry.yaml)
datasets: dataset aliases →project.yamlpaths (relative tojerry.yaml).default_dataset: which dataset project commands use when you omit--dataset/--project.plugin_root: where scaffolding commands write Python code (src/<package>/...) and where they look forpyproject.toml.
Plugin Package
These live under lib/<plugin>/src/<package>/:
dtos/*.py: DTO models (raw source shapes).parsers/*.py: raw -> DTO parsers (referenced by source YAML via entry point).domains/<domain>/model.py: domain record models.mappers/*.py: iterator mappings from parsed values to domain records.combiners/*.py: functions combining broadcast or aligned domain records.loaders/*.py: optional custom loaders for inputs beyond built-in filesystem and HTTP transports.pyproject.toml: entry points for loaders, parsers, mappers, and combiners (rerunpip install -e lib/<plugin>after changes).
Source to Domain Record
- Built-in filesystem and HTTP transports read input through the configured
reader. Custom loaders handle other protocols. - A parser converts each row into a source-shaped DTO and may drop invalid rows.
- A mapper converts DTOs into canonical domain records shared by downstream
streams. Every record has a timezone-aware
timefield. - Custom loaders are for behavior such as pagination, authentication, or proprietary protocols. See Extending the runtime.
Transforms (Preprocess -> Ordered Stream -> Series -> Sample)
- Preprocess transforms run on mapped domain records before ordering. Each transform operates on one record at a time. Configure source-backed streams under
preprocess:. - Ordered transforms run after ordering (dedupe, cadence enforcement, lag/lead, rolling, derive, fills). These operate across a sequence of records for a partition because they depend on sorted partition/time order and cadence. Configure streams under
transforms:. - Series shaping runs after stream regularization.
sequenceshapes the per-series payload for vectorization;scalemarks feature or target vectors that receive the selected dataset fold's scaler during full serving. - Postprocess policies select assembled vector columns and filter samples by coverage. Configure them under
postprocess:indataset.yaml. - Transform lists contain flat, validated built-in operations. Each item has an
operationdiscriminator and that operation's fields. See the transform guide for the supported operations.
Glossary
- Source alias:
sources/*.yaml:id(referenced by source-backed streams underfrom.source). - Stream id:
streams/*.yaml:id(referenced bydataset.yamlunderstream:). - Sample key: sample identity: floored time plus optional
dataset.sample.keys. - Partition: complete identity of an independent record series, declared by
stream
partition_byand used as the state boundary for history-based transforms. - Series ID fields: partition fields not present in
dataset.sample.keys; these are appended to series IDs in partition order. - Group: sample cadence set by
dataset.sample.cadence. - Preview stage: stable semantic boundary selected with
jerry serve --preview <stage>. - Sort spill: ordered stages sort pickle-serializable values in bounded serialized buffers and spill temporary runs when the next value would exceed the configured buffer.
Documentation
- Configuration: config layout, precedence, and YAML reference.
- Data flow: the YAML reference chain from workspace to output.
- CLI: command behavior beyond
--help. - Transforms: preprocess, ordered, series, and postprocess stages.
- Artifacts: dependencies, freshness, splitting, and serving.
- Python integrations: final-sample and bounded model-batch iterators.
- Research workflow: export samples to Parquet, derive a series with Polars, and reingest it into Jerry.
- Extending: plugin entry points and contracts.
- Architecture: runtime and pipeline design.
Development
See CONTRIBUTING.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jerry_thomas-7.0.1.tar.gz.
File metadata
- Download URL: jerry_thomas-7.0.1.tar.gz
- Upload date:
- Size: 191.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6988d9ad7a64a67a9b54b7741b6caf8f590d256d3d0ac68bb7612163ec643c87
|
|
| MD5 |
b0d06f214004db53b15a2273af19080c
|
|
| BLAKE2b-256 |
1e0632b7d2e9fd549dbc9b528a399f7545aa8f97c8b0a4537b5ebb6109b755eb
|
Provenance
The following attestation bundles were made for jerry_thomas-7.0.1.tar.gz:
Publisher:
workflow.yml on mr-lovalova/datapipeline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jerry_thomas-7.0.1.tar.gz -
Subject digest:
6988d9ad7a64a67a9b54b7741b6caf8f590d256d3d0ac68bb7612163ec643c87 - Sigstore transparency entry: 2233168570
- Sigstore integration time:
-
Permalink:
mr-lovalova/datapipeline@d683dc7a32c540f2afc8d586df09c4ae8652c813 -
Branch / Tag:
refs/tags/v7.0.1 - Owner: https://github.com/mr-lovalova
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@d683dc7a32c540f2afc8d586df09c4ae8652c813 -
Trigger Event:
release
-
Statement type:
File details
Details for the file jerry_thomas-7.0.1-py3-none-any.whl.
File metadata
- Download URL: jerry_thomas-7.0.1-py3-none-any.whl
- Upload date:
- Size: 293.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3371e4548694b02159f1f0487ad212f1842970256a2dfe960bdde73701d03cb
|
|
| MD5 |
7060fcd63f0450bd10983b084c2159aa
|
|
| BLAKE2b-256 |
e422d80fd84b83a40257e6484026d22af4bb8c984c9436221b27f1ce3e2f2d71
|
Provenance
The following attestation bundles were made for jerry_thomas-7.0.1-py3-none-any.whl:
Publisher:
workflow.yml on mr-lovalova/datapipeline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jerry_thomas-7.0.1-py3-none-any.whl -
Subject digest:
a3371e4548694b02159f1f0487ad212f1842970256a2dfe960bdde73701d03cb - Sigstore transparency entry: 2233169069
- Sigstore integration time:
-
Permalink:
mr-lovalova/datapipeline@d683dc7a32c540f2afc8d586df09c4ae8652c813 -
Branch / Tag:
refs/tags/v7.0.1 - Owner: https://github.com/mr-lovalova
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@d683dc7a32c540f2afc8d586df09c4ae8652c813 -
Trigger Event:
release
-
Statement type: