Added in globbing for loading javascript files
This commit is contained in:
parent
25be1aeb82
commit
fbae33595b
|
@ -100,8 +100,8 @@ You can still use Firebug to debug when generating a specRunner HTML file (see b
|
||||||
* debug: use the built-in Rhino debugger (gives you the chance to set a breakpoint before firing the test suite)
|
* debug: use the built-in Rhino debugger (gives you the chance to set a breakpoint before firing the test suite)
|
||||||
* jsRootDir: the javascript install root dir. Jasmine and other should be installed here (see source)
|
* jsRootDir: the javascript install root dir. Jasmine and other should be installed here (see source)
|
||||||
* sourcesRootDir: your production JS files root dir.
|
* sourcesRootDir: your production JS files root dir.
|
||||||
* specs: one or more spec file to run. Default behavior: use java Class name (replaces Test with Spec, see example)
|
* specs: one or more spec file to run. You may also use the [glob syntax described here](https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html#getPathMatcher%28java.lang.String%29).For example to load all javascript files in subdir use subdir/*.js. Default behavior: use java Class name (replaces Test with Spec, see example).
|
||||||
* sources: one or more JS production file which your spec needs (included before specs, d'uh)
|
* sources: one or more JS production file which your spec needs (included before specs, d'uh). You can use the same glob syntax as the specs option.
|
||||||
* generateSpecRunner: (the HTML output, useful for firefox/firebug debugging etc)
|
* generateSpecRunner: (the HTML output, useful for firefox/firebug debugging etc)
|
||||||
* specRunnerSubDir: a subsidiary path to the default runner root directory where generated spec runners will be placed
|
* specRunnerSubDir: a subsidiary path to the default runner root directory where generated spec runners will be placed
|
||||||
* envJs: load EnvJS support (defaults to true)
|
* envJs: load EnvJS support (defaults to true)
|
||||||
|
|
4
pom.xml
4
pom.xml
|
@ -62,8 +62,8 @@
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.0</version>
|
<version>3.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.6</source>
|
<source>1.7</source>
|
||||||
<target>1.6</target>
|
<target>1.7</target>
|
||||||
<showDeprecation>true</showDeprecation>
|
<showDeprecation>true</showDeprecation>
|
||||||
<showWarnings>true</showWarnings>
|
<showWarnings>true</showWarnings>
|
||||||
<encoding>UTF-8</encoding>
|
<encoding>UTF-8</encoding>
|
||||||
|
|
|
@ -1,6 +1,19 @@
|
||||||
package be.klak.rhino;
|
package be.klak.rhino;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
|
import java.nio.file.FileVisitResult;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.PathMatcher;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.SimpleFileVisitor;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.PriorityQueue;
|
||||||
|
|
||||||
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Context;
|
||||||
import org.mozilla.javascript.ContextFactory;
|
import org.mozilla.javascript.ContextFactory;
|
||||||
|
@ -77,13 +90,62 @@ public class RhinoContext {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void load(String path, String... jsFiles) {
|
public void load(String path, String... jsFiles) {
|
||||||
for (String jsFile : jsFiles) {
|
try {
|
||||||
load(path + jsFile);
|
List<Path> files = getFiles(path, jsFiles);
|
||||||
|
for (Path file: files) {
|
||||||
|
load(file.toString());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void load(String fileName) {
|
private List<Path> getFiles(String root, String... globs) throws IOException {
|
||||||
|
// Use a priority queue as the order of the files may make a difference
|
||||||
|
final PriorityQueue<MatchResult> matchResults = new PriorityQueue<>();
|
||||||
|
if (Paths.get(root).toFile().exists()) {
|
||||||
|
final List<PathMatcher> pathMatchers = getPathMatchers(root, globs);
|
||||||
|
Files.walkFileTree(Paths.get(root), new SimpleFileVisitor<Path>() {
|
||||||
|
@Override
|
||||||
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
|
MatchResult matchResult = match(file, pathMatchers);
|
||||||
|
if (matchResult != null) {
|
||||||
|
matchResults.add(matchResult);
|
||||||
|
};
|
||||||
|
return super.visitFile(file, attrs);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
List<Path> paths = new ArrayList<>();
|
||||||
|
for (MatchResult matchResult : matchResults) {
|
||||||
|
paths.add(matchResult.path);
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PathMatcher> getPathMatchers(String root, String[] globs) {
|
||||||
|
List<PathMatcher> matchers = new ArrayList<>();
|
||||||
|
for (String glob : globs) {
|
||||||
|
matchers.add(FileSystems.getDefault().getPathMatcher("glob:" + root + glob));
|
||||||
|
}
|
||||||
|
return matchers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private MatchResult match(Path file,
|
||||||
|
List<PathMatcher> pathMatchers) {
|
||||||
|
MatchResult matchResult = null;
|
||||||
|
for (int i = 0; i < pathMatchers.size() && matchResult == null; i++) {
|
||||||
|
if (pathMatchers.get(i).matches(file)) {
|
||||||
|
matchResult = new MatchResult(i, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void load(String fileName) {
|
||||||
evalJS("load('" + fileName + "')");
|
evalJS("load('" + fileName + "')");
|
||||||
// Main.processFile(this.jsContext, this.jsScope, fileName);
|
// Main.processFile(this.jsContext, this.jsScope, fileName);
|
||||||
}
|
}
|
||||||
|
@ -95,14 +157,14 @@ public class RhinoContext {
|
||||||
* @param resource the resource to resolve from the classpath
|
* @param resource the resource to resolve from the classpath
|
||||||
*/
|
*/
|
||||||
public void loadFromClasspath(final String resource) {
|
public void loadFromClasspath(final String resource) {
|
||||||
URL rsrcUrl =
|
URL rsrcUrl =
|
||||||
Thread.currentThread().getContextClassLoader().getResource(resource);
|
Thread.currentThread().getContextClassLoader().getResource(resource);
|
||||||
|
|
||||||
if (rsrcUrl == null) {
|
if (rsrcUrl == null) {
|
||||||
throw new IllegalArgumentException("resource " + resource + " not found on classpath");
|
throw new IllegalArgumentException("resource " + resource + " not found on classpath");
|
||||||
}
|
}
|
||||||
|
|
||||||
evalJS(String.format("load('%s')", rsrcUrl.toExternalForm()));
|
evalJS(String.format("load('%s')", rsrcUrl.toExternalForm()));
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
@ -150,4 +212,21 @@ public class RhinoContext {
|
||||||
public void exit() {
|
public void exit() {
|
||||||
Context.exit();
|
Context.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class MatchResult implements Comparable<MatchResult> {
|
||||||
|
|
||||||
|
private final int position;
|
||||||
|
private final Path path;
|
||||||
|
|
||||||
|
public MatchResult(int position, Path path) {
|
||||||
|
this.position = position;
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(MatchResult o) {
|
||||||
|
return position - o.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
package be.klak.rhino;
|
package be.klak.rhino;
|
||||||
|
|
||||||
import static org.fest.assertions.Assertions.assertThat;
|
import static org.fest.assertions.Assertions.assertThat;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.mozilla.javascript.EcmaError;
|
||||||
import org.mozilla.javascript.NativeObject;
|
import org.mozilla.javascript.NativeObject;
|
||||||
import org.mozilla.javascript.ScriptableObject;
|
import org.mozilla.javascript.ScriptableObject;
|
||||||
|
|
||||||
|
@ -81,6 +83,21 @@ public class RhinoContextTest {
|
||||||
assertThat(context.evalJS("loadedTwo")).isEqualTo(true);
|
assertThat(context.evalJS("loadedTwo")).isEqualTo(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void loadGlob() {
|
||||||
|
RhinoContext context = new RhinoContext();
|
||||||
|
context.load("src/test/javascript/", "globLoadTest/g*.js");
|
||||||
|
|
||||||
|
assertThat(context.evalJS("glob1")).isEqualTo(1.0);
|
||||||
|
assertThat(context.evalJS("glob2")).isEqualTo(2.0);
|
||||||
|
try {
|
||||||
|
context.evalJS("notGlobbed");
|
||||||
|
fail("notGlobbed should not have been loaded");
|
||||||
|
} catch (EcmaError e) {
|
||||||
|
// TODO need a better way to detect that it was not loaded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// {{{ loadsJSFilesFromClasspath
|
// {{{ loadsJSFilesFromClasspath
|
||||||
@Test
|
@Test
|
||||||
public void loadsJSFilesFromClasspath() {
|
public void loadsJSFilesFromClasspath() {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
var glob1 = 1;
|
|
@ -0,0 +1 @@
|
||||||
|
var glob2 = 2;
|
|
@ -0,0 +1 @@
|
||||||
|
var notGlobbed = "Shouldn't be loaded";
|
Reference in New Issue