From 72479cdc25ff4d23a23b38e5bb25e01cd18bcd45 Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Fri, 10 Mar 2023 14:53:23 +0000 Subject: [PATCH] JAL-629 start of tests and more examples --- examples/argfiles/test_fab41-B.txt | 4 + examples/argfiles/test_fab41-autocounter.txt | 14 ++ examples/argfiles/test_fab41.txt | 14 ++ src/jalview/bin/ArgParser.java | 255 ++++++++++++++++++------ src/jalview/util/FileUtils.java | 10 +- test/jalview/bin/ArgParserTest.java | 37 +++- test/jalview/bin/argparser/argfile.autocounter | 7 + test/jalview/bin/argparser/argfile1.txt | 2 +- test/jalview/bin/argparser/argfile2.txt | 2 +- test/jalview/bin/argparser/test1.fa | 8 +- test/jalview/bin/argparser/test2.fa | 8 +- test/jalview/bin/argparser/testProps.jvprops | 1 + 12 files changed, 272 insertions(+), 90 deletions(-) create mode 100644 examples/argfiles/test_fab41-B.txt create mode 100644 examples/argfiles/test_fab41-autocounter.txt create mode 100644 examples/argfiles/test_fab41.txt create mode 100644 test/jalview/bin/argparser/argfile.autocounter diff --git a/examples/argfiles/test_fab41-B.txt b/examples/argfiles/test_fab41-B.txt new file mode 100644 index 0000000..4bf0b31 --- /dev/null +++ b/examples/argfiles/test_fab41-B.txt @@ -0,0 +1,4 @@ +--open[B]=./examples/uniref50.fa +--colour[B]=clustal +--image[B]=outputB.html +--close[B] diff --git a/examples/argfiles/test_fab41-autocounter.txt b/examples/argfiles/test_fab41-autocounter.txt new file mode 100644 index 0000000..9981286 --- /dev/null +++ b/examples/argfiles/test_fab41-autocounter.txt @@ -0,0 +1,14 @@ +--open[{++n}]=./examples/test_fab41.result/sample.a2m +--colour[{n}]=clustal +--structure[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb +--paematrix[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3_scores.json +--structure[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4.pdb +--paematrix[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4_scores.json +--structure[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2.pdb +--paematrix[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2_scores.json +--structure[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5.pdb +--paematrix[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5_scores.json +--structure[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1.pdb +--paematrix[{n}]=./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1_scores.json +--image[{n}]=output1.html +--close diff --git a/examples/argfiles/test_fab41.txt b/examples/argfiles/test_fab41.txt new file mode 100644 index 0000000..a1db923 --- /dev/null +++ b/examples/argfiles/test_fab41.txt @@ -0,0 +1,14 @@ +--open=./examples/test_fab41.result/sample.a2m +--colour=clustal +--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb +--paematrix=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3_scores.json +--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4.pdb +--paematrix=./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4_scores.json +--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2.pdb +--paematrix=./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2_scores.json +--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5.pdb +--paematrix=./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5_scores.json +--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1.pdb +--paematrix=./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1_scores.json +--image=output1.html +--close diff --git a/src/jalview/bin/ArgParser.java b/src/jalview/bin/ArgParser.java index 3b08013..77b3e87 100644 --- a/src/jalview/bin/ArgParser.java +++ b/src/jalview/bin/ArgParser.java @@ -27,9 +27,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.EnumSet; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -40,22 +38,28 @@ import jalview.util.FileUtils; public class ArgParser { + private static final String DOUBLEDASH = "--"; + private static final String NEGATESTRING = "no"; + // the linked id used for no id (not even square braces) private static final String DEFAULTLINKEDID = ""; + // the linked id used to increment the idCounter (and use the incremented + // value) + private static final String INCREMENTAUTOCOUNTERLINKEDID = "{++n}"; + + // the linked id used to use the idCounter + private static final String AUTOCOUNTERLINKEDID = "{n}"; + + private int idCounter = 0; + private static enum Opt { BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP, GLOB } - // These bootstrap args are simply parsed before a full parse of arguments and - // so are accessible at an earlier stage to (e.g.) set debug log leve, provide - // a props file (that might set log level), run headlessly, read an argfile - // instead of other args. - private static final List bootstrapArgs; - public enum Arg { /* @@ -98,7 +102,7 @@ public class ArgParser // expects a string value SORTBYTREE.setOptions(true, Opt.BOOLEAN); USAGESTATS.setOptions(true, Opt.BOOLEAN); - OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI); + OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB); OPEN2.setOptions(Opt.STRING, Opt.LINKED); PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP); QUESTIONNAIRE.setOptions(Opt.STRING); @@ -128,6 +132,11 @@ public class ArgParser DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP); QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP); ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB); + // BOOTSTRAP args are parsed before a full parse of arguments and + // so are accessible at an earlier stage to (e.g.) set debug log level, + // provide a props file (that might set log level), run headlessly, read + // an argfile instead of other args. + } private final String[] argNames; @@ -423,16 +432,6 @@ public class ArgParser return ret; } - /* - public Object getAppletValue(String key, String def, boolean asString) - { - Object value; - return (appletParams == null ? null - : (value = appletParams.get(key.toLowerCase())) == null ? def - : asString ? "" + value : value); - } - */ - // new style private static final Map argMap; @@ -445,11 +444,8 @@ public class ArgParser static { argMap = new HashMap<>(); - bootstrapArgs = new ArrayList<>(); for (Arg a : EnumSet.allOf(Arg.class)) { - if (a.hasOption(Opt.BOOTSTRAP)) - bootstrapArgs.add(a); for (String argName : a.getNames()) { if (argMap.containsKey(argName)) @@ -473,30 +469,39 @@ public class ArgParser public ArgParser(String[] args) { - this(Arrays.asList(args)); + // make a mutable new ArrayList so that shell globbing parser works + this(new ArrayList<>(Arrays.asList(args))); } public ArgParser(List args) { - Enumeration argE = Collections.enumeration(args); + init(args); + } + + private void init(List args) + { + // Enumeration argE = Collections.enumeration(args); int argIndex = 0; - while (argE.hasMoreElements()) + // while (argE.hasMoreElements()) + for (int i = 0; i < args.size(); i++) { - String arg = argE.nextElement(); + // String arg = argE.nextElement(); + String arg = args.get(i); String argName = null; String val = null; + List vals = null; // for Opt.GLOB only String linkedId = null; - if (arg.startsWith("--")) + if (arg.startsWith(DOUBLEDASH)) { int equalPos = arg.indexOf('='); if (equalPos > -1) { - argName = arg.substring(2, equalPos); + argName = arg.substring(DOUBLEDASH.length(), equalPos); val = arg.substring(equalPos + 1); } else { - argName = arg.substring(2); + argName = arg.substring(DOUBLEDASH.length()); } int idOpen = argName.indexOf('['); int idClose = argName.indexOf(']'); @@ -552,25 +557,62 @@ public class ArgParser if (a.hasOption(Opt.STRING) && equalPos == -1) { // take next arg as value if required, and '=' was not found - if (!argE.hasMoreElements()) + // if (!argE.hasMoreElements()) + if (i + 1 >= args.size()) { // no value to take for arg, which wants a value Console.error("Argument '" + a.getName() + "' requires a value, none given. Ignoring."); continue; } - val = argE.nextElement(); + // deal with bash globs here (--arg val* is expanded before reaching + // the JVM). Note that SubVals cannot be used in this case. + // If using the --arg=val then the glob is preserved and Java globs + // will be used later. SubVals can be used. + if (a.hasOption(Opt.GLOB)) + { + vals.addAll(getShellGlobbedFilenameValues(a, args, i + 1)); + } + else + { + val = args.get(i + 1); + } } - // use default linkedId for linked arguments - if (a.hasOption(Opt.LINKED) && linkedId == null) - linkedId = DEFAULTLINKEDID; + String autoCounterString = null; + if (a.hasOption(Opt.LINKED)) + { + if (linkedId == null) + { + // use default linkedId for linked arguments + linkedId = DEFAULTLINKEDID; + Console.debug( + "Changing linkedId to '" + linkedId + "' from " + arg); + } + else if (linkedId.equals(AUTOCOUNTERLINKEDID)) + { + // turn {n} to the autoCounter + autoCounterString = Integer.toString(idCounter); + linkedId = autoCounterString; + Console.debug( + "Changing linkedId to '" + linkedId + "' from " + arg); + } + else if (linkedId.equals(INCREMENTAUTOCOUNTERLINKEDID)) + { + // turn {++n} to the incremented autoCounter + autoCounterString = Integer.toString(++idCounter); + linkedId = autoCounterString; + Console.debug( + "Changing linkedId to '" + linkedId + "' from " + arg); + } + } if (!linkedArgs.containsKey(linkedId)) linkedArgs.put(linkedId, new ArgValuesMap()); ArgValuesMap avm = linkedArgs.get(linkedId); + // not dealing with both NODUPLICATEVALUES and GLOB if (a.hasOption(Opt.NODUPLICATEVALUES) && avm.hasValue(a, val)) { Console.error("Argument '--" + argName @@ -597,7 +639,15 @@ public class ArgParser // store appropriate value if (a.hasOption(Opt.STRING)) { - avs.addValue(val, argIndex); + if (a.hasOption(Opt.GLOB) && vals != null && vals.size() > 0) + { + for (String v : vals) + avs.addValue(val, argIndex++); + } + else + { + avs.addValue(val, argIndex); + } } else if (a.hasOption(Opt.BOOLEAN)) { @@ -632,6 +682,29 @@ public class ArgParser } } + /* + * A helper method to take a list of String args where we're expecting + * {"--previousargs", "--arg", "file1", "file2", "file3", "--otheroptionsornot"} + * and the index of the globbed arg, here 1. It returns a + * List {"file1", "file2", "file3"} + * *and remove these from the original list object* so that processing + * can continue from where it has left off, e.g. args has become + * {"--previousargs", "--arg", "--otheroptionsornot"} + * so the next increment carries on from the next --arg if available. + */ + private static List getShellGlobbedFilenameValues(Arg a, + List args, int i) + { + List vals = new ArrayList<>(); + while (i < args.size() && !args.get(i).startsWith(DOUBLEDASH)) + { + vals.add(args.remove(i)); + if (!a.hasOption(Opt.GLOB)) + break; + } + return vals; + } + public boolean isSet(Arg a) { return a.hasOption(Opt.LINKED) ? isSet("", a) : isSet(null, a); @@ -1054,9 +1127,9 @@ public class ArgParser { if (!argFile.exists()) { - System.err.println( - "--" + Arg.ARGFILE.name().toLowerCase(Locale.ROOT) + "=\"" - + argFile.getPath() + "\": File does not exist."); + System.err.println(DOUBLEDASH + + Arg.ARGFILE.name().toLowerCase(Locale.ROOT) + "=\"" + + argFile.getPath() + "\": File does not exist."); System.exit(2); } try @@ -1064,7 +1137,7 @@ public class ArgParser argsList.addAll(Files.readAllLines(Paths.get(argFile.getPath()))); } catch (IOException e) { - System.err.println("--" + System.err.println(DOUBLEDASH + Arg.ARGFILE.name().toLowerCase(Locale.ROOT) + "=\"" + argFile.getPath() + "\": File could not be read."); System.exit(3); @@ -1080,56 +1153,66 @@ public class ArgParser public static BootstrapArgs getBootstrapArgs(String[] args) { - return new BootstrapArgs(args); + List argList = new ArrayList<>(Arrays.asList(args)); + return new BootstrapArgs(argList); } - private BootstrapArgs(String[] args) + private BootstrapArgs(List args) { init(args); } - private void init(String[] args) + private void init(List args) { if (args == null) return; - Enumeration argE = Collections - .enumeration(Arrays.asList(args)); - while (argE.hasMoreElements()) + for (int i = 0; i < args.size(); i++) { - String arg = argE.nextElement(); + String arg = args.get(i); String argName = null; String val = null; - if (arg.startsWith("--")) + if (arg.startsWith(ArgParser.DOUBLEDASH)) { int equalPos = arg.indexOf('='); if (equalPos > -1) { - argName = arg.substring(2, equalPos); + argName = arg.substring(ArgParser.DOUBLEDASH.length(), + equalPos); val = arg.substring(equalPos + 1); } else { - argName = arg.substring(2); + argName = arg.substring(ArgParser.DOUBLEDASH.length()); val = "true"; } + Arg a = argMap.get(argName); - if (a != null && bootstrapArgs.contains(a)) + + if (a == null || !a.hasOption(Opt.BOOTSTRAP)) + { + // not a valid bootstrap arg + continue; + } + + if (a.hasOption(Opt.STRING)) { - if (!bootstrapArgMap.containsKey(a) - || bootstrapArgMap.get(a) == null) + if (equalPos == -1) { - List aL = new ArrayList<>(); - aL.add(val); - bootstrapArgMap.put(a, aL); + addAll(a, ArgParser.getShellGlobbedFilenameValues(a, args, + i + 1)); } - else if (a.hasOption(Opt.MULTI)) + else { - List aL = bootstrapArgMap.get(a); // already established - // this is not null - aL.add(val); - bootstrapArgMap.put(a, aL); + if (a.hasOption(Opt.GLOB)) + addAll(a, FileUtils.getFilenamesFromGlob(val)); + else + add(a, val); } } + else + { + add(a, val); + } } } } @@ -1144,14 +1227,56 @@ public class ArgParser return bootstrapArgMap.get(a); } - public String get(Arg a) + private List getOrCreateList(Arg a) { - if (bootstrapArgMap.containsKey(a)) + List l = getList(a); + if (l == null) { - List aL = bootstrapArgMap.get(a); - return (aL == null || aL.size() == 0) ? null : aL.get(0); + l = new ArrayList<>(); + putList(a, l); } - return null; + return l; + } + + private void putList(Arg a, List l) + { + bootstrapArgMap.put(a, l); + } + + /* + * Creates a new list if not used before, + * adds the value unless the existing list is non-empty + * and the arg is not MULTI (so first expressed value is + * retained). + */ + private void add(Arg a, String s) + { + List l = getOrCreateList(a); + if (a.hasOption(Opt.MULTI) || l.size() == 0) + { + l.add(s); + } + } + + private void addAll(Arg a, List al) + { + List l = getOrCreateList(a); + if (a.hasOption(Opt.MULTI)) + { + l.addAll(al); + } + } + + /* + * Retrieves the first value even if MULTI. + * A convenience for non-MULTI args. + */ + public String get(Arg a) + { + if (!bootstrapArgMap.containsKey(a)) + return null; + List aL = bootstrapArgMap.get(a); + return (aL == null || aL.size() == 0) ? null : aL.get(0); } } } \ No newline at end of file diff --git a/src/jalview/util/FileUtils.java b/src/jalview/util/FileUtils.java index 5bc6570..9aa27f9 100644 --- a/src/jalview/util/FileUtils.java +++ b/src/jalview/util/FileUtils.java @@ -14,6 +14,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import java.util.stream.Collectors; public class FileUtils { @@ -26,7 +27,6 @@ public class FileUtils public static List getFilesFromGlob(String pattern) { List files = new ArrayList<>(); - /* * For efficiency of the Files.walkFileTree, let's find the longest path that doesn't need globbing. * We look for the first glob character * { ? and then look for the last File.separator before that. @@ -102,4 +102,12 @@ public class FileUtils return files; } + + public static List getFilenamesFromGlob(String pattern) + { + // convert list of Files to list of File.getPath() Strings + return getFilesFromGlob(pattern).stream().map(f -> f.getPath()) + .collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/test/jalview/bin/ArgParserTest.java b/test/jalview/bin/ArgParserTest.java index 7b70a4b..9d4a8be 100644 --- a/test/jalview/bin/ArgParserTest.java +++ b/test/jalview/bin/ArgParserTest.java @@ -11,13 +11,13 @@ import org.testng.annotations.Test; import jalview.bin.ArgParser.Arg; import jalview.bin.ArgParser.BootstrapArgs; -import jalview.util.FileUtils; public class ArgParserTest { @Test(groups = "Functional", dataProvider = "argLines") - public void parseArgsAndSubValsTest(String commandLineArgs) + public void parseArgsAndSubValsTest(String commandLineArgs, Arg a, + String other) { String[] args = commandLineArgs.split("\\s*"); ArgParser argparser = new ArgParser(args); @@ -34,13 +34,15 @@ public class ArgParserTest { Properties bP = Cache.bootstrapProperties(b.get(Arg.PROPS)); Assert.assertTrue(other.equals(bP.get(Cache.BOOTSTRAP_TEST))); + Assert.assertFalse(bP.contains("NOT" + Cache.BOOTSTRAP_TEST)); } else if (a == Arg.ARGFILE) { - List files = FileUtils.getFilesFromGlob(b.get(a)); + List filenames = b.getList(a); boolean found = false; - for (File f : files) + for (String s : filenames) { + File f = new File(s); File fo = new File(other); try { @@ -53,24 +55,35 @@ public class ArgParserTest { } } - Assert.assertTrue(found); + Assert.assertTrue(found, + "File '" + other + "' not found in shell expanded glob '" + + commandLineArgs + "'"); } } @Test(groups = "Functional", dataProvider = "argFiles") - public void argFilesTest(String commandLineArgs, Arg a) + public void argFilesTest(String commandLineArgs, Arg a, String other) { String[] args = commandLineArgs.split("\\s+"); BootstrapArgs b = BootstrapArgs.getBootstrapArgs(args); Assert.assertTrue(b.contains(a)); + Assert.assertFalse(b.contains(Arg.OPEN)); if (a == Arg.PROPS) { Properties bP = Cache.bootstrapProperties(b.get(Arg.PROPS)); Assert.assertTrue("true".equals(bP.get(Cache.BOOTSTRAP_TEST))); } + } + @DataProvider(name = "argLinesTest") + public Object[][] argLinesTest() + { + return new Object[][] { + // can't use this one yet as it doesn't get shell expanded + { "--argfile test/jalview/bin/argparser/argfile*.txt", Arg.ARGFILE, + "test/jalview/bin/argparser/argfile0.txt" }, }; } @DataProvider(name = "argLines") @@ -84,14 +97,18 @@ public class ArgParserTest { "--open=test/jalview/bin/argparser/test1.fa --props=test/jalview/bin/argparser/testProps.jvprops", Arg.PROPS, "true" }, { "--argfile=test/jalview/bin/argparser/argfile*.txt", Arg.ARGFILE, - "test/jalview/bin/argparser/argfile1.txt" } }; + "test/jalview/bin/argparser/argfile0.txt" }, + { "--argfile=test/jalview/bin/argparser/argfile*.txt", Arg.ARGFILE, + "test/jalview/bin/argparser/argfile1.txt" }, + { "--argfile=test/jalview/bin/argparser/argfile*.txt", Arg.ARGFILE, + "test/jalview/bin/argparser/argfile2.txt" } }; } @DataProvider(name = "argFiles") public Object[][] argFiles() { - return new Object[][] { - { "--argfile=test/jalview/bin/argparser/argfile0.txt", Arg.OPEN, - "test/jalview/bin/argfiles/test1.fa" } }; + return new Object[][] { { + "--argfile=test/jalview/bin/argparser/argfile0.txt --open=shouldntbeabootstrap", + Arg.ARGFILE, "test/jalview/bin/argfiles/test1.fa" } }; } } diff --git a/test/jalview/bin/argparser/argfile.autocounter b/test/jalview/bin/argparser/argfile.autocounter new file mode 100644 index 0000000..bbf3776 --- /dev/null +++ b/test/jalview/bin/argparser/argfile.autocounter @@ -0,0 +1,7 @@ +--open[{++n}]=test/jalview/bin/argparser/test1.fa +--colour[{n}]=gecos:flower +--open[{++n}]=test/jalview/bin/argparser/test2.fa +--colour[{n}]=zappo +--open[{++n}]=test/jalview/bin/argparser/test1.fa +--open[{n}]=test/jalview/bin/argparser/test2.fa +--colour[{n}]=taylor diff --git a/test/jalview/bin/argparser/argfile1.txt b/test/jalview/bin/argparser/argfile1.txt index f1b406f..4164fb5 100644 --- a/test/jalview/bin/argparser/argfile1.txt +++ b/test/jalview/bin/argparser/argfile1.txt @@ -1,4 +1,4 @@ --open[all]=test/jalview/bin/argparser/test1.fa --open[all]=test/jalview/bin/argparser/test2.fa --open[1]=test/jalview/bin/argparser/test1.fa ---open[2]=test/jalview/bin/argparser/test1.fa +--open[2]=test/jalview/bin/argparser/test2.fa diff --git a/test/jalview/bin/argparser/argfile2.txt b/test/jalview/bin/argparser/argfile2.txt index 63e8433..e08a1dc 100644 --- a/test/jalview/bin/argparser/argfile2.txt +++ b/test/jalview/bin/argparser/argfile2.txt @@ -1 +1 @@ ---open=test/jalview/bin/argparser/test1.fa +--open=test/jalview/bin/argparser/test2.fa diff --git a/test/jalview/bin/argparser/test1.fa b/test/jalview/bin/argparser/test1.fa index 5174ae1..c9e687f 100644 --- a/test/jalview/bin/argparser/test1.fa +++ b/test/jalview/bin/argparser/test1.fa @@ -1,6 +1,2 @@ ->TEST1A -AAAARG ->TEST1B -HELLO ->TEST1C -OUTTHERE +>TEST1 +AAAA diff --git a/test/jalview/bin/argparser/test2.fa b/test/jalview/bin/argparser/test2.fa index 90d48e1..a51dd78 100644 --- a/test/jalview/bin/argparser/test2.fa +++ b/test/jalview/bin/argparser/test2.fa @@ -1,6 +1,2 @@ ->TEST2A -AAAARG ->TEST2B -HELLO ->TEST2C -OUTTHERE +>TEST2 +BBBB diff --git a/test/jalview/bin/argparser/testProps.jvprops b/test/jalview/bin/argparser/testProps.jvprops index 7e142b2..8008953 100644 --- a/test/jalview/bin/argparser/testProps.jvprops +++ b/test/jalview/bin/argparser/testProps.jvprops @@ -84,3 +84,4 @@ WRAP_ALIGNMENT=false #DAS_REGISTRY_URL=http\://www.dasregistry.org/das/ # retired 01/05/2015 DAS_REGISTRY_URL=http\://www.ebi.ac.uk/das-srv/registry/das/ BOOTSTRAP_TEST=true +NOTBOOTSTRAP_TEST=true -- 1.7.10.2