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

Provide further command-line options. #12

Merged
merged 17 commits into from
Sep 17, 2020

Conversation

mtbc
Copy link
Member

@mtbc mtbc commented Sep 9, 2020

Fixes #7 and aids ome/design#20 by adding command-line options to cover those of omero::cmd::Duplicate.

@mtbc
Copy link
Member Author

mtbc commented Sep 10, 2020

pip install -U https://codeload.github.com/snoopycrimecop/omero-cli-duplicate/zip/merge_ci for easy testing.

@pwalczysko
Copy link
Member

    # Duplicate a project with the original images linked into its datasets
    omero duplicate Project:15 --reference-classes=Image

Not sure what that is supposed to do. I thought the duplicate by default does that anyway (duplicate a project implies duplicating all its Datasets and all the images in those datasets. What am I missing here ?

@pwalczysko
Copy link
Member

# Reuse annotations except for duplicating comments and ratings

I would suggest replacing the work reuse with something more precise, like link the original annotations to the duplicates, do not duplicate the annotations

@pwalczysko
Copy link
Member

pwalczysko commented Sep 10, 2020

  --duplicate-classes DUPLICATE_CLASSES
                                        Modifies the given option by specifying classes to duplicate

Wonder when would I use that ? An example would be handy.

Aha, sorry, it is there, in the last example

@pwalczysko
Copy link
Member

Could we maybe go away from the word classes ? Objects would be a fine replacement by me

@mtbc
Copy link
Member Author

mtbc commented Sep 10, 2020

By default duplicate links duplicate images into the datasets, not the originals. --reference-classes=Image won't duplicate images.

"something more precise" goes way off the end of the line, that's okay? I was trying to do what I could while keeping it short.

"classes" to match the description of the other options like "--include", they seem to be classes elsewhere in CLI-speak. "objects" I'd be more likely to interpret as being instances rather than kinds.

@pwalczysko
Copy link
Member

...way off the end of the line, that's okay?

More okay imho than to leave room for unclarity.

@pwalczysko
Copy link
Member

pwalczysko commented Sep 10, 2020

Trying to link some annotations on the original to the duplicates in read-only group leads to failure, as kind of expected ... We need to think about this case at least for the webclient though @will-moore (in the example below, user-8 is trying to duplicate user-2's Project and link the Tags from the original to the duplicate by passing --reference-classes=Annotation:

(env562) pwalczysko@ls31618~$ omero duplicate Project:23308 --reference-classes=Annotation --duplicate-classes=CommentAnnotation,LongAnnotation --report
Using session for user-8@merge-ci-devspace.openmicroscopy.org:4064. Idle timeout: 10 min. Current group: read-only-1
omero.cmd.Duplicate Project:23308 failed: 'graph-fail'
	message=Group is rwr---. Cannot link to object: ome.model.annotations.TagAnnotation:Id_57735
	stacktrace=ome.conditions.SecurityViolation: Group is rwr---. Cannot link to object: ome.model.annotations.TagAnnotation:Id_57735
	at ome.security.basic.OmeroInterceptor.throwIfNotGranted(OmeroInterceptor.java:1270)
	at ome.security.basic.OmeroInterceptor.evaluateLinkages(OmeroInterceptor.java:628)
....

@pwalczysko
Copy link
Member

All taken on #12 (comment). Re-reading the help, I think my main tripping point is that I did not get the reference as meaning link and thus missed the whole concept of either linking (some of) the original objects to duplicates, or, instead, duplicating (some of) the objects.
Could we maybe remove the reference wording in favor of link or linking and similar ?

Modifies the given option by specifying classes to reference

@pwalczysko
Copy link
Member

pwalczysko commented Sep 10, 2020

Problem when tried to duplicate a dataset with exclusion of ROIs and FileAnnotations.

(env562) pwalczysko@ls31618~$ omero duplicate Dataset:4152 --ignore-classes=Roi,FileAnnotation --report
Using session for user-3@merge-ci-devspace.openmicroscopy.org:4064. Idle timeout: 10 min. Current group: public
omero.cmd.Duplicate Dataset:4152 failed: 'graph-fail'
	message=not-null property references a null or transient value: ome.model.annotations.DatasetAnnotationLink.child
	stacktrace=org.hibernate.PropertyValueException: not-null property references a null or transient value: ome.model.annotations.DatasetAnnotationLink.child
	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:312)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:143)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:201)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:147)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:71)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
	at sun.reflect.GeneratedMethodAccessor2383.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at ome.tools.hibernate.SessionFactory.invoke(SessionFactory.java:105)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy74.persist(Unknown Source)
	at omero.cmd.graphs.DuplicateI.persistDuplicatesWithNewPropertyValues(DuplicateI.java:740)
	at omero.cmd.graphs.DuplicateI.step(DuplicateI.java:1028)
	at omero.cmd.HandleI.steps(HandleI.java:448)
	at omero.cmd.HandleI$RunSteps.innerWork(HandleI.java:509)
	at omero.cmd.HandleI$2.doWork(HandleI.java:383)
	at omero.cmd.HandleI$2.doWork(HandleI.java:380)
	at sun.reflect.GeneratedMethodAccessor303.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at ome.services.util.Executor$Impl$Interceptor.invoke(Executor.java:568)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at ome.security.basic.EventHandler.invoke(EventHandler.java:154)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at ome.tools.hibernate.ProxyCleanupFilter$Interceptor.invoke(ProxyCleanupFilter.java:249)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at ome.services.util.ServiceHandler.invoke(ServiceHandler.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy73.doWork(Unknown Source)
	at ome.services.util.Executor$Impl.execute(Executor.java:447)
	at omero.cmd.HandleI.run(HandleI.java:379)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at ome.services.util.Executor$Impl$1.call(Executor.java:488)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

@mtbc
Copy link
Member Author

mtbc commented Sep 10, 2020

That one's a tricky one. In read-annotate you can reference the attachments but in read-only you may need the blunt instrument of --ignore-classes=IAnnotationLink.

@pwalczysko
Copy link
Member

pwalczysko commented Sep 10, 2020

in read-only you may need the blunt instrument of --ignore-classes=IAnnotationLink.

That will be hard to explain to users. I actually do not understand myself why that should be the case. Is it possible to change it ?

Also, the behaviour is actually erratic then - or at least it appears so. I have first run the command with exclusion of Roi only, and it did not error, it was just not returning for a long time.

@mtbc
Copy link
Member Author

mtbc commented Sep 10, 2020

Not easily changed. Could be worth an issue but there is already a ton of graphs-related RFE (if we include Trello cards).

The issue is basically one of lookahead and class distinctions. RoIs don't have a separate kind of linking object at all so they don't run into this issue, you should be able to --ignore-classes=Roi just fine. However, links from images to comments are of the same kind as links from images to tags so with the class-based selectors there is no way to say, for example, "ignore links to attachments but duplicate links to comments". What you ran into was that it was duplicating the link from the dataset to the attachment but the link had nothing it could point to (as attachments were ignored) and there is no clever machinery to see that problem in advance or recover from it when it occurs.

In read-annotate at least one can fall back to referencing instead so the duplicate link still has somewhere to point but the class-based selectors and same-link-kinds mean that for read-only one can ignore all links from datasets to annotations or none.

@pwalczysko
Copy link
Member

Re #12 (comment)

for read-only one can ignore all links from datasets to annotations or none.

Tried to do just that, but that failed too, see below

(env562) pwalczysko@ls31618~$ omero duplicate Dataset:4152 --ignore-classes=Annotation --report
Using session for user-3@merge-ci-devspace.openmicroscopy.org:4064. Idle timeout: 10 min. Current group: public
omero.cmd.Duplicate Dataset:4152 failed: 'graph-fail'
	message=not-null property references a null or transient value: ome.model.annotations.FilesetAnnotationLink.child
	stacktrace=org.hibernate.PropertyValueException: not-null property references a null or transient value: ome.model.annotations.FilesetAnnotationLink.child
	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:312)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:143)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:201)

@mtbc
Copy link
Member Author

mtbc commented Sep 10, 2020

Try --ignore-classes=DatasetAnnotationLink. The ignorings need to target the links.

@pwalczysko
Copy link
Member

Try --ignore-classes=DatasetAnnotationLink. The ignorings need to target the links.

@mtbc yes, thank you. I think I got it finally, see below please. Although finally successful, we should think how to give this as an example in the help text, because no way it is intiutive or even deducible.

  1. Insert an example when in RO group and specify in that example that links have to be singled out
  2. Insert an example sstating (maybe again in RO group) that shows that ROIs can be gotten rid of even in RO group, i.e. they are exceptional in the sense that there is no link (all that explanation might be swallowed, but the ROI example might just say "possible also in RO group".
(env562) pwalczysko@ls31618~$ omero duplicate Dataset:4152 --ignore-classes=DatasetAnnotationLink,ImageAnnotationLink,Roi --report
Using session for user-3@merge-ci-devspace.openmicroscopy.org:4064. Idle timeout: 10 min. Current group: public
omero.cmd.Duplicate Dataset:4152 ok
Steps: 14
Elapsed time: 244.833 secs.
Flags: []
Duplicates
  CommentAnnotation:57779-57789
  FilesetAnnotationLink:5027-5037
  Dataset:25524
  DatasetImageLink:86691-86705
  Channel:366992-367021
  Image:143052-143066
...

" omero duplicate Project:15 --reference-classes=Annotation "
"--duplicate-classes=CommentAnnotation,LongAnnotation\n"
"""
Group permissions can prevent simply referencing an Image or Annotation.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Group permissions can prevent simply referencing an Image or Annotation.
Group permissions can prevent simply linking an Image or Annotation.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this is not optimal suggestion.
How would "referencing for linking" sound ? Or maybe Group permissions can prevent simply referencing an Image or Annotation because the subsequent linking is not possible.

?

@pwalczysko
Copy link
Member

One formulation suggestion, otherwise looks good and works as expected.
I am confident now that I can grasp the behaviour and explain to @will-moore if necessary.

@pwalczysko
Copy link
Member

The last two commits look good as well.

Copy link
Member

@joshmoore joshmoore left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Few CLI usability comments.

@@ -61,6 +72,38 @@ def cmd_type(self):
import omero.all
return omero.cmd.Duplicate

def _pre_objects(self, parser):
parser.add_argument(
"--duplicate-classes",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could see dropping --classes here and perhaps adding a short-cut, -D.

Copy link
Member Author

@mtbc mtbc Sep 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's largely the default anyway.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't assume there's a way to list what the server will do by default, is there?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is basically what --dry-run does but, generally, the name of the subcommand is a big hint.

Copy link
Member

@joshmoore joshmoore Sep 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... I don't know.

omero duplicate --dry-run Image:160 --report
omero.cmd.Duplicate Image:160 Dry run performed
...
Duplicates
  Arc:107
  Detector:22
  DetectorSettings:22
...

doesn't really give me a sense of the default parameters to know what I can change from "duplicate" to "reference". Are there any that default to "reference" (or even "ignore")?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing's jumping to my mind apart from things like how details.owner are effectively ignored but that can't be overridden with --duplicate anyway. Generally the only "do a different thing by default" going on with graphs operations is when it switches to deleting, e.g., removing somebody else's comments when you move an image into a private group (also not overridable), but duplicate never switches to deletion.

def _pre_objects(self, parser):
parser.add_argument(
"--duplicate-classes",
help=("Modifies the given option by specifying kinds of object to "
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could see dropping "Modifies the given option by". Perhaps, "Specify kind of object to duplicate"

help=("Modifies the given option by specifying kinds of object to "
"link to instead of duplicate"))
parser.add_argument(
"--ignore-classes",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These could conceivable be marked nargs="+" to handle -R Foo -R Bar.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That one's new to me so have created ome/omero-py#253 as a start.

help=("Modifies the given option by specifying kinds of object to "
"duplicate"))
parser.add_argument(
"--reference-classes",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

choices = tuple([x[:-1] for x in dir(omero.model) if x.endswith("I")]) or similar would be able to detect typos in the arguments.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately that includes classes like Event which aren't permitted and omits the example's Annotation which is; I don't think we have an easy way here to get a good list of choices.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Encoding that logic along with the other base graph methods would probably produce something maintainable:

def get_graph_targets():
 - load all classes
 - remove events and other known problems
 - add "Annotations" and other necessary base classes

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If not asking the server then probably best done with some codegen adjustments. Marker interfaces like IAnnotationLink are also available.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -28,15 +28,10 @@

from omero.cli import CLI, GraphControl

HELP = """Duplicate OMERO data.
HELP = ("""Duplicate OMERO data.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This 3 word intro could likely be dropped in favor of the next sentence:

usage: ./.venv3/bin/omero duplicate [-h] [--wait WAIT] [--include INCLUDE]
                                    [--exclude EXCLUDE] [--ordered] [--list]
                                    [--report] [--dry-run] [--force]
                                    [--duplicate-classes DUPLICATE_CLASSES]
                                    [--reference-classes REFERENCE_CLASSES]
                                    [--ignore-classes IGNORE_CLASSES]
                                    [obj [obj ...]]

Duplicate OMERO data.

Duplicate entire graphs of data based on the ID of the top-node.

" omero duplicate Project:15 --reference-classes=Annotation "
"--duplicate-classes=CommentAnnotation,LongAnnotation\n"
"""
Group permissions can prevent a duplicated link from referencing another
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm skeptical that this paragraph is going to be understandable by most. Is there any chance of detecting this particular error and then saying, "you will need to modify your parameters"?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or perhaps at least, I'd begin with a more friendly text describing things in general, and then prefix this paragraph with Warning/Details/Notice etc.

Copy link
Member Author

@mtbc mtbc Sep 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://trello.com/c/F4cAE0k3/358-graphexception-subclasses may be the best approach there though it'd also require analysis to figure what else can cause the same condition.

help=("Modifies the given option by specifying kinds of object to "
"duplicate"))
parser.add_argument(
"--reference-classes",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add metavar="CLASS" (or "TYPE")

@mtbc
Copy link
Member Author

mtbc commented Sep 16, 2020

For testing one can adjust the "omero.cmd.graphs" line in logback.xml from INFO to DEBUG to get a full report in Blitz-0.log of the options that the CLI sent to the server.

Copy link
Member

@joshmoore joshmoore left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Few minor comments but the help is generally looking much more usable. Thank you.

By default, a whole subtree of OMERO model objects is duplicated. One
may opt to have duplicate objects reference original parts of the
subtree instead of also duplicating those, see the "--reference" option
below. More strongly, one may "--ignore" given kinds of model object
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

model object seemed odd here in the singular.

@@ -61,6 +78,44 @@ def cmd_type(self):
import omero.all
return omero.cmd.Duplicate

def _pre_objects(self, parser):
parser.add_argument(
"--duplicate",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You decided against the short-cuts?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, given that we shortened from --duplicate-classes and I imagined you might have initially thought --duplicate would be used more often than I'd guess, given that it overrides overrides to put them back to default. We haven't much done it elsewhere, e.g., for --include or --dry-run or whatever. Could still do it if it brings enough value, maybe capital letters to reduce conflicts with non-graph-command options.

"--duplicate=CommentAnnotation,LongAnnotation\n"
"""
Group permissions can prevent a duplicated link from referencing another
user's Image or Annotation. However, note that ignoring a linked-to
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i.e. it will throw an exception?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm pointing out we may want to say that to the user.

"""
" # Duplicate a project, linking to the original annotations "
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason for the extra """ and separately quoted lines here?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor point - shouldn't we use Project instead of project to refer to objects? Also it's more consistent with the commands themselves.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stops flake8 complaining about the long line.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm trying to be consistent with the other CLI graphs command help text, this PR was originally just adapted from GraphControl methods which is why some of the suggested changes here I've mirrored back into omero-py. Certainly open to reworking it all but perhaps could be a separate effort given how many related subcommands there are.

@pwalczysko
Copy link
Member

I like the new wording of the help. I would

  • also lean towards the plural of objects in sentences like discussed in Provide further command-line options. #12 (comment)
  • why is there actually the = sign syntax when using the flags ? The main help text does not suggest the equal sign, you can read it only from the examples, such as
--duplicate=CommentAnnotation,LongAnnotation\n

@mtbc
Copy link
Member Author

mtbc commented Sep 16, 2020

Oops, now more commits than ome/omero-blitz#100. 😆

@joshmoore
Copy link
Member

  • why is there actually the = sign syntax when using the flags ? The main help text does not suggest the equal sign, you can read it only from the examples, such as

For most people familiar with the command line, it should be understood that the equals is optional. --foo=bar is equivalent to --foo bar. We certainly don't have a style-guide entry preferring one over the other and I would not think we want to proscriptive. (ergo, for this PR, I also don't mind one way or the other)

Copy link
Member

@joshmoore joshmoore left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Today's help looks good. The issue with the short arguments (e.g. -D) can be addressed later. Release (0.4.0?) will need to be coordinated.

@joshmoore joshmoore merged commit f2b3c7d into ome:master Sep 17, 2020
@mtbc mtbc deleted the extend-CLI-duplicate branch September 17, 2020 09:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

RFE: allow options to be specified
4 participants