Skip to content

Commit 3a913ee

Browse files
authored
Merge pull request #4828 from aleksandra-tarkowska/rebased/develop/config-exists
Add --set to config append, --report to config {set,append,remove} (rebased onto develop)
2 parents 1da6018 + 17d9974 commit 3a913ee

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

Diff for: components/tools/OmeroPy/src/omero/plugins/prefs.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,18 @@ def _configure(self, parser):
165165
for x in [set, append, remove]:
166166
x.add_argument(
167167
"KEY", help="Name of the key in the current profile")
168+
# report is intended for use with cfg mgmt tools
169+
x.add_argument("--report", action="store_true",
170+
help="Report if changes are made")
168171
set.add_argument(
169172
"-f", "--file", type=ExistingFile('r'),
170173
help="Load value from file")
171174
set.add_argument(
172175
"VALUE", nargs="?",
173176
help="Value to be set. If it is missing, the key will be removed")
177+
append.add_argument(
178+
"--set", action="store_true",
179+
help="Append only if not already in the list")
174180
append.add_argument("VALUE", help="Value to be appended")
175181
remove.add_argument("VALUE", help="Value to be removed")
176182

@@ -317,8 +323,12 @@ def set(self, args, config):
317323
f.close()
318324
elif args.VALUE is None:
319325
del config[args.KEY]
326+
if args.report:
327+
self.ctx.out('Changed: Removed %s' % args.KEY)
320328
else:
321329
config[args.KEY] = args.VALUE
330+
if args.report:
331+
self.ctx.out('Changed: Set %s:%s' % (args.KEY, args.VALUE))
322332

323333
def get_list_value(self, args, config):
324334
import json
@@ -348,13 +358,17 @@ def append(self, args, config):
348358
import json
349359
if args.KEY in config.keys():
350360
list_value = self.get_list_value(args, config)
351-
list_value.append(json.loads(args.VALUE))
352361
elif args.KEY.startswith('omero.web.'):
353362
list_value = self.get_omeroweb_default(args.KEY)
354-
list_value.append(json.loads(args.VALUE))
355363
else:
356-
list_value = [json.loads(args.VALUE)]
357-
config[args.KEY] = json.dumps(list_value)
364+
list_value = []
365+
jv = json.loads(args.VALUE)
366+
if not args.set or jv not in list_value:
367+
list_value.append(json.loads(args.VALUE))
368+
config[args.KEY] = json.dumps(list_value)
369+
if args.report:
370+
self.ctx.out(
371+
'Changed: Appended %s:%s' % (args.KEY, args.VALUE))
358372

359373
@with_rw_config
360374
def remove(self, args, config):
@@ -372,6 +386,8 @@ def remove(self, args, config):
372386

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

376392
@with_config
377393
def keys(self, args, config):

Diff for: components/tools/OmeroPy/test/unit/clitest/test_prefs.py

+41-5
Original file line numberDiff line numberDiff line change
@@ -243,20 +243,50 @@ def testRemoveFails(self, initval, newval):
243243
with pytest.raises(NonZeroReturnCode):
244244
self.invoke("remove A %s" % newval)
245245

246-
def testAppendRemove(self, capsys):
247-
self.invoke("append A 1")
246+
@pytest.mark.parametrize('report', ['--report', ''])
247+
def testAppendRemove(self, report, capsys):
248+
self.invoke("append %s A 1" % report)
249+
self.assertReportStdout(report, capsys, 'Appended A:1')
248250
self.invoke("get A")
249251
self.assertStdoutStderr(capsys, out='[1]')
250-
self.invoke("append A \"y\"")
252+
self.invoke("append %s A \"y\"" % report)
253+
self.assertReportStdout(report, capsys, 'Appended A:"y"')
251254
self.invoke("get A")
252255
self.assertStdoutStderr(capsys, out='[1, "y"]')
253-
self.invoke("remove A \"y\"")
256+
self.invoke("remove %s A \"y\"" % report)
257+
self.assertReportStdout(report, capsys, 'Removed A:"y"')
254258
self.invoke("get A")
255259
self.assertStdoutStderr(capsys, out='[1]')
256-
self.invoke("remove A 1")
260+
self.invoke("remove %s A 1" % report)
261+
self.assertReportStdout(report, capsys, 'Removed A:1')
257262
self.invoke("get A")
258263
self.assertStdoutStderr(capsys, out='[]')
259264

265+
def assertReportStdout(self, report, capsys, out):
266+
if report and out:
267+
self.assertStdoutStderr(capsys, out='Changed: %s' % out)
268+
else:
269+
self.assertStdoutStderr(capsys, out='')
270+
271+
@pytest.mark.parametrize('report', ['--report', ''])
272+
def testAppendSet(self, report, capsys):
273+
self.invoke("append %s --set A 1" % report)
274+
self.assertReportStdout(report, capsys, 'Appended A:1')
275+
self.invoke("get A")
276+
self.assertStdoutStderr(capsys, out='[1]')
277+
self.invoke("append %s --set A 2" % report)
278+
self.assertReportStdout(report, capsys, 'Appended A:2')
279+
self.invoke("get A")
280+
self.assertStdoutStderr(capsys, out='[1, 2]')
281+
self.invoke("append %s --set A 1" % report)
282+
self.assertReportStdout(report, capsys, '')
283+
self.invoke("get A")
284+
self.assertStdoutStderr(capsys, out='[1, 2]')
285+
self.invoke("append %s A 1" % report)
286+
self.assertReportStdout(report, capsys, 'Appended A:1')
287+
self.invoke("get A")
288+
self.assertStdoutStderr(capsys, out='[1, 2, 1]')
289+
260290
def testRemoveIdenticalValues(self, capsys):
261291
self.invoke("set A [1,1]")
262292
self.invoke("remove A 1")
@@ -273,9 +303,15 @@ def testAppendWithDefault(self, monkeypatch, capsys):
273303
"omero.web.test": ["TEST", "[1,2,3]", json.loads],
274304
"omero.web.notalist": ["NOTALIST", "abc", str],
275305
})
306+
276307
self.invoke("append omero.web.test 4")
277308
self.invoke("get omero.web.test")
278309
self.assertStdoutStderr(capsys, out='[1, 2, 3, 4]')
310+
self.invoke("append --set omero.web.test 2")
311+
self.assertStdoutStderr(capsys, out='')
312+
self.invoke("get omero.web.test")
313+
self.assertStdoutStderr(capsys, out='[1, 2, 3, 4]')
314+
279315
self.invoke("append omero.web.unknown 1")
280316
self.invoke("get omero.web.unknown")
281317
self.assertStdoutStderr(capsys, out='[1]')

0 commit comments

Comments
 (0)