Revert "re_order_kwargs, default_arg_delim, create_command_string functions"
This reverts commit 8173555dbb7ed64131384ac8934be71535bb8f2f.
Change-Id: I405d77fdfb82c3fd1efd0308e28688e035c284ec
diff --git a/lib/gen_cmd.py b/lib/gen_cmd.py
index 32f515d..6f88be1 100644
--- a/lib/gen_cmd.py
+++ b/lib/gen_cmd.py
@@ -10,8 +10,6 @@
import collections
import signal
import time
-import re
-import inspect
import gen_print as gp
import gen_valid as gv
@@ -520,266 +518,3 @@
kwargs['test_mode'] = test_mode
return shell_cmd(command_string, **kwargs)
-
-
-def re_order_kwargs(stack_frame_ix, **kwargs):
- r"""
- Re-order the kwargs to match the order in which they were specified on a
- function invocation and return as an ordered dictionary.
-
- Note that this re_order_kwargs function should not be necessary in python
- versions 3.6 and beyond.
-
- Example:
-
- The caller calls func1 like this:
-
- func1('mike', arg1='one', arg2='two', arg3='three')
-
- And func1 is defined as follows:
-
- def func1(first_arg, **kwargs):
-
- kwargs = re_order_kwargs(first_arg_num=2, stack_frame_ix=3, **kwargs)
-
- The kwargs dictionary before calling re_order_kwargs (where order is not
- guaranteed):
-
- kwargs:
- kwargs[arg3]: three
- kwargs[arg2]: two
- kwargs[arg1]: one
-
- The kwargs dictionary after calling re_order_kwargs:
-
- kwargs:
- kwargs[arg1]: one
- kwargs[arg2]: two
- kwargs[arg3]: three
-
- Note that the re-ordered kwargs match the order specified on the call to
- func1.
-
- Description of argument(s):
- stack_frame_ix The stack frame of the function whose
- kwargs values must be re-ordered. 0 is
- the stack frame of re_order_kwargs, 1 is
- the stack from of its caller and so on.
- kwargs The keyword argument dictionary which is
- to be re-ordered.
- """
-
- new_kwargs = collections.OrderedDict()
-
- # Get position number of first keyword on the calling line of code.
- (args, varargs, keywords, locals) =\
- inspect.getargvalues(inspect.stack()[stack_frame_ix][0])
- first_kwarg_pos = 1 + len(args)
- if varargs is not None:
- first_kwarg_pos += len(locals[varargs])
- for arg_num in range(first_kwarg_pos, first_kwarg_pos + len(kwargs)):
- # This will result in an arg_name value such as "arg1='one'".
- arg_name = gp.get_arg_name(None, arg_num, stack_frame_ix + 2)
- # Continuing with the prior example, the following line will result
- # in key being set to 'arg1'.
- key = arg_name.split('=')[0]
- new_kwargs[key] = kwargs[key]
-
- return new_kwargs
-
-
-def default_arg_delim(arg_dashes):
- r"""
- Return the default argument delimiter value for the given arg_dashes value.
-
- Note: this function is useful for functions that manipulate bash command
- line arguments (e.g. --parm=1 or -parm 1).
-
- Description of argument(s):
- arg_dashes The argument dashes specifier (usually,
- "-" or "--").
- """
-
- if arg_dashes == "--":
- return "="
-
- return " "
-
-
-def create_command_string(command, *pos_parms, **options):
- r"""
- Create and return a bash command string consisting of the given arguments
- formatted as text.
-
- The default formatting of options is as follows:
-
- <single dash><option name><space delim><option value>
-
- Example:
-
- -parm value
-
- The caller can change the kind of dashes/delimiters used by specifying
- "arg_dashes" and/or "arg_delims" as options. These options are processed
- specially by the create_command_string function and do NOT get inserted
- into the resulting command string. All options following the
- arg_dashes/arg_delims options will then use the specified values for
- dashes/delims. In the special case of arg_dashes equal to "--", the
- arg_delim will automatically be changed to "=". See examples below.
-
- Quoting rules:
-
- The create_command_string function will single quote option values as
- needed to prevent bash expansion. If the caller wishes to defeat this
- action, they may single or double quote the option value themselves. See
- examples below.
-
- pos_parms are NOT automatically quoted. The caller is advised to either
- explicitly add quotes or to use the quote_bash_parm functions to quote any
- pos_parms.
-
- Examples:
-
- command_string = create_command_string('cd', '~')
-
- Result:
- cd ~
-
- Note that the pos_parm ("~") does NOT get quoted, as per the
- aforementioned rules. If quotes are desired, they may be added explicitly
- by the caller:
-
- command_string = create_command_string('cd', '\'~\'')
-
- Result:
- cd '~'
-
- command_string = create_command_string('grep', '\'^[^ ]*=\'',
- '/tmp/myfile', i=None, m='1', arg_dashes='--', color='always')
-
- Result:
- grep -i -m 1 --color=always '^[^ ]*=' /tmp/myfile
-
- In the preceding example, note the use of None to cause the "i" parm to be
- treated as a flag (i.e. no argument value is generated). Also, note the
- use of arg_dashes to change the type of dashes used on all subsequent
- options. The following example is equivalent to the prior. Note that
- quote_bash_parm is used instead of including the quotes explicitly.
-
- command_string = create_command_string('grep', quote_bash_parm('^[^ ]*='),
- '/tmp/myfile', i=None, m='1', arg_dashes='--', color='always')
-
- Result:
- grep -i -m 1 --color=always '^[^ ]*=' /tmp/myfile
-
- In the following example, note the automatic quoting of the password
- option, as per the aforementioned rules.
-
- command_string = create_command_string('my_pgm', '/tmp/myfile', i=None,
- m='1', arg_dashes='--', password='${my_pw}')
-
- However, let's say that the caller wishes to have bash expand the password
- value. To achieve this, the caller can use double quotes:
-
- command_string = create_command_string('my_pgm', '/tmp/myfile', i=None,
- m='1', arg_dashes='--', password='"${my_pw}"')
-
- Result:
- my_pgm -i -m 1 --password="${my_pw}" /tmp/myfile
-
- command_string = create_command_string('ipmitool', 'power status',
- I='lanplus', C='3', U='root', P='0penBmc', H='wsbmc010')
-
- Result:
- ipmitool -I lanplus -C 3 -U root -P 0penBmc -H wsbmc010 power status
-
- By default create_command_string will take measures to preserve the order
- of the callers options. In some cases, this effort may fail (as when
- calling directly from a robot program). In this case, the caller can
- accept the responsibility of keeping an ordered list of options by calling
- this function with the last positional parm as some kind of dictionary
- (preferably an OrderedDict) and avoiding the use of any actual option args.
-
- Example:
- kwargs = collections.OrderedDict([('pass', 0), ('fail', 0)])
- command_string = create_command_string('my program', 'pos_parm1', kwargs)
-
- Result:
-
- my program -pass 0 -fail 0 pos_parm1
-
- Note to programmers who wish to write a wrapper to this function: To get
- the options to be processed correctly, the wrapper function must include a
- _stack_frame_ix_ keyword argument to allow this function to properly
- re-order options:
-
- def create_ipmi_ext_command_string(command, **kwargs):
-
- return create_command_string('ipmitool', command, _stack_frame_ix_=2,
- **kwargs)
-
- Example call of wrapper function:
-
- command_string = create_ipmi_ext_command_string('power status',
- I='lanplus')
-
- Description of argument(s):
- command The command (e.g. "cat", "sort",
- "ipmitool", etc.).
- pos_parms The positional parms for the command (e.g.
- PATTERN, FILENAME, etc.). These will be
- placed at the end of the resulting command
- string.
- options The command options (e.g. "-m 1",
- "--max-count=NUM", etc.). Note that if
- the value of any option is None, then it
- will be understood to be a flag (for which
- no value is required).
- """
-
- arg_dashes = "-"
- delim = default_arg_delim(arg_dashes)
-
- command_string = command
-
- if gp.is_dict(pos_parms[-1]):
- # Convert pos_parms from tuple to list.
- pos_parms = list(pos_parms)
- # Re-assign options to be the last pos_parm value (which is a
- # dictionary).
- options = pos_parms[-1]
- # Now delete the last pos_parm.
- del pos_parms[-1]
- else:
- # Either get stack_frame_ix from the caller via options or set it to
- # the default value.
- if '_stack_frame_ix_' in options:
- stack_frame_ix = options['_stack_frame_ix_']
- del options['_stack_frame_ix_']
- else:
- stack_frame_ix = 1
- # Re-establish the original options order as specified on the
- # original line of code. This function depends on correct order.
- options = re_order_kwargs(stack_frame_ix, **options)
- for key, value in options.items():
- # Check for special values in options and process them.
- if key == "arg_dashes":
- arg_dashes = str(value)
- delim = default_arg_delim(arg_dashes)
- continue
- if key == "arg_delim":
- delim = str(value)
- continue
- # Format the options elements into the command string.
- command_string += " " + arg_dashes + key
- if value is not None:
- command_string += delim
- if re.match(r'^(["].*["]|[\'].*[\'])$', str(value)):
- # Already quoted.
- command_string += str(value)
- else:
- command_string += gm.quote_bash_parm(str(value))
- # Finally, append the pos_parms to the end of the command_string.
- command_string = command_string + ' ' + ' '.join(pos_parms)
-
- return command_string