diff --git a/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy b/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy index 54de5b1dca..cc0a0b4435 100644 --- a/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy +++ b/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy @@ -306,6 +306,14 @@ class WorkflowMetadata { onCompleteActions.add(action) } + void setOnCompleteFormConfig( Closure action ) { + final clone = (Closure)action.clone() + clone.delegate = NF.binding.variables + clone.resolveStrategy = Closure.DELEGATE_FIRST + + onCompleteActions.add(clone) + } + /** * Implements the following idiom in the pipeline script: *
@@ -333,6 +341,14 @@ class WorkflowMetadata { onErrorActions.add(action) } + void setOnErrorFromConfig(Closure action ) { + final clone = (Closure)action.clone() + clone.delegate = NF.binding.variables + clone.resolveStrategy = Closure.DELEGATE_FIRST + + onErrorActions.add(clone) + } + /** * Dynamic getter for workflow metadata attributes * @@ -366,11 +382,11 @@ class WorkflowMetadata { if( !workflowConfig ) return // -- register `onComplete` if( workflowConfig.onComplete instanceof Closure ) { - onComplete( (Closure)workflowConfig.onComplete ) + setOnCompleteFormConfig( (Closure)workflowConfig.onComplete ) } // -- register `onError` if( workflowConfig.onError instanceof Closure ) { - onError( (Closure)workflowConfig.onError ) + setOnErrorFromConfig( (Closure)workflowConfig.onError ) } } diff --git a/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy b/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy index 723a8249d4..19c69017dd 100644 --- a/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy +++ b/modules/nextflow/src/test/groovy/nextflow/script/WorkflowMetadataTest.groovy @@ -166,7 +166,7 @@ class WorkflowMetadataTest extends Specification { } when: - metadata.onComplete(handler) + metadata.setOnCompleteFormConfig(handler) metadata.invokeOnComplete() then: @@ -190,7 +190,7 @@ class WorkflowMetadataTest extends Specification { def metadata = new WorkflowMetadata(session, null) when: - metadata.onComplete { + metadata.setOnCompleteFormConfig { throw new WorkflowScriptErrorException('You failed!') } metadata.invokeOnComplete() @@ -236,7 +236,7 @@ class WorkflowMetadataTest extends Specification { } when: - metadata.onError(handler) + metadata.setOnErrorFromConfig(handler) metadata.invokeOnError(Mock(TraceRecord)) then: diff --git a/tests/checks/script-vars-oncomplete.nf/.checks b/tests/checks/script-vars-oncomplete.nf/.checks new file mode 100644 index 0000000000..2496d34559 --- /dev/null +++ b/tests/checks/script-vars-oncomplete.nf/.checks @@ -0,0 +1,21 @@ +set -e + +# +# run normal mode +# +echo '' +$NXF_RUN | tee stdout + +[[ `grep -c 'Workflow Executed!' stdout` == 1 ]] || false +[[ `grep -c 'local variable: local' stdout` == 1 ]] || false +[[ `grep -c 'param output dir: results' stdout` == 1 ]] || false +[[ `grep -c 'Method executed!' stdout` == 1 ]] || false +[[ `grep -c 'script-vars-oncomplete.nf' stdout` == 1 ]] || false +[[ `grep -c "Can't access to a global variable" stdout` == 1 ]] || false +[[ `grep -c "Can't access to a private workflow property" stdout` == 1 ]] || false +[[ `grep -c 'Success!' stdout` == 1 ]] || false + + + + + diff --git a/tests/checks/script-vars-onerror.nf/.checks b/tests/checks/script-vars-onerror.nf/.checks new file mode 100644 index 0000000000..982fbdd337 --- /dev/null +++ b/tests/checks/script-vars-onerror.nf/.checks @@ -0,0 +1,21 @@ +set -e + +# +# run normal mode +# +echo '' +$NXF_RUN | tee stdout + +[[ `grep -c 'Workflow Failed!' stdout` == 1 ]] || false +[[ `grep -c 'local variable: local' stdout` == 1 ]] || false +[[ `grep -c 'param output dir: results' stdout` == 1 ]] || false +[[ `grep -c 'Method executed!' stdout` == 1 ]] || false +[[ `grep 'Executed script' stdout | grep -c 'script-vars-onerror.nf'` == 1 ]] || false +[[ `grep -c "Can't access to a global variable" stdout` == 1 ]] || false +[[ `grep -c "Can't access to a private workflow property" stdout` == 1 ]] || false +[[ `grep -c 'Failure!' stdout` == 1 ]] || false + + + + + diff --git a/tests/script-vars-oncomplete.nf b/tests/script-vars-oncomplete.nf new file mode 100644 index 0000000000..2012ca0c87 --- /dev/null +++ b/tests/script-vars-oncomplete.nf @@ -0,0 +1,35 @@ +def global_var = 'global' + +def method() { + println("Method executed!") +} + +workflow { + params.outdir = 'results' + + def local = 'local' + + workflow.onComplete { + println("local variable: ${local}") + println("param output dir: ${params.outdir}") + method() + println("Executed script : ${workflow.scriptFile}") + // expected failure + try { + println("global variable: ${global}") + }catch (groovy.lang.MissingPropertyException e){ + println("Can't access to a global variable") + } + try { + println("workflow private variable: ${events}") + }catch (Exception e){ + println("Can't access to a private workflow property") + } + if( workflow.success ) + println("Success!") + else + println("Failure!") + } + + println("Workflow Executed!") +} diff --git a/tests/script-vars-onerror.nf b/tests/script-vars-onerror.nf new file mode 100644 index 0000000000..6c53af65a0 --- /dev/null +++ b/tests/script-vars-onerror.nf @@ -0,0 +1,35 @@ +def global_var = 'global' + +def method() { + println("Method executed!") +} + +workflow { + params.outdir = 'results' + + def local = 'local' + + workflow.onError { + println("local variable: ${local}") + println("param output dir: ${params.outdir}") + method() + println("Executed script : ${workflow.scriptFile}") + // expected failures + try { + println("global variable: ${global}") + }catch (groovy.lang.MissingPropertyException e){ + println("Can't access to a global variable") + } + try { + println("workflow private variable: ${events}") + }catch (Exception e){ + println("Can't access to a private workflow property") + } + if( workflow.success ) + println("Success!") + else + println("Failure!") + } + + throw new Exception("Workflow Failed!") +}