Skip to content

Commit 200cd9f

Browse files
committed
implement #112 - Init __file__ in JSR223 bindings for Jython
1 parent 42997d8 commit 200cd9f

File tree

5 files changed

+57
-8
lines changed

5 files changed

+57
-8
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ software
2424
package.json
2525
releases.generated.yml
2626
set-env.ps1
27+
.jython_cache

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ dependencies {
4545
testImplementation group: 'org.apache.groovy', name: 'groovy-test', version: project.property('dep.groovy')
4646

4747
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: project.property('dep.jupiter')
48-
testRuntimeOnly group: "org.python", name: "jython", version: "2.7.3"
48+
testRuntimeOnly group: "org.python", name: "jython", version: "2.7.4"
4949

5050
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
5151
}
@@ -289,9 +289,9 @@ tasks.register('testWithGraalVMJDK', Test) {
289289
tasks.register('testJSR223EnginePresent', Test) {
290290
useJUnitPlatform()
291291
jvmArgs JVM_ARGS
292-
// groovy and python are on the classpath
292+
systemProperty "python.import.site", false
293293
scanForTestClasses = false
294-
include "org/openstreetmap/josm/plugins/scripting/jsr223/JSR223CompatibleEnginePresentTest.class"
294+
include "org/openstreetmap/josm/plugins/scripting/jsr223/*.class"
295295
testLogging {
296296
events TestLogEvent.FAILED, TestLogEvent.PASSED
297297
exceptionFormat = TestExceptionFormat.FULL

src/main/java/org/openstreetmap/josm/plugins/scripting/model/ScriptEngineDescriptor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,15 @@ public boolean isDescribingGraalJS() {
393393
return this.engineType.equals(ScriptEngineType.GRAALVM) && "js".equals(this.engineId);
394394
}
395395

396+
/**
397+
* Replies true if this descriptor describes the JSR223-compatible Jython-engine
398+
*
399+
* @return true if this descriptor describes the JSR223-compatible Jython-engine
400+
*/
401+
public boolean isJython() {
402+
return contentMimeTypes.contains("text/python");
403+
}
404+
396405
public enum ScriptEngineType {
397406
/**
398407
* a scripting engine supplied as JSR233 compliant scripting engine

src/main/java/org/openstreetmap/josm/plugins/scripting/ui/ScriptExecutor.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,31 +86,35 @@ private void warnOpenScriptFileFailed(File f, Exception e) {
8686
* @throws NullPointerException if <code>scriptFile</code> is null
8787
* @throws IllegalArgumentException if <code>scriptFile</code> isn't a readable file
8888
*/
89-
void runScriptWithPluggedEngine(
89+
public void runScriptWithPluggedEngine(
9090
@NotNull final ScriptEngineDescriptor desc,
9191
@NotNull final File scriptFile) throws IllegalArgumentException {
9292
Objects.requireNonNull(desc);
9393
Objects.requireNonNull(scriptFile);
9494
Assert.assertArg(scriptFile.isFile(), "Expected a script file, got ''{0}''", scriptFile);
9595
Assert.assertArg(scriptFile.canRead(), "Expected a readable script file, got ''{0}''", scriptFile);
9696

97-
logger.info(format(""));
98-
9997
final ScriptEngine engine = JSR223ScriptEngineProvider.getInstance().getScriptEngine(desc);
10098
if (engine == null) {
10199
warnScriptingEngineNotFound();
102100
return;
103101
}
104102
final Runnable task = () -> {
103+
final var bindings = engine.createBindings();
104+
// For a python script we initialize the bindings as follows:
105+
// __file__ = <full path to script file>
106+
if (desc.isJython()) {
107+
bindings.put("__file__", scriptFile.getPath());
108+
}
105109
try {
106110
if (engine instanceof Compilable) {
107111
JSR223CompiledScriptCache
108112
.getInstance()
109113
.compile((Compilable) engine, scriptFile)
110-
.eval();
114+
.eval(bindings);
111115
} else {
112116
try (var reader = new InputStreamReader(new FileInputStream(scriptFile), StandardCharsets.UTF_8)) {
113-
engine.eval(reader);
117+
engine.eval(reader, bindings);
114118
}
115119
}
116120
} catch (ScriptException e) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.openstreetmap.josm.plugins.scripting.jsr223
2+
3+
import org.junit.jupiter.api.Test
4+
import org.openstreetmap.josm.gui.MainApplication
5+
import org.openstreetmap.josm.plugins.scripting.JOSMFixtureBasedTest
6+
import org.openstreetmap.josm.plugins.scripting.model.ScriptEngineMetaDataProvider
7+
import org.openstreetmap.josm.plugins.scripting.ui.ScriptExecutor
8+
9+
import static org.junit.Assert.assertEquals
10+
11+
class JythonBindingsTest extends JOSMFixtureBasedTest {
12+
13+
public static String __file__holder = null
14+
15+
@Test
16+
void ensureDefaultBindingsAreSet() {
17+
final jythonDesc = ScriptEngineMetaDataProvider
18+
.getAvailablePluggedScriptEngines()
19+
.filter(desc -> desc.isJython())
20+
.findAny()
21+
.orElseThrow(() -> new IllegalStateException("No Jython scripting engine found"))
22+
23+
final executor = new ScriptExecutor(MainApplication.getMainFrame())
24+
25+
// generate temporary script file
26+
final scriptFile = File.createTempFile("test-script", "")
27+
scriptFile.write("""
28+
from org.openstreetmap.josm.plugins.scripting.jsr223 import JythonBindingsTest
29+
JythonBindingsTest.__file__holder = __file__
30+
""")
31+
executor.runScriptWithPluggedEngine(jythonDesc, scriptFile)
32+
assertEquals(scriptFile.getPath(), __file__holder)
33+
scriptFile.delete()
34+
}
35+
}

0 commit comments

Comments
 (0)