add basic recursion to atfiles

This commit is contained in:
Jonathan Shook 2024-07-10 13:03:18 -05:00
parent 5190bad443
commit 29e1dbe122
3 changed files with 33 additions and 3 deletions

View File

@ -21,6 +21,7 @@ import io.nosqlbench.nb.api.nbio.NBIO;
import io.nosqlbench.nb.api.nbio.NBPathsAPI; import io.nosqlbench.nb.api.nbio.NBPathsAPI;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.snakeyaml.engine.v2.api.Load; import org.snakeyaml.engine.v2.api.Load;
import org.snakeyaml.engine.v2.api.LoadSettings; import org.snakeyaml.engine.v2.api.LoadSettings;
@ -49,6 +50,12 @@ public class NBAtFile {
* <LI>{@code >-- } asserts each value starts with global option syntax (--)</LI> * <LI>{@code >-- } asserts each value starts with global option syntax (--)</LI>
* </UL> * </UL>
* *
* <P>Files can be included recursively using a format like <PRE>{@code
* - include:${DIR}/somefile.yaml
* }</PRE></P>
*
* Standard formatting specifiers above should work in this mode as well.
*
* @param processInPlace The linked list which is statefully modified. If you need * @param processInPlace The linked list which is statefully modified. If you need
* an unmodified copy, then this is the responsibility of the caller. * an unmodified copy, then this is the responsibility of the caller.
* @return An updated list with all values expanded and injected * @return An updated list with all values expanded and injected
@ -59,10 +66,10 @@ public class NBAtFile {
ListIterator<String> iter = processInPlace.listIterator(); ListIterator<String> iter = processInPlace.listIterator();
while (iter.hasNext()) { while (iter.hasNext()) {
String spec = iter.next(); String spec = iter.next();
if (spec.startsWith("@")) { if (spec.startsWith("@") || spec.startsWith("include=")|| spec.startsWith("include:")) {
iter.previous(); iter.previous();
iter.remove(); iter.remove();
LinkedList<String> spliceIn = includeAt(spec); LinkedList<String> spliceIn = includeAt(spec.replaceFirst("include=","@").replaceFirst("include:","@"));
for (String s : spliceIn) { for (String s : spliceIn) {
iter.add(s); iter.add(s);
} }
@ -89,6 +96,22 @@ public class NBAtFile {
* @return The linked list of arguments which is to be spliced into the caller's command list * @return The linked list of arguments which is to be spliced into the caller's command list
*/ */
public static LinkedList<String> includeAt(String spec) { public static LinkedList<String> includeAt(String spec) {
LinkedList<String> toInclude = doInclude(spec);
boolean recurse = false;
for (String s : toInclude) {
if (s.startsWith("include=")||s.startsWith("include:")) {
recurse=true;
break;
}
}
if (recurse) {
toInclude=includeAt(toInclude);
}
return toInclude;
}
private static @NotNull LinkedList<String> doInclude(String spec) {
Matcher matcher = includePattern.matcher(spec); Matcher matcher = includePattern.matcher(spec);
if (matcher.matches()) { if (matcher.matches()) {
String filepathSpec = matcher.group("filepath"); String filepathSpec = matcher.group("filepath");
@ -135,7 +158,6 @@ public class NBAtFile {
} else { } else {
throw new RuntimeException("Unable to match at-file specifier: " + spec + " to pattern '" + includePattern.pattern() + "'"); throw new RuntimeException("Unable to match at-file specifier: " + spec + " to pattern '" + includePattern.pattern() + "'");
} }
} }
private static LinkedList<String> interposePath(LinkedList<String> formatted, Path atPath) { private static LinkedList<String> interposePath(LinkedList<String> formatted, Path atPath) {

View File

@ -79,4 +79,9 @@ class NBAtFileTest {
assertThat(strings).containsExactly("--option1", "--option2=value2", "--option3=value3", "--option4=value4"); assertThat(strings).containsExactly("--option1", "--option2=value2", "--option3=value3", "--option4=value4");
} }
@Test
public void testAtfileRecursion() {
LinkedList<String> strings = NBAtFile.includeAt("@src/test/resources/atfiles/simple_recursion.yaml");
assertThat(strings).containsExactly("arg1","arg1","arg2","arg3","arg3");
}
} }

View File

@ -0,0 +1,3 @@
- arg1
- include:${DIR}/simple_list.yaml
- arg3