7
7
import numpy as np
8
8
9
9
10
- from zarr .compat import PY2 , binary_type
10
+ from zarr .compat import PY2 , binary_type , Mapping
11
11
from zarr .errors import MetadataError
12
12
13
13
14
14
ZARR_FORMAT = 2
15
15
16
16
17
- def _ensure_str (s ):
17
+ def ensure_str (s ):
18
18
if PY2 : # pragma: py3 no cover
19
19
# noinspection PyUnresolvedReferences
20
20
if isinstance (s , buffer ): # noqa
@@ -27,12 +27,32 @@ def _ensure_str(s):
27
27
return s
28
28
29
29
30
+ def json_dumps (o ):
31
+ """Write JSON in a consistent, human-readable way."""
32
+ return json .dumps (o , indent = 4 , sort_keys = True , ensure_ascii = True ,
33
+ separators = (',' , ': ' ))
34
+
35
+
36
+ def parse_metadata (s ):
37
+ if isinstance (s , Mapping ):
38
+ # assume metadata has already been parsed into a mapping object
39
+ meta = s
40
+ else :
41
+ # assume metadata needs to be parsed as JSON
42
+ s = ensure_str (s )
43
+ meta = json .loads (s )
44
+ return meta
45
+
46
+
30
47
def decode_array_metadata (s ):
31
- s = _ensure_str (s )
32
- meta = json .loads (s )
48
+ meta = parse_metadata (s )
49
+
50
+ # check metadata format
33
51
zarr_format = meta .get ('zarr_format' , None )
34
52
if zarr_format != ZARR_FORMAT :
35
53
raise MetadataError ('unsupported zarr format: %s' % zarr_format )
54
+
55
+ # extract array metadata fields
36
56
try :
37
57
dtype = decode_dtype (meta ['dtype' ])
38
58
fill_value = decode_fill_value (meta ['fill_value' ], dtype )
@@ -67,8 +87,7 @@ def encode_array_metadata(meta):
67
87
order = meta ['order' ],
68
88
filters = meta ['filters' ],
69
89
)
70
- s = json .dumps (meta , indent = 4 , sort_keys = True , ensure_ascii = True ,
71
- separators = (',' , ': ' ))
90
+ s = json_dumps (meta )
72
91
b = s .encode ('ascii' )
73
92
return b
74
93
@@ -98,14 +117,14 @@ def decode_dtype(d):
98
117
99
118
100
119
def decode_group_metadata (s ):
101
- s = _ensure_str (s )
102
- meta = json .loads (s )
120
+ meta = parse_metadata (s )
121
+
122
+ # check metadata format version
103
123
zarr_format = meta .get ('zarr_format' , None )
104
124
if zarr_format != ZARR_FORMAT :
105
125
raise MetadataError ('unsupported zarr format: %s' % zarr_format )
106
- meta = dict (
107
- zarr_format = ZARR_FORMAT ,
108
- )
126
+
127
+ meta = dict (zarr_format = zarr_format )
109
128
return meta
110
129
111
130
@@ -115,7 +134,7 @@ def encode_group_metadata(meta=None):
115
134
meta = dict (
116
135
zarr_format = ZARR_FORMAT ,
117
136
)
118
- s = json . dumps (meta , indent = 4 , sort_keys = True , ensure_ascii = True )
137
+ s = json_dumps (meta )
119
138
b = s .encode ('ascii' )
120
139
return b
121
140
0 commit comments