You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2016/04/08 21:28:26 UTC

aurora git commit: Remove support for positional command line arguments,

Repository: aurora
Updated Branches:
  refs/heads/master bd90d768e -> 0dd096dc5


Remove support for positional command line arguments,

Reviewed at https://reviews.apache.org/r/45939/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/0dd096dc
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/0dd096dc
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/0dd096dc

Branch: refs/heads/master
Commit: 0dd096dc51beac2f83c4523bfe170536d489e956
Parents: bd90d76
Author: Bill Farner <wf...@apache.org>
Authored: Fri Apr 8 12:28:43 2016 -0700
Committer: Bill Farner <wf...@apache.org>
Committed: Fri Apr 8 12:28:43 2016 -0700

----------------------------------------------------------------------
 .../apache/aurora/common/args/Positional.java   |  40 -------
 .../common/args/apt/CmdLineProcessor.java       |  35 +-----
 .../aurora/common/args/apt/Configuration.java   |  60 ++++------
 .../apache/aurora/common/args/ArgScanner.java   |  31 ------
 .../org/apache/aurora/common/args/Args.java     |  58 +---------
 .../aurora/common/args/PositionalInfo.java      | 109 -------------------
 .../aurora/common/args/ArgScannerTest.java      |  71 ------------
 .../org/apache/aurora/common/args/ArgsTest.java |   5 -
 8 files changed, 25 insertions(+), 384 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons-args/src/main/java/org/apache/aurora/common/args/Positional.java
----------------------------------------------------------------------
diff --git a/commons-args/src/main/java/org/apache/aurora/common/args/Positional.java b/commons-args/src/main/java/org/apache/aurora/common/args/Positional.java
deleted file mode 100644
index 1c6f86f..0000000
--- a/commons-args/src/main/java/org/apache/aurora/common/args/Positional.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.common.args;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-/**
- * Annotation to mark an {@link Arg} for gathering the positional command line arguments.
- */
-@Retention(RUNTIME)
-@Target(FIELD)
-public @interface Positional {
-  /**
-   * The help string to display on the command line in a usage message.
-   */
-  String help();
-
-  /**
-   * The parser class to use for parsing the positional arguments.  The parser must return the same
-   * type as the field being annotated.
-   */
-  Class<? extends Parser<?>> parser() default NoParser.class;
-
-  // TODO: https://github.com/twitter/commons/issues/353, Consider to add argFile for positional.
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons-args/src/main/java/org/apache/aurora/common/args/apt/CmdLineProcessor.java
----------------------------------------------------------------------
diff --git a/commons-args/src/main/java/org/apache/aurora/common/args/apt/CmdLineProcessor.java b/commons-args/src/main/java/org/apache/aurora/common/args/apt/CmdLineProcessor.java
index d531ba0..5fda5dc 100644
--- a/commons-args/src/main/java/org/apache/aurora/common/args/apt/CmdLineProcessor.java
+++ b/commons-args/src/main/java/org/apache/aurora/common/args/apt/CmdLineProcessor.java
@@ -57,13 +57,11 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 
 import org.apache.aurora.common.args.Arg;
 import org.apache.aurora.common.args.ArgParser;
 import org.apache.aurora.common.args.CmdLine;
 import org.apache.aurora.common.args.Parser;
-import org.apache.aurora.common.args.Positional;
 import org.apache.aurora.common.args.Verifier;
 import org.apache.aurora.common.args.VerifierFor;
 import org.apache.aurora.common.args.apt.Configuration.ParserInfo;
@@ -103,9 +101,6 @@ public class CmdLineProcessor extends AbstractProcessor {
         @Override public Configuration get() {
           try {
             Configuration configuration = Configuration.load();
-            for (ArgInfo argInfo : configuration.positionalInfo()) {
-              configBuilder.addPositionalInfo(argInfo);
-            }
             for (ArgInfo argInfo : configuration.optionInfo()) {
               configBuilder.addCmdLineArg(argInfo);
             }
@@ -169,7 +164,7 @@ public class CmdLineProcessor extends AbstractProcessor {
   @Override
   public Set<String> getSupportedAnnotationTypes() {
     return ImmutableSet.copyOf(Iterables.transform(
-        ImmutableList.of(Positional.class, CmdLine.class, ArgParser.class, VerifierFor.class),
+        ImmutableList.of(CmdLine.class, ArgParser.class, VerifierFor.class),
         GET_NAME));
   }
 
@@ -184,27 +179,11 @@ public class CmdLineProcessor extends AbstractProcessor {
 
       Set<? extends Element> cmdlineArgs = getAnnotatedElements(roundEnv, CmdLine.class);
       contributingClassNamesBuilder.addAll(extractEnclosingClassNames(cmdlineArgs));
-      Set<? extends Element> positionalArgs = getAnnotatedElements(roundEnv, Positional.class);
-      contributingClassNamesBuilder.addAll(extractEnclosingClassNames(positionalArgs));
-
-      ImmutableSet<? extends Element> invalidArgs =
-          Sets.intersection(cmdlineArgs, positionalArgs).immutableCopy();
-      if (!invalidArgs.isEmpty()) {
-        error("An Arg cannot be annotated with both @CmdLine and @Positional, found bad Arg "
-            + "fields: %s", invalidArgs);
-      }
 
       for (ArgInfo cmdLineInfo : processAnnotatedArgs(parsedTypes, cmdlineArgs, CmdLine.class)) {
         configBuilder.addCmdLineArg(cmdLineInfo);
       }
 
-      for (ArgInfo positionalInfo
-          : processAnnotatedArgs(parsedTypes, positionalArgs, Positional.class)) {
-
-        configBuilder.addPositionalInfo(positionalInfo);
-      }
-      checkPositionalArgsAreLists(roundEnv);
-
       processParsers(parsers);
 
       Set<? extends Element> verifiers = getAnnotatedElements(roundEnv, VerifierFor.class);
@@ -292,18 +271,6 @@ public class CmdLineProcessor extends AbstractProcessor {
     }
   }
 
-  private void checkPositionalArgsAreLists(RoundEnvironment roundEnv) {
-    for (Element positionalArg : getAnnotatedElements(roundEnv, Positional.class)) {
-      @Nullable TypeMirror typeArgument =
-          getTypeArgument(positionalArg.asType(), typeElement(Arg.class));
-      if ((typeArgument == null)
-          || !typeUtils.isSubtype(typeElement(List.class).asType(), typeArgument)) {
-        error("Found @Positional %s %s.%s that is not a List",
-            positionalArg.asType(), positionalArg.getEnclosingElement(), positionalArg);
-      }
-    }
-  }
-
   @Nullable
   private Set<String> getParsedTypes(@Nullable Configuration configuration,
       Set<? extends Element> parsers) {

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons-args/src/main/java/org/apache/aurora/common/args/apt/Configuration.java
----------------------------------------------------------------------
diff --git a/commons-args/src/main/java/org/apache/aurora/common/args/apt/Configuration.java b/commons-args/src/main/java/org/apache/aurora/common/args/apt/Configuration.java
index b526dd0..1832d41 100644
--- a/commons-args/src/main/java/org/apache/aurora/common/args/apt/Configuration.java
+++ b/commons-args/src/main/java/org/apache/aurora/common/args/apt/Configuration.java
@@ -82,16 +82,17 @@ public final class Configuration {
   private static final String DEFAULT_RESOURCE_NAME = "cmdline.arg.info.txt";
 
   private int nextResourceIndex;
-  private final ImmutableSet<ArgInfo> positionalInfos;
   private final ImmutableSet<ArgInfo> cmdLineInfos;
   private final ImmutableSet<ParserInfo> parserInfos;
   private final ImmutableSet<VerifierInfo> verifierInfos;
 
-  private Configuration(int nextResourceIndex,
-      Iterable<ArgInfo> positionalInfos, Iterable<ArgInfo> cmdLineInfos,
-      Iterable<ParserInfo> parserInfos, Iterable<VerifierInfo> verifierInfos) {
+  private Configuration(
+      int nextResourceIndex,
+      Iterable<ArgInfo> cmdLineInfos,
+      Iterable<ParserInfo> parserInfos,
+      Iterable<VerifierInfo> verifierInfos) {
+
     this.nextResourceIndex = nextResourceIndex;
-    this.positionalInfos = ImmutableSet.copyOf(positionalInfos);
     this.cmdLineInfos = ImmutableSet.copyOf(cmdLineInfos);
     this.parserInfos = ImmutableSet.copyOf(parserInfos);
     this.verifierInfos = ImmutableSet.copyOf(verifierInfos);
@@ -248,22 +249,16 @@ public final class Configuration {
   }
 
   static class Builder {
-    private final Set<ArgInfo> positionalInfos = Sets.newHashSet();
     private final Set<ArgInfo> argInfos = Sets.newHashSet();
     private final Set<ParserInfo> parserInfos = Sets.newHashSet();
     private final Set<VerifierInfo> verifierInfos = Sets.newHashSet();
 
     public boolean isEmpty() {
-      return positionalInfos.isEmpty()
-          && argInfos.isEmpty()
+      return argInfos.isEmpty()
           && parserInfos.isEmpty()
           && verifierInfos.isEmpty();
     }
 
-    void addPositionalInfo(ArgInfo positionalInfo) {
-      positionalInfos.add(positionalInfo);
-    }
-
     void addCmdLineArg(ArgInfo argInfo) {
       argInfos.add(argInfo);
     }
@@ -285,8 +280,11 @@ public final class Configuration {
     }
 
     public Configuration build(Configuration configuration) {
-      return new Configuration(configuration.nextResourceIndex + 1,
-          positionalInfos, argInfos, parserInfos, verifierInfos);
+      return new Configuration(
+          configuration.nextResourceIndex + 1,
+          argInfos,
+          parserInfos,
+          verifierInfos);
     }
   }
 
@@ -352,7 +350,6 @@ public final class Configuration {
     private final int nextIndex;
     private int lineNumber = 0;
 
-    private final ImmutableList.Builder<ArgInfo> positionalInfo = ImmutableList.builder();
     private final ImmutableList.Builder<ArgInfo> fieldInfoBuilder = ImmutableList.builder();
     private final ImmutableList.Builder<ParserInfo> parserInfoBuilder = ImmutableList.builder();
     private final ImmutableList.Builder<VerifierInfo> verifierInfoBuilder = ImmutableList.builder();
@@ -372,13 +369,7 @@ public final class Configuration {
         }
 
         String type = parts.remove(0);
-        if ("positional".equals(type)) {
-          if (parts.size() != 2) {
-            throw new ConfigurationException(
-                "Invalid positional line: %s @%d", trimmed, lineNumber);
-          }
-          positionalInfo.add(new ArgInfo(parts.get(0), parts.get(1)));
-        } else if ("field".equals(type)) {
+        if ("field".equals(type)) {
           if (parts.size() != 2) {
             throw new ConfigurationException("Invalid field line: %s @%d", trimmed, lineNumber);
           }
@@ -403,8 +394,11 @@ public final class Configuration {
 
     @Override
     public Configuration getResult() {
-      return new Configuration(nextIndex, positionalInfo.build(),
-          fieldInfoBuilder.build(), parserInfoBuilder.build(), verifierInfoBuilder.build());
+      return new Configuration(
+          nextIndex,
+          fieldInfoBuilder.build(),
+          parserInfoBuilder.build(),
+          verifierInfoBuilder.build());
     }
   }
 
@@ -417,23 +411,12 @@ public final class Configuration {
   }
 
   public boolean isEmpty() {
-    return positionalInfos.isEmpty()
-        && cmdLineInfos.isEmpty()
+    return cmdLineInfos.isEmpty()
         && parserInfos.isEmpty()
         && verifierInfos.isEmpty();
   }
 
   /**
-   * Returns the field info for the sole {@literal @Positional} annotated field on the classpath,
-   * if any.
-   *
-   * @return The field info for the {@literal @Positional} annotated field if any.
-   */
-  public Iterable<ArgInfo> positionalInfo() {
-    return positionalInfos;
-  }
-
-  /**
    * Returns the field info for all the {@literal @CmdLine} annotated fields on the classpath.
    *
    * @return The field info for all the {@literal @CmdLine} annotated fields.
@@ -475,11 +458,6 @@ public final class Configuration {
     writer.printf("# %s\n ", message);
 
     writer.println();
-    for (ArgInfo info : positionalInfos) {
-      writer.printf("positional %s %s\n", info.className, info.fieldName);
-    }
-
-    writer.println();
     for (ArgInfo info : cmdLineInfos) {
       writer.printf("field %s %s\n", info.className, info.fieldName);
     }

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons/src/main/java/org/apache/aurora/common/args/ArgScanner.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/args/ArgScanner.java b/commons/src/main/java/org/apache/aurora/common/args/ArgScanner.java
index 306ca4d..6e7f23d 100644
--- a/commons/src/main/java/org/apache/aurora/common/args/ArgScanner.java
+++ b/commons/src/main/java/org/apache/aurora/common/args/ArgScanner.java
@@ -331,10 +331,6 @@ public final class ArgScanner {
       return false;
     }
 
-    Optional<? extends PositionalInfo<?>> positionalInfoOptional = argsInfo.getPositionalInfo();
-    checkArgument(positionalInfoOptional.isPresent() || positionalArgs.isEmpty(),
-        "Positional arguments have been supplied but there is no Arg annotated to received them.");
-
     Iterable<? extends OptionInfo<?>> optionInfos = argsInfo.getOptionInfos();
 
     final Set<String> argsFailedToParse = Sets.newHashSet();
@@ -375,20 +371,10 @@ public final class ArgScanner {
       }
     }
 
-    if (positionalInfoOptional.isPresent()) {
-      PositionalInfo<?> positionalInfo = positionalInfoOptional.get();
-      positionalInfo.load(parserOracle, positionalArgs);
-    }
-
     Set<String> commandLineArgumentInfos = Sets.newTreeSet();
 
     Iterable<? extends ArgumentInfo<?>> allArguments = argsInfo.getOptionInfos();
 
-    if (positionalInfoOptional.isPresent()) {
-      PositionalInfo<?> positionalInfo = positionalInfoOptional.get();
-      allArguments = Iterables.concat(optionInfos, ImmutableList.of(positionalInfo));
-    }
-
     for (ArgumentInfo<?> anArgumentInfo : allArguments) {
       Arg<?> arg = anArgumentInfo.getArg();
 
@@ -447,23 +433,6 @@ public final class ArgScanner {
     infoLog("-------------------------------------------------------------------------");
     infoLog(String.format("%s to print this help message",
         Joiner.on(" or ").join(Iterables.transform(ArgumentInfo.HELP_ARGS, ARG_NAME_TO_FLAG))));
-    Optional<? extends PositionalInfo<?>> positionalInfoOptional = argsInfo.getPositionalInfo();
-    if (positionalInfoOptional.isPresent()) {
-      infoLog("\nPositional args:");
-      PositionalInfo<?> positionalInfo = positionalInfoOptional.get();
-      Arg<?> arg = positionalInfo.getArg();
-      Object defaultValue = arg.uncheckedGet();
-      ImmutableList<String> constraints = positionalInfo.collectConstraints(verifiers);
-      infoLog(String.format("%s%s\n\t%s",
-                            defaultValue != null ? "default " + defaultValue : "",
-                            Iterables.isEmpty(constraints)
-                                ? ""
-                                : " [" + Joiner.on(", ").join(constraints) + "]",
-                            positionalInfo.getHelp()));
-      // TODO: https://github.com/twitter/commons/issues/353, in the future we may
-      // want to support @argfile format for positional arguments. We should check
-      // to update firstArgFileArgumentName for them as well.
-    }
     ImmutableList<String> required = requiredHelps.build();
     if (!required.isEmpty()) {
       infoLog("\nRequired flags:"); // yes - this should actually throw!

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons/src/main/java/org/apache/aurora/common/args/Args.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/args/Args.java b/commons/src/main/java/org/apache/aurora/common/args/Args.java
index 1983fd9..202835d 100644
--- a/commons/src/main/java/org/apache/aurora/common/args/Args.java
+++ b/commons/src/main/java/org/apache/aurora/common/args/Args.java
@@ -20,7 +20,6 @@ import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
-import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
@@ -71,30 +70,16 @@ public final class Args {
         return OptionInfo.createFromField(field);
       };
 
-  private static final Function<Field, PositionalInfo<?>> TO_POSITIONAL_INFO =
-      field -> {
-        @Nullable Positional positional = field.getAnnotation(Positional.class);
-        if (positional == null) {
-          throw new ConfigurationException("No @Positional Arg annotation for field " + field);
-        }
-        return PositionalInfo.createFromField(field);
-      };
-
   /**
    * An opaque container for all the positional and optional {@link Arg} metadata in-play for a
    * command line parse.
    */
   public static final class ArgsInfo {
     private final Configuration configuration;
-    private final Optional<? extends PositionalInfo<?>> positionalInfo;
     private final ImmutableList<? extends OptionInfo<?>> optionInfos;
 
-    ArgsInfo(Configuration configuration,
-             Optional<? extends PositionalInfo<?>> positionalInfo,
-             Iterable<? extends OptionInfo<?>> optionInfos) {
-
+    ArgsInfo(Configuration configuration, Iterable<? extends OptionInfo<?>> optionInfos) {
       this.configuration = Preconditions.checkNotNull(configuration);
-      this.positionalInfo = Preconditions.checkNotNull(positionalInfo);
       this.optionInfos = ImmutableList.copyOf(optionInfos);
     }
 
@@ -102,10 +87,6 @@ public final class Args {
       return configuration;
     }
 
-    Optional<? extends PositionalInfo<?>> getPositionalInfo() {
-      return positionalInfo;
-    }
-
     ImmutableList<? extends OptionInfo<?>> getOptionInfos() {
       return optionInfos;
     }
@@ -121,25 +102,10 @@ public final class Args {
    *     arg field.
    */
   static ArgsInfo fromConfiguration(Configuration configuration, Predicate<Field> filter) {
-    ImmutableSet<Field> positionalFields =
-        ImmutableSet.copyOf(filterFields(configuration.positionalInfo(), filter));
-
-    if (positionalFields.size() > 1) {
-      throw new IllegalArgumentException(
-          String.format("Found %d fields marked for @Positional Args after applying filter - "
-              + "only 1 is allowed:\n\t%s", positionalFields.size(),
-              Joiner.on("\n\t").join(positionalFields)));
-    }
-
-    Optional<? extends PositionalInfo<?>> positionalInfo =
-        Optional.fromNullable(
-            Iterables.getOnlyElement(
-                Iterables.transform(positionalFields, TO_POSITIONAL_INFO), null));
-
     Iterable<? extends OptionInfo<?>> optionInfos = Iterables.transform(
         filterFields(configuration.optionInfo(), filter), TO_OPTION_INFO);
 
-    return new ArgsInfo(configuration, positionalInfo, optionInfos);
+    return new ArgsInfo(configuration, optionInfos);
   }
 
   private static Iterable<Field> filterFields(Iterable<ArgInfo> infos, Predicate<Field> filter) {
@@ -184,33 +150,19 @@ public final class Args {
     Configuration configuration = Configuration.load();
     ArgsInfo staticInfo = Args.fromConfiguration(configuration, filter);
 
-    final ImmutableSet.Builder<PositionalInfo<?>> positionalInfos =
-        ImmutableSet.<PositionalInfo<?>>builder().addAll(staticInfo.getPositionalInfo().asSet());
     final ImmutableSet.Builder<OptionInfo<?>> optionInfos =
         ImmutableSet.<OptionInfo<?>>builder().addAll(staticInfo.getOptionInfos());
 
     for (Object source : sources) {
       Class<?> clazz = source instanceof Class ? (Class) source : source.getClass();
       for (Field field : clazz.getDeclaredFields()) {
-        if (filter.apply(field)) {
-          boolean cmdLine = field.isAnnotationPresent(CmdLine.class);
-          boolean positional = field.isAnnotationPresent(Positional.class);
-          if (cmdLine && positional) {
-            throw new IllegalArgumentException(
-                "An Arg cannot be annotated with both @CmdLine and @Positional, found bad Arg "
-                 + "field: " + field);
-          } else if (cmdLine) {
-            optionInfos.add(OptionInfo.createFromField(field, source));
-          } else if (positional) {
-            positionalInfos.add(PositionalInfo.createFromField(field, source));
-          }
+        if (filter.apply(field) && field.isAnnotationPresent(CmdLine.class)) {
+          optionInfos.add(OptionInfo.createFromField(field, source));
         }
       }
     }
 
-    @Nullable PositionalInfo<?> positionalInfo =
-        Iterables.getOnlyElement(positionalInfos.build(), null);
-    return new ArgsInfo(configuration, Optional.fromNullable(positionalInfo), optionInfos.build());
+    return new ArgsInfo(configuration, optionInfos.build());
   }
 
   private Args() {

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons/src/main/java/org/apache/aurora/common/args/PositionalInfo.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/args/PositionalInfo.java b/commons/src/main/java/org/apache/aurora/common/args/PositionalInfo.java
deleted file mode 100644
index 83d9cd5..0000000
--- a/commons/src/main/java/org/apache/aurora/common/args/PositionalInfo.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.common.args;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.reflect.TypeToken;
-
-import org.apache.aurora.common.args.apt.Configuration;
-
-/**
- * Description of a positional command line argument.
- */
-public final class PositionalInfo<T> extends ArgumentInfo<List<T>> {
-  /**
-   * Factory method to create a PositionalInfo from a field.
-   *
-   * @param field The field must contain a {@link Arg Arg&lt;List&lt;?&gt;&gt;}. The List&lt;?&gt;
-   *     represents zero or more positional arguments.
-   * @return a PositionalInfo describing the field.
-   */
-  static PositionalInfo<?> createFromField(Field field) {
-    return createFromField(field, null);
-  }
-
-  /**
-   * Factory method to create a PositionalInfo from a field.
-   *
-   * @param field The field must contain a {@link Arg Arg&lt;List&lt;?&gt;&gt;}. The List&lt;?&gt;
-   *     represents zero or more positional arguments.
-   * @param instance The object containing the non-static Arg instance or else null if the Arg
-   *     field is static.
-   * @return a PositionalInfo describing the field.
-   */
-  static PositionalInfo<?> createFromField(Field field, @Nullable Object instance) {
-    Preconditions.checkNotNull(field);
-    Positional positional = field.getAnnotation(Positional.class);
-    if (positional == null) {
-      throw new Configuration.ConfigurationException(
-          "No @Positional Arg annotation for field " + field);
-    }
-
-    Preconditions.checkArgument(
-        TypeUtil.getRawType(TypeUtil.getTypeParam(field)) == List.class,
-        "Field is annotated for positional parsing but is not of Arg<List<?>> type");
-    Type nestedType = TypeUtil.extractTypeToken(TypeUtil.getTypeParam(field));
-
-    @SuppressWarnings({"unchecked", "rawtypes"}) // we have no way to know the type here
-    PositionalInfo<?> positionalInfo = new PositionalInfo(
-        "[positional args]",
-        positional.help(),
-        ArgumentInfo.getArgForField(field, Optional.fromNullable(instance)),
-        TypeUtil.getTypeParamTypeToken(field),
-        TypeToken.of(nestedType),
-        Arrays.asList(field.getAnnotations()),
-        positional.parser());
-
-    return positionalInfo;
-  }
-
-  private final TypeToken<T> elementType;
-
-  private PositionalInfo(
-      String name,
-      String help,
-      Arg<List<T>> arg,
-      TypeToken<List<T>> type,
-      TypeToken<T> elementType,
-      List<Annotation> verifierAnnotations,
-      @Nullable Class<? extends Parser<? extends List<T>>> parser) {
-
-    // TODO: https://github.com/twitter/commons/issues/353, consider future support of
-    // argFile for Positional arguments.
-    super(name, help, arg, type, verifierAnnotations, parser);
-    this.elementType = elementType;
-  }
-
-  /**
-   * Parses the positional args and stores the results in the {@link Arg} described by this
-   * {@code PositionalInfo}.
-   */
-  void load(final ParserOracle parserOracle, List<String> positionalArgs) {
-    final Parser<? extends T> parser = parserOracle.get(elementType);
-    List<T> assignmentValue = Lists.newArrayList(Iterables.transform(positionalArgs,
-        argValue -> parser.parse(parserOracle, elementType.getType(), argValue)));
-    setValue(assignmentValue);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons/src/test/java/org/apache/aurora/common/args/ArgScannerTest.java
----------------------------------------------------------------------
diff --git a/commons/src/test/java/org/apache/aurora/common/args/ArgScannerTest.java b/commons/src/test/java/org/apache/aurora/common/args/ArgScannerTest.java
index 6ac518a..06ce914 100644
--- a/commons/src/test/java/org/apache/aurora/common/args/ArgScannerTest.java
+++ b/commons/src/test/java/org/apache/aurora/common/args/ArgScannerTest.java
@@ -13,7 +13,6 @@
  */
 package org.apache.aurora.common.args;
 
-import java.io.File;
 import java.io.PrintStream;
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
@@ -117,9 +116,6 @@ public class ArgScannerTest {
     @CmdLine(name = "range", help = "help")
     static final Arg<com.google.common.collect.Range<Integer>> RANGE =
         Arg.create(com.google.common.collect.Range.closed(1, 5));
-    @Positional(help = "help")
-    static final Arg<List<Amount<Long, Time>>> POSITIONAL =
-        Arg.<List<Amount<Long, Time>>>create(ImmutableList.<Amount<Long, Time>>of());
   }
 
   @Test
@@ -174,12 +170,6 @@ public class ArgScannerTest {
     test(StandardArgs.class,
         () -> assertThat(StandardArgs.RANGE.get(), is(com.google.common.collect.Range.closed(1, 5))),
         "range", "1-5");
-
-    resetArgs(StandardArgs.class);
-    assertTrue(parse(StandardArgs.class, "1mins", "2secs"));
-    assertEquals(ImmutableList.builder()
-        .add(Amount.of(60L, Time.SECONDS))
-        .add(Amount.of(2L, Time.SECONDS)).build(), StandardArgs.POSITIONAL.get());
   }
 
   public static class Name {
@@ -565,67 +555,6 @@ public class ArgScannerTest {
     parse(ImmutableList.of(AmountContainer.class), "-time_amount=1abcd");
   }
 
-  static class Main1 {
-    @Positional(help = "halp")
-    static final Arg<List<String>> NAMES = Arg.create(null);
-  }
-
-  static class Main2 {
-    @Positional(help = "halp")
-    static final Arg<List<List<String>>> ROSTERS = Arg.create(null);
-  }
-
-  static class Main3 {
-    @Positional(help = "halp")
-    static final Arg<List<Double>> PERCENTILES = Arg.create(null);
-
-    @Positional(help = "halp")
-    static final Arg<List<File>> FILES = Arg.create(null);
-  }
-
-  private void resetMainArgs() {
-    resetArgs(Main1.class);
-    resetArgs(Main2.class);
-    resetArgs(Main3.class);
-  }
-
-  @Test
-  public void testMultiplePositionalsFails() {
-    // Indivdually these should work.
-
-    resetMainArgs();
-    assertTrue(parse(Main1.class, "jack,jill", "laurel,hardy"));
-    assertEquals(ImmutableList.of("jack,jill", "laurel,hardy"),
-        ImmutableList.copyOf(Main1.NAMES.get()));
-
-    resetMainArgs();
-    assertTrue(parse(Main2.class, "jack,jill", "laurel,hardy"));
-    assertEquals(
-        ImmutableList.of(
-            ImmutableList.of("jack", "jill"),
-            ImmutableList.of("laurel", "hardy")),
-        ImmutableList.copyOf(Main2.ROSTERS.get()));
-
-    // But if combined in the same class or across classes the @Positional is ambiguous and we
-    // should fail fast.
-
-    resetMainArgs();
-    try {
-      parse(ImmutableList.of(Main1.class, Main2.class), "jack,jill", "laurel,hardy");
-      fail("Expected more than 1 in-scope @Positional Arg List to trigger a failure.");
-    } catch (IllegalArgumentException e) {
-      // expected
-    }
-
-    resetMainArgs();
-    try {
-      parse(Main3.class, "50", "90", "99", "99.9");
-      fail("Expected more than 1 in-scope @Positional Arg List to trigger a failure.");
-    } catch (IllegalArgumentException e) {
-      // expected
-    }
-  }
-
   // TODO(William Farner): Do we want to support nested parameterized args?  If so, need to define a
   // syntax for that and build it in.
   //    e.g. List<List<Integer>>, List<Pair<String, String>>

http://git-wip-us.apache.org/repos/asf/aurora/blob/0dd096dc/commons/src/test/java/org/apache/aurora/common/args/ArgsTest.java
----------------------------------------------------------------------
diff --git a/commons/src/test/java/org/apache/aurora/common/args/ArgsTest.java b/commons/src/test/java/org/apache/aurora/common/args/ArgsTest.java
index 4ffc794..7bccaba 100644
--- a/commons/src/test/java/org/apache/aurora/common/args/ArgsTest.java
+++ b/commons/src/test/java/org/apache/aurora/common/args/ArgsTest.java
@@ -15,7 +15,6 @@ package org.apache.aurora.common.args;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.List;
 
 import com.google.common.collect.ImmutableList;
 
@@ -33,9 +32,6 @@ public class ArgsTest {
     @NotEmpty
     @CmdLine(name = "name", help = "help")
     private final Arg<String> name = Arg.create();
-
-    @Positional(help = "help")
-    private final Arg<List<Integer>> values = Arg.create();
   }
 
   @Test
@@ -47,7 +43,6 @@ public class ArgsTest {
 
     assertEquals(new File("fred"), App.DB.get());
     assertEquals("bob", app.name.get());
-    assertEquals(ImmutableList.of(1, 137), app.values.get());
   }
 
   @Test