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.
- cdxcore/__init__.py +1 -9
- cdxcore/config.py +1188 -521
- cdxcore/crman.py +95 -25
- cdxcore/err.py +371 -0
- cdxcore/pretty.py +468 -0
- cdxcore/pretty.py_bak.py +750 -0
- cdxcore/subdir.py +2225 -1334
- cdxcore/uniquehash.py +515 -363
- cdxcore/util.py +358 -417
- cdxcore/verbose.py +683 -248
- cdxcore/version.py +398 -139
- cdxcore-0.1.9.dist-info/METADATA +27 -0
- cdxcore-0.1.9.dist-info/RECORD +36 -0
- {cdxcore-0.1.5.dist-info → cdxcore-0.1.9.dist-info}/top_level.txt +3 -1
- docs/source/conf.py +123 -0
- docs2/source/conf.py +35 -0
- tests/test_config.py +502 -0
- tests/test_crman.py +54 -0
- tests/test_err.py +86 -0
- tests/test_pretty.py +404 -0
- tests/test_subdir.py +289 -0
- tests/test_uniquehash.py +159 -144
- tests/test_util.py +122 -83
- tests/test_verbose.py +119 -0
- tests/test_version.py +153 -0
- up/git_message.py +2 -2
- cdxcore/logger.py +0 -319
- cdxcore/prettydict.py +0 -388
- cdxcore/prettyobject.py +0 -64
- cdxcore-0.1.5.dist-info/METADATA +0 -1418
- cdxcore-0.1.5.dist-info/RECORD +0 -30
- conda/conda_exists.py +0 -10
- conda/conda_modify_yaml.py +0 -42
- tests/_cdxbasics.py +0 -1086
- {cdxcore-0.1.5.dist-info → cdxcore-0.1.9.dist-info}/WHEEL +0 -0
- {cdxcore-0.1.5.dist-info → cdxcore-0.1.9.dist-info}/licenses/LICENSE +0 -0
- {cdxcore → tmp}/deferred.py +0 -0
- {cdxcore → tmp}/dynaplot.py +0 -0
- {cdxcore → tmp}/filelock.py +0 -0
- {cdxcore → tmp}/jcpool.py +0 -0
- {cdxcore → tmp}/np.py +0 -0
- {cdxcore → tmp}/npio.py +0 -0
- {cdxcore → tmp}/sharedarray.py +0 -0
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
|
+
|