diff --git a/src/main/groovy/nebula/plugin/clojuresque/tasks/ClojureRun.groovy b/src/main/groovy/nebula/plugin/clojuresque/tasks/ClojureRun.groovy index b7ccd17..e05b418 100644 --- a/src/main/groovy/nebula/plugin/clojuresque/tasks/ClojureRun.groovy +++ b/src/main/groovy/nebula/plugin/clojuresque/tasks/ClojureRun.groovy @@ -19,13 +19,17 @@ abstract class ClojureRun extends ClojureSourceTask { @Classpath abstract ConfigurableFileCollection getClasspath() + private final Property fn + @Input @Optional - abstract Property getFn() + Property getFn() { + return fn + } @Option(option = "fn", description = "The clojure function (and optional args) to execute.") public void setFn(String fn) { - this.getFn().set(fn) + this.fn.set(fn) } private final ExecOperations execOperations @@ -39,6 +43,7 @@ abstract class ClojureRun extends ClojureSourceTask { ClojureRun(ExecOperations execOperations, ObjectFactory objects) { this.execOperations = execOperations this.objects = objects + this.fn = objects.property(String) } void jvmOptions(Closure closure) { @@ -50,7 +55,7 @@ abstract class ClojureRun extends ClojureSourceTask { void run() { def options = [ - fn: fn.getOrNull() + fn: getFn().getOrNull() ] def runtime = [ diff --git a/src/test/groovy/nebula/plugin/clojure/ClojureRunSpec.groovy b/src/test/groovy/nebula/plugin/clojure/ClojureRunSpec.groovy new file mode 100644 index 0000000..f546f68 --- /dev/null +++ b/src/test/groovy/nebula/plugin/clojure/ClojureRunSpec.groovy @@ -0,0 +1,136 @@ +package nebula.plugin.clojure + +class ClojureRunSpec extends BaseIntegrationTestKitSpec { + + private final APP_CLJ = '''\ + (ns test.nebula.app) + + (defn hello + [name] + (println "Hello," name)) + + (defn greet-world + [] + (println "Hello, World!")) + '''.stripIndent() + + def 'clojureRun task can be created and registered'() { + given: + buildFile << '''\ + plugins { + id 'com.netflix.nebula.clojure' + } + + repositories { mavenCentral() } + + dependencies { + implementation 'org.clojure:clojure:1.10.3' + } + '''.stripIndent() + + settingsFile << 'rootProject.name="clojure-run-test"' + + def clojurefiles = new File(projectDir, 'src/main/clojure/test/nebula') + clojurefiles.mkdirs() + new File(clojurefiles, 'app.clj').text = APP_CLJ + + when: + def result = runTasks('tasks', '--all') + + then: + noExceptionThrown() + result.output.contains('clojureRun') + } + + def 'clojureRun task accepts --fn command line option'() { + given: + buildFile << '''\ + plugins { + id 'com.netflix.nebula.clojure' + } + + repositories { mavenCentral() } + + dependencies { + implementation 'org.clojure:clojure:1.10.3' + } + '''.stripIndent() + + settingsFile << 'rootProject.name="clojure-run-with-fn"' + + def clojurefiles = new File(projectDir, 'src/main/clojure/test/nebula') + clojurefiles.mkdirs() + new File(clojurefiles, 'app.clj').text = APP_CLJ + + when: + def result = runTasks('clojureRun', '--fn=test.nebula.app/greet-world') + + then: + noExceptionThrown() + result.output.contains('Hello, World!') + } + + def 'clojureRun task can be configured with fn property'() { + given: + buildFile << '''\ + plugins { + id 'com.netflix.nebula.clojure' + } + + repositories { mavenCentral() } + + dependencies { + implementation 'org.clojure:clojure:1.10.3' + } + + tasks.named('clojureRun') { + fn = 'test.nebula.app/greet-world' + } + '''.stripIndent() + + settingsFile << 'rootProject.name="clojure-run-configured"' + + def clojurefiles = new File(projectDir, 'src/main/clojure/test/nebula') + clojurefiles.mkdirs() + new File(clojurefiles, 'app.clj').text = APP_CLJ + + when: + def result = runTasks('clojureRun') + + then: + noExceptionThrown() + result.output.contains('Hello, World!') + } + + def 'clojureRun task works with fn property using Provider API'() { + given: + buildFile << '''\ + plugins { + id 'com.netflix.nebula.clojure' + } + + repositories { mavenCentral() } + + dependencies { + implementation 'org.clojure:clojure:1.10.3' + } + + tasks.named('clojureRun') { + fn.set('test.nebula.app/greet-world') + } + '''.stripIndent() + + settingsFile << 'rootProject.name="clojure-run-provider-api"' + + def clojurefiles = new File(projectDir, 'src/main/clojure/test/nebula') + clojurefiles.mkdirs() + new File(clojurefiles, 'app.clj').text = APP_CLJ + + when: + def result = runTasks('clojureRun') + + then: + noExceptionThrown() + result.output.contains('Hello, World!') + } +}