Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for user-defined long argument prefix #278

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions sh.py
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,9 @@ class Command(object):
# for example, --arg=derp, '=' is the long_sep
"long_sep": "=",

# the prefix used for long arguments
"long_prefix": "--",

# this is for programs that expect their input to be from a terminal.
# ssh is one of those programs
"tty_in": False,
Expand Down Expand Up @@ -836,7 +839,7 @@ def _extract_call_args(kwargs, to_override={}):
return call_args, kwargs


def _aggregate_keywords(self, keywords, sep, raw=False):
def _aggregate_keywords(self, keywords, sep, raw=False, long_prefix='--'):
processed = []
for k, v in keywords.items():
# we're passing a short arg as a kwarg, example:
Expand All @@ -853,16 +856,18 @@ def _aggregate_keywords(self, keywords, sep, raw=False):
k = k.replace("_", "-")

if v is True:
processed.append(encode_to_py3bytes_or_py2str("--" + k))
processed.append(encode_to_py3bytes_or_py2str(long_prefix
+ k))
elif v is False:
pass
else:
arg = encode_to_py3bytes_or_py2str("--%s%s%s" % (k, sep, v))
arg = encode_to_py3bytes_or_py2str(
"%s%s%s%s" % (long_prefix, k, sep, v))
processed.append(arg)
return processed


def _compile_args(self, args, kwargs, sep):
def _compile_args(self, args, kwargs, sep, long_prefix='--'):
processed_args = []

# aggregate positional args
Expand All @@ -874,12 +879,14 @@ def _compile_args(self, args, kwargs, sep):
for sub_arg in arg:
processed_args.append(encode_to_py3bytes_or_py2str(sub_arg))
elif isinstance(arg, dict):
processed_args += self._aggregate_keywords(arg, sep, raw=True)
processed_args += self._aggregate_keywords(
arg, sep, raw=True, long_prefix=long_prefix)
else:
processed_args.append(encode_to_py3bytes_or_py2str(arg))

# aggregate the keyword arguments
processed_args += self._aggregate_keywords(kwargs, sep)
processed_args += self._aggregate_keywords(kwargs, sep,
long_prefix=long_prefix)

return processed_args

Expand All @@ -903,7 +910,10 @@ def bake(self, *args, **kwargs):
fn._partial_call_args.update(pruned_call_args)
fn._partial_baked_args.extend(self._partial_baked_args)
sep = pruned_call_args.get("long_sep", self._call_args["long_sep"])
fn._partial_baked_args.extend(self._compile_args(args, kwargs, sep))
prefix = pruned_call_args.get("long_prefix",
self._call_args["long_prefix"])
fn._partial_baked_args.extend(self._compile_args(
args, kwargs, sep, long_prefix=prefix))
return fn

def __str__(self):
Expand Down Expand Up @@ -997,7 +1007,9 @@ def __call__(self, *args, **kwargs):
else:
args.insert(0, first_arg)

processed_args = self._compile_args(args, kwargs, call_args["long_sep"])
processed_args = self._compile_args(
args, kwargs, call_args["long_sep"],
long_prefix=call_args["long_prefix"])

# makes sure our arguments are broken up correctly
split_args = self._partial_baked_args + processed_args
Expand Down
12 changes: 12 additions & 0 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,18 @@ def test_custom_separator(self):
python_baked = python.bake(py.name, {"long-option": "underscore"}, _long_sep="=baked=")
self.assertEqual(python_baked().strip(), "--long-option=baked=underscore")

def test_custom_long_prefix(self):
py = create_tmp_test("""
import sys
print(sys.argv[1])
""")
self.assertEqual(python(py.name,
{"long-option": "underscore"}, _long_prefix="-custom-").strip(), "-custom-long-option=underscore")
# test baking too
python_baked = python.bake(py.name, {"long-option": "underscore"}, _long_prefix="-baked-")
self.assertEqual(python_baked().strip(), "-baked-long-option=underscore")


def test_command_wrapper(self):
from sh import Command, which

Expand Down