Browse Source

util.py: f-strings, whitespace, minor cleanups

The MMGen Project 3 years ago
parent
commit
cf1f179fbf
1 changed files with 46 additions and 43 deletions
  1. 46 43
      mmgen/util.py

+ 46 - 43
mmgen/util.py

@@ -465,7 +465,7 @@ def get_hash_params(hash_preset):
 	if hash_preset in g.hash_presets:
 		return g.hash_presets[hash_preset] # N,p,r,buflen
 	else: # Shouldn't be here
-		die(3,"{}: invalid 'hash_preset' value".format(hash_preset))
+		die(3,f"{hash_preset}: invalid 'hash_preset' value")
 
 def compare_chksums(chk1,desc1,chk2,desc2,hdr='',die_on_fail=False,verbose=False):
 
@@ -478,13 +478,13 @@ def compare_chksums(chk1,desc1,chk2,desc2,hdr='',die_on_fail=False,verbose=False
 			vmsg(m,force=verbose)
 			return False
 
-	vmsg('{} checksum OK ({})'.format(capfirst(desc1),chk1))
+	vmsg(f'{capfirst(desc1)} checksum OK ({chk1})')
 	return True
 
 def compare_or_die(val1, desc1, val2, desc2, e='Error'):
 	if val1 != val2:
-		die(3,"{}: {} ({}) doesn't match {} ({})".format(e,desc2,val2,desc1,val1))
-	dmsg('{} OK ({})'.format(capfirst(desc2),val2))
+		die(3,f"{e}: {desc2} ({val2}) doesn't match {desc1} ({val1})")
+	dmsg(f'{capfirst(desc2)} OK ({val2})')
 	return True
 
 def check_binary(args):
@@ -506,7 +506,7 @@ def open_file_or_exit(filename,mode,silent=False):
 		return open(filename, mode)
 	except:
 		op = ('writing','reading')['r' in mode]
-		die(2,("Unable to open file '{}' for {}".format(filename,op),'')[silent])
+		die(2,'' if silent else f'Unable to open file {filename!r} for {op}')
 
 def check_file_type_and_access(fname,ftype,blkdev_ok=False):
 
@@ -520,17 +520,20 @@ def check_file_type_and_access(fname,ftype,blkdev_ok=False):
 	if blkdev_ok: ok_types.append((stat.S_ISBLK,'block device'))
 	if ftype == 'output directory': ok_types = [(stat.S_ISDIR, 'output directory')]
 
-	try: mode = os.stat(fname).st_mode
+	try:
+		mode = os.stat(fname).st_mode
 	except:
-		raise FileNotFound("Requested {} '{}' not found".format(ftype,fname))
+		raise FileNotFound(f'Requested {ftype} {fname!r} not found')
 
 	for t in ok_types:
-		if t[0](mode): break
+		if t[0](mode):
+			break
 	else:
-		die(1,"Requested {} '{}' is not a {}".format(ftype,fname,' or '.join([t[1] for t in ok_types])))
+		ok_list = ' or '.join( t[1] for t in ok_types )
+		die(1,f'Requested {ftype} {fname!r} is not a {ok_list}')
 
-	if not os.access(fname, access):
-		die(1,"Requested {} '{}' is not {}able by you".format(ftype,fname,m))
+	if not os.access(fname,access):
+		die(1,f'Requested {ftype} {fname!r} is not {m}able by you')
 
 	return True
 
@@ -543,7 +546,7 @@ def check_outdir(f):
 def check_wallet_extension(fn):
 	from .wallet import Wallet
 	if not Wallet.ext_to_type(get_extension(fn)):
-		raise BadFileExtension("'{}': unrecognized seed source file extension".format(fn))
+		raise BadFileExtension(f'{fn!r}: unrecognized seed source file extension')
 def make_full_path(outdir,outfile):
 	return os.path.normpath(os.path.join(outdir, os.path.basename(outfile)))
 
@@ -571,10 +574,10 @@ def get_seed_file(cmd_args,nargs,invoked_as=None):
 	return cmd_args[0] if cmd_args else (wf,None)[wd_from_opt]
 
 def confirm_or_raise(message,q,expect='YES',exit_msg='Exiting at user request'):
-	m = message.strip()
-	if m: msg(m)
-	a = q+'  ' if q[0].isupper() else 'Are you sure you want to {}?\n'.format(q)
-	b = "Type uppercase '{}' to confirm: ".format(expect)
+	if message.strip():
+		msg(message.strip())
+	a = f'{q}  ' if q[0].isupper() else f'Are you sure you want to {q}?\n'
+	b = f'Type uppercase {expect!r} to confirm: '
 	if my_raw_input(a+b).strip() != expect:
 		raise UserNonConfirmation(exit_msg)
 
@@ -601,22 +604,22 @@ def write_data_to_file( outfile,data,desc='data',
 		qmsg('Output to STDOUT requested')
 		if g.stdin_tty:
 			if no_tty:
-				die(2,'Printing {} to screen is not allowed'.format(desc))
+				die(2,f'Printing {desc} to screen is not allowed')
 			if (ask_tty and not opt.quiet) or binary:
-				confirm_or_raise('','output {} to screen'.format(desc))
+				confirm_or_raise('',f'output {desc} to screen')
 		else:
-			try:    of = os.readlink('/proc/{}/fd/1'.format(os.getpid())) # Linux
+			try:    of = os.readlink(f'/proc/{os.getpid()}/fd/1') # Linux
 			except: of = None # Windows
 
 			if of:
 				if of[:5] == 'pipe:':
 					if no_tty:
-						die(2,'Writing {} to pipe is not allowed'.format(desc))
+						die(2,f'Writing {desc} to pipe is not allowed')
 					if ask_tty and not opt.quiet:
-						confirm_or_raise('','output {} to pipe'.format(desc))
+						confirm_or_raise('',f'output {desc} to pipe')
 						msg('')
 				of2,pd = os.path.relpath(of),os.path.pardir
-				msg("Redirecting output to file '{}'".format((of2,of)[of2[:len(pd)] == pd]))
+				msg('Redirecting output to file {!r}'.format(of if of2[:len(pd)] == pd else of2))
 			else:
 				msg('Redirecting output to file')
 
@@ -635,16 +638,16 @@ def write_data_to_file( outfile,data,desc='data',
 			outfile = make_full_path(opt.outdir,outfile)
 
 		if ask_write:
-			if not ask_write_prompt: ask_write_prompt = 'Save {}?'.format(desc)
+			if not ask_write_prompt:
+				ask_write_prompt = f'Save {desc}?'
 			if not keypress_confirm(ask_write_prompt,
 						default_yes=ask_write_default_yes):
-				die(1,'{} not saved'.format(capfirst(desc)))
+				die(1,f'{capfirst(desc)} not saved')
 
 		hush = False
 		if file_exists(outfile) and ask_overwrite:
-			q = "File '{}' already exists\nOverwrite?".format(outfile)
-			confirm_or_raise('',q)
-			msg("Overwriting file '{}'".format(outfile))
+			confirm_or_raise('',f'File {outfile!r} already exists\nOverwrite?')
+			msg(f'Overwriting file {outfile!r}')
 			hush = True
 
 		# not atomic, but better than nothing
@@ -658,8 +661,7 @@ def write_data_to_file( outfile,data,desc='data',
 				if d != cmp_data:
 					if g.test_suite:
 						print_diff(cmp_data,d)
-					m = "{} in file '{}' has been altered by some other program!  Aborting file write"
-					die(3,m.format(desc,outfile))
+					die(3,f'{desc} in file {outfile!r} has been altered by some other program! Aborting file write')
 
 		# To maintain portability, always open files in binary mode
 		# If 'binary' option not set, encode/decode data before writing and after reading
@@ -668,11 +670,11 @@ def write_data_to_file( outfile,data,desc='data',
 		try:
 			f.write(data if binary else data.encode())
 		except:
-			die(2,"Failed to write {} to file '{}'".format(desc,outfile))
+			die(2,f'Failed to write {desc} to file {outfile!r}')
 		f.close
 
 		if not (hush or quiet):
-			msg("{} written to file '{}'".format(capfirst(desc),outfile))
+			msg(f'{capfirst(desc)} written to file {outfile!r}')
 
 		return True
 
@@ -690,10 +692,10 @@ def get_words_from_user(prompt):
 
 def get_words_from_file(infile,desc,quiet=False):
 	if not quiet:
-		qmsg("Getting {} from file '{}'".format(desc,infile))
+		qmsg(f'Getting {desc} from file {infile!r}')
 	f = open_file_or_exit(infile, 'rb')
 	try: words = f.read().decode().split()
-	except: die(1,'{} data must be UTF-8 encoded.'.format(capfirst(desc)))
+	except: die(1,f'{capfirst(desc)} data must be UTF-8 encoded.')
 	f.close()
 	dmsg('Sanitized input: [{}]'.format(' '.join(words)))
 	return words
@@ -709,7 +711,7 @@ def mmgen_decrypt_file_maybe(fn,desc='',quiet=False,silent=False):
 	have_enc_ext = get_extension(fn) == g.mmenc_ext
 	if have_enc_ext or not is_utf8(d):
 		m = ('Attempting to decrypt','Decrypting')[have_enc_ext]
-		qmsg("{} {} '{}'".format(m,desc,fn))
+		qmsg(f'{m} {desc} {fn!r}')
 		from .crypto import mmgen_decrypt_retry
 		d = mmgen_decrypt_retry(d,desc)
 	return d
@@ -718,19 +720,19 @@ def get_lines_from_file(fn,desc='',trim_comments=False,quiet=False,silent=False)
 	dec = mmgen_decrypt_file_maybe(fn,desc,quiet=quiet,silent=silent)
 	ret = dec.decode().splitlines()
 	if trim_comments: ret = remove_comments(ret)
-	dmsg("Got {} lines from file '{}'".format(len(ret),fn))
+	dmsg(f'Got {len(ret)} lines from file {fn!r}')
 	return ret
 
 def get_data_from_user(desc='data'): # user input MUST be UTF-8
-	p = ('','Enter {}: '.format(desc))[g.stdin_tty]
+	p = f'Enter {desc}: ' if g.stdin_tty else ''
 	data = my_raw_input(p,echo=opt.echo_passphrase)
-	dmsg('User input: [{}]'.format(data))
+	dmsg(f'User input: [{data}]')
 	return data
 
 def get_data_from_file(infile,desc='data',dash=False,silent=False,binary=False,quiet=False):
 
 	if not opt.quiet and not silent and not quiet and desc:
-		qmsg("Getting {} from file '{}'".format(desc,infile))
+		qmsg(f'Getting {desc} from file {infile!r}')
 
 	if dash and infile == '-':
 		data = os.fdopen(0,'rb').read(g.max_input_size+1)
@@ -741,7 +743,7 @@ def get_data_from_file(infile,desc='data',dash=False,silent=False,binary=False,q
 		data = data.decode()
 
 	if len(data) == g.max_input_size + 1:
-		raise MaxInputSizeExceeded('Too much input data!  Max input data size: {} bytes'.format(g.max_input_size))
+		raise MaxInputSizeExceeded(f'Too much input data!  Max input data size: {f.max_input_size} bytes')
 
 	return data
 
@@ -872,12 +874,11 @@ def do_license_msg(immed=False):
 	if opt.quiet or g.no_license or opt.yes or not g.stdin_tty:
 		return
 
-	p = "Press 'w' for conditions and warranty info, or 'c' to continue:"
 	import mmgen.license as gpl
 	msg(gpl.warning)
-	prompt = '{} '.format(p.strip())
 
 	from .term import get_char
+	prompt = "Press 'w' for conditions and warranty info, or 'c' to continue: "
 	while True:
 		reply = get_char(prompt, immed_chars=('','wc')[bool(immed)])
 		if reply == 'w':
@@ -936,8 +937,10 @@ def altcoin_subclass(cls,proto,mod_dir):
 def write_mode(orig_func):
 	def f(self,*args,**kwargs):
 		if self.mode != 'w':
-			m = '{} opened in read-only mode: cannot execute method {}()'
-			die(1,m.format(type(self).__name__,locals()['orig_func'].__name__))
+			die(1,'{} opened in read-only mode: cannot execute method {}()'.format(
+				type(self).__name__,
+				locals()['orig_func'].__name__
+			))
 		return orig_func(self,*args,**kwargs)
 	return f