Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
64fa88c
test(Z5-delete-stale-metadata-cache): red — ZarrHAMTStore.get returns…
Faolain Jul 12, 2026
8f04d00
fix(Z5-delete-stale-metadata-cache): ZarrHAMTStore.get returns delete…
Faolain Jul 12, 2026
288eeba
test(Z4-coord-allowlist): red — Coordinate names outside a hardcoded …
Faolain Jul 12, 2026
509133c
test(Z2-resize-remap): red — Resizing any non-first dimension scrambl…
Faolain Jul 12, 2026
40877e8
test(Z3-shard-cache-eviction): red — LRU cache can evict a shard duri…
Faolain Jul 12, 2026
3058e5c
fix(Z3-shard-cache-eviction): LRU cache can evict a shard during its …
Faolain Jul 13, 2026
e07d797
test(Z6-store-contract): red — zarr Store contract conformance bundle…
Faolain Jul 13, 2026
5b0309c
fix(Z6-store-contract): zarr Store contract conformance bundle (Shard…
Faolain Jul 13, 2026
d9d9545
test(P4-cid-objects): red — ShardedZarrStore round-trips every CID th…
Faolain Jul 13, 2026
1da30fc
fix(P4-cid-objects): ShardedZarrStore round-trips every CID through b…
Faolain Jul 13, 2026
e775ec0
test(Z1-multivar-index): red — Multiple data variables silently overw…
Faolain Jul 13, 2026
db65890
test(K1-lazy-client-binding): red — KuboCAS(client=...) crashes outsi…
Faolain Jul 12, 2026
7db8992
fix(K1-lazy-client-binding): KuboCAS(client=...) crashes outside an e…
Faolain Jul 12, 2026
b085505
test(K3-per-loop-semaphore): red — Semaphore bound to the first event…
Faolain Jul 12, 2026
491014e
fix(K3-per-loop-semaphore): Semaphore bound to the first event loop b…
Faolain Jul 12, 2026
18994be
test(K2-user-client-multiloop): red — User-supplied client on a secon…
Faolain Jul 12, 2026
a5866eb
fix(K2-user-client-multiloop): User-supplied client on a second loop:…
Faolain Jul 12, 2026
b1d15ea
test(K8-respect-client-timeout): red — Hardcoded timeout=60.0 silentl…
Faolain Jul 12, 2026
22c24d4
fix(K8-respect-client-timeout): Hardcoded timeout=60.0 silently overr…
Faolain Jul 12, 2026
763b74a
test(K5-follow-redirects): red — Gateway redirects are hard failures …
Faolain Jul 13, 2026
a2d64bd
fix(K5-follow-redirects): Gateway redirects are hard failures (dweb.l…
Faolain Jul 13, 2026
0c912bf
test(K7-url-normalization): red — Gateway URL ending in /ipfs (no tra…
Faolain Jul 13, 2026
02edeeb
test(H2-enable-write-idempotent): red — enable_write() while already …
Faolain Jul 12, 2026
1b5a4e0
fix(H2-enable-write-idempotent): enable_write() while already in writ…
Faolain Jul 12, 2026
3cd2803
test(H3-failed-set-atomicity): red — A failed set() destroys previous…
Faolain Jul 12, 2026
893144c
fix(H3-failed-set-atomicity): A failed set() destroys previously comm…
Faolain Jul 12, 2026
9d62d1a
test(H4-keys-iteration-deadlock): red — Deadlock when calling get/set…
Faolain Jul 12, 2026
c243fa9
fix(H4-keys-iteration-deadlock): Deadlock when calling get/set/delete…
Faolain Jul 12, 2026
4cc5348
test(H5-read-cache-growth): red — Write-mode buffer grows without bou…
Faolain Jul 12, 2026
490a251
fix(H5-read-cache-growth): Write-mode buffer grows without bound on p…
Faolain Jul 12, 2026
cf995a1
fix(K7-url-normalization): Gateway URL ending in /ipfs (no trailing s…
Faolain Jul 13, 2026
9cb6755
test(H1-delete-canonicalization): red — Root CID is not deterministic…
Faolain Jul 12, 2026
088ef9e
test(K4-range-correctness): red — Byte-range handling: 200-with-full-…
Faolain Jul 13, 2026
645c79c
fix(H1-delete-canonicalization): Root CID is not deterministic once d…
Faolain Jul 12, 2026
7292bc8
fix(K4-range-correctness): Byte-range handling: 200-with-full-body si…
Faolain Jul 13, 2026
7a1ed1a
test(P1-direct-blake3): red — blake3_hashfn spends ~99% of its time i…
Faolain Jul 13, 2026
1625cc5
test(K6-retry-policy): red — Retry policy inverted: transient 5xx/429…
Faolain Jul 13, 2026
9e1d1f8
fix(P1-direct-blake3): blake3_hashfn spends ~99% of its time in multi…
Faolain Jul 13, 2026
7989d36
fix(K6-retry-policy): Retry policy inverted: transient 5xx/429 never …
Faolain Jul 13, 2026
f4894e5
test(P2-relink-o1-hash-once): red — O(256) link scans per level and r…
Faolain Jul 13, 2026
6c3cb19
test(K9-semaphore-scope): red — Semaphore held across retry backoff a…
Faolain Jul 13, 2026
6907f87
fix(P2-relink-o1-hash-once): O(256) link scans per level and repeated…
Faolain Jul 13, 2026
3e23eb5
fix(K9-semaphore-scope): Semaphore held across retry backoff and time…
Faolain Jul 13, 2026
805f87a
test(P5-concurrent-vacate): red — vacate() flushes nodes serially — O…
Faolain Jul 13, 2026
6dc0eee
test(K10-http2-enable): red — Enable HTTP/2 on internal HTTPS clients…
Faolain Jul 13, 2026
7711a4d
fix(P5-concurrent-vacate): vacate() flushes nodes serially — O(node c…
Faolain Jul 13, 2026
1d12a1e
fix(K10-http2-enable): Enable HTTP/2 on internal HTTPS clients with a…
Faolain Jul 13, 2026
42ee900
Merge branch 'fix/zarr-stores' into review-fixes-integration
Faolain Jul 13, 2026
b41d71d
Merge branch 'fix/kubocas-http' into review-fixes-integration
Faolain Jul 13, 2026
a2e93f4
test(H6-write-perf-restore): red — happy-path set() must not deepcopy…
Faolain Jul 13, 2026
a7082b3
fix(H6-write-perf-restore): restore write throughput — happy-path set…
Faolain Jul 13, 2026
7c7e6c1
fix(H6-write-perf-restore): address review findings
Faolain Jul 13, 2026
0d4523b
chore: finalize rebase onto current main
0xSwego Jul 13, 2026
f409a2d
fix: timezone bug
TheGreatAlgo Jul 13, 2026
1e53a88
test(K6b-retry-after-floor): red — Retry-After must be honored as min…
Faolain Jul 16, 2026
5fa6481
fix(K6b-retry-after-floor): honor Retry-After as server-directed wait…
Faolain Jul 16, 2026
ef3ff8a
test(Z7-delete-legacy-metadata): red — delete must remove legacy meta…
Faolain Jul 16, 2026
d605e64
fix(Z7-delete-legacy-metadata): remove legacy metadata entry independ…
Faolain Jul 16, 2026
b654eb0
fix(K6b-retry-after-floor): address review findings — cap pathologica…
Faolain Jul 16, 2026
41a23de
test(K11-zero-concurrency): red — KuboCAS(concurrency=0) must be reje…
Faolain Jul 16, 2026
5cc229a
fix(K11-zero-concurrency): reject non-positive concurrency — Semaphor…
Faolain Jul 16, 2026
2fe42c2
test(Z8-cas-save-cid-validation): red — set() must reject non-CID res…
Faolain Jul 16, 2026
d99fe65
fix(Z7-delete-legacy-metadata): address review findings — overwriting…
Faolain Jul 16, 2026
ee34f90
fix(Z8-cas-save-cid-validation): validate CAS.save returns a CID in s…
Faolain Jul 16, 2026
5453ca7
test(Z9-cache-contains): red — MemoryBoundedLRUCache membership via '…
Faolain Jul 16, 2026
e0cd47a
fix(Z9-cache-contains): make MemoryBoundedLRUCache.__contains__ synch…
Faolain Jul 16, 2026
6347b90
test(Z10-concurrent-flush): red — dirty shards must flush with overla…
Faolain Jul 16, 2026
4cf604b
fix(Z10-concurrent-flush): flush dirty shards with bounded concurrent…
Faolain Jul 16, 2026
6b4d2d8
test(H7-delete-failure-atomicity): red — a failed delete must not los…
Faolain Jul 16, 2026
c42b90a
fix(H7-delete-failure-atomicity): prefetch collapse subtrees before m…
Faolain Jul 16, 2026
4ae64cf
fix(Z10-concurrent-flush): address review findings — cancel sibling f…
Faolain Jul 16, 2026
f1300c5
chore(review-nits): rename builtin-shadowing params, narrow test exce…
Faolain Jul 16, 2026
b9e2a1e
chore(review-nits): rename builtin-shadowing id params in clean-node …
Faolain Jul 16, 2026
d04051c
test(review-round2): restore dual-representation precondition in z7 f…
Faolain Jul 16, 2026
c897aef
test(P6-bounded-vacate): red — vacate save waves must be bounded and …
Faolain Jul 16, 2026
dedd5db
fix(P6-bounded-vacate): bound vacate save waves at 16 concurrent and …
Faolain Jul 16, 2026
0d68f9f
test(P7-len-no-snapshot): red — len() must count without materializin…
Faolain Jul 16, 2026
676fbd0
fix(P7-len-no-snapshot): count keys under the lock without a snapshot
Faolain Jul 16, 2026
caee41d
fix(K12-cross-loop-client): add client_factory for per-loop clients; …
Faolain Jul 16, 2026
cf1bc4c
test(Z11-v1-unrecorded-coord): red — non-allowlisted coordinate chunk…
Faolain Jul 16, 2026
52dc6b9
fix(Z11-v1-unrecorded-coord): classify pre-recording foreign-rank nam…
Faolain Jul 16, 2026
03f6478
test(Z12-v1-legacy-primary-inference): red — legacy V1 roots without …
Faolain Jul 16, 2026
0d0a8f7
fix(K12-cross-loop-client): address review findings — snapshot event …
Faolain Jul 16, 2026
7794bfe
fix(Z12-v1-legacy-primary-inference): infer the primary array path fr…
Faolain Jul 16, 2026
ca5d6ab
fix(Z11/Z12): address review findings — abort inference on CAS outage…
Faolain Jul 16, 2026
73c89ab
test(Z12): cover inference skip branches — coordinate/garbage/mismatc…
Faolain Jul 16, 2026
b726dff
fix(z13): never clobber an inferred V1 primary on foreign chunk writes
Faolain Jul 16, 2026
c740ab8
fix(p8): bound flush task creation with fixed worker pools
Faolain Jul 16, 2026
6944b0d
fix(k13): make KuboCAS.aclose() loop-aware instead of silently leaking
Faolain Jul 16, 2026
634f9ce
fix(z12): require a declared matching chunk shape for primary inference
Faolain Jul 17, 2026
ce85d2a
test(hygiene): scope p6 orphan-task check to vacate-created tasks; co…
Faolain Jul 17, 2026
942580d
test(hypothesis): property-test z12 inference, z7 legacy-metadata mut…
Faolain Jul 17, 2026
d9e34ae
fix: address final PR review findings
0xSwego Jul 18, 2026
c5e1fe9
fix: issues
TheGreatAlgo Jul 20, 2026
a414e0b
fix: update inference
TheGreatAlgo Jul 20, 2026
20271ab
fix: httpx issue
TheGreatAlgo Jul 20, 2026
9a24630
fix: read only to write
TheGreatAlgo Jul 21, 2026
51eea02
fix: httpx
TheGreatAlgo Jul 21, 2026
a0ddb93
fix: tests
TheGreatAlgo Jul 21, 2026
a40432a
fix: update version
TheGreatAlgo Jul 21, 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
6 changes: 3 additions & 3 deletions py_hamt/encryption_hamt_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,13 +183,13 @@ async def get(
return None

async def set(self, key: str, value: zarr.core.buffer.Buffer) -> None:
"""@private"""
"""Encrypt and store a value, then update cached metadata."""
if self.read_only:
raise Exception("Cannot write to a read-only store.")

raw_bytes = value.to_bytes()
if key in self.metadata_read_cache:
self.metadata_read_cache[key] = raw_bytes
# Encrypt it
encrypted_bytes = self._encrypt(raw_bytes)
await self.hamt.set(key, encrypted_bytes)
if key in self.metadata_read_cache:
self.metadata_read_cache[key] = raw_bytes
387 changes: 284 additions & 103 deletions py_hamt/hamt.py

Large diffs are not rendered by default.

604 changes: 470 additions & 134 deletions py_hamt/sharded_zarr_store.py

Large diffs are not rendered by default.

653 changes: 522 additions & 131 deletions py_hamt/store_httpx.py

Large diffs are not rendered by default.

15 changes: 7 additions & 8 deletions py_hamt/zarr_hamt_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,13 +234,14 @@ def supports_partial_writes(self) -> bool:
return False

async def set(self, key: str, value: zarr.core.buffer.Buffer) -> None:
"""@private"""
"""Store a value and update any existing metadata cache entry."""
if self.read_only:
raise Exception("Cannot write to a read-only store.")

raw_bytes = value.to_bytes()
await self.hamt.set(key, raw_bytes)
if key in self.metadata_read_cache:
self.metadata_read_cache[key] = value.to_bytes()
await self.hamt.set(key, value.to_bytes())
self.metadata_read_cache[key] = raw_bytes

async def set_if_not_exists(self, key: str, value: zarr.core.buffer.Buffer) -> None:
"""@private"""
Expand All @@ -259,18 +260,16 @@ def supports_deletes(self) -> bool:
return not self.hamt.read_only

async def delete(self, key: str) -> None:
"""@private"""
"""Delete a key and evict any cached metadata for it."""
if self.read_only:
raise Exception("Cannot write to a read-only store.")
try:
await self.hamt.delete(key)
# In practice these lines never seem to be needed, creating and appending data are the only operations most zarrs actually undergo
# if key in self.metadata_read_cache:
# del self.metadata_read_cache[key]
# It's fine if the key was not in the HAMT
# Sometimes zarr v3 calls deletes on keys that don't exist (or have already been deleted) for some reason, probably concurrency issues
except KeyError:
return
pass
self.metadata_read_cache.pop(key, None)

@property
def supports_listing(self) -> bool:
Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "py-hamt"
version = "3.4.1"
version = "3.5.0"
description = "HAMT implementation for a content-addressed storage system."
readme = "README.md"
requires-python = ">=3.12"
Expand Down Expand Up @@ -36,6 +36,7 @@ dev = [
"docker>=7.1.0",
"types-docker>=7.1.0.20250523",
"pre-commit>=4.2.0",
"trustme>=1.2.1",
]

[tool.ruff]
Expand Down
2 changes: 1 addition & 1 deletion pytest.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# pytest.ini
[pytest]
asyncio_mode = auto
asyncio_default_fixture_loop_scope = session
asyncio_default_fixture_loop_scope = function
filterwarnings =
ignore:sharded_zarr_v1 is deprecated.*:FutureWarning
6 changes: 4 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
from testing_utils import create_ipfs, ipld_strategy # noqa: F401


@pytest.fixture(scope="session")
@pytest.fixture
async def global_client_session():
"""One httpx.AsyncClient shared by the whole test run."""
"""A fresh httpx.AsyncClient per test (function-scoped to match the
function-scoped event loop; a session-scoped client bound to one test's
loop breaks later tests once that loop closes)."""
async with httpx.AsyncClient() as client:
yield client
# httpx's async context manager awaits client.aclose() for us
Expand Down
21 changes: 21 additions & 0 deletions tests/fixtures/z1_legacy_multivar_store.json

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions tests/fixtures/z1_legacy_single_var_store.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"blocks": {
"bafkr4iamm5aavgo5molhsg5z4f254ajp3kz3khdmvrzueombleskssbg7a": "ewogICJhdHRyaWJ1dGVzIjoge30sCiAgInphcnJfZm9ybWF0IjogMywKICAiY29uc29saWRhdGVkX21ldGFkYXRhIjogbnVsbCwKICAibm9kZV90eXBlIjogImdyb3VwIgp9",
"bafkr4ibxty4gbihdefvbos7sjo75crb7el3rmbd7rsjvh5n5p3agetbona": "KLUv/WCAAO0DANQDAADwPwBAAAgQFBgcICIkJigqLC4wMTIzNDU2Nzg5Ojs8PT4/QIAAQYAAQoAAQ4AARIAARYAARoAAR4BHQC8g4NcDMxsti4GZjZbFwMxGy2JgZkPyZZYln8yy5MssS77MsuTLLEu+zLLkyyxLvsyyyJdZFpFvyVrDHPfa",
"bafkr4ick6fvm7ckmt2c6rfyl3aajcx3p3mdvugrihlinfmui3c5h2uei5q": "ewogICJzaGFwZSI6IFsKICAgIDQsCiAgICA0LAogICAgNgogIF0sCiAgImRhdGFfdHlwZSI6ICJmbG9hdDY0IiwKICAiY2h1bmtfZ3JpZCI6IHsKICAgICJuYW1lIjogInJlZ3VsYXIiLAogICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICJjaHVua19zaGFwZSI6IFsKICAgICAgICAyLAogICAgICAgIDQsCiAgICAgICAgNgogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7fSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgInRpbWUiLAogICAgImxhdCIsCiAgICAibG9uIgogIF0sCiAgInphcnJfZm9ybWF0IjogMywKICAibm9kZV90eXBlIjogImFycmF5IiwKICAic3RvcmFnZV90cmFuc2Zvcm1lcnMiOiBbXQp9",
"bafkr4icpnkpo3pserbi4nekr2ldezdajzdc2z2kq2auxkqvs5pv5lnnvxa": "ewogICJzaGFwZSI6IFsKICAgIDQsCiAgICA0LAogICAgNgogIF0sCiAgImRhdGFfdHlwZSI6ICJmbG9hdDY0IiwKICAiY2h1bmtfZ3JpZCI6IHsKICAgICJuYW1lIjogInJlZ3VsYXIiLAogICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICJjaHVua19zaGFwZSI6IFsKICAgICAgICAyLAogICAgICAgIDQsCiAgICAgICAgNgogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7CiAgICAiX0ZpbGxWYWx1ZSI6ICJBQUFBQUFBQStIOD0iCiAgfSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgInRpbWUiLAogICAgImxhdCIsCiAgICAibG9uIgogIF0sCiAgInphcnJfZm9ybWF0IjogMywKICAibm9kZV90eXBlIjogImFycmF5IiwKICAic3RvcmFnZV90cmFuc2Zvcm1lcnMiOiBbXQp9",
"bafkr4iczmsrm27icvtifxcvwogorby6a32jhv4r4sall3cvqvfvpud4kmu": "ewogICJzaGFwZSI6IFsKICAgIDQKICBdLAogICJkYXRhX3R5cGUiOiAiaW50NjQiLAogICJjaHVua19ncmlkIjogewogICAgIm5hbWUiOiAicmVndWxhciIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgImNodW5rX3NoYXBlIjogWwogICAgICAgIDQKICAgICAgXQogICAgfQogIH0sCiAgImNodW5rX2tleV9lbmNvZGluZyI6IHsKICAgICJuYW1lIjogImRlZmF1bHQiLAogICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICJzZXBhcmF0b3IiOiAiLyIKICAgIH0KICB9LAogICJmaWxsX3ZhbHVlIjogMCwKICAiY29kZWNzIjogWwogICAgewogICAgICAibmFtZSI6ICJieXRlcyIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJlbmRpYW4iOiAibGl0dGxlIgogICAgICB9CiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJ6c3RkIiwKICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgImxldmVsIjogMCwKICAgICAgICAiY2hlY2tzdW0iOiBmYWxzZQogICAgICB9CiAgICB9CiAgXSwKICAiYXR0cmlidXRlcyI6IHt9LAogICJkaW1lbnNpb25fbmFtZXMiOiBbCiAgICAidGltZSIKICBdLAogICJ6YXJyX2Zvcm1hdCI6IDMsCiAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KfQ==",
"bafkr4idbvkz7l3nb376a6hkrn4jhfeiakhx7bohuqhtin3selkns2vjnt4": "ewogICJzaGFwZSI6IFsKICAgIDYKICBdLAogICJkYXRhX3R5cGUiOiAiZmxvYXQ2NCIsCiAgImNodW5rX2dyaWQiOiB7CiAgICAibmFtZSI6ICJyZWd1bGFyIiwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAiY2h1bmtfc2hhcGUiOiBbCiAgICAgICAgNgogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7CiAgICAiX0ZpbGxWYWx1ZSI6ICJBQUFBQUFBQStIOD0iCiAgfSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgImxvbiIKICBdLAogICJ6YXJyX2Zvcm1hdCI6IDMsCiAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KfQ==",
"bafkr4idj3cpeoiwwyy5rdpx7tidnlehl3etnb77dbxvkferhp2cwyiwpve": "ewogICJzaGFwZSI6IFsKICAgIDQKICBdLAogICJkYXRhX3R5cGUiOiAiZmxvYXQ2NCIsCiAgImNodW5rX2dyaWQiOiB7CiAgICAibmFtZSI6ICJyZWd1bGFyIiwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAiY2h1bmtfc2hhcGUiOiBbCiAgICAgICAgNAogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7CiAgICAiX0ZpbGxWYWx1ZSI6ICJBQUFBQUFBQStIOD0iCiAgfSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgImxhdCIKICBdLAogICJ6YXJyX2Zvcm1hdCI6IDMsCiAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KfQ==",
"bafkr4iejghfjnobiycewyqcqbr5zcjskim4lc5t3czkqjo2vcmopq5y2sa": "KLUv/SAgrQAAcAAAAQACAAMAAAAAAAAAA1QCAAMB",
"bafkr4iekekhcnomg3irwttcrotdo2ztgzjffxiaixwvan4tgindj7xebdy": "KLUv/SAw7QAAgAAAAAAAgGbAAFtCQFuAZkAFAGAIGAcIW0nRgiM=",
"bafkr4iem6twzkgh63qzeph75im4udb3xdbkfnnda62j6r2myc4p6tpwpzq": "KLUv/WCAAL0DAFIEDRawNcMBDMMAkzlnm3UTERER0UFjGM5TOlvHrYBbALcatxi3FrcUtxJH/HDDCyd8cMFVoAEwIODXWfIdmFmWfAdmliXfgZllyXdgZlnyHSizLPkOzCxLvgMzy5LvwMxGy2JgZqNlMVBmo2UxMDMy2lLYsBoW",
"bafkr4ifhaszbondcaw3nvy7lbco56htp7ogybo45iqdl6i4bfqedtlpine": "ewogICJhdHRyaWJ1dGVzIjoge30sCiAgInphcnJfZm9ybWF0IjogMywKICAiY29uc29saWRhdGVkX21ldGFkYXRhIjogewogICAgImtpbmQiOiAiaW5saW5lIiwKICAgICJtdXN0X3VuZGVyc3RhbmQiOiBmYWxzZSwKICAgICJtZXRhZGF0YSI6IHsKICAgICAgInRlbXAiOiB7CiAgICAgICAgInNoYXBlIjogWwogICAgICAgICAgNCwKICAgICAgICAgIDQsCiAgICAgICAgICA2CiAgICAgICAgXSwKICAgICAgICAiZGF0YV90eXBlIjogImZsb2F0NjQiLAogICAgICAgICJjaHVua19ncmlkIjogewogICAgICAgICAgIm5hbWUiOiAicmVndWxhciIsCiAgICAgICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAgICAgImNodW5rX3NoYXBlIjogWwogICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICA2CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjaHVua19rZXlfZW5jb2RpbmciOiB7CiAgICAgICAgICAibmFtZSI6ICJkZWZhdWx0IiwKICAgICAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICAgICAic2VwYXJhdG9yIjogIi8iCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZmlsbF92YWx1ZSI6IDAuMCwKICAgICAgICAiY29kZWNzIjogWwogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJieXRlcyIsCiAgICAgICAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICAgICAgICJlbmRpYW4iOiAibGl0dGxlIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJ6c3RkIiwKICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICAgImxldmVsIjogMCwKICAgICAgICAgICAgICAiY2hlY2tzdW0iOiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICJfRmlsbFZhbHVlIjogIkFBQUFBQUFBK0g4PSIKICAgICAgICB9LAogICAgICAgICJkaW1lbnNpb25fbmFtZXMiOiBbCiAgICAgICAgICAidGltZSIsCiAgICAgICAgICAibGF0IiwKICAgICAgICAgICJsb24iCiAgICAgICAgXSwKICAgICAgICAiemFycl9mb3JtYXQiOiAzLAogICAgICAgICJub2RlX3R5cGUiOiAiYXJyYXkiLAogICAgICAgICJzdG9yYWdlX3RyYW5zZm9ybWVycyI6IFtdCiAgICAgIH0sCiAgICAgICJ0aW1lIjogewogICAgICAgICJzaGFwZSI6IFsKICAgICAgICAgIDQKICAgICAgICBdLAogICAgICAgICJkYXRhX3R5cGUiOiAiaW50NjQiLAogICAgICAgICJjaHVua19ncmlkIjogewogICAgICAgICAgIm5hbWUiOiAicmVndWxhciIsCiAgICAgICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAgICAgImNodW5rX3NoYXBlIjogWwogICAgICAgICAgICAgIDQKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNodW5rX2tleV9lbmNvZGluZyI6IHsKICAgICAgICAgICJuYW1lIjogImRlZmF1bHQiLAogICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICJzZXBhcmF0b3IiOiAiLyIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmaWxsX3ZhbHVlIjogMCwKICAgICAgICAiY29kZWNzIjogWwogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJieXRlcyIsCiAgICAgICAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICAgICAgICJlbmRpYW4iOiAibGl0dGxlIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJ6c3RkIiwKICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICAgImxldmVsIjogMCwKICAgICAgICAgICAgICAiY2hlY2tzdW0iOiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiYXR0cmlidXRlcyI6IHt9LAogICAgICAgICJkaW1lbnNpb25fbmFtZXMiOiBbCiAgICAgICAgICAidGltZSIKICAgICAgICBdLAogICAgICAgICJ6YXJyX2Zvcm1hdCI6IDMsCiAgICAgICAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgICAgICAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KICAgICAgfSwKICAgICAgImxhdCI6IHsKICAgICAgICAic2hhcGUiOiBbCiAgICAgICAgICA0CiAgICAgICAgXSwKICAgICAgICAiZGF0YV90eXBlIjogImZsb2F0NjQiLAogICAgICAgICJjaHVua19ncmlkIjogewogICAgICAgICAgIm5hbWUiOiAicmVndWxhciIsCiAgICAgICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAgICAgImNodW5rX3NoYXBlIjogWwogICAgICAgICAgICAgIDQKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNodW5rX2tleV9lbmNvZGluZyI6IHsKICAgICAgICAgICJuYW1lIjogImRlZmF1bHQiLAogICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICJzZXBhcmF0b3IiOiAiLyIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmaWxsX3ZhbHVlIjogMC4wLAogICAgICAgICJjb2RlY3MiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImJ5dGVzIiwKICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICAgImVuZGlhbiI6ICJsaXR0bGUiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInpzdGQiLAogICAgICAgICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAgICAgICAibGV2ZWwiOiAwLAogICAgICAgICAgICAgICJjaGVja3N1bSI6IGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgIl9GaWxsVmFsdWUiOiAiQUFBQUFBQUErSDg9IgogICAgICAgIH0sCiAgICAgICAgImRpbWVuc2lvbl9uYW1lcyI6IFsKICAgICAgICAgICJsYXQiCiAgICAgICAgXSwKICAgICAgICAiemFycl9mb3JtYXQiOiAzLAogICAgICAgICJub2RlX3R5cGUiOiAiYXJyYXkiLAogICAgICAgICJzdG9yYWdlX3RyYW5zZm9ybWVycyI6IFtdCiAgICAgIH0sCiAgICAgICJsb24iOiB7CiAgICAgICAgInNoYXBlIjogWwogICAgICAgICAgNgogICAgICAgIF0sCiAgICAgICAgImRhdGFfdHlwZSI6ICJmbG9hdDY0IiwKICAgICAgICAiY2h1bmtfZ3JpZCI6IHsKICAgICAgICAgICJuYW1lIjogInJlZ3VsYXIiLAogICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICJjaHVua19zaGFwZSI6IFsKICAgICAgICAgICAgICA2CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjaHVua19rZXlfZW5jb2RpbmciOiB7CiAgICAgICAgICAibmFtZSI6ICJkZWZhdWx0IiwKICAgICAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICAgICAic2VwYXJhdG9yIjogIi8iCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZmlsbF92YWx1ZSI6IDAuMCwKICAgICAgICAiY29kZWNzIjogWwogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJieXRlcyIsCiAgICAgICAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICAgICAgICJlbmRpYW4iOiAibGl0dGxlIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJ6c3RkIiwKICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICAgICAgICAgImxldmVsIjogMCwKICAgICAgICAgICAgICAiY2hlY2tzdW0iOiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICJfRmlsbFZhbHVlIjogIkFBQUFBQUFBK0g4PSIKICAgICAgICB9LAogICAgICAgICJkaW1lbnNpb25fbmFtZXMiOiBbCiAgICAgICAgICAibG9uIgogICAgICAgIF0sCiAgICAgICAgInphcnJfZm9ybWF0IjogMywKICAgICAgICAibm9kZV90eXBlIjogImFycmF5IiwKICAgICAgICAic3RvcmFnZV90cmFuc2Zvcm1lcnMiOiBbXQogICAgICB9CiAgICB9CiAgfSwKICAibm9kZV90eXBlIjogImdyb3VwIgp9",
"bafkr4ifysp246qb32nooik7bsg3xqc5olxqxdhy2dibb4c3xxxpakqy36e": "ewogICJzaGFwZSI6IFsKICAgIDQKICBdLAogICJkYXRhX3R5cGUiOiAiZmxvYXQ2NCIsCiAgImNodW5rX2dyaWQiOiB7CiAgICAibmFtZSI6ICJyZWd1bGFyIiwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAiY2h1bmtfc2hhcGUiOiBbCiAgICAgICAgNAogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7fSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgImxhdCIKICBdLAogICJ6YXJyX2Zvcm1hdCI6IDMsCiAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KfQ==",
"bafkr4ihmv4rapvqddmvhiy3l2zc5vnlavxnjwiqhpgr26q7723ymyi6c74": "ewogICJzaGFwZSI6IFsKICAgIDYKICBdLAogICJkYXRhX3R5cGUiOiAiZmxvYXQ2NCIsCiAgImNodW5rX2dyaWQiOiB7CiAgICAibmFtZSI6ICJyZWd1bGFyIiwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAiY2h1bmtfc2hhcGUiOiBbCiAgICAgICAgNgogICAgICBdCiAgICB9CiAgfSwKICAiY2h1bmtfa2V5X2VuY29kaW5nIjogewogICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcGFyYXRvciI6ICIvIgogICAgfQogIH0sCiAgImZpbGxfdmFsdWUiOiAwLjAsCiAgImNvZGVjcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnl0ZXMiLAogICAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgICAiZW5kaWFuIjogImxpdHRsZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAienN0ZCIsCiAgICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAgICJsZXZlbCI6IDAsCiAgICAgICAgImNoZWNrc3VtIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImF0dHJpYnV0ZXMiOiB7fSwKICAiZGltZW5zaW9uX25hbWVzIjogWwogICAgImxvbiIKICBdLAogICJ6YXJyX2Zvcm1hdCI6IDMsCiAgIm5vZGVfdHlwZSI6ICJhcnJheSIsCiAgInN0b3JhZ2VfdHJhbnNmb3JtZXJzIjogW10KfQ==",
"bafkr4ihwfbcpgt5veqn7hw2pgzkf6z34nrhc4hkscreq7z4bqn2zhqg65e": "KLUv/SAgxQAAcAAAAAAAgFbAAD5AgFZAAwBAyArdCxwB",
"bafyr4ien3weyp7qrsanvp5dwr6b427dwjb4unrxrrxr3jsemlzuam2yksq": "iNgqWCUAAVUeIDeeOGCg4yFqF0vyS7/RRD8i9xYEf4yTU/W9fsBiTC5o2CpYJQABVR4gjPTtlRj+3DJHn/1DOUGHdxhUVrRg9pPo6ZgXH+m+z8z29vb29vY=",
"bafyr4iglueebu33cpmsrmbrl6lm65ltvoyd6wmxvlbeo7kilq6xy5kzdeu": "o2ZjaHVua3OlanNoYXJkX2NpZHOB2CpYJQABcR4gjd2Jh/4RkBtX9HaPg818dkh5RsbxjeO0yIxeaAZrCpRrYXJyYXlfc2hhcGWDBAQGa2NodW5rX3NoYXBlgwIEBm9zaGFyZGluZ19jb25maWehcGNodW5rc19wZXJfc2hhcmQIcnByaW1hcnlfYXJyYXlfcGF0aGR0ZW1waG1ldGFkYXRhqGdsYXQvYy8w2CpYJQABVR4g9ihE80+1JBvz2082VF9nfGxOLh1SFEkP54GDdZPA3ulnbG9uL2MvMNgqWCUAAVUeIIoijia5htojacxRdMbtZmbKSlugCL2qBvJmQ0af3IEeaHRpbWUvYy8w2CpYJQABVR4giTHKlrgowIlsQFAMe5EmSkM4sXZ7FlUEu1UTHPh3GpBpemFyci5qc29u2CpYJQABVR4gpwSyFzRiBbba4+sInd8eb/uNgLudRAa/I4EsCDmt6GltbGF0L3phcnIuanNvbtgqWCUAAVUeIGnYnkci1sY7Eb7/mgbVkOvZJtD/4w3qopInfoVsIs+pbWxvbi96YXJyLmpzb27YKlglAAFVHiBhqrP17aHf/A8dUW8ScpEAUe/wuPSB5obuRFqbLVUtn250ZW1wL3phcnIuanNvbtgqWCUAAVUeIE9qnu2+RIhRxpFR0sZMjAnIxazpUNApdUKy6+vVtbW4bnRpbWUvemFyci5qc29u2CpYJQABVR4gWWSizX0CrNBbirZxnRDjwN6SevI8kBa9irCpavoPimVwbWFuaWZlc3RfdmVyc2lvbm9zaGFyZGVkX3phcnJfdjE="
},
"root_cid": "bafyr4iglueebu33cpmsrmbrl6lm65ltvoyd6wmxvlbeo7kilq6xy5kzdeu"
}
8 changes: 4 additions & 4 deletions tests/test_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def converter_test_dataset():
yield ds


@pytest.mark.asyncio(loop_scope="session")
@pytest.mark.asyncio
async def test_converter_produces_identical_dataset(
create_ipfs: tuple[str, str],
converter_test_dataset: xr.Dataset,
Expand Down Expand Up @@ -141,7 +141,7 @@ async def test_converter_produces_identical_dataset(
print("=" * 80)


@pytest.mark.asyncio(loop_scope="session")
@pytest.mark.asyncio
async def test_hamt_to_sharded_cli_success(
create_ipfs: tuple[str, str], converter_test_dataset: xr.Dataset, capsys
):
Expand Down Expand Up @@ -192,7 +192,7 @@ async def test_hamt_to_sharded_cli_success(
xr.testing.assert_identical(test_ds, ds_from_sharded)


@pytest.mark.asyncio(loop_scope="session")
@pytest.mark.asyncio
async def test_hamt_to_sharded_cli_default_args(
create_ipfs: tuple[str, str], converter_test_dataset: xr.Dataset, capsys
):
Expand Down Expand Up @@ -238,7 +238,7 @@ async def test_hamt_to_sharded_cli_default_args(
xr.testing.assert_identical(test_ds, ds_from_sharded)


@pytest.mark.asyncio(loop_scope="session")
@pytest.mark.asyncio
async def test_hamt_to_sharded_cli_invalid_cid(create_ipfs: tuple[str, str], capsys):
"""
Tests the CLI with an invalid hamt_cid.
Expand Down
Loading
Loading