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

Add --set to config append, --report to config {set,append,remove} (rebased onto develop) #4828

Merged
merged 2 commits into from
Sep 9, 2016
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
24 changes: 20 additions & 4 deletions components/tools/OmeroPy/src/omero/plugins/prefs.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,18 @@ def _configure(self, parser):
for x in [set, append, remove]:
x.add_argument(
"KEY", help="Name of the key in the current profile")
# report is intended for use with cfg mgmt tools
x.add_argument("--report", action="store_true",
help="Report if changes are made")
set.add_argument(
"-f", "--file", type=ExistingFile('r'),
help="Load value from file")
set.add_argument(
"VALUE", nargs="?",
help="Value to be set. If it is missing, the key will be removed")
append.add_argument(
"--set", action="store_true",
help="Append only if not already in the list")
append.add_argument("VALUE", help="Value to be appended")
remove.add_argument("VALUE", help="Value to be removed")

Expand Down Expand Up @@ -317,8 +323,12 @@ def set(self, args, config):
f.close()
elif args.VALUE is None:
del config[args.KEY]
if args.report:
self.ctx.out('Changed: Removed %s' % args.KEY)
else:
config[args.KEY] = args.VALUE
if args.report:
self.ctx.out('Changed: Set %s:%s' % (args.KEY, args.VALUE))

def get_list_value(self, args, config):
import json
Expand Down Expand Up @@ -348,13 +358,17 @@ def append(self, args, config):
import json
if args.KEY in config.keys():
list_value = self.get_list_value(args, config)
list_value.append(json.loads(args.VALUE))
elif args.KEY.startswith('omero.web.'):
list_value = self.get_omeroweb_default(args.KEY)
list_value.append(json.loads(args.VALUE))
else:
list_value = [json.loads(args.VALUE)]
config[args.KEY] = json.dumps(list_value)
list_value = []
jv = json.loads(args.VALUE)
if not args.set or jv not in list_value:
list_value.append(json.loads(args.VALUE))
config[args.KEY] = json.dumps(list_value)
if args.report:
self.ctx.out(
'Changed: Appended %s:%s' % (args.KEY, args.VALUE))

@with_rw_config
def remove(self, args, config):
Expand All @@ -372,6 +386,8 @@ def remove(self, args, config):

list_value.remove(json.loads(args.VALUE))
config[args.KEY] = json.dumps(list_value)
if args.report:
self.ctx.out('Changed: Removed %s:%s' % (args.KEY, args.VALUE))

@with_config
def keys(self, args, config):
Expand Down
46 changes: 41 additions & 5 deletions components/tools/OmeroPy/test/unit/clitest/test_prefs.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,20 +243,50 @@ def testRemoveFails(self, initval, newval):
with pytest.raises(NonZeroReturnCode):
self.invoke("remove A %s" % newval)

def testAppendRemove(self, capsys):
self.invoke("append A 1")
@pytest.mark.parametrize('report', ['--report', ''])
def testAppendRemove(self, report, capsys):
self.invoke("append %s A 1" % report)
self.assertReportStdout(report, capsys, 'Appended A:1')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1]')
self.invoke("append A \"y\"")
self.invoke("append %s A \"y\"" % report)
self.assertReportStdout(report, capsys, 'Appended A:"y"')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1, "y"]')
self.invoke("remove A \"y\"")
self.invoke("remove %s A \"y\"" % report)
self.assertReportStdout(report, capsys, 'Removed A:"y"')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1]')
self.invoke("remove A 1")
self.invoke("remove %s A 1" % report)
self.assertReportStdout(report, capsys, 'Removed A:1')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[]')

def assertReportStdout(self, report, capsys, out):
if report and out:
self.assertStdoutStderr(capsys, out='Changed: %s' % out)
else:
self.assertStdoutStderr(capsys, out='')

@pytest.mark.parametrize('report', ['--report', ''])
def testAppendSet(self, report, capsys):
self.invoke("append %s --set A 1" % report)
self.assertReportStdout(report, capsys, 'Appended A:1')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1]')
self.invoke("append %s --set A 2" % report)
self.assertReportStdout(report, capsys, 'Appended A:2')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1, 2]')
self.invoke("append %s --set A 1" % report)
self.assertReportStdout(report, capsys, '')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1, 2]')
self.invoke("append %s A 1" % report)
self.assertReportStdout(report, capsys, 'Appended A:1')
self.invoke("get A")
self.assertStdoutStderr(capsys, out='[1, 2, 1]')

def testRemoveIdenticalValues(self, capsys):
self.invoke("set A [1,1]")
self.invoke("remove A 1")
Expand All @@ -273,9 +303,15 @@ def testAppendWithDefault(self, monkeypatch, capsys):
"omero.web.test": ["TEST", "[1,2,3]", json.loads],
"omero.web.notalist": ["NOTALIST", "abc", str],
})

self.invoke("append omero.web.test 4")
self.invoke("get omero.web.test")
self.assertStdoutStderr(capsys, out='[1, 2, 3, 4]')
self.invoke("append --set omero.web.test 2")
self.assertStdoutStderr(capsys, out='')
self.invoke("get omero.web.test")
self.assertStdoutStderr(capsys, out='[1, 2, 3, 4]')

self.invoke("append omero.web.unknown 1")
self.invoke("get omero.web.unknown")
self.assertStdoutStderr(capsys, out='[1]')
Expand Down