cdxcore 0.1.5__py3-none-any.whl → 0.1.9__py3-none-any.whl

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.

Potentially problematic release.


This version of cdxcore might be problematic. Click here for more details.

tests/test_pretty.py ADDED
@@ -0,0 +1,404 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Tue Apr 14 21:24:52 2020
4
+ @author: hansb
5
+ """
6
+
7
+
8
+ import unittest as unittest
9
+ import dataclasses as dataclasses
10
+ import sys as sys
11
+ import os as os
12
+ import pickle as pickle
13
+ import tempfile as tempfile
14
+ import shutil as shutil
15
+ sys.setrecursionlimit(100)
16
+
17
+ def import_local():
18
+ """
19
+ In order to be able to run our tests manually from the 'tests' directory
20
+ we force import from the local package.
21
+ We also force reloading all modules to make sure we are not running old code.
22
+ """
23
+ me = "cdxcore"
24
+ import os
25
+ import sys
26
+ cwd = os.getcwd()
27
+ if cwd[-len(me):] == me:
28
+ return
29
+ assert cwd[-5:] == "tests",("Expected current working directory to be in a 'tests' directory", cwd[-5:], "from", cwd)
30
+ assert cwd[-6] in ['/', '\\'],("Expected current working directory 'tests' to be lead by a '\\' or '/'", cwd[-6:], "from", cwd)
31
+ sys.path.insert( 0, cwd[:-6] )
32
+
33
+ # reload modules
34
+ import importlib as imp
35
+ modules = sys.modules.copy()
36
+ for name, mdata in modules.items():
37
+ if name[:len(me)] == me:
38
+ imp.reload(mdata)
39
+ print("Reloaded", name)
40
+ import_local()
41
+
42
+ from cdxcore.pretty import PrettyObject, Sequence
43
+
44
+ class A1(PrettyObject):
45
+ def __init__(self, x=3):
46
+ self.x=x
47
+ class A2(PrettyObject):
48
+ def __init__(self, x): # mandatory argument
49
+ self.x=x
50
+
51
+
52
+ class Test(unittest.TestCase):
53
+
54
+
55
+ def test_PrettyObject(self):
56
+
57
+ # basics
58
+ g1 = PrettyObject(a=1)
59
+ g1.b = 2
60
+ g1['c'] = 3
61
+ self.assertEqual(g1.a, 1)
62
+ self.assertEqual(g1.b, 2)
63
+ self.assertEqual(g1.c, 3)
64
+
65
+ with self.assertRaises(AttributeError):
66
+ _ = g1.d
67
+
68
+ g1['e'] = 4
69
+ del g1.e
70
+ g1.f = 5
71
+ del g1['f']
72
+ with self.assertRaises(AttributeError):
73
+ _ = g1.e
74
+ with self.assertRaises(AttributeError):
75
+ _ = g1.f
76
+ with self.assertRaises(AttributeError):
77
+ del g1.f
78
+
79
+ self.assertEqual(g1.get('c',4),3)
80
+ self.assertEqual(g1.get('d',4),4)
81
+
82
+
83
+ g1 = PrettyObject(g1)
84
+ self.assertEqual(g1.a, 1)
85
+ self.assertEqual(g1.b, 2)
86
+ self.assertEqual(g1.c, 3)
87
+
88
+ g1.update({ 'd':4 })
89
+ self.assertEqual(g1.d, 4)
90
+ g1.update(PrettyObject(e=5))
91
+ self.assertEqual(g1.e, 5)
92
+
93
+ g1.update({ 'd':4 },d=3)
94
+ self.assertEqual(g1.d, 3)
95
+
96
+ # get default
97
+ g = PrettyObject()
98
+ x = g.setdefault("x", 1.)
99
+ self.assertEqual(x, 1.)
100
+ self.assertEqual(g.x, 1.)
101
+
102
+ # functions
103
+ def F(self,x):
104
+ self.x = x # set 'x'
105
+ g = PrettyObject()
106
+ g.F = F
107
+ g.F(2)
108
+ self.assertEqual(g.x,2)
109
+
110
+ g = PrettyObject(z=2)
111
+ g.F = lambda slf, x: slf.z*x # access 'z'
112
+ self.assertEqual(g.F(3),6)
113
+
114
+ g2 = PrettyObject()
115
+ g2.F = g.F
116
+ with self.assertRaises(AttributeError):
117
+ g2.F(3) # no 'z'
118
+ g2.z = 3
119
+ self.assertEqual(g2.F(3),9)
120
+
121
+
122
+ with self.assertRaises(TypeError):
123
+ def G():
124
+ return 1
125
+ g.G = G
126
+ g.G()
127
+
128
+ # __ does not work
129
+ g = PrettyObject()
130
+ g.__x = 1
131
+ g._y = 2
132
+ self.assertEqual(g.__x,1) # works as usual
133
+ self.assertEqual(g['_y'],2) # protected works as for all python objects
134
+ with self.assertRaises(KeyError):
135
+ _ = g['__x'] # does not work: cannot use private members as dictionary elements
136
+ self.assertEqual( getattr(g, "__z", None), None )
137
+ with self.assertRaises(AttributeError):
138
+ getattr(g, "__z",)
139
+
140
+ # at_pos
141
+ g1 = PrettyObject()
142
+ g1.a=2
143
+ g1.b=1
144
+ g1.d=3
145
+ g1.c=4
146
+ self.assertEqual(g1.a, 2)
147
+ self.assertEqual(g1.b, 1)
148
+ self.assertEqual(g1.d, 3)
149
+ self.assertEqual(g1.c, 4)
150
+ self.assertEqual( g1.at_pos[3], 4)
151
+ self.assertEqual( g1.at_pos[0:2], [2,1])
152
+ self.assertEqual( g1.at_pos.keys[3], 'c')
153
+ self.assertEqual( g1.at_pos.keys[0:2], ['a', 'b'])
154
+ self.assertEqual( g1.at_pos.items[3], ('c',4))
155
+ self.assertEqual( g1.at_pos.items[0:2], [('a',2), ('b',1)])
156
+
157
+ self.assertTrue( isinstance( g1.at_pos, Sequence ))
158
+ self.assertTrue( isinstance( g1.at_pos.keys, list ))
159
+ self.assertTrue( isinstance( g1.at_pos.values, list ))
160
+ self.assertTrue( isinstance( g1.at_pos.items, Sequence ))
161
+
162
+ # copy
163
+ p = PrettyObject(x=1,y=2)
164
+ p.q1 = PrettyObject(z=3)
165
+ p.q2 = PrettyObject(z=4)
166
+ r = p.copy(x=11)
167
+ p.q1.z = 33 # not shallow copy
168
+ self.assertEqual( r.x, 11 )
169
+ self.assertEqual( r.y, 2 )
170
+ self.assertEqual( r.q1.z, 33 )
171
+ self.assertEqual( r.q2.z, 4 )
172
+
173
+ # iterator
174
+ self.assertEqual( str(g1.at_pos.values), "[2, 1, 3, 4]")
175
+ icnt = 0
176
+ for k, v in g1.items():
177
+ if icnt == 0:
178
+ self.assertEqual(k, "a")
179
+ self.assertEqual(v, 2)
180
+ elif icnt == 1:
181
+ self.assertEqual(k, "b")
182
+ self.assertEqual(v, 1)
183
+ elif icnt == 2:
184
+ self.assertEqual(k, "d")
185
+ self.assertEqual(v, 3)
186
+ else:
187
+ self.assertEqual( icnt, 3)
188
+ self.assertEqual(k, "c")
189
+ self.assertEqual(v, 4)
190
+ icnt += 1
191
+
192
+ @dataclasses.dataclass
193
+ class Data:
194
+ data : PrettyObject = PrettyObject().as_field()
195
+ data = Data()
196
+ with self.assertRaises(AttributeError):
197
+ _ = data.data.x
198
+ data = Data(PrettyObject(x=1))
199
+ self.assertEqual(data.data.x,1)
200
+
201
+ @dataclasses.dataclass
202
+ class Data:
203
+ data : PrettyObject = PrettyObject(x=2).as_field()
204
+ data = Data()
205
+ self.assertEqual(data.data.x,2)
206
+ data = Data( data=PrettyObject({'x':3}))
207
+ self.assertEqual(data.data.x,3)
208
+
209
+ # comparison
210
+
211
+ a = PrettyObject(x=1,y=2)
212
+ b = PrettyObject(x=1,y=2)
213
+ self.assertEqual( a, b)
214
+ a = PrettyObject(x=1,y=2)
215
+ b = PrettyObject(y=2,x=1)
216
+ self.assertNotEqual( a, b)
217
+ a = PrettyObject(x=1,y=2,z=3)
218
+ b = PrettyObject(x=1,y=2)
219
+ self.assertNotEqual( a, b)
220
+ self.assertTrue( a>= b)
221
+ self.assertFalse( a<=b)
222
+
223
+ # OR
224
+
225
+ p = PrettyObject(a=1,b=2,x=3)
226
+ q = PrettyObject(x=44,y=55,z=66)
227
+ self.assertEqual( p|q, dict(a=1,b=2,x=44,y=55,z=66))
228
+ self.assertEqual( q|p, dict(x=3,y=55,z=66,a=1,b=2))
229
+ a = p.copy()
230
+ a |= p
231
+ self.assertEqual( p|q, dict(a=1,b=2,x=44,y=55,z=66))
232
+
233
+
234
+ # I/O
235
+
236
+ p = PrettyObject()
237
+ p.x = 1
238
+ p.q = PrettyObject(y=22)
239
+ self.assertEqual(p.q.y,22)
240
+
241
+ a = A1()
242
+ a.q = PrettyObject(y=22)
243
+ self.assertEqual(a.x,3)
244
+ self.assertEqual(a.q.y,22)
245
+
246
+ aa = A2(x=4)
247
+ aa.q = PrettyObject(y=22)
248
+ self.assertEqual(aa.x,4)
249
+ self.assertEqual(aa.q.y,22)
250
+
251
+ try:
252
+ tmp_dir = tempfile.mkdtemp()
253
+ self.assertNotEqual(tmp_dir[-1],"/")
254
+ self.assertNotEqual(tmp_dir[-1],"\\")
255
+ tmp_file = tmp_dir + "/test_pretty_object.pck"
256
+
257
+ with open(tmp_file, "wb") as f:
258
+ pickle.dump(p,f)
259
+
260
+ with open(tmp_file, "rb") as f:
261
+ p2 = pickle.load(f)
262
+ self.assertEqual(p2,p)
263
+
264
+ os.remove(tmp_file)
265
+
266
+ with open(tmp_file, "wb") as f:
267
+ pickle.dump(a,f)
268
+
269
+ with open(tmp_file, "rb") as f:
270
+ a2 = pickle.load(f)
271
+ self.assertEqual(a2,a)
272
+
273
+ os.remove(tmp_file)
274
+
275
+ with open(tmp_file, "wb") as f:
276
+ pickle.dump(aa,f)
277
+
278
+ with open(tmp_file, "rb") as f:
279
+ aa2 = pickle.load(f)
280
+ self.assertEqual(aa2,aa)
281
+
282
+ os.remove(tmp_file)
283
+
284
+ finally:
285
+ shutil.rmtree(tmp_dir)
286
+
287
+
288
+ """
289
+ def test_PrettyDict(self):
290
+
291
+ g1 = PrettyDict(a=1)
292
+ g1.b = 2
293
+ g1['c'] = 3
294
+ self.assertEqual(g1.a, 1)
295
+ self.assertEqual(g1.b, 2)
296
+ self.assertEqual(g1.c, 3)
297
+
298
+ with self.assertRaises(KeyError):
299
+ _ = g1.d
300
+
301
+ g1.e = 4
302
+ g1.f = 5
303
+ del g1['e']
304
+ del g1['f']
305
+ with self.assertRaises(KeyError):
306
+ _ = g1.e
307
+ with self.assertRaises(KeyError):
308
+ _ = g1.f
309
+
310
+ self.assertEqual(g1.get('c',4),3)
311
+ self.assertEqual(g1.get('d',4),4)
312
+ self.assertEqual(g1('c'),3)
313
+ self.assertEqual(g1('c',4),3)
314
+ self.assertEqual(g1('d',4),4)
315
+
316
+ g1 = PrettyDict(g1)
317
+ self.assertEqual(g1.a, 1)
318
+ self.assertEqual(g1.b, 2)
319
+ self.assertEqual(g1.c, 3)
320
+
321
+ g1.update({ 'd':4 })
322
+ self.assertEqual(g1.d, 4)
323
+ g1.update(PrettyDict(e=5))
324
+ self.assertEqual(g1.e, 5)
325
+
326
+ g1.update({ 'd':4 },d=3)
327
+ self.assertEqual(g1.d, 3)
328
+
329
+ # functions
330
+ def F(self,x):
331
+ self.x = x
332
+
333
+ g = PrettyDict()
334
+ g.F = F
335
+ g.F(2)
336
+ self.assertEqual(g.x,2)
337
+
338
+ g2 = PrettyDict()
339
+ g2.F = g.F
340
+ g2.F(3)
341
+ self.assertEqual(g2.x,3) # new value only for this object is 3
342
+ self.assertEqual(g.x,2) # old value remains 2
343
+
344
+ with self.assertRaises(TypeError):
345
+ def G():
346
+ return 1
347
+ g.G = G
348
+ g.G()
349
+
350
+ # __ does not work
351
+ g = PrettyDict()
352
+ g.__x = 1
353
+ g._y = 2
354
+ self.assertEqual(g.__x,1) # works as usual
355
+ self.assertEqual(g['_y'],2) # protected works as for all python objects
356
+ with self.assertRaises(KeyError):
357
+ _ = g['__x'] # does not work: cannot use private members as dictionary elements
358
+ self.assertEqual( getattr(g, "__z", None), None )
359
+ with self.assertRaises(AttributeError):
360
+ getattr(g, "__z",)
361
+
362
+ # at_pos
363
+ g1 = PrettyDict()
364
+ g1.a=1
365
+ g1.b=2
366
+ g1.d=4
367
+ g1.c=3
368
+ self.assertEqual(g1.a, 1)
369
+ self.assertEqual(g1.b, 2)
370
+ self.assertEqual(g1.c, 3)
371
+ self.assertEqual(g1.d, 4)
372
+ self.assertEqual( g1.at_pos[3], 3)
373
+ self.assertEqual( g1.at_pos[0:2], [1,2])
374
+ self.assertEqual( g1.at_pos.keys[3], 'c')
375
+ self.assertEqual( g1.at_pos.keys[0:2], ['a', 'b'])
376
+ self.assertEqual( g1.at_pos.items[3], ('c',3))
377
+ self.assertEqual( g1.at_pos.items[0:2], [('a',1), ('b',2)])
378
+
379
+ @dataclasses.dataclass
380
+ class Data:
381
+ data : PrettyField = PrettyField.Field()
382
+ data = Data()
383
+ with self.assertRaises(KeyError):
384
+ _ = data.data.x
385
+ data = Data(PrettyDict(x=1))
386
+ self.assertEqual(data.data.x,1)
387
+
388
+ @dataclasses.dataclass
389
+ class Data:
390
+ data : PrettyField = PrettyField.Field(x=2)
391
+ data = Data()
392
+ self.assertEqual(data.data.x,2)
393
+ data = Data( data=PrettyDict({'x':3}))
394
+ self.assertEqual(data.data.x,3)
395
+ data = Data( data={'x':3})
396
+ self.assertEqual(data.data['x'],3)
397
+
398
+ # data I/O
399
+ """
400
+
401
+ if __name__ == '__main__':
402
+ unittest.main()
403
+
404
+
tests/test_subdir.py ADDED
@@ -0,0 +1,289 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Tue Apr 14 21:24:52 2020
4
+ @author: hansb
5
+ """
6
+
7
+ import unittest as unittest
8
+
9
+ def import_local():
10
+ """
11
+ In order to be able to run our tests manually from the 'tests' directory
12
+ we force import from the local package.
13
+ We also force reloading all modules to make sure we are not running old code.
14
+ """
15
+ me = "cdxcore"
16
+ import os
17
+ import sys
18
+ cwd = os.getcwd()
19
+ if cwd[-len(me):] == me:
20
+ return
21
+ assert cwd[-5:] == "tests",("Expected current working directory to be in a 'tests' directory", cwd[-5:], "from", cwd)
22
+ assert cwd[-6] in ['/', '\\'],("Expected current working directory 'tests' to be lead by a '\\' or '/'", cwd[-6:], "from", cwd)
23
+ sys.path.insert( 0, cwd[:-6] )
24
+
25
+ # reload modules
26
+ import importlib as imp
27
+ modules = sys.modules.copy()
28
+ for name, mdata in modules.items():
29
+ if name[:len(me)] == me:
30
+ imp.reload(mdata)
31
+ import_local()
32
+
33
+ """
34
+ Imports
35
+ """
36
+ from cdxcore.subdir import SubDir, CacheMode, VersionError, VersionPresentError
37
+ import numpy as np
38
+
39
+ class Test(unittest.TestCase):
40
+
41
+ def test_subdir(self):
42
+
43
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", delete_everything=True )
44
+ sub['y'] = 2
45
+ sub.write('z',3)
46
+ sub.write_string('l',"hallo")
47
+ sub.write(['a','b'],[11,22])
48
+
49
+ lst = str(sorted(sub.files()))
50
+ self.assertEqual(lst, "['a', 'b', 'y', 'z']")
51
+ lst = str(sorted(sub.files(ext="txt")))
52
+ self.assertEqual(lst, "['l']")
53
+
54
+ # test naming
55
+ self.assertEqual( str(sub), sub.path + ";*" + sub.ext )
56
+ self.assertEqual( repr(sub), "SubDir(" + sub.path + ";*" + sub.ext + ")" )
57
+
58
+ # read them all back
59
+ self.assertEqual(sub['y'],2)
60
+ self.assertEqual(sub['z'],3)
61
+ self.assertEqual(sub.read_string('l'),"hallo")
62
+ self.assertEqual(sub['a'],11)
63
+ self.assertEqual(sub['b'],22)
64
+ self.assertEqual(sub(['a','b'], None), [11,22])
65
+ self.assertEqual(sub.read(['a','b']), [11,22])
66
+ self.assertEqual(sub[['a','b']], [11,22])
67
+ self.assertEqual(sub(['aaaa','bbbb'], None), [None,None])
68
+
69
+ # test alternatives
70
+ self.assertEqual(sub.read('y'),2)
71
+ self.assertEqual(sub.read('y',None),2)
72
+ self.assertEqual(sub.read('u',None),None)
73
+ self.assertEqual(sub('y',None),2)
74
+ self.assertEqual(sub('u',None),None)
75
+
76
+ # missing objects
77
+ with self.assertRaises(AttributeError):
78
+ print(sub.x2)
79
+ with self.assertRaises(KeyError):
80
+ print(sub['x2'])
81
+ with self.assertRaises(KeyError):
82
+ print(sub.read('x2',raise_on_error=True))
83
+
84
+ # delete & confirm they are gone
85
+ del sub['y']
86
+ sub.delete('z')
87
+
88
+ del sub['x'] # silent
89
+ with self.assertRaises(KeyError):
90
+ sub.delete('x',raise_on_error=True)
91
+
92
+ # sub dirs
93
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", delete_everything=True )
94
+ s1 = sub("subDir1")
95
+ s2 = sub("subDir2/")
96
+ s3 = SubDir("subDir3/",parent=sub)
97
+ s4 = SubDir("subDir4", parent=sub)
98
+ self.assertEqual(s1.path, sub.path + "subDir1/")
99
+ self.assertEqual(s2.path, sub.path + "subDir2/")
100
+ self.assertEqual(s3.path, sub.path + "subDir3/")
101
+ self.assertEqual(s4.path, sub.path + "subDir4/")
102
+ lst = str(sorted(sub.sub_dirs()))
103
+ self.assertEqual(lst, "[]")
104
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", delete_everything=True )
105
+ s1 = sub("subDir1", create_directory=True)
106
+ s2 = sub("subDir2/", create_directory=True)
107
+ s3 = SubDir("subDir3/",parent=sub, create_directory=True)
108
+ s4 = SubDir("subDir4", parent=sub, create_directory=True)
109
+ self.assertEqual(s1.path, sub.path + "subDir1/")
110
+ self.assertEqual(s2.path, sub.path + "subDir2/")
111
+ self.assertEqual(s3.path, sub.path + "subDir3/")
112
+ self.assertEqual(s4.path, sub.path + "subDir4/")
113
+ lst = str(sorted(sub.sub_dirs()))
114
+ self.assertEqual(lst, "['subDir1', 'subDir2', 'subDir3', 'subDir4']")
115
+
116
+ sub.delete_all_content()
117
+ self.assertEqual(len(sub.files()),0)
118
+ self.assertEqual(len(sub.sub_dirs()),0)
119
+ sub.delete_everything()
120
+
121
+ # test vectors
122
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", delete_everything=True )
123
+ sub[['y','z']] = [2,3]
124
+
125
+ self.assertEqual(sub[['y','z']], [2,3])
126
+ with self.assertRaises(KeyError):
127
+ self.assertEqual(sub[['y','z','r']], [2,3,None])
128
+ self.assertEqual(sub.read(['y','r'],default=None), [2,None])
129
+ self.assertEqual(sub(['y','r'],default=None), [2,None])
130
+
131
+ sub.write(['a','b'],1)
132
+ self.assertEqual(sub.read(['a','b']),[1,1])
133
+ with self.assertRaises(ValueError):
134
+ sub.write(['x','y','z'],[1,2])
135
+ sub.delete_everything()
136
+
137
+ # test setting ext
138
+ sub1 = "!/.tmp_test_for_cdxbasics.subdir"
139
+ fd1 = SubDir(sub1).path
140
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir/test;*.bin", delete_everything=True )
141
+ self.assertEqual(sub.path, fd1+"test/")
142
+ fn = sub.full_file_name("file")
143
+ self.assertEqual(fn,fd1+"test/file.bin")
144
+ sub.delete_everything()
145
+
146
+ # test versioning
147
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir")
148
+ version = "1.0.0"
149
+ sub.write("test", "hans", version=version )
150
+ r = sub.read("test", version=version )
151
+ self.assertEqual(r, "hans")
152
+ r = sub.read("test", "nothans", version="2.0.0", delete_wrong_version=False )
153
+ self.assertEqual(r, "nothans")
154
+ self.assertTrue(sub.exists("test"))
155
+ r = sub.is_version("test", version=version )
156
+ self.assertTrue(r)
157
+ r = sub.is_version("test", version="2.0.0" )
158
+ self.assertFalse(r)
159
+ r = sub.read("test", "nothans", version="2.0.0", delete_wrong_version=True )
160
+ self.assertFalse(sub.exists("test"))
161
+ sub.delete_everything()
162
+
163
+ # test JSON
164
+ x = np.ones((10,))
165
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.JSON_PICKLE )
166
+ sub.write("test", x)
167
+ r = sub.read("test", None, raise_on_error=True)
168
+ r = sub.read("test", None)
169
+ self.assertEqual( list(x), list(r) )
170
+ self.assertEqual(sub.ext, ".jpck")
171
+ sub.delete_everything()
172
+
173
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.JSON_PLAIN )
174
+ sub.write("test", x)
175
+ r = sub.read("test", None)
176
+ self.assertEqual( list(x), list(r) )
177
+ self.assertEqual(sub.ext, ".json")
178
+ sub.delete_everything()
179
+
180
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.BLOSC )
181
+ sub.write("test_2", x)
182
+ r = sub.read("test_2", None, raise_on_error=True )
183
+ self.assertEqual( list(x), list(r) )
184
+ self.assertEqual(sub.ext, ".zbsc")
185
+ sub.write("test", x, version="1")
186
+ r = sub.read("test", None, version="1")
187
+ self.assertEqual( list(x), list(r) )
188
+ with self.assertRaises(VersionError):
189
+ r = sub.read("test", None, version="2", raise_on_error=True)
190
+ # wrong version
191
+ sub.delete_everything()
192
+
193
+ sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.GZIP )
194
+ sub.write("test", x)
195
+ r = sub.read("test", None )
196
+ self.assertEqual( list(x), list(r) )
197
+ self.assertEqual(sub.ext, ".pgz")
198
+ sub.write("test", x, version="1")
199
+ r = sub.read("test", None, version="1")
200
+ self.assertEqual( list(x), list(r) )
201
+ with self.assertRaises(VersionError):
202
+ r = sub.read("test", None, version="2", raise_on_error=True)
203
+ # wrong version
204
+ sub.delete_everything()
205
+
206
+ def test_new(self):
207
+
208
+
209
+ subdir = SubDir("my_directory") # relative to current working directory
210
+ subdir = SubDir("./my_directory") # relative to current working directory
211
+ subdir = SubDir("~/my_directory") # relative to home directory
212
+ subdir = SubDir("!/my_directory") # relative to default temp directory
213
+
214
+ subdir = SubDir("my_directory", "~") # relative to home directory
215
+ subdir = SubDir("my_directory", "!") # relative to default temp directory
216
+ subdir = SubDir("my_directory", ".") # relative to current directory
217
+ subdir2 = SubDir("my_directory", subdir) # subdir2 is relative to `subdir`
218
+
219
+ # extension handling
220
+
221
+ subdir = SubDir("!/extension_test", fmt=SubDir.BLOSC )
222
+ self.assertEqual( subdir.ext, ".zbsc" )
223
+ subdir = subdir("", fmt=SubDir.GZIP )
224
+ self.assertEqual( subdir.ext, ".pgz" )
225
+ subdir = subdir("", fmt=SubDir.JSON_PICKLE )
226
+ self.assertEqual( subdir.ext, ".jpck" )
227
+ subdir = subdir("", fmt=SubDir.JSON_PLAIN )
228
+ self.assertEqual( subdir.ext, ".json" )
229
+ subdir = subdir("", fmt=SubDir.PICKLE )
230
+ self.assertEqual( subdir.ext, ".pck" )
231
+
232
+ # version
233
+
234
+ version = "0.1"
235
+ data = [12,34,56]
236
+
237
+ def test_format(fmt, excset=False ):
238
+ subdir.write("test", data, version=version, fmt=fmt )
239
+ _ = subdir.read("test", version=version, fmt=fmt )
240
+ self.assertEqual( data, _ )
241
+ with self.assertRaises(VersionError):
242
+ _ = subdir.read("test", version="x1", fmt=fmt, raise_on_error=True )
243
+
244
+ # no version error
245
+ subdir.write("test", data, version=version, fmt=fmt )
246
+
247
+ if not excset:
248
+ # json_pickle throws no exception...
249
+ _ = subdir.read("test", raise_on_error=True, fmt=fmt )
250
+ else:
251
+ with self.assertRaises(VersionPresentError):
252
+ _ = subdir.read("test", raise_on_error=True, fmt=fmt )
253
+
254
+ test_format( SubDir.PICKLE, True )
255
+ test_format( SubDir.BLOSC, True )
256
+ test_format( SubDir.GZIP, True )
257
+ test_format( SubDir.JSON_PICKLE )
258
+
259
+
260
+
261
+ def test_cache_mode(self):
262
+
263
+ on = CacheMode("on")
264
+ gn = CacheMode("gen")
265
+ of = CacheMode("off")
266
+ cl = CacheMode("clear")
267
+ up = CacheMode("update")
268
+ ro = CacheMode("readonly")
269
+
270
+ with self.assertRaises(KeyError):
271
+ _ = CacheMode("OFF")
272
+
273
+ allc = [on, gn, of, cl, up, ro]
274
+
275
+ self.assertEqual( [ x.is_on for x in allc ], [True, False, False, False, False, False ] )
276
+ self.assertEqual( [ x.is_gen for x in allc ], [False, True, False, False, False, False ] )
277
+ self.assertEqual( [ x.is_off for x in allc ], [False, False, True, False, False, False ] )
278
+ self.assertEqual( [ x.is_clear for x in allc ], [False, False, False, True, False, False ] )
279
+ self.assertEqual( [ x.is_update for x in allc ], [False, False, False, False, True, False ] )
280
+ self.assertEqual( [ x.is_readonly for x in allc ], [False, False, False, False, False, True ] )
281
+
282
+ self.assertEqual( [ x.read for x in allc ], [True, True, False, False, False, True] )
283
+ self.assertEqual( [ x.write for x in allc ], [True, True, False, False, True, False] )
284
+ self.assertEqual( [ x.delete for x in allc ], [False, False, False, True, True, False ] )
285
+ self.assertEqual( [ x.del_incomp for x in allc ], [True, False, False, True, True, False ] )
286
+ if __name__ == '__main__':
287
+ unittest.main()
288
+
289
+