Any other thoughts on this?  I will proceed with initial encapsulation work
in the meantime, but am interested in any other pro/con opinions.

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/
> >>
>

Reply via email to