Skip to content
Merged
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
51 changes: 31 additions & 20 deletions covert/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ def argparse():
sys.exit(1)

aiter = iter(av[1:])
longargs = [flag[1:] for switches in ad.values() for flag in switches if flag.startswith("--")]
shortargs = [flag[1:] for switches in ad.values() for flag in switches if not flag.startswith("--")]
for a in aiter:
aprint = a
if not a.startswith('-'):
args.files.append(a)
continue
Expand All @@ -124,28 +127,36 @@ def argparse():
if a == '--':
args.files += args
break
if not a.startswith('--') and len(a) > 2:
stderr.write(f' 💣 Short arguments cannot be combined: covert {args.mode} {a}\n')
sys.exit(1)
if a.startswith('--'):
a = a.lower()
argvar = next((k for k, v in ad.items() if a in v), None)
if argvar is None:
stderr.write(f'{modehelp}\n 💣 Unknown argument: covert {args.mode} {a}\n')
sys.exit(1)
try:
var = getattr(args, argvar)
if isinstance(var, list):
var.append(next(aiter))
elif isinstance(var, str):
setattr(args, argvar, next(aiter))
elif isinstance(var, int):
setattr(args, argvar, var + 1)
else:
setattr(args, argvar, True)
except StopIteration:
stderr.write(f'{modehelp}\n 💣 Argument parameter missing: covert {args.mode} {a} …\n')
sys.exit(1)
if not a.startswith('--') and len(a) > 2:
if any(arg not in shortargs for arg in list(a[1:])):
falseargs = [arg for arg in list(a[1:]) if arg not in shortargs]
stderr.write(f' 💣 {falseargs} is not an argument: covert {args.mode} {a}\n')
sys.exit(1)
a = [f'-{shortarg}' for shortarg in list(a[1:]) if shortarg in shortargs]
if isinstance(a, str):
a = [a]
for i, av in enumerate(a):
argvar = next((k for k, v in ad.items() if av in v), None)
if isinstance(av, int):
continue
if argvar is None:
stderr.write(f'{modehelp}\n 💣 Unknown argument: covert {args.mode} {aprint}\n')
sys.exit(1)
try:
var = getattr(args, argvar)
if isinstance(var, list):
var.append(next(aiter))
elif isinstance(var, str):
setattr(args, argvar, next(aiter))
elif isinstance(var, int):
setattr(args, argvar, var + 1)
else:
setattr(args, argvar, True)
except StopIteration:
stderr.write(f'{modehelp}\n 💣 Argument parameter missing: covert {args.mode} {aprint} …\n')
sys.exit(1)

return args

Expand Down
24 changes: 24 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest
import sys

def test_argparser(capsys):
from covert.__main__ import argparse # Import *after* capsys wraps stdout/stderr

# Correct but complex arguments
sys.argv = "covert enc --recipient recipient1 -r recipient2 -Arrp recipient3 recipient4".split()
a = argparse()
assert a.recipients == ['recipient1', 'recipient2', 'recipient3', 'recipient4']
assert a.paste is True
assert a.askpass == 1
# Should produce no output
cap = capsys.readouterr()
assert not cap.out
assert not cap.err

# Missing argument parameter
sys.argv = "covert enc -Arrp recipient1".split()
with pytest.raises(SystemExit):
argparse()
cap = capsys.readouterr()
assert not cap.out
assert "Argument parameter missing: covert enc -Arrp …" in cap.err