Skip to content

Commit

Permalink
Parse multiple positional-consuming jq args. Fixes kislyuk#16
Browse files Browse the repository at this point in the history
  • Loading branch information
kislyuk committed Jan 29, 2018
1 parent 61d96c5 commit 7d2983b
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 7 deletions.
4 changes: 3 additions & 1 deletion test/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ def test_yq_err(self):
self.run_yq("- %", ["."], expect_exit_code=err)

def test_yq_arg_passthrough(self):
self.assertEqual(self.run_yq("{}", ["--arg", "foo", "bar", "--indent", "4", "."]), "")
self.assertEqual(self.run_yq("{}", ["--arg", "foo", "bar", "--arg", "x", "y", "--indent", "4", "."]), "")
self.assertEqual(self.run_yq("{}", ["--arg", "foo", "bar", "--arg", "x", "y", "-y", "--indent", "4", ".x=$x"]),
"x: y\n")
self.run_yq("{}", ["--indent", "9", "."], expect_exit_code=2)

def fd_path(self, fh):
Expand Down
12 changes: 6 additions & 6 deletions yq/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,22 +57,22 @@ def decode_docs(jq_output, json_decoder):
parser.add_argument("--version", action="version", version="%(prog)s {version}".format(version=__version__))

# jq arguments that consume positionals must be listed here to avoid our parser mistaking them for our positionals
jq_arg_group = parser.add_argument_group("jq_args")
jq_arg_spec = {"--indent": 1, "-f": 1, "--from-file": 1, "-L": 1, "--arg": 2, "--argjson": 2, "--slurpfile": 2,
"--argfile": 2}
for arg in jq_arg_spec:
jq_arg_group.add_argument(arg, nargs=jq_arg_spec[arg], dest=arg, help=argparse.SUPPRESS)
parser.add_argument(arg, nargs=jq_arg_spec[arg], dest=arg, action="append", help=argparse.SUPPRESS)

parser.add_argument("jq_filter")
parser.add_argument("files", nargs="*", type=argparse.FileType())

def main(args=None):
args, jq_args = parser.parse_known_args(args=args)
for arg in jq_arg_spec:
vals = getattr(args, arg, None)
if vals is not None:
jq_args.append(arg)
jq_args.extend(vals)
values = getattr(args, arg, None)
if values is not None:
for value_group in values:
jq_args.append(arg)
jq_args.extend(value_group)

if sys.stdin.isatty() and not args.files:
return parser.print_help()
Expand Down

0 comments on commit 7d2983b

Please sign in to comment.