Browse Source

various fixes and cleanups

MMGen 5 years ago
parent
commit
c1347d1080
9 changed files with 46 additions and 39 deletions
  1. 9 9
      mmgen/color.py
  2. 1 1
      mmgen/devtools.py
  3. 1 1
      mmgen/globalvars.py
  4. 1 1
      mmgen/obj.py
  5. 0 1
      mmgen/tw.py
  6. 7 5
      test/objtest.py
  7. 18 15
      test/test.py
  8. 4 3
      test/test_py_d/ts_ref.py
  9. 5 3
      test/unit_tests.py

+ 9 - 9
mmgen/color.py

@@ -26,7 +26,7 @@ _colors = {
 	'green':       (  121,      (32,1) ),
 	'yellow':      (  229,      (33,1) ),
 	'blue':        (  75,       (34,1) ),
-	'magenta':     (  213,      (35,1) ),
+	'magenta':     (  205,      (35,1) ),
 	'cyan':        (  122,      (36,1) ),
 	'pink':        (  218,      (35,1) ),
 	'orange':      (  216,      (31,1) ),
@@ -41,14 +41,14 @@ _colors = {
 	'yelbg':       ( (232,229), (30,103) ),
 }
 
-for c in _colors:
-	e = _colors[c]
-	globals()['_256_'+c]   = '\033[38;5;{};1m'.format(e[0]) if type(e[0]) == int \
-						else '\033[38;5;{};48;5;{};1m'.format(*e[0])
-	globals()['_16_'+c]    = '\033[{}m'.format(e[1][0]) if e[1][1] == 0 \
-						else '\033[{};{}m'.format(*e[1])
-	globals()['_clr_'+c] = ''; _reset = ''
-	exec('def {c}(s): return _clr_{c}+s+_reset'.format(c=c))
+for _c in _colors:
+	_e = _colors[_c]
+	globals()['_256_'+_c]   = '\033[38;5;{};1m'.format(_e[0]) if type(_e[0]) == int \
+						else '\033[38;5;{};48;5;{};1m'.format(*_e[0])
+	globals()['_16_'+_c]    = '\033[{}m'.format(_e[1][0]) if _e[1][1] == 0 \
+						else '\033[{};{}m'.format(*_e[1])
+	globals()['_clr_'+_c] = ''; _reset = ''
+	exec('def {c}(s): return _clr_{c}+s+_reset'.format(c=_c))
 
 def nocolor(s): return s
 

+ 1 - 1
mmgen/devtools.py

@@ -6,7 +6,7 @@ from difflib import unified_diff
 
 def pmsg(*args,out=sys.stderr):
 	d = args if len(args) > 1 else '' if not args else args[0]
-	out.write('\n' + pprint.PrettyPrinter(indent=4).pformat(d) + '\n')
+	out.write(pprint.PrettyPrinter(indent=4).pformat(d) + '\n')
 def pdie(*args,exit_val=1,out=sys.stderr):
 	pmsg(*args,out=out)
 	sys.exit(exit_val)

+ 1 - 1
mmgen/globalvars.py

@@ -70,7 +70,7 @@ class g(object):
 	tx_confs     = 3
 	seed_len     = 256
 
-	# Constant vars - some of these might be overriden in opts.py, but they don't change thereafter
+	# Constant vars - some of these might be overridden in opts.py, but they don't change thereafter
 
 	coin                 = 'BTC'
 	dcoin                = None # the display coin unit

+ 1 - 1
mmgen/obj.py

@@ -486,7 +486,7 @@ class CoinAddr(str,Hilite,InitErrors,MMGenObject):
 			assert set(s) <= set(ascii_letters+digits),'contains non-alphanumeric characters'
 			me = str.__new__(cls,s)
 			va = g.proto.verify_addr(s,hex_width=cls.hex_width,return_dict=True)
-			assert va,'failed verification'
+			assert va,'coin address {!r} failed verification'.format(s)
 			me.addr_fmt = va['format']
 			me.hex = va['hex']
 			return me

+ 0 - 1
mmgen/tw.py

@@ -61,7 +61,6 @@ Actions: [q]uit view, [p]rint to file, pager [v]iew, [w]ide view, add [l]abel:
 	class MMGenTwOutputList(list,MMGenObject): pass
 
 	class MMGenTwUnspentOutput(MMGenListItem):
-	#	attrs = 'txid','vout','amt','label','twmmid','addr','confs','scriptPubKey','days','skip'
 		txid     = MMGenListItemAttr('txid','CoinTxID')
 		vout     = MMGenListItemAttr('vout',int,typeconv=False)
 		amt      = MMGenImmutableAttr('amt',g.proto.coin_amt.__name__)

+ 7 - 5
test/objtest.py

@@ -115,13 +115,15 @@ def run_test(test,arg,input_data):
 		die(2,red('{}'.format(e.args[0])))
 
 def do_loop():
-	utests = cmd_args
+	import importlib
 	network = ('mainnet','testnet')[bool(g.testnet)]
-	gl = globals()
-	exec('from test.objtest_py_d.ot_{}_{} import tests'.format(g.coin.lower(),network),gl,gl)
+	modname = 'test.objtest_py_d.ot_{}_{}'.format(g.coin.lower(),network)
+	test_data = importlib.import_module(modname).tests
 	gmsg('Running data object tests for {} {}'.format(g.coin,network))
+
 	clr = None
-	for test in tests:
+	utests = cmd_args
+	for test in test_data:
 		if utests and test not in utests: continue
 		nl = ('\n','')[bool(opt.super_silent) or clr == None]
 		clr = (blue,nocolor)[bool(opt.super_silent)]
@@ -129,7 +131,7 @@ def do_loop():
 		for k in ('bad','good'):
 			if not opt.silent:
 				msg(purple(capfirst(k)+' input:'))
-			for arg in tests[test][k]:
+			for arg in test_data[test][k]:
 				run_test(test,arg,input_data=k)
 
 do_loop()

+ 18 - 15
test/test.py

@@ -140,10 +140,10 @@ If no command is given, the whole test suite is run.
 data_dir = os.path.join('test','data_dir' + ('','-α')[bool(os.getenv('MMGEN_DEBUG_UTF8'))])
 
 # we need the values of two opts before running opts.init, so parse without initializing:
-uopts = opts.init(opts_data,parse_only=True)[0]
+_uopts = opts.init(opts_data,parse_only=True)[0]
 
 # step 1: delete data_dir symlink in ./test;
-if not ('resume' in uopts or 'skip_deps' in uopts):
+if not ('resume' in _uopts or 'skip_deps' in _uopts):
 	try: os.unlink(data_dir)
 	except: pass
 
@@ -154,7 +154,7 @@ usr_args = opts.init(opts_data)
 
 # step 3: move data_dir to /dev/shm and symlink it back to ./test:
 trash_dir = os.path.join('test','trash')
-if not ('resume' in uopts or 'skip_deps' in uopts):
+if not ('resume' in _uopts or 'skip_deps' in _uopts):
 	shm_dir = create_shm_dir(data_dir,trash_dir)
 
 check_segwit_opts()
@@ -330,21 +330,24 @@ cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses
 	'34': {},
 }
 
-for k in ('6','7','8'):
-	cfgs['2'+k] = {}
-	cfgs['2'+k].update(cfgs[k])
+def fixup_cfgs():
+	for k in ('6','7','8'):
+		cfgs['2'+k] = {}
+		cfgs['2'+k].update(cfgs[k])
 
-for k in cfgs:
-	cfgs[k]['tmpdir'] = os.path.join('test','tmp{}'.format(k))
-	cfgs[k]['segwit'] = randbool() if opt.segwit_random else bool(opt.segwit or opt.bech32)
+	for k in cfgs:
+		cfgs[k]['tmpdir'] = os.path.join('test','tmp{}'.format(k))
+		cfgs[k]['segwit'] = randbool() if opt.segwit_random else bool(opt.segwit or opt.bech32)
 
-from copy import deepcopy
-for a,b in (('6','11'),('7','12'),('8','13')):
-	cfgs[b] = deepcopy(cfgs[a])
-	cfgs[b]['tmpdir'] = os.path.join('test','tmp'+b)
+	from copy import deepcopy
+	for a,b in (('6','11'),('7','12'),('8','13')):
+		cfgs[b] = deepcopy(cfgs[a])
+		cfgs[b]['tmpdir'] = os.path.join('test','tmp'+b)
 
-if g.debug_utf8:
-	for k in cfgs: cfgs[k]['tmpdir'] += '-α'
+	if g.debug_utf8:
+		for k in cfgs: cfgs[k]['tmpdir'] += '-α'
+
+fixup_cfgs()
 
 utils = {
 #	'check_deps': 'check dependencies for specified command (WIP)', # TODO

+ 4 - 3
test/test_py_d/ts_ref.py

@@ -30,6 +30,7 @@ from test.test_py_d.ts_base import *
 from test.test_py_d.ts_shared import *
 
 wpasswd = 'reference password'
+nw_name = '{} {}'.format(g.coin,('Mainnet','Testnet')[g.testnet])
 
 class TestSuiteRef(TestSuiteBase,TestSuiteShared):
 	'saved reference files'
@@ -202,7 +203,7 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared):
 			mmtype   = None,
 			add_args = [],
 			id_key   = None,
-			pat      = 'BTC Mainnet.*Legacy'):
+			pat      = '{}.*Legacy'.format(nw_name)):
 		af_key = 'ref_{}file'.format(ftype) + ('_' + id_key if id_key else '')
 		af_fn = TestSuiteRef.sources[af_key].format(pfx or self.altcoin_pfx,'' if coin else self.tn_ext)
 		af = joinpath(ref_dir,(subdir or self.ref_subdir,'')[ftype=='passwd'],af_fn)
@@ -225,12 +226,12 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared):
 	def ref_segwitaddrfile_chk(self):
 		if not 'S' in g.proto.mmtypes:
 			return skip('not supported')
-		return self.ref_addrfile_chk(ftype='segwitaddr',pat='BTC Mainnet.*Segwit')
+		return self.ref_addrfile_chk(ftype='segwitaddr',pat='{}.*Segwit'.format(nw_name))
 
 	def ref_bech32addrfile_chk(self):
 		if not 'B' in g.proto.mmtypes:
 			return skip('not supported')
-		return self.ref_addrfile_chk(ftype='bech32addr',pat='BTC Mainnet.*Bech32')
+		return self.ref_addrfile_chk(ftype='bech32addr',pat='{}.*Bech32'.format(nw_name))
 
 	def ref_keyaddrfile_chk(self):
 		return self.ref_addrfile_chk(ftype='keyaddr')

+ 5 - 3
test/unit_tests.py

@@ -67,12 +67,14 @@ try:
 		if test not in all_tests:
 			die(1,"'{}': test not recognized".format(test))
 
+	import importlib
 	for test in (cmd_args or all_tests):
-		exec('from test.unit_tests_d.ut_{m} import unit_test'.format(m=test))
+		modname = 'test.unit_tests_d.ut_{}'.format(test)
+		mod = importlib.import_module(modname)
 		gmsg('Running unit test {}'.format(test))
-		if not unit_test().run_test(test):
+		if not mod.unit_test().run_test(test):
 			rdie(1,'Unit test {!r} failed'.format(test))
-		exec('del unit_test'.format(test))
+		del mod
 
 	exit_msg()
 except KeyboardInterrupt: