Skip to content

Commit cbd05db

Browse files
author
Martin Durant
committed
Fix all
1 parent a293f02 commit cbd05db

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

zarr/storage.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import multiprocessing
2222
import operator
2323
import os
24+
import json
2425
import re
2526
import shutil
2627
import sys
@@ -949,14 +950,32 @@ def atexit_rmglob(path,
949950
class FSStore(MutableMapping):
950951

951952
def __init__(self, url, normalize_keys=True, key_separator='.',
952-
mode='w', **storage_options):
953+
mode='w', consolidated=False, metadata_key='.zmetadata', **storage_options):
953954
import fsspec
954955
self.path = url
955956
self.normalize_keys = normalize_keys
956957
self.key_separator = key_separator
957958
self.map = fsspec.get_mapper(url, **storage_options)
958959
self.fs = self.map.fs # for direct operations
959960
self.mode = mode
961+
# TODO: should warn if consolidated and write mode?
962+
if self.fs.exists(url) and not self.fs.isdir(url):
963+
err_fspath_exists_notdir(url)
964+
self.consolidated = consolidated
965+
self.metadata_key = metadata_key
966+
if consolidated:
967+
self.meta = json.loads(self.map.get(metadata_key, b"{}").decode())
968+
if mode == 'r' or 'zarr_consolidated_format' in self.meta:
969+
consolidated_format = self.meta.get('zarr_consolidated_format', None)
970+
if consolidated_format != 1:
971+
raise MetadataError('unsupported zarr consolidated metadata format: %s' %
972+
consolidated_format)
973+
else:
974+
self.meta['zarr_consolidated_format'] = 1
975+
976+
@staticmethod
977+
def _is_meta(key):
978+
return key.split('/')[-1] in [attrs_key, group_meta_key, array_meta_key]
960979

961980
def _normalize_key(self, key):
962981
key = normalize_storage_path(key).lstrip('/')
@@ -966,12 +985,17 @@ def _normalize_key(self, key):
966985
return key.lower() if self.normalize_keys else key
967986

968987
def __getitem__(self, key):
988+
if self.consolidated and self._is_meta(key):
989+
return self.meta[key]
969990
key = self._normalize_key(key)
970991
return self.map[key]
971992

972993
def __setitem__(self, key, value):
973994
if self.mode == 'r':
974-
raise PermissionError
995+
err_read_only()
996+
if self.consolidated and self._is_meta(key):
997+
self.meta[key] = value.decode()
998+
self.map[self.metadata_key] = json.dumps(self.meta).encode()
975999
key = self._normalize_key(key)
9761000
path = self.dir_path(key)
9771001
value = ensure_contiguous_ndarray(value)
@@ -984,7 +1008,10 @@ def __setitem__(self, key, value):
9841008

9851009
def __delitem__(self, key):
9861010
if self.mode == 'r':
987-
raise PermissionError
1011+
err_read_only()
1012+
if self.consolidated and self._is_meta(key):
1013+
del self.meta[key]
1014+
self.map[self.metadata_key] = json.dumps(self.meta).encode()
9881015
key = self._normalize_key(key)
9891016
path = self.dir_path(key)
9901017
if self.fs.isdir(path):
@@ -993,6 +1020,8 @@ def __delitem__(self, key):
9931020
del self.map[key]
9941021

9951022
def __contains__(self, key):
1023+
if self.consolidated and self._is_meta(key):
1024+
return key in self.meta
9961025
key = self._normalize_key(key)
9971026
return key in self.map
9981027

@@ -1022,6 +1051,8 @@ def listdir(self, path=None):
10221051
return []
10231052

10241053
def rmdir(self, path=None):
1054+
if self.mode == 'r':
1055+
err_read_only()
10251056
store_path = self.dir_path(path)
10261057
if self.fs.isdir(store_path):
10271058
self.fs.rm(store_path, recursive=True)
@@ -1031,6 +1062,10 @@ def getsize(self, path=None):
10311062
return self.fs.du(store_path, True, True)
10321063

10331064
def clear(self):
1065+
if self.mode == 'r':
1066+
err_read_only()
1067+
if self.consolidated:
1068+
self.meta = {}
10341069
self.map.clear()
10351070

10361071

zarr/tests/test_storage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
attrs_key, default_compressor, getsize,
3131
group_meta_key, init_array, init_group, migrate_1to2)
3232
from zarr.storage import FSStore as NestedDirectoryStore
33+
from zarr.storage import FSStore as DirectoryStore
3334
from zarr.tests.util import CountingDict, skip_test_env_var
3435

3536

0 commit comments

Comments
 (0)