gabriel / musehub public
BREAKING task/minio-replace-local-backend #5 / 5
AI Agent gabriel · 126 days ago · May 9, 2026 · Diff

remove LocalBackend: BlobBackend is the only storage backend

- Delete tests entirely owned by LocalBackend (test_per_repo_object_store.py, test_object_store.py, test_no_legacy_flat_store.py) - Rewrite all other test files to use BlobBackend against MinIO - Fix production code: remove _repo_root disk-ref block, fix get_backend() call sites that still passed owner/slug args - Rename S3Backend → BlobBackend in test_minio_backend.py integration class - Update conftest to patch musehub.storage.backends + deploy.repair_objects - Fix ghost-repair tests: use patch.object(_repair_mod, 'settings') since repair_objects.py uses a local binding via from-import - Fix test_C7: remove _upsert_object_refs call that was bypassing ghost guard - Strip all stale LocalBackend/S3Backend/repo_root_for references from production docstrings and docs_muse_wire.html template

sha256:54954e48c799d81d5132424ce016a4e9d8b769b08166bce60af610959529061e sha
+91 ~72 −294 symbols
sha256:81bdc8951272f542f807d0d3198b57b54808e30e512d0d96ab478831f53866bb snapshot
+91
symbols added
~72
symbols modified
−294
symbols removed
0
dead code introduced
Semantic Changes 457 symbols
~ tests/test_blob_backend_unit.py .py 39 symbols added
+ TestBlobBackendKeys class class TestBlobBackendKeys L40–55
+ test_key_contains_object_id method method test_key_contains_object_id L41–43
+ test_key_preserves_colon method method test_key_preserves_colon L45–47
+ test_uri_for_preserves_colon method method test_uri_for_preserves_colon L53–55
+ test_uri_for_s3_scheme method method test_uri_for_s3_scheme L49–51
+ TestBlobBackendMocked class class TestBlobBackendMocked L62–135
+ test_delete_calls_delete_object method async_method test_delete_calls_delete_object L96–99
+ test_exists_false_on_error method async_method test_exists_false_on_error L92–94
+ test_exists_true_when_head_succeeds method async_method test_exists_true_when_head_succeeds L87–90
+ test_get_batch_omits_missing method async_method test_get_batch_omits_missing L113–116
+ test_get_batch_returns_all_found method async_method test_get_batch_returns_all_found L101–111
+ test_get_batch_runs_in_parallel method async_method test_get_batch_runs_in_parallel L118–135
+ test_get_returns_body_bytes method async_method test_get_returns_body_bytes L75–80
+ test_get_returns_none_on_missing method async_method test_get_returns_none_on_missing L82–85
+ test_put_calls_put_object_no_head_check method async_method test_put_calls_put_object_no_head_check L63–67
+ test_put_idempotent_second_write_safe method async_method test_put_idempotent_second_write_safe L69–73
+ TestDecodeb64 class class TestDecodeb64 L175–188
+ test_empty method method test_empty L187–188
+ test_missing_padding method method test_missing_padding L181–185
+ test_standard method method test_standard L176–179
+ TestReadObjectBytes class class TestReadObjectBytes L142–168
+ _obj method method _obj L143–146
+ test_cache_beats_storage_uri method async_method test_cache_beats_storage_uri L152–154
+ test_no_path_no_cache_returns_none method async_method test_no_path_no_cache_returns_none L167–168
+ test_reads_s3_uri method async_method test_reads_s3_uri L156–165
+ test_returns_content_cache method async_method test_returns_content_cache L148–150
+ _S3GetResponse class class _S3GetResponse L23–24 ← moved from tests/test_storage_backends.py
+ _mock_backend function function _mock_backend L27–33
+ BlobBackend import import BlobBackend L19–19
+ MagicMock import import MagicMock L15–15
+ SimpleNamespace import import SimpleNamespace L13–13 ← moved from tests/test_storage_backends.py
+ TypedDict import import TypedDict L14–14 ← moved from tests/test_storage_backends.py
+ annotations import import annotations L10–10
+ decode_b64 import import decode_b64 L19–19
+ long_id import import long_id L20–20
+ patch import import patch L15–15 ← moved from tests/test_storage_backends.py
+ pytest import import pytest L17–17
+ read_object_bytes import import read_object_bytes L19–19
+ time import import time L12–12 ← moved from tests/test_storage_backends.py
~ tests/test_minio_backend.py .py 34 symbols added
+ MINIO_ACCESS_KEY variable variable MINIO_ACCESS_KEY L33–33
+ MINIO_BUCKET variable variable MINIO_BUCKET L32–32
+ MINIO_ENDPOINT variable variable MINIO_ENDPOINT L31–31
+ MINIO_SECRET_KEY variable variable MINIO_SECRET_KEY L34–34
+ TestBlobBackendNaming class class TestBlobBackendNaming L72–97
+ test_blob_backend_exported_from_storage method method test_blob_backend_exported_from_storage L76–78
+ test_blob_backend_importable method method test_blob_backend_importable L73–74
+ test_get_backend_returns_blob_backend method method test_get_backend_returns_blob_backend L87–97
+ test_s3_backend_name_deleted method method test_s3_backend_name_deleted L80–85
+ TestGetBackendNoFallback class class TestGetBackendNoFallback L100–146
+ test_local_backend_is_deleted method method test_local_backend_is_deleted L134–139
+ test_local_backend_not_in_storage_init method method test_local_backend_not_in_storage_init L141–146
+ test_raises_when_no_bucket_configured method method test_raises_when_no_bucket_configured L101–109
+ test_returns_blob_backend_when_aws_bucket_set method method test_returns_blob_backend_when_aws_bucket_set L122–132
+ test_returns_blob_backend_when_r2_bucket_set method method test_returns_blob_backend_when_r2_bucket_set L111–120
+ TestS3BackendMinIO class class TestS3BackendMinIO L154–224
+ test_delete_removes_object method async_method test_delete_removes_object L195–201
+ test_exists_false_before_put method async_method test_exists_false_before_put L165–168
+ test_exists_true_after_put method async_method test_exists_true_after_put L171–175
+ test_get_backend_with_minio_env_vars method async_method test_get_backend_with_minio_env_vars L211–224
+ test_get_returns_none_for_missing method async_method test_get_returns_none_for_missing L188–192
+ test_put_get_round_trip method async_method test_put_get_round_trip L156–162
+ test_put_is_idempotent method async_method test_put_is_idempotent L178–185
+ test_uri_for_uses_s3_scheme method async_method test_uri_for_uses_s3_scheme L204–208
+ _minio_backend function function _minio_backend L41–49
+ _minio_reachable function function _minio_reachable L52–58
+ _oid function function _oid L37–38
+ annotations import import annotations L18–18 ← moved from tests/test_storage_backends.py
+ importlib import import importlib L20–20
+ long_id import import long_id L26–26 ← moved from tests/test_storage_backends.py
+ patch import import patch L22–22 ← moved from tests/test_per_repo_object_store.py
+ pytest import import pytest L24–24 ← moved from tests/test_storage_backends.py
+ secrets import import secrets L21–21 ← moved from tests/test_storage_backends.py
+ requires_minio variable variable requires_minio L61–64
~ tests/test_no_legacy_flat_store.py .py 35 symbols removed
TestConfigNoLegacy class class TestConfigNoLegacy L177–199
test_musehub_repos_dir_present method method test_musehub_repos_dir_present L186–192
test_no_musehub_objects_dir_in_settings method method test_no_musehub_objects_dir_in_settings L178–184
test_no_objects_dir_in_config_source method method test_no_objects_dir_in_config_source L194–199
TestLocalBackendNoLegacy class class TestLocalBackendNoLegacy L55–169
test_exists_without_repo_root_raises method async_method test_exists_without_repo_root_raises L118–123
test_get_without_repo_root_raises method async_method test_get_without_repo_root_raises L111–116
test_init_takes_no_objects_dir_arg method method test_init_takes_no_objects_dir_arg L73–81
test_no_flat_path_in_source method method test_no_flat_path_in_source L157–169
test_no_root_attribute method method test_no_root_attribute L64–71
test_no_safe_id_method method method test_no_safe_id_method L56–62
test_path_with_repo_root_uses_algo_shard_layout method method test_path_with_repo_root_uses_algo_shard_layout L90–102
test_path_without_repo_root_raises method method test_path_without_repo_root_raises L83–88
test_per_repo_object_on_disk_at_correct_path method async_method test_per_repo_object_on_disk_at_correct_path L142–155
test_per_repo_roundtrip method async_method test_per_repo_roundtrip L125–140
test_put_without_repo_root_raises method async_method test_put_without_repo_root_raises L104–109
TestMusehubSyncNoLegacy class class TestMusehubSyncNoLegacy L207–231
test_no_musehub_objects_dir_in_sync_source method method test_no_musehub_objects_dir_in_sync_source L216–222
test_no_object_disk_path_function method method test_no_object_disk_path_function L208–214
test_no_safe_id_in_sync_source method method test_no_safe_id_in_sync_source L224–231
TestObjectsRouteNoLegacy class class TestObjectsRouteNoLegacy L239–255
test_no_musehub_objects_dir_in_objects_route method method test_no_musehub_objects_dir_in_objects_route L240–246
test_objects_route_validates_against_repos_dir method method test_objects_route_validates_against_repos_dir L248–255
TestStorageInitNoLegacy class class TestStorageInitNoLegacy L263–269
test_no_flat_store_description_in_init method method test_no_flat_store_description_in_init L264–269
_REPO_ROOT variable variable _REPO_ROOT L37–37
_ast_names function function _ast_names L44–47
_source function function _source L40–41
Path import import Path L30–30
annotations import import annotations L25–25
ast import import ast L27–27
inspect import import inspect L28–28
long_id import import long_id L33–33
pytest import import pytest L32–32
textwrap import import textwrap L29–29
~ tests/test_object_store.py .py 26 symbols removed
_add_object function async_function _add_object L32–52
AsyncMock import import AsyncMock L17–17
AsyncSession import import AsyncSession L20–20
JSONValue import import JSONValue L24–24
MagicMock import import MagicMock L17–17
Path import import Path L16–16
_MusehubObject import import _MusehubObject L23–23
annotations import import annotations L12–12
blob_id import import blob_id L22–22
create_repo import import create_repo L25–25
fake_id import import fake_id L22–22
patch import import patch L17–17
pytest import import pytest L19–19
stat import import stat L14–14
tempfile import import tempfile L15–15
test_integrity_scan_clean function async_function test_integrity_scan_clean L113–130
test_integrity_scan_detects_hash_mismatch function async_function test_integrity_scan_detects_hash_mismatch L162–181
test_integrity_scan_detects_missing_object function async_function test_integrity_scan_detects_missing_object L137–155
test_local_backend_write_idempotent_for_same_content function function test_local_backend_write_idempotent_for_same_content L78–91
test_local_backend_write_repairs_corrupt_file function function test_local_backend_write_repairs_corrupt_file L94–106
test_local_backend_write_sets_readonly function function test_local_backend_write_sets_readonly L59–75
test_reaper_removes_objects_past_retention function async_function test_reaper_removes_objects_past_retention L218–247
test_reaper_spares_objects_within_retention function async_function test_reaper_spares_objects_within_retention L250–274
test_soft_delete_sets_deleted_at function async_function test_soft_delete_sets_deleted_at L188–204
test_soft_delete_unknown_object_returns_false function async_function test_soft_delete_unknown_object_returns_false L207–211
test_wire_push_stream_rejects_when_repo_quota_exceeded function async_function test_wire_push_stream_rejects_when_repo_quota_exceeded L281–321
~ tests/test_per_repo_object_store.py .py 63 symbols removed
TestDataIntegrity class class TestDataIntegrity L382–448
test_delete_from_one_repo_does_not_affect_other method async_method test_delete_from_one_repo_does_not_affect_other L417–430
test_file_inside_repo_algo_shard_structure method async_method test_file_inside_repo_algo_shard_structure L432–442
test_put_idempotent_with_repo_root method async_method test_put_idempotent_with_repo_root L383–391
test_repo_root_for_path_structure method async_method test_repo_root_for_path_structure L444–448
test_two_repo_paths_do_not_collide method async_method test_two_repo_paths_do_not_collide L403–415
test_uri_for_with_repo_root_matches_put_uri method async_method test_uri_for_with_repo_root_matches_put_uri L393–401
TestE2E class class TestE2E L275–314
test_binary_content_preserved method async_method test_binary_content_preserved L307–314
test_disk_path_resolves_to_algo_shard_structure method async_method test_disk_path_resolves_to_algo_shard_structure L294–305
test_full_lifecycle_via_repo_root_for method async_method test_full_lifecycle_via_repo_root_for L278–292
TestIntegration class class TestIntegration L169–267
test_delete_from_one_repo_leaves_other_intact method async_method test_delete_from_one_repo_leaves_other_intact L238–249
test_delete_with_repo_root_removes_file method async_method test_delete_with_repo_root_removes_file L206–214
test_exists_with_repo_root_true_after_put method async_method test_exists_with_repo_root_true_after_put L197–204
test_get_missing_with_repo_root_returns_none method async_method test_get_missing_with_repo_root_returns_none L262–267
test_get_with_repo_root_reads_from_repo_dir method async_method test_get_with_repo_root_reads_from_repo_dir L186–195
test_put_creates_algo_shard_dirs_automatically method async_method test_put_creates_algo_shard_dirs_automatically L251–260
test_put_with_repo_root_creates_file_in_repo_dir method async_method test_put_with_repo_root_creates_file_in_repo_dir L172–184
test_put_without_repo_root_raises method async_method test_put_without_repo_root_raises L216–222
test_two_repos_same_oid_isolated method async_method test_two_repos_same_oid_isolated L224–236
TestPerformance class class TestPerformance L528–572
test_50_sequential_puts_with_repo_root_under_budget method async_method test_50_sequential_puts_with_repo_root_under_budget L540–550
test_exists_50_calls_with_repo_root_under_budget method async_method test_exists_50_calls_with_repo_root_under_budget L552–563
test_put_with_repo_root_latency method async_method test_put_with_repo_root_latency L529–538
test_repo_root_for_1000_calls_under_1_second method async_method test_repo_root_for_1000_calls_under_1_second L565–572
TestSecurity class class TestSecurity L456–520
test_exists_with_invalid_object_id_raises method async_method test_exists_with_invalid_object_id_raises L489–495
test_file_immutable_after_put_with_repo_root method async_method test_file_immutable_after_put_with_repo_root L510–520
test_get_with_invalid_object_id_raises method async_method test_get_with_invalid_object_id_raises L481–487
test_invalid_object_id_raises_with_repo_root method method test_invalid_object_id_raises_with_repo_root L465–471
test_path_traversal_in_object_id_raises_with_repo_root method method test_path_traversal_in_object_id_raises_with_repo_root L457–463
test_put_with_invalid_object_id_raises method async_method test_put_with_invalid_object_id_raises L473–479
test_repo_root_for_does_not_allow_traversal_in_owner method method test_repo_root_for_does_not_allow_traversal_in_owner L497–502
test_repo_root_for_does_not_allow_traversal_in_slug method method test_repo_root_for_does_not_allow_traversal_in_slug L504–508
TestStress class class TestStress L322–374
test_20_repos_under_5_seconds method async_method test_20_repos_under_5_seconds L360–374
test_50_objects_per_repo_all_isolated method async_method test_50_objects_per_repo_all_isolated L323–341
test_concurrent_puts_to_different_repos method async_method test_concurrent_puts_to_different_repos L343–358
TestUnit class class TestUnit L60–161
test_path_traversal_in_object_id_raises_with_repo_root method method test_path_traversal_in_object_id_raises_with_repo_root L125–131
test_path_two_repos_different_directories method method test_path_two_repos_different_directories L94–105
test_path_with_repo_root_no_colon_on_disk method method test_path_with_repo_root_no_colon_on_disk L85–92
test_path_with_repo_root_same_oid_same_path method method test_path_with_repo_root_same_oid_same_path L153–161
test_path_with_repo_root_uses_algo_sharded_layout method method test_path_with_repo_root_uses_algo_sharded_layout L63–75
test_path_without_repo_root_raises method method test_path_without_repo_root_raises L77–83
test_repo_root_for_returns_correct_path method method test_repo_root_for_returns_correct_path L140–144
test_repo_root_for_uses_settings_default method method test_repo_root_for_uses_settings_default L146–151
test_settings_has_musehub_repos_dir method method test_settings_has_musehub_repos_dir L133–138
test_uri_for_with_repo_root_contains_algo_and_objects method method test_uri_for_with_repo_root_contains_algo_and_objects L107–115
test_uri_for_without_repo_root_raises method method test_uri_for_without_repo_root_raises L117–123
_backend function function _backend L44–46
_oid function function _oid L39–41
_repo_root function function _repo_root L49–52
_uid function function _uid L35–36
Path import import Path L24–24
annotations import import annotations L19–19
asyncio import import asyncio L21–21
long_id import import long_id L28–28
patch import import patch L25–25 → moved to tests/test_minio_backend.py
pytest import import pytest L27–27
secrets import import secrets L22–22
time import import time L23–23
~ tests/test_storage_backends.py .py 116 symbols removed
TestAtomicWrite class class TestAtomicWrite L708–798
test_write_concurrent_same_object_safe method async_method test_write_concurrent_same_object_safe L790–798
test_write_file_is_immutable_after_put method async_method test_write_file_is_immutable_after_put L730–738
test_write_idempotent_identical_bytes_skips_io method async_method test_write_idempotent_identical_bytes_skips_io L760–772
test_write_leaves_complete_file method async_method test_write_leaves_complete_file L711–719
test_write_no_tmp_file_remains_after_success method async_method test_write_no_tmp_file_remains_after_success L721–728
test_write_repairs_corrupted_file_atomically method async_method test_write_repairs_corrupted_file_atomically L774–788
test_write_tmp_file_cleaned_up_on_fsync_failure method async_method test_write_tmp_file_cleaned_up_on_fsync_failure L740–758
TestDataIntegrityLocalBackend class class TestDataIntegrityLocalBackend L546–613
test_data_not_corrupted method async_method test_data_not_corrupted L555–562
test_delete_only_removes_target method async_method test_delete_only_removes_target L596–605
test_empty_bytes_stored_and_retrieved method async_method test_empty_bytes_stored_and_retrieved L607–613
test_put_is_idempotent_for_identical_bytes method async_method test_put_is_idempotent_for_identical_bytes L564–571
test_put_repairs_corrupted_file method async_method test_put_repairs_corrupted_file L573–594
test_put_returns_deterministic_uri method async_method test_put_returns_deterministic_uri L547–553
TestE2ELocalBackend class class TestE2ELocalBackend L462–506
test_binary_data_preserved method async_method test_binary_data_preserved L480–487
test_full_lifecycle method async_method test_full_lifecycle L463–478
test_large_object method async_method test_large_object L489–496
test_uri_resolves_to_disk_path method async_method test_uri_resolves_to_disk_path L498–506
TestIntegrationLocalBackend class class TestIntegrationLocalBackend L272–353
test_delete_nonexistent_is_noop method async_method test_delete_nonexistent_is_noop L313–317
test_delete_removes_object method async_method test_delete_removes_object L304–311
test_exists_after_put method async_method test_exists_after_put L290–296
test_exists_missing_returns_false method async_method test_exists_missing_returns_false L298–302
test_get_missing_returns_none method async_method test_get_missing_returns_none L283–288
test_per_repo_isolation method async_method test_per_repo_isolation L345–353
test_put_and_get_round_trip method async_method test_put_and_get_round_trip L273–281
test_put_creates_parent_dirs method async_method test_put_creates_parent_dirs L329–334
test_put_idempotent_same_bytes method async_method test_put_idempotent_same_bytes L319–327
test_sha256_oid_round_trip method async_method test_sha256_oid_round_trip L336–343
TestIntegrationS3BackendMocked class class TestIntegrationS3BackendMocked L356–454
_mock_s3_backend method method _mock_s3_backend L359–365
test_delete_calls_delete_object method async_method test_delete_calls_delete_object L404–407
test_exists_returns_false_on_error method async_method test_exists_returns_false_on_error L400–402
test_exists_returns_true_when_head_succeeds method async_method test_exists_returns_true_when_head_succeeds L395–398
test_get_batch_is_parallel_not_sequential method async_method test_get_batch_is_parallel_not_sequential L429–454
test_get_batch_omits_missing_objects method async_method test_get_batch_omits_missing_objects L422–427
test_get_batch_returns_all_found_objects method async_method test_get_batch_returns_all_found_objects L409–420
test_get_returns_body_bytes method async_method test_get_returns_body_bytes L381–387
test_get_returns_none_on_error method async_method test_get_returns_none_on_error L389–393
test_put_calls_put_object_directly method async_method test_put_calls_put_object_directly L367–372
test_put_is_idempotent method async_method test_put_is_idempotent L374–379
TestPerformanceLocalBackend class class TestPerformanceLocalBackend L651–700
test_50_sequential_puts_under_budget method async_method test_50_sequential_puts_under_budget L689–700
test_exists_latency method async_method test_exists_latency L676–687
test_get_latency method async_method test_get_latency L662–674
test_put_latency method async_method test_put_latency L652–660
TestSecurityLocalBackend class class TestSecurityLocalBackend L621–643
test_exists_without_repo_root_raises method async_method test_exists_without_repo_root_raises L639–643
test_get_without_repo_root_raises method async_method test_get_without_repo_root_raises L633–637
test_put_without_repo_root_raises method async_method test_put_without_repo_root_raises L627–631
test_s3_key_preserves_colons method method test_s3_key_preserves_colons L622–625
TestStressLocalBackend class class TestStressLocalBackend L514–538
test_concurrent_reads method async_method test_concurrent_reads L532–538
test_concurrent_writes_different_objects method async_method test_concurrent_writes_different_objects L524–530
test_write_many_objects method async_method test_write_many_objects L515–522
TestUnitDecodeb64 class class TestUnitDecodeb64 L122–148
test_already_padded method method test_already_p L141–145
test_empty_string method method test_empty_string L147–148
test_missing_one_padding method method test_missing_one_padding L129–133
test_missing_two_padding method method test_missing_two_padding L135–139
test_standard_base64 method method test_standard_base64 L123–127
TestUnitGetBackend class class TestUnitGetBackend L151–209
test_get_backend_bound_local_exists_needs_no_repo_root_kwarg method async_method test_get_backend_bound_local_exists_needs_no_repo_root_kwarg L190–200
test_get_backend_bound_local_get_needs_no_repo_root_kwarg method async_method test_get_backend_bound_local_get_needs_no_repo_root_kwarg L177–188
test_get_backend_no_args_local_returns_unbound method method test_get_backend_no_args_local_returns_unbound L202–209
test_get_backend_returns_local_when_no_s3_bucket method method test_get_backend_returns_local_when_no_s3_bucket L152–157
test_get_backend_returns_s3_when_bucket_set method method test_get_backend_returns_s3_when_bucket_set L159–165
test_get_backend_with_owner_slug_returns_bound_local method method test_get_backend_with_owner_slug_returns_bound_local L167–175
TestUnitLocalBackend class class TestUnitLocalBackend L70–97
test_path_requires_repo_root method method test_path_requires_repo_root L71–74
test_path_with_repo_root_uses_algo_shard_layout method method test_path_with_repo_root_uses_algo_shard_layout L76–83
test_uri_for_contains_obj method method test_uri_for_contains_obj L92–97
test_uri_for_has_local_prefix method method test_uri_for_has_local_prefix L85–90
TestUnitLocalBackendBoundInit class class TestUnitLocalBackendBoundInit L212–264
test_bound_backend_stores_repo_root method method test_bound_backend_stores_repo_root L215–218
test_bound_delete_no_kwarg method async_method test_bound_delete_no_kwarg L240–246
test_bound_exists_no_kwarg method async_method test_bound_exists_no_kwarg L232–238
test_bound_put_and_get_no_kwarg method async_method test_bound_put_and_get_no_kwarg L224–230
test_kwarg_overrides_bound_repo_root method async_method test_kwarg_overrides_bound_repo_root L248–258
test_unbound_backend_has_none_repo_root method method test_unbound_backend_has_none_repo_root L220–222
test_unbound_get_without_kwarg_raises method async_method test_unbound_get_without_kwarg_raises L260–264
TestUnitReadObjectBytes class class TestUnitReadObjectBytes L806–868
_obj method method _obj L810–819
test_content_cache_takes_priority_over_disk method async_method test_content_cache_takes_priority_over_disk L826–831
test_missing_disk_file_returns_none method async_method test_missing_disk_file_returns_none L860–863
test_no_path_no_cache_returns_none method async_method test_no_path_no_cache_returns_none L865–868
test_reads_from_s3_when_s3_uri method async_method test_reads_from_s3_when_s3_uri L847–858
test_reads_local_disk_path method async_method test_reads_local_disk_path L833–838
test_reads_local_uri_prefix method async_method test_reads_local_uri_prefix L840–845
test_returns_content_cache_when_present method async_method test_returns_content_cache_when_present L821–824
TestUnitS3Backend class class TestUnitS3Backend L100–119
test_key_basic method method test_key_basic L101–104
test_key_preserves_colon method method test_key_preserves_colon L106–109
test_uri_for_preserves_colon_in_key method method test_uri_for_preserves_colon_in_key L116–119
test_uri_for_s3_prefix method method test_uri_for_s3_prefix L111–114
_S3GetResponse class class _S3GetResponse L49–50 → moved to tests/test_blob_backend_unit.py
_backend function function _backend L57–58
_repo_root function function _repo_root L61–62
_uid function function _uid L53–54
LocalBackend import import LocalBackend L42–42
MagicMock import import MagicMock L38–38
Path import import Path L35–35
S3Backend import import S3Backend L42–42
SimpleNamespace import import SimpleNamespace L36–36 → moved to tests/test_blob_backend_unit.py
TypedDict import import TypedDict L37–37 → moved to tests/test_blob_backend_unit.py
annotations import import annotations L30–30 → moved to tests/test_minio_backend.py
asyncio import import asyncio L32–32
decode_b64 import import decode_b64 L42–42
get_backend import import get_backend L42–42
long_id import import long_id L43–43 → moved to tests/test_minio_backend.py
patch import import patch L38–38 → moved to tests/test_blob_backend_unit.py
pytest import import pytest L40–40 → moved to tests/test_minio_backend.py
secrets import import secrets L33–33 → moved to tests/test_minio_backend.py
time import import time L34–34 → moved to tests/test_blob_backend_unit.py
~ deploy/repair_objects.py .py 1 symbol modified
~ repair
~ musehub/api/routes/musehub/repos.py .py 1 symbol removed
repair_branch function async_function repair_branch L397–466
~ musehub/api/routes/wire.py .py 1 symbol modified
~ musehub/main.py .py 1 symbol modified
~ musehub/services/musehub_intel_providers.py .py 2 symbols removed, 1 symbol modified
_resolve_repo_root function async_function _resolve_repo_root L237–255
repo_root_for import import repo_root_for L43–43
~ musehub/services/musehub_wire.py .py 1 symbol removed, 6 symbols modified
~ musehub/storage/__init__.py .py 1 symbol added, 2 symbols removed, 3 symbols modified
LocalBackend import import LocalBackend L21–21
S3Backend import import S3Backend L21–21
+ BlobBackend import import BlobBackend L7–7
~ musehub/storage/backends.py .py 2 symbols added, 16 symbols removed, 15 symbols modified
~ _key
~ delete
~ exists
~ get
~ stream
LocalBackend class class LocalBackend L161–350
__init__ method method __init__ L174–175
_path method method _path L187–204
_resolve_root method method _resolve_root L177–185
_write method method _write L216–259
delete method async_method delete L302–307
exists method async_method exists L293–300
get method async_method get L261–268
get_batch method async_method get_batch L270–291
presign_batch method async_method presign_batch L338–350
put method async_method put L209–214
stream method async_method stream L309–336
uri_for method method uri_for L206–207
S3Backend class class S3Backend L352–583
put method async_method put L418–426
repo_root_for function function repo_root_for L585–598
+ BlobBackend class class BlobBackend L150–381
+ put method async_method put L216–224
~ musehub/templates/musehub/pages/docs_muse_wire.html .html 1 symbol added, 1 symbol removed, 4 symbols modified
h3: Key format by backend section h3: Key format by backend L907–907
+ h3: Key format section h3: Key format L907–907
~ tests/bench_push.py .py 1 symbol modified
~ main
~ tests/conftest.py .py 1 symbol modified
~ tests/test_api_performance.py .py 1 symbol added, 4 symbols removed
test_local_backend_has_stream function function test_local_backend_has_stream L121–123
test_local_backend_stream_missing_yields_nothing function async_function test_local_backend_stream_missing_yields_nothing L154–163
test_local_backend_stream_yields_all_content function async_function test_local_backend_stream_yields_all_content L131–151
test_s3_backend_has_stream function function test_s3_backend_has_stream L126–128
+ test_blob_backend_has_stream function function test_blob_backend_has_stream L120–122
~ tests/test_object_store_canonical.py .py 1 symbol added, 3 symbols removed, 1 symbol modified
test_local_backend_path_is_under_objects_dir method method test_local_backend_path_is_under_objects_dir L216–226
test_local_backend_path_uses_sharded_layout method method test_local_backend_path_uses_sharded_layout L201–214
test_s3_key_uses_prefix_form method method test_s3_key_uses_prefix_form L228–235
+ test_blob_backend_key_uses_prefix_form method method test_blob_backend_key_uses_prefix_form L199–206
~ tests/test_pack_files.py .py 8 symbols removed
TestLocalBackendPackFallthrough class class TestLocalBackendPackFallthrough L186–256
test_exists_returns_true_for_packed_object method async_method test_exists_returns_true_for_packed_object L207–222
test_get_finds_object_in_pack_after_loose_removed method async_method test_get_finds_object_in_pack_after_loose_ L188–204
test_get_returns_none_when_not_loose_or_packed method async_method test_get_returns_none_when_not_loose_or_packed L225–232
test_loose_object_takes_precedence_over_pack method async_method test_loose_object_takes_precedence_over_pack L235–256
TestPackRoundTrip class class TestPackRoundTrip L387–446
test_new_loose_objects_after_pack_are_readable method async_method test_new_loose_objects_after_pack_are_readable L423–446
test_write_pack_remove_loose_still_readable method async_method test_write_pack_remove_loose_still_readable L389–420
~ tests/test_push_object_integrity.py .py 1 symbol added, 1 symbol removed, 1 symbol modified
test_i1_local_backend_put_is_durable function function test_i1_local_backend_put_is_durable L132–148
+ test_i1_blob_backend_put_is_durable function async_function test_i1_blob_backend_put_is_durable L132–152
~ tests/test_raw_endpoint.py .py 8 symbols added, 8 symbols removed, 9 symbols modified
test_local_backend_exists_returns_true_after_put method async_method test_local_backend_exists_returns_true_after_put L132–136
test_local_backend_exists_single_arg method async_method test_local_backend_exists_single_arg L126–130
test_local_backend_exists_two_args_raises method async_method test_local_backend_exists_two_args_raises L138–142
test_s3_backend_exists_single_arg method async_method test_s3_backend_exists_single_arg L144–154
test_s3_backend_exists_two_args_raises method async_method test_s3_backend_exists_two_args_raises L156–163
LocalBackend import import LocalBackend L38–38
Path import import Path L22–22
S3Backend import import S3Backend L38–38
+ MINIO_ACCESS_KEY variable variable MINIO_ACCESS_KEY L41–41
+ MINIO_BUCKET variable variable MINIO_BUCKET L40–40
+ MINIO_ENDPOINT variable variable MINIO_ENDPOINT L39–39
+ MINIO_SECRET_KEY variable variable MINIO_SECRET_KEY L42–42
+ test_blob_backend_exists_error_returns_false method async_method test_blob_backend_exists_error_returns_false L152–159
+ test_blob_backend_exists_single_arg method async_method test_blob_backend_exists_single_arg L140–150
+ _minio_backend function function _minio_backend L49–56
+ BlobBackend import import BlobBackend L36–36
~ tests/test_storage_tiers.py .py 3 symbols removed
TestFullPromotion class class TestFullPromotion L415–480
test_new_objects_written_after_prune_are_hot method async_method test_new_objects_written_after_prune_are_hot L453–480
test_objects_readable_through_all_lifecycle_stages method async_method test_objects_readable_through_all_lifecycle_stages L417–450
~ tests/test_wire_fetch_presign.py .py 1 symbol removed
test_fp4_local_backend_never_presigns function async_function test_fp4_local_backend_never_presigns L307–320
~ tests/test_wire_presign_push.py .py 3 symbols added, 3 symbols removed, 6 symbols modified
test_p1_local_backend_missing_goes_to_stream_these function async_function test_p1_local_backend_missing_goes_to_stream_these L230–259
test_p2_s3_backend_missing_gets_presigned_url function async_function test_p2_s3_backend_missing_gets_presigned_url L267–293
test_p7_s3_backend_presign_batch_url_format function async_function test_p7_s3_backend_presign_batch_url_format L496–523
+ test_p1_already_stored_vs_missing function async_function test_p1_already_stored_vs_missing L225–263
+ test_p2_missing_gets_presigned_url function async_function test_p2_missing_gets_presigned_url L271–297
+ test_p7_blob_backend_presign_batch_url_format function async_function test_p7_blob_backend_presign_batch_url_format L500–527

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:54954e48c799d81d5132424ce016a4e9d8b769b08166bce60af610959529061e --body "your comment"