cdxcore 0.1.6__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.6.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.6.dist-info/METADATA +0 -1418
- cdxcore-0.1.6.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.6.dist-info → cdxcore-0.1.9.dist-info}/WHEEL +0 -0
- {cdxcore-0.1.6.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_util.py
CHANGED
|
@@ -9,15 +9,34 @@ import numpy as np
|
|
|
9
9
|
import datetime as datetime
|
|
10
10
|
from zoneinfo import ZoneInfo
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
def import_local():
|
|
13
|
+
"""
|
|
14
|
+
In order to be able to run our tests manually from the 'tests' directory
|
|
15
|
+
we force import from the local package.
|
|
16
|
+
We also force reloading all modules to make sure we are not running old code.
|
|
17
|
+
"""
|
|
18
|
+
me = "cdxcore"
|
|
19
|
+
import os
|
|
20
|
+
import sys
|
|
21
|
+
cwd = os.getcwd()
|
|
22
|
+
if cwd[-len(me):] == me:
|
|
23
|
+
return
|
|
24
|
+
assert cwd[-5:] == "tests",("Expected current working directory to be in a 'tests' directory", cwd[-5:], "from", cwd)
|
|
25
|
+
assert cwd[-6] in ['/', '\\'],("Expected current working directory 'tests' to be lead by a '\\' or '/'", cwd[-6:], "from", cwd)
|
|
26
|
+
sys.path.insert( 0, cwd[:-6] )
|
|
27
|
+
|
|
28
|
+
# reload modules
|
|
29
|
+
import importlib as imp
|
|
30
|
+
modules = sys.modules.copy()
|
|
31
|
+
for name, mdata in modules.items():
|
|
32
|
+
if name[:len(me)] == me:
|
|
33
|
+
imp.reload(mdata)
|
|
34
|
+
import_local()
|
|
35
|
+
|
|
36
|
+
from cdxcore.util import is_function, is_atomic, is_float, is_filename
|
|
18
37
|
from cdxcore.util import fmt, fmt_seconds, fmt_list, fmt_dict, fmt_big_number, fmt_digits, fmt_big_byte_number, fmt_datetime, fmt_date, fmt_time, fmt_timedelta, fmt_filename, DEF_FILE_NAME_MAP
|
|
19
38
|
|
|
20
|
-
class
|
|
39
|
+
class Test(unittest.TestCase):
|
|
21
40
|
|
|
22
41
|
def test_fmt(self):
|
|
23
42
|
|
|
@@ -211,20 +230,40 @@ class UtilTest(unittest.TestCase):
|
|
|
211
230
|
self.assertEqual( fmt_filename("K:X;Z"), "K;X;Z" )
|
|
212
231
|
self.assertEqual( fmt_filename("*"), "@" )
|
|
213
232
|
self.assertEqual( fmt_filename("."), "." ) # technically a valid filename, but a reserved name at that
|
|
233
|
+
|
|
234
|
+
with self.assertRaises(ValueError):
|
|
235
|
+
self.assertEqual( fmt_filename("2*2/4=x", by="wrong"), "2@2_4=x" )
|
|
236
|
+
|
|
237
|
+
BLANK = { '/' : "",
|
|
238
|
+
'\\': "",
|
|
239
|
+
'|' : "",
|
|
240
|
+
':' : "",
|
|
241
|
+
'>' : "",
|
|
242
|
+
'<' : "",
|
|
243
|
+
'?' : "",
|
|
244
|
+
'*' : "",
|
|
245
|
+
}
|
|
246
|
+
self.assertEqual( fmt_filename("2*2/4=x", by=BLANK), "224=x" )
|
|
247
|
+
|
|
248
|
+
# is_filename
|
|
249
|
+
self.assertTrue( is_filename("hans") )
|
|
250
|
+
self.assertFalse( is_filename("h/ans") )
|
|
251
|
+
self.assertFalse( is_filename("h?ans") )
|
|
252
|
+
|
|
214
253
|
|
|
215
254
|
def test_basics(self):
|
|
216
255
|
|
|
217
|
-
#
|
|
218
|
-
self.assertFalse(
|
|
219
|
-
self.assertFalse(
|
|
220
|
-
self.assertTrue(
|
|
221
|
-
self.assertTrue(
|
|
256
|
+
# is_function
|
|
257
|
+
self.assertFalse( is_function(1) )
|
|
258
|
+
self.assertFalse( is_function("text") )
|
|
259
|
+
self.assertTrue( is_function(self.test_basics) )
|
|
260
|
+
self.assertTrue( is_function(lambda x: x) )
|
|
222
261
|
|
|
223
262
|
def f(x,y):
|
|
224
263
|
return x
|
|
225
|
-
self.assertTrue(
|
|
264
|
+
self.assertTrue( is_function(f) )
|
|
226
265
|
def ff():
|
|
227
|
-
self.assertTrue(
|
|
266
|
+
self.assertTrue( is_function(ff) )
|
|
228
267
|
ff()
|
|
229
268
|
|
|
230
269
|
class A(object):
|
|
@@ -249,79 +288,79 @@ class UtilTest(unittest.TestCase):
|
|
|
249
288
|
a = A()
|
|
250
289
|
b = B()
|
|
251
290
|
c = C()
|
|
252
|
-
self.assertFalse(
|
|
253
|
-
self.assertFalse(
|
|
254
|
-
self.assertFalse(
|
|
255
|
-
self.assertFalse(
|
|
256
|
-
self.assertFalse(
|
|
257
|
-
self.assertFalse(
|
|
258
|
-
self.assertTrue(
|
|
259
|
-
self.assertTrue(
|
|
260
|
-
self.assertFalse(
|
|
261
|
-
self.assertTrue(
|
|
262
|
-
self.assertTrue(
|
|
263
|
-
self.assertTrue(
|
|
264
|
-
self.assertFalse(
|
|
265
|
-
self.assertTrue(
|
|
266
|
-
self.assertTrue(
|
|
267
|
-
self.assertTrue(
|
|
268
|
-
self.assertTrue(
|
|
269
|
-
self.assertTrue(
|
|
270
|
-
self.assertFalse(
|
|
291
|
+
self.assertFalse( is_function(A) )
|
|
292
|
+
self.assertFalse( is_function(B) )
|
|
293
|
+
self.assertFalse( is_function(C) )
|
|
294
|
+
self.assertFalse( is_function(a) )
|
|
295
|
+
self.assertFalse( is_function(b) )
|
|
296
|
+
self.assertFalse( is_function(c) )
|
|
297
|
+
self.assertTrue( is_function(A.__init__) )
|
|
298
|
+
self.assertTrue( is_function(A.f) )
|
|
299
|
+
self.assertFalse( is_function(A.square) )
|
|
300
|
+
self.assertTrue( is_function(A.g) )
|
|
301
|
+
self.assertTrue( is_function(a.__init__) )
|
|
302
|
+
self.assertTrue( is_function(a.f) )
|
|
303
|
+
self.assertFalse( is_function(a.square) ) # <-- properties are not considered as function
|
|
304
|
+
self.assertTrue( is_function(a.g) )
|
|
305
|
+
self.assertTrue( is_function(B.__init__) )
|
|
306
|
+
self.assertTrue( is_function(B.__call__ ) )
|
|
307
|
+
self.assertTrue( is_function(b.__init__) )
|
|
308
|
+
self.assertTrue( is_function(b.__call__ ) )
|
|
309
|
+
self.assertFalse( is_function(b) ) # <-- properties are not considered as function
|
|
271
310
|
self.assertTrue( callable(b) )
|
|
272
|
-
self.assertFalse(
|
|
273
|
-
self.assertTrue(
|
|
274
|
-
self.assertTrue(
|
|
311
|
+
self.assertFalse( is_function(c) )
|
|
312
|
+
self.assertTrue( is_function(i for i in c) )
|
|
313
|
+
self.assertTrue( is_function(lambda x : x*x) )
|
|
275
314
|
|
|
276
|
-
#
|
|
277
|
-
self.assertTrue(
|
|
278
|
-
self.assertTrue(
|
|
279
|
-
self.assertTrue(
|
|
280
|
-
self.assertFalse(
|
|
281
|
-
self.assertTrue(
|
|
282
|
-
self.assertFalse(
|
|
283
|
-
self.assertTrue(
|
|
284
|
-
self.assertTrue(
|
|
285
|
-
self.assertTrue(
|
|
286
|
-
self.assertFalse(
|
|
287
|
-
self.assertFalse(
|
|
288
|
-
self.assertTrue(
|
|
289
|
-
self.assertTrue(
|
|
290
|
-
self.assertFalse(
|
|
291
|
-
self.assertFalse(
|
|
292
|
-
self.assertFalse(
|
|
293
|
-
self.assertFalse(
|
|
294
|
-
self.assertFalse(
|
|
295
|
-
self.assertFalse(
|
|
296
|
-
self.assertFalse(
|
|
297
|
-
self.assertFalse(
|
|
315
|
+
# is_atomic
|
|
316
|
+
self.assertTrue( is_atomic(0) )
|
|
317
|
+
self.assertTrue( is_atomic(0.1) )
|
|
318
|
+
self.assertTrue( is_atomic("c") )
|
|
319
|
+
self.assertFalse( is_atomic(b'\x02') )
|
|
320
|
+
self.assertTrue( is_atomic("text") )
|
|
321
|
+
self.assertFalse( is_atomic(complex(0.,-1)) )
|
|
322
|
+
self.assertTrue( is_atomic(True) )
|
|
323
|
+
self.assertTrue( is_atomic(1==0) )
|
|
324
|
+
self.assertTrue( is_atomic(datetime.date(year=2005, month=2, day=1)) )
|
|
325
|
+
self.assertFalse( is_atomic(datetime.time(hour=4)) )
|
|
326
|
+
self.assertFalse( is_atomic(datetime.datetime(year=2005, month=2, day=1, hour=4)) )
|
|
327
|
+
self.assertTrue( is_atomic(1==0) )
|
|
328
|
+
self.assertTrue( is_atomic(1==0) )
|
|
329
|
+
self.assertFalse( is_atomic(A) )
|
|
330
|
+
self.assertFalse( is_atomic(a) )
|
|
331
|
+
self.assertFalse( is_atomic(f) )
|
|
332
|
+
self.assertFalse( is_atomic([1,2]) )
|
|
333
|
+
self.assertFalse( is_atomic([]) )
|
|
334
|
+
self.assertFalse( is_atomic({}) )
|
|
335
|
+
self.assertFalse( is_atomic({'x':2}) )
|
|
336
|
+
self.assertFalse( is_atomic({'x':2}) )
|
|
298
337
|
|
|
299
|
-
self.assertEqual(
|
|
300
|
-
self.assertEqual(
|
|
301
|
-
self.assertEqual(
|
|
302
|
-
self.assertEqual(
|
|
303
|
-
self.assertEqual(
|
|
304
|
-
self.assertEqual(
|
|
305
|
-
self.assertEqual(
|
|
306
|
-
self.assertEqual(
|
|
307
|
-
self.assertEqual(
|
|
308
|
-
self.assertEqual(
|
|
309
|
-
self.assertEqual(
|
|
310
|
-
self.assertEqual(
|
|
338
|
+
self.assertEqual( is_atomic(np.int_(0)), True )
|
|
339
|
+
self.assertEqual( is_atomic(np.int32(0)), True )
|
|
340
|
+
self.assertEqual( is_atomic(np.int64(0)), True )
|
|
341
|
+
self.assertEqual( is_atomic(np.complex128(0)), True )
|
|
342
|
+
self.assertEqual( is_atomic(np.datetime64()), True )
|
|
343
|
+
self.assertEqual( is_atomic(np.timedelta64()), True )
|
|
344
|
+
self.assertEqual( is_atomic(np.ushort(0)), True )
|
|
345
|
+
self.assertEqual( is_atomic(np.float32(0)), True )
|
|
346
|
+
self.assertEqual( is_atomic(np.float64(0)), True )
|
|
347
|
+
self.assertEqual( is_atomic(np.ulonglong(0)), True )
|
|
348
|
+
self.assertEqual( is_atomic(np.longdouble(0)), True )
|
|
349
|
+
self.assertEqual( is_atomic(np.half(0)), True )
|
|
311
350
|
|
|
312
|
-
#
|
|
313
|
-
self.assertFalse(
|
|
314
|
-
self.assertTrue(
|
|
315
|
-
self.assertFalse(
|
|
316
|
-
self.assertFalse(
|
|
317
|
-
self.assertFalse(
|
|
318
|
-
self.assertTrue(
|
|
319
|
-
self.assertTrue(
|
|
320
|
-
self.assertTrue(
|
|
321
|
-
self.assertFalse(
|
|
322
|
-
self.assertFalse(
|
|
323
|
-
self.assertFalse(
|
|
324
|
-
self.assertFalse(
|
|
351
|
+
# is_float
|
|
352
|
+
self.assertFalse( is_float(0) )
|
|
353
|
+
self.assertTrue( is_float(0.1) )
|
|
354
|
+
self.assertFalse( is_float(1==2) )
|
|
355
|
+
self.assertFalse( is_float("0.1") )
|
|
356
|
+
self.assertFalse( is_float(complex(0.,-1.)) )
|
|
357
|
+
self.assertTrue( is_float(np.float16(0.1)) )
|
|
358
|
+
self.assertTrue( is_float(np.float32(0.1)) )
|
|
359
|
+
self.assertTrue( is_float(np.float64(0.1)) )
|
|
360
|
+
self.assertFalse( is_float(np.int16(0.1)) )
|
|
361
|
+
self.assertFalse( is_float(np.int32(0.1)) )
|
|
362
|
+
self.assertFalse( is_float(np.int64(0.1)) )
|
|
363
|
+
self.assertFalse( is_float(np.complex64(0.1)) )
|
|
325
364
|
|
|
326
365
|
if __name__ == '__main__':
|
|
327
366
|
unittest.main()
|
tests/test_verbose.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
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
|
+
print("Reloaded", name)
|
|
32
|
+
import_local()
|
|
33
|
+
|
|
34
|
+
from cdxcore.verbose import Context
|
|
35
|
+
from cdxcore.uniquehash import unique_hash32 as unique_hash
|
|
36
|
+
|
|
37
|
+
class Test(unittest.TestCase):
|
|
38
|
+
|
|
39
|
+
def test_verbose(self):
|
|
40
|
+
|
|
41
|
+
class Channel(object):
|
|
42
|
+
def __init__(self):
|
|
43
|
+
self.track = []
|
|
44
|
+
def __call__(self, msg : str, flush : bool ):
|
|
45
|
+
self.track.append( (msg, flush) )
|
|
46
|
+
def __str__(self):
|
|
47
|
+
return str( self.track )
|
|
48
|
+
|
|
49
|
+
def f_sub( num=3, context = Context.quiet ):
|
|
50
|
+
context.report(0, "Entering loop")
|
|
51
|
+
for i in range(num):
|
|
52
|
+
context.report(1, "Number %ld", i)
|
|
53
|
+
|
|
54
|
+
def f_main( context = Context.quiet ):
|
|
55
|
+
context.write( "First step" )
|
|
56
|
+
# ... do something
|
|
57
|
+
context.report( 1, "Intermediate step 1" )
|
|
58
|
+
context.report( 1, "Intermediate step 2\nwith newlines" )
|
|
59
|
+
# ... do something
|
|
60
|
+
f_sub( context=context(1) )
|
|
61
|
+
# ... do something
|
|
62
|
+
context.write( "Final step" )
|
|
63
|
+
|
|
64
|
+
channel = Channel()
|
|
65
|
+
context = Context(1,channel=channel)
|
|
66
|
+
f_main(context)
|
|
67
|
+
self.assertEqual( str(channel), r"[('00: First step\n', True), ('01: Intermediate step 1\n', True), ('01: Intermediate step 2\n01: with newlines\n', True), ('01: Entering loop\n', True), ('00: Final step\n', True)]")
|
|
68
|
+
|
|
69
|
+
channel = Channel()
|
|
70
|
+
context = Context(2,channel=channel)
|
|
71
|
+
f_main(context)
|
|
72
|
+
self.assertEqual( str(channel), r"[('00: First step\n', True), ('01: Intermediate step 1\n', True), ('01: Intermediate step 2\n01: with newlines\n', True), ('01: Entering loop\n', True), ('02: Number 0\n', True), ('02: Number 1\n', True), ('02: Number 2\n', True), ('00: Final step\n', True)]")
|
|
73
|
+
|
|
74
|
+
channel = Channel()
|
|
75
|
+
context = Context("all",channel=channel)
|
|
76
|
+
f_main(context)
|
|
77
|
+
self.assertEqual( str(channel), r"[('00: First step\n', True), ('01: Intermediate step 1\n', True), ('01: Intermediate step 2\n01: with newlines\n', True), ('01: Entering loop\n', True), ('02: Number 0\n', True), ('02: Number 1\n', True), ('02: Number 2\n', True), ('00: Final step\n', True)]")
|
|
78
|
+
|
|
79
|
+
channel = Channel()
|
|
80
|
+
context = Context(None,channel=channel)
|
|
81
|
+
f_main(context)
|
|
82
|
+
self.assertEqual( str(channel), r"[('00: First step\n', True), ('01: Intermediate step 1\n', True), ('01: Intermediate step 2\n01: with newlines\n', True), ('01: Entering loop\n', True), ('02: Number 0\n', True), ('02: Number 1\n', True), ('02: Number 2\n', True), ('00: Final step\n', True)]")
|
|
83
|
+
|
|
84
|
+
channel = Channel()
|
|
85
|
+
context = Context("quiet",channel=channel)
|
|
86
|
+
f_main(context)
|
|
87
|
+
self.assertEqual( str(channel), r"[]")
|
|
88
|
+
|
|
89
|
+
verbose1 = Context(1)
|
|
90
|
+
verbose1.level = 2
|
|
91
|
+
verbose2 = Context(2,indent=3)
|
|
92
|
+
verbose2.level = 3
|
|
93
|
+
self.assertEqual( unique_hash( verbose1 ), unique_hash( verbose2 ) )
|
|
94
|
+
|
|
95
|
+
verbose = Context("all")
|
|
96
|
+
self.assertEqual( verbose.fmt(0,"test {x}", x=1), "00: test 1")
|
|
97
|
+
self.assertEqual( verbose.fmt(1,"test %(x)d", x=1), "01: test 1")
|
|
98
|
+
self.assertEqual( verbose.fmt(2,"test %d", 1), "02: test 1")
|
|
99
|
+
verbose = Context(1)
|
|
100
|
+
self.assertEqual( verbose.fmt(0,"test {x}", x=1), "00: test 1")
|
|
101
|
+
self.assertEqual( verbose.fmt(1,"test %(x)d", x=1), "01: test 1")
|
|
102
|
+
self.assertEqual( verbose.fmt(2,"test %d", 1), None)
|
|
103
|
+
verbose = Context(1)
|
|
104
|
+
x = 1
|
|
105
|
+
self.assertEqual( verbose.fmt(0,lambda : f"test {x}"), "00: test 1")
|
|
106
|
+
|
|
107
|
+
def f():
|
|
108
|
+
raise RuntimeError("I should not happen")
|
|
109
|
+
verbose.fmt(2,f)
|
|
110
|
+
def f():
|
|
111
|
+
raise RuntimeError("I should happen")
|
|
112
|
+
with self.assertRaises(RuntimeError):
|
|
113
|
+
verbose.fmt(1,f)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == '__main__':
|
|
117
|
+
unittest.main()
|
|
118
|
+
|
|
119
|
+
|
tests/test_version.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
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.version import version
|
|
37
|
+
|
|
38
|
+
@version("1.0")
|
|
39
|
+
def f(x):
|
|
40
|
+
return x
|
|
41
|
+
@version("2.0", dependencies=[f])
|
|
42
|
+
def g1(x):
|
|
43
|
+
return f(x)
|
|
44
|
+
@version("2.1", dependencies=[f])
|
|
45
|
+
def g2(x):
|
|
46
|
+
return f(x)
|
|
47
|
+
class A(object):
|
|
48
|
+
@version("2.2")
|
|
49
|
+
def r1(self, x):
|
|
50
|
+
return x
|
|
51
|
+
@version("2.3", dependencies=['A.r1', 'g1'])
|
|
52
|
+
def r2(self, x):
|
|
53
|
+
return x
|
|
54
|
+
@version("XV")
|
|
55
|
+
class B(object):
|
|
56
|
+
def f(self, x):
|
|
57
|
+
return x
|
|
58
|
+
@version("1")
|
|
59
|
+
def t1(self):
|
|
60
|
+
return
|
|
61
|
+
@version("2", auto_class=True)
|
|
62
|
+
def t2(self):
|
|
63
|
+
return
|
|
64
|
+
@version("3", auto_class=False)
|
|
65
|
+
def t3(self):
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
@version("3.0", dependencies=['g1', g2, 'A.r1', A.r2, B])
|
|
69
|
+
def h(x,y):
|
|
70
|
+
a = A()
|
|
71
|
+
return g1(x)+g2(y)+a.r1(x)+a.r2(y)
|
|
72
|
+
|
|
73
|
+
@version("0.0.1")
|
|
74
|
+
class baseA(object):
|
|
75
|
+
pass
|
|
76
|
+
@version("0.0.2")
|
|
77
|
+
class baseB(baseA):
|
|
78
|
+
pass
|
|
79
|
+
@version("0.0.3", auto_class=False)
|
|
80
|
+
class baseC(baseA):
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
bA = baseA()
|
|
84
|
+
|
|
85
|
+
@version("2", dependencies=[bA]) # <- actually not a great use case to make a function dependent on an object (instead of the class)
|
|
86
|
+
def baf(x):
|
|
87
|
+
return x
|
|
88
|
+
|
|
89
|
+
class AA(object):
|
|
90
|
+
def __init__(self, x=2):
|
|
91
|
+
self.x = x
|
|
92
|
+
@version(version="0.4.1")
|
|
93
|
+
def h(self, y):
|
|
94
|
+
return self.x*y
|
|
95
|
+
|
|
96
|
+
@version(version="0.3.0")
|
|
97
|
+
def Ah(x,y):
|
|
98
|
+
return x+y
|
|
99
|
+
|
|
100
|
+
@version(version="0.0.2", dependencies=[Ah])
|
|
101
|
+
def Af(x,y):
|
|
102
|
+
return Ah(y,x)
|
|
103
|
+
|
|
104
|
+
@version(version="0.0.1", dependencies=["Af", AA.h])
|
|
105
|
+
def Ag(x,z):
|
|
106
|
+
a = AA()
|
|
107
|
+
return Af(x*2,z)+a.h(z)
|
|
108
|
+
|
|
109
|
+
class Test(unittest.TestCase):
|
|
110
|
+
|
|
111
|
+
def test_version(self):
|
|
112
|
+
# test dependency
|
|
113
|
+
|
|
114
|
+
a = A()
|
|
115
|
+
b = B()
|
|
116
|
+
bA = baseA()
|
|
117
|
+
bB = baseB()
|
|
118
|
+
bC = baseC()
|
|
119
|
+
|
|
120
|
+
self.assertEqual( h.version.input, "3.0" )
|
|
121
|
+
self.assertEqual( h.version.full, "3.0 { A.r1: 2.2, A.r2: 2.3 { A.r1: 2.2, g1: 2.0 { f: 1.0 } }, B: XV, g1: 2.0 { f: 1.0 }, g2: 2.1 { f: 1.0 } }" )
|
|
122
|
+
self.assertEqual( h.version.unique_id48, "3.0 { A.r1: 2.2, A.r2: 2.3 { A.r1: 2.2, 2695aabd" )
|
|
123
|
+
self.assertEqual( h.version.is_dependent( g2 ), "2.1" )
|
|
124
|
+
self.assertEqual( h.version.is_dependent( "g2" ), "2.1" )
|
|
125
|
+
self.assertEqual( h.version.is_dependent( f ), "1.0" )
|
|
126
|
+
self.assertEqual( h.version.is_dependent( "f" ), "1.0" )
|
|
127
|
+
self.assertEqual( h.version.is_dependent( B ), "XV" )
|
|
128
|
+
self.assertEqual( h.version.is_dependent( b ), "XV" )
|
|
129
|
+
self.assertEqual( h.version.is_dependent( A.r2 ), "2.3" )
|
|
130
|
+
self.assertEqual( h.version.is_dependent( a.r2 ), "2.3" )
|
|
131
|
+
self.assertEqual( b.t1.version.full, "1 { B: XV }" )
|
|
132
|
+
self.assertEqual( b.t2.version.full, "2 { B: XV }" )
|
|
133
|
+
self.assertEqual( b.t3.version.full, "3" )
|
|
134
|
+
self.assertEqual( baf.version.full, "2 { baseA: 0.0.1 }" )
|
|
135
|
+
|
|
136
|
+
self.assertEqual( baseA.version.full, "0.0.1")
|
|
137
|
+
self.assertEqual( baseB.version.full, "0.0.2 { baseA: 0.0.1 }")
|
|
138
|
+
self.assertEqual( baseC.version.full, "0.0.3")
|
|
139
|
+
self.assertEqual( bA.version.full, "0.0.1")
|
|
140
|
+
self.assertEqual( bB.version.full, "0.0.2 { baseA: 0.0.1 }")
|
|
141
|
+
self.assertEqual( bC.version.full, "0.0.3")
|
|
142
|
+
|
|
143
|
+
Ag(1,2)
|
|
144
|
+
|
|
145
|
+
self.assertEqual( Ag.version.input, "0.0.1")
|
|
146
|
+
self.assertEqual( Ag.version.full, "0.0.1 { AA.h: 0.4.1, Af: 0.0.2 { Ah: 0.3.0 } }")
|
|
147
|
+
self.assertEqual( Ag.version.unique_id48, "0.0.1 { AA.h: 0.4.1, Af: 0.0.2 { Ah: 0.3.0 } }")
|
|
148
|
+
self.assertEqual( Ag.version.dependencies,('0.0.1', {'AA.h': '0.4.1', 'Af': ('0.0.2', {'Ah': '0.3.0'})}) )
|
|
149
|
+
|
|
150
|
+
if __name__ == '__main__':
|
|
151
|
+
unittest.main()
|
|
152
|
+
|
|
153
|
+
|
up/git_message.py
CHANGED