I'm in favor of the entire proposal. I am also willing to do reviews for
this.

On Tue, Jan 12, 2016 at 9:22 AM, Joshua Cohen <jco...@apache.org> wrote:

> I'm in favor of this proposal and will be very happy to see commons-args go
> away :).
>
> On Tue, Jan 12, 2016 at 6:53 AM, John Sirois <j...@conductant.com> wrote:
>
> > On Mon, Jan 11, 2016 at 9:49 PM, Bill Farner <wfar...@apache.org> wrote:
> >
> > > Any other thoughts on this?  I will proceed with initial encapsulation
> > work
> > > in the meantime, but am interested in any other pro/con opinions.
> > >
> >
> > I've stayed quiet on this since Bill and I spoke about the idea offline
> in
> > its pre-seed phase.  I think the advantages have already been
> well-covered
> > so I'll point out the disadvantages I've seen (I implemented a system
> like
> > this in the past):
> >
> > In the absence of the args system injecting args where they're needed
> (the
> > current Args does this and so is a 2nd form of data injection in addition
> > to guice), developers find it hard or inconvenient to plumb options from
> > the place where args are parsed (near main) to where they belong.  If DI
> is
> > not widely deployed - this can be a real problem.
> >
> > That said, In Aurora we don't have this problem.  Guice is used
> extensively
> > for DI in aurora and it can get the options plumbed where we need them in
> > the standard way.
> >
> > I'm very much in favor of this proposal.
> >
> >
> > > On Fri, Jan 8, 2016 at 10:25 AM, Maxim Khutornenko <ma...@apache.org>
> > > wrote:
> > >
> > > > "Can you turn that concern into a more firm stance?" - you mastered
> > > > the original library and I fully trust you with the new one :)
> > > >
> > > > +1.
> > > >
> > > > On Thu, Jan 7, 2016 at 6:58 PM, Bill Farner <wfar...@apache.org>
> > wrote:
> > > > > Can you turn that concern into a more firm stance?
> > > > >
> > > > > FWIW if you look closely, there's really only about 100 lines of
> > > > greenfield
> > > > > code in /r/42042 (CommandLineParameters.java, sure to grow of
> > course).
> > > > > There's a lot of bulk due to splitting out parser classes;
> > commons-args
> > > > has
> > > > > the same.
> > > > >
> > > > > I should have been clear - i'm not married to this.  Mostly
> > scratching
> > > an
> > > > > old itch, i won't be upset if it's more churn than it's worth at
> this
> > > > time.
> > > > >  (I _am_ tired of the gradle and intellij issues though.)
> > > > >
> > > > > On Thu, Jan 7, 2016 at 6:31 PM, Maxim Khutornenko <
> ma...@apache.org>
> > > > wrote:
> > > > >
> > > > >> I am a big +1 to the refactoring if only for testability reasons.
> > > > >>
> > > > >> My only concern is the amount of supporting code that your POC
> > > > >> resulted in https://reviews.apache.org/r/42042. It may feel like
> > > > >> trading code with Commons parser at the end, which is battle
> proven
> > > > >> and well tested. That said, arg parsing is generally a well scoped
> > > > >> problem, so it should be relatively easy to cover major testing
> > > > >> scenarios.
> > > > >>
> > > > >> On Thu, Jan 7, 2016 at 5:18 PM, Bill Farner <wfar...@apache.org>
> > > wrote:
> > > > >> > All,
> > > > >> >
> > > > >> > I propose that we replace our current command line args system.
> > For
> > > > >> those
> > > > >> > unaware, the args system [1] we currently use was forked out of
> > > > Twitter
> > > > >> > Commons several months ago.  The goal when forking was to
> > > > adapt/maintain
> > > > >> or
> > > > >> > eventually replace these libraries.  Given the code volume and
> > > > complexity
> > > > >> > of commons-args, i propose we replace it and address some issues
> > > along
> > > > >> the
> > > > >> > way.
> > > > >> >
> > > > >> > I suggest several goals:
> > > > >> > a. sidestep current development hurdles we have encountered with
> > the
> > > > args
> > > > >> > system (intellij/gradle not working nicely with apt)
> > > > >> > b. encourage better testability of Module classes by always
> > > injecting
> > > > all
> > > > >> > args
> > > > >> > c. leverage a well-maintained third-party argument parsing
> library
> > > > >> > d. stretch: enable user-friendly features like logical option
> > groups
> > > > for
> > > > >> > better help/usage output
> > > > >> > e. stretch: enable alternative configuration inputs like a
> > > > configuration
> > > > >> > file or environment variables
> > > > >> >
> > > > >> > (b) is currently an issue because command line arguments are
> > driven
> > > > from
> > > > >> > pseudo-constants within the code, for example:
> > > > >> >
> > > > >> >     @NotNull
> > > > >> >     @CmdLine(name = "cluster_name", help = "Name to identify the
> > > > cluster
> > > > >> > being served.")
> > > > >> >     private static final Arg<String> CLUSTER_NAME =
> Arg.create();
> > > > >> >
> > > > >> >     @NotNull
> > > > >> >     @NotEmpty
> > > > >> >     @CmdLine(name = "serverset_path", help = "ZooKeeper
> ServerSet
> > > > path to
> > > > >> > register at.")
> > > > >> >     private static final Arg<String> SERVERSET_PATH =
> > Arg.create();
> > > > >> >
> > > > >> > This makes it simple to add command line arguments.  However, it
> > > means
> > > > >> that
> > > > >> > a level of indirection is needed to parameterize and test the
> code
> > > > >> > consuming arg values.  We have various examples of this
> throughout
> > > the
> > > > >> > project.
> > > > >> >
> > > > >> > I propose that we change the way command line arguments are
> > declared
> > > > such
> > > > >> > that a Module with the above arguments would instead declare an
> > > > interface
> > > > >> > that produces its parameters:
> > > > >> >
> > > > >> >     public interface Params {
> > > > >> >       @Help("Name to identify the cluster being served.")
> > > > >> >       String clusterName();
> > > > >> >
> > > > >> >       @NotEmpty
> > > > >> >       @Help("ZooKeeper ServerSet path to register at.")
> > > > >> >       String serversetPath();
> > > > >> >     }
> > > > >> >
> > > > >> >     public SchedulerModule(Params params) {
> > > > >> >       // Params are supplied to the module constructor.
> > > > >> >     }
> > > > >> >
> > > > >> > Please see this review for a complete example of this part of
> the
> > > > change:
> > > > >> > https://reviews.apache.org/r/41804
> > > > >> >
> > > > >> > This is roughly the same amount of overhead for declaring
> > arguments
> > > as
> > > > >> the
> > > > >> > current scenario, with the addition of a very obvious mechanism
> > for
> > > > >> > swapping the source of parameters.  This allows us to isolate
> the
> > > > body of
> > > > >> > code responsible for supplying configuration values, which we
> lack
> > > > today.
> > > > >> >
> > > > >> > The remaining work is to bridge the gap between a command line
> > > > argument
> > > > >> > system and Parameter interfaces.  This is relatively easy to do
> > with
> > > > >> > dynamic proxies.  I have posted a proof of concept here:
> > > > >> > https://reviews.apache.org/r/42042
> > > > >> >
> > > > >> > Regarding (c), i have done some analysis of libraries available
> > and
> > > i
> > > > >> > suggest argparse4j [3].  It has thorough documentation, no
> > > transitive
> > > > >> > dependencies, and is being actively developed (last release Dec
> > > 2015).
> > > > >> > However, i would like to emphasize that i think we should
> minimize
> > > > >> coupling
> > > > >> > to the argument parsing library so that we may switch in the
> > future.
> > > > >> > Argparse4j has a feature that makes the non-critical feature (d)
> > > > >> possible.
> > > > >> >
> > > > >> > With that, what do you think?  Are there other goals we should
> > add?
> > > > Does
> > > > >> > the plan make sense?
> > > > >> >
> > > > >> > [1]
> > > > >> >
> > > > >>
> > > >
> > >
> >
> https://github.com/apache/aurora/tree/master/commons-args/src/main/java/org/apache/aurora/common/args
> > > > >> > [2] https://github.com/twitter/commons
> > > > >> > [3] https://argparse4j.github.io/
> > > > >>
> > > >
> > >
> >
> >
> >
> > --
> > John Sirois
> > 303-512-3301
> >
>
> --
> Zameer Manji
>
>
>

Reply via email to