oxymake 0.1.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.
- oxymake-0.1.0/.gitignore +125 -0
- oxymake-0.1.0/PKG-INFO +32 -0
- oxymake-0.1.0/README.md +19 -0
- oxymake-0.1.0/oxymake_launcher.py +101 -0
- oxymake-0.1.0/pyproject.toml +36 -0
oxymake-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Build
|
|
2
|
+
/target/
|
|
3
|
+
/target-linux/
|
|
4
|
+
# Nested Cargo target dirs (e.g. a crate compiled in isolation) — never track
|
|
5
|
+
# build artifacts anywhere in the tree. Anchored `/target/` alone misses these.
|
|
6
|
+
**/target/
|
|
7
|
+
**/*.rs.bk
|
|
8
|
+
|
|
9
|
+
# mdBook build output (docs/book/book/) — generated by `mdbook build docs/book`,
|
|
10
|
+
# published to Cloudflare Pages. Never tracked; rebuilt in CI on every deploy.
|
|
11
|
+
docs/book/book/
|
|
12
|
+
|
|
13
|
+
# IDE
|
|
14
|
+
.idea/
|
|
15
|
+
.vscode/
|
|
16
|
+
*.swp
|
|
17
|
+
*.swo
|
|
18
|
+
*~
|
|
19
|
+
|
|
20
|
+
# OS
|
|
21
|
+
.DS_Store
|
|
22
|
+
Thumbs.db
|
|
23
|
+
|
|
24
|
+
# OxyMake runtime (for testing)
|
|
25
|
+
.oxymake/
|
|
26
|
+
|
|
27
|
+
# Mutation testing
|
|
28
|
+
mutants.out/
|
|
29
|
+
mutants.out.old/
|
|
30
|
+
|
|
31
|
+
# Coverage
|
|
32
|
+
lcov.info
|
|
33
|
+
tarpaulin-report.html
|
|
34
|
+
.beads/
|
|
35
|
+
.claude/
|
|
36
|
+
.runtime/
|
|
37
|
+
|
|
38
|
+
# Local agent context — never commit (Gas Town/polecat playbook, operator-private)
|
|
39
|
+
CLAUDE.local.md
|
|
40
|
+
|
|
41
|
+
# Benchmark generated workloads and timestamped results
|
|
42
|
+
benchmark/perf/workloads/
|
|
43
|
+
benchmark/perf/results-*.md
|
|
44
|
+
|
|
45
|
+
# Head-to-head bench: transient workloads and per-run measurement data
|
|
46
|
+
bench/snakemake-vs-oxymake/workloads/
|
|
47
|
+
bench/snakemake-vs-oxymake/data/
|
|
48
|
+
|
|
49
|
+
# Benchmark generated outputs (top-level and per-benchmark)
|
|
50
|
+
benchmark/data/
|
|
51
|
+
benchmark/logs/
|
|
52
|
+
benchmark/results/
|
|
53
|
+
benchmark/*/data/
|
|
54
|
+
benchmark/*/logs/
|
|
55
|
+
benchmark/*/results/
|
|
56
|
+
benchmark/*/benchmarks/
|
|
57
|
+
|
|
58
|
+
# LaTeX build artifacts (keep only .tex and .pdf in docs/paper/)
|
|
59
|
+
*.aux
|
|
60
|
+
*.log
|
|
61
|
+
*.out
|
|
62
|
+
*.bbl
|
|
63
|
+
*.blg
|
|
64
|
+
*.fls
|
|
65
|
+
*.fdb_latexmk
|
|
66
|
+
*.synctex.gz
|
|
67
|
+
/oxymake-paper.*
|
|
68
|
+
|
|
69
|
+
# Beads / Dolt files (added by bd init)
|
|
70
|
+
.dolt/
|
|
71
|
+
*.db
|
|
72
|
+
.beads-credential-key
|
|
73
|
+
bench_output/
|
|
74
|
+
__pycache__/
|
|
75
|
+
.oxymake_warm_*.py
|
|
76
|
+
spec/tla/states/
|
|
77
|
+
|
|
78
|
+
# ── Confidential / author+agent residence — keep OFF the public surface ──
|
|
79
|
+
# These trees hold strategic/relational/inside-baseball docs that must not be
|
|
80
|
+
# tracked on the public surface. The surviving public artefacts are the ADRs,
|
|
81
|
+
# not these minutes/premortems/outreach.
|
|
82
|
+
CLAUDE.local.md
|
|
83
|
+
docs/_private/
|
|
84
|
+
docs/migrated-from-*/
|
|
85
|
+
docs/outreach/
|
|
86
|
+
docs/paper/premortems/
|
|
87
|
+
docs/decisions/
|
|
88
|
+
docs/cosmon-feedback/
|
|
89
|
+
docs/lore/
|
|
90
|
+
|
|
91
|
+
# Externalized denylist for scripts/release-checklist.sh — holds the confidential
|
|
92
|
+
# alternations (OXYMAKE_FORBID_PATTERN / OXYMAKE_CONF_PATHS) so the guard never
|
|
93
|
+
# names in clear what it forbids (scrub-oxymake-main-tree, D7). Never tracked.
|
|
94
|
+
scripts/.release-denylist.local
|
|
95
|
+
|
|
96
|
+
# confidential paths, kept off the public surface
|
|
97
|
+
docs/agent/
|
|
98
|
+
docs/health/
|
|
99
|
+
|
|
100
|
+
# Cross-molecule-board (CMB) correspondence — cross-galaxy inbox/outbox messages.
|
|
101
|
+
# Same residence class as docs/cosmon-feedback/: relational/inside-baseball notes
|
|
102
|
+
# (session origins, third-party names, NDA/strategy context) that must NOT reach
|
|
103
|
+
# the public surface. Keep OFF main; residence is the orphan narration branch.
|
|
104
|
+
docs/cmb/
|
|
105
|
+
|
|
106
|
+
# TLC model-checker cache (jar downloaded by spec/tla/run-tlc.sh)
|
|
107
|
+
spec/tla/.tlc-cache/
|
|
108
|
+
|
|
109
|
+
# ...but the archived TLC reference outputs ARE committed (H19):
|
|
110
|
+
# they are what makes the paper's state counts reproducible.
|
|
111
|
+
!spec/tla/runs/*.out
|
|
112
|
+
|
|
113
|
+
# personal submission helper + internal go/no-go audit (private residence)
|
|
114
|
+
docs/paper/arxiv-metadata.txt
|
|
115
|
+
ops/audits/prerelease-go-2026-06-14.md
|
|
116
|
+
|
|
117
|
+
# task-20260614-6d66 — confidentiality (Gate 1, public-prep).
|
|
118
|
+
# These two design docs use private, domain-specific methodology as their worked
|
|
119
|
+
# example (internal data scale, private lab paths). That is confidential IP, not
|
|
120
|
+
# a generic OxyMake capability — private residence (noogram/oxymake-private).
|
|
121
|
+
# The generic engine ideas they explore (per-module DAG nodes, in-memory
|
|
122
|
+
# critical path) can be re-documented neutrally on the public surface if needed.
|
|
123
|
+
docs/design/per-alpha-signal-splitting.md
|
|
124
|
+
docs/design/stage2-lab-test-plan.md
|
|
125
|
+
.wrangler/
|
oxymake-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oxymake
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Content-addressable workflow engine — git checkout no longer rebuilds everything
|
|
5
|
+
Project-URL: Homepage, https://oxymake.dev
|
|
6
|
+
Project-URL: Repository, https://github.com/noogram/oxymake
|
|
7
|
+
Project-URL: Releases, https://github.com/noogram/oxymake/releases
|
|
8
|
+
Author-email: Emmanuel Sérié <emmanuel@serie.dev>
|
|
9
|
+
License: MIT OR Apache-2.0
|
|
10
|
+
Keywords: build,cache,pipeline,snakemake,workflow
|
|
11
|
+
Requires-Python: >=3.8
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
# OxyMake (Python launcher)
|
|
15
|
+
|
|
16
|
+
A content-addressable workflow engine. You `git checkout` an old branch, re-run
|
|
17
|
+
your pipeline, and it **does not** rebuild everything — change detection is a
|
|
18
|
+
BLAKE3 hash of file *content*, not timestamps.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uv tool install oxymake # or: pipx install oxymake
|
|
22
|
+
ox --help
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This package is a thin launcher: on first run it downloads the prebuilt `ox`
|
|
26
|
+
binary for your platform from the
|
|
27
|
+
[GitHub release](https://github.com/noogram/oxymake/releases/latest), verifies
|
|
28
|
+
its SHA-256, caches it, and execs it. No Rust toolchain required — which is the
|
|
29
|
+
point: bioinformatics and data-science users who live in conda/pip can try
|
|
30
|
+
OxyMake without a source build.
|
|
31
|
+
|
|
32
|
+
Full documentation: <https://github.com/noogram/oxymake>
|
oxymake-0.1.0/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# OxyMake (Python launcher)
|
|
2
|
+
|
|
3
|
+
A content-addressable workflow engine. You `git checkout` an old branch, re-run
|
|
4
|
+
your pipeline, and it **does not** rebuild everything — change detection is a
|
|
5
|
+
BLAKE3 hash of file *content*, not timestamps.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv tool install oxymake # or: pipx install oxymake
|
|
9
|
+
ox --help
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
This package is a thin launcher: on first run it downloads the prebuilt `ox`
|
|
13
|
+
binary for your platform from the
|
|
14
|
+
[GitHub release](https://github.com/noogram/oxymake/releases/latest), verifies
|
|
15
|
+
its SHA-256, caches it, and execs it. No Rust toolchain required — which is the
|
|
16
|
+
point: bioinformatics and data-science users who live in conda/pip can try
|
|
17
|
+
OxyMake without a source build.
|
|
18
|
+
|
|
19
|
+
Full documentation: <https://github.com/noogram/oxymake>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Thin launcher for the OxyMake `ox` binary.
|
|
2
|
+
|
|
3
|
+
Installed via `uv tool install oxymake` / `pipx install oxymake`, this module
|
|
4
|
+
exposes the `ox` and `oxymake` console scripts. On first invocation it downloads
|
|
5
|
+
the prebuilt binary matching the host platform from the GitHub release, verifies
|
|
6
|
+
its SHA-256 against the `.sha256` sidecar, caches it under the user cache dir,
|
|
7
|
+
and execs it. No Rust toolchain is required.
|
|
8
|
+
|
|
9
|
+
This keeps the conda/pip onboarding path open: the audience that lives in Python
|
|
10
|
+
never has to `cargo install` from source.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import hashlib
|
|
16
|
+
import os
|
|
17
|
+
import platform
|
|
18
|
+
import stat
|
|
19
|
+
import sys
|
|
20
|
+
import tarfile
|
|
21
|
+
import tempfile
|
|
22
|
+
import urllib.request
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
__version__ = "0.1.0"
|
|
26
|
+
|
|
27
|
+
_REPO = "noogram/oxymake"
|
|
28
|
+
_BASE = f"https://github.com/{_REPO}/releases/download/v{__version__}"
|
|
29
|
+
|
|
30
|
+
# (sys.platform startswith, machine) -> release target triple
|
|
31
|
+
_TARGETS = {
|
|
32
|
+
("darwin", "arm64"): "aarch64-apple-darwin",
|
|
33
|
+
("darwin", "x86_64"): "x86_64-apple-darwin",
|
|
34
|
+
("linux", "x86_64"): "x86_64-unknown-linux-gnu",
|
|
35
|
+
("linux", "amd64"): "x86_64-unknown-linux-gnu",
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _target() -> str:
|
|
40
|
+
key = (sys.platform, platform.machine().lower())
|
|
41
|
+
target = _TARGETS.get(key)
|
|
42
|
+
if target is None:
|
|
43
|
+
raise SystemExit(
|
|
44
|
+
f"oxymake: no prebuilt binary for {key}. "
|
|
45
|
+
f"Build from source: https://github.com/{_REPO}#install"
|
|
46
|
+
)
|
|
47
|
+
return target
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _cache_dir() -> Path:
|
|
51
|
+
root = os.environ.get("XDG_CACHE_HOME") or str(Path.home() / ".cache")
|
|
52
|
+
d = Path(root) / "oxymake" / __version__
|
|
53
|
+
d.mkdir(parents=True, exist_ok=True)
|
|
54
|
+
return d
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _download(url: str, dest: Path) -> None:
|
|
58
|
+
with urllib.request.urlopen(url) as resp, open(dest, "wb") as fh: # noqa: S310
|
|
59
|
+
fh.write(resp.read())
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _verify(tarball: Path, target: str) -> None:
|
|
63
|
+
"""Verify the tarball against its published .sha256 sidecar."""
|
|
64
|
+
expected = _download_text(f"{_BASE}/ox-{target}.tar.gz.sha256").split()[0].strip()
|
|
65
|
+
actual = hashlib.sha256(tarball.read_bytes()).hexdigest()
|
|
66
|
+
if actual != expected:
|
|
67
|
+
raise SystemExit(
|
|
68
|
+
f"oxymake: checksum mismatch for ox-{target}.tar.gz "
|
|
69
|
+
f"(expected {expected}, got {actual}). Refusing to run."
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _download_text(url: str) -> str:
|
|
74
|
+
with urllib.request.urlopen(url) as resp: # noqa: S310
|
|
75
|
+
return resp.read().decode()
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _ensure_binary() -> Path:
|
|
79
|
+
target = _target()
|
|
80
|
+
binary = _cache_dir() / "ox"
|
|
81
|
+
if binary.exists():
|
|
82
|
+
return binary
|
|
83
|
+
|
|
84
|
+
url = f"{_BASE}/ox-{target}.tar.gz"
|
|
85
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
86
|
+
tarball = Path(tmp) / "ox.tar.gz"
|
|
87
|
+
_download(url, tarball)
|
|
88
|
+
_verify(tarball, target)
|
|
89
|
+
with tarfile.open(tarball) as tf:
|
|
90
|
+
tf.extract("ox", _cache_dir()) # noqa: S202 - controlled, verified archive
|
|
91
|
+
binary.chmod(binary.stat().st_mode | stat.S_IEXEC)
|
|
92
|
+
return binary
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def main() -> "int":
|
|
96
|
+
binary = _ensure_binary()
|
|
97
|
+
os.execv(str(binary), [str(binary), *sys.argv[1:]])
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if __name__ == "__main__":
|
|
101
|
+
main()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "oxymake"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Content-addressable workflow engine — git checkout no longer rebuilds everything"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = { text = "MIT OR Apache-2.0" }
|
|
12
|
+
authors = [{ name = "Emmanuel Sérié", email = "emmanuel@serie.dev" }]
|
|
13
|
+
keywords = ["workflow", "pipeline", "snakemake", "build", "cache"]
|
|
14
|
+
|
|
15
|
+
[project.urls]
|
|
16
|
+
Homepage = "https://oxymake.dev"
|
|
17
|
+
Repository = "https://github.com/noogram/oxymake"
|
|
18
|
+
Releases = "https://github.com/noogram/oxymake/releases"
|
|
19
|
+
|
|
20
|
+
# This is a thin launcher: it fetches the prebuilt `ox` binary that matches the
|
|
21
|
+
# host platform from the GitHub release on first run, caches it, and execs it.
|
|
22
|
+
# It deliberately has no Rust build dependency so that `uv tool install oxymake`
|
|
23
|
+
# and `pipx install oxymake` work in a pure conda/pip environment.
|
|
24
|
+
|
|
25
|
+
[project.scripts]
|
|
26
|
+
ox = "oxymake_launcher:main"
|
|
27
|
+
oxymake = "oxymake_launcher:main"
|
|
28
|
+
|
|
29
|
+
# The distribution name (`oxymake`) does not match the single launcher module
|
|
30
|
+
# (`oxymake_launcher.py`), so hatchling cannot auto-detect what to ship in the
|
|
31
|
+
# wheel — it must be told explicitly, or `python -m build` fails the wheel step.
|
|
32
|
+
[tool.hatch.build.targets.wheel]
|
|
33
|
+
only-include = ["oxymake_launcher.py"]
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.sdist]
|
|
36
|
+
include = ["oxymake_launcher.py", "README.md", "pyproject.toml"]
|