From a79ad4cb74e7851314325b180957d8694155140b Mon Sep 17 00:00:00 2001
From: mancini <mancini@astron.nl>
Date: Wed, 16 Oct 2019 14:53:53 +0200
Subject: [PATCH] Refactor and add File/Dir Selector

---
 steps/DP3.ParsetGenerator.cwl              | 160 +++++++++++----------
 steps/FileDirSelector.cwl                  |  24 ++++
 test_jobs/parset_generator_file_input.json |  22 +++
 3 files changed, 130 insertions(+), 76 deletions(-)
 create mode 100644 steps/FileDirSelector.cwl
 create mode 100644 test_jobs/parset_generator_file_input.json

diff --git a/steps/DP3.ParsetGenerator.cwl b/steps/DP3.ParsetGenerator.cwl
index 6f374ad8..3b759498 100644
--- a/steps/DP3.ParsetGenerator.cwl
+++ b/steps/DP3.ParsetGenerator.cwl
@@ -54,87 +54,95 @@ inputs:
     type: Any[]?
 
 outputs:
-    - id: output_parset
-      doc: Parset output file
-      type: File
-      outputBinding:
-        glob: output_parset
-    - id: input_files
-      doc: additional input files
-      type: File[]
-      outputBinding:
-        outputEval: |-
-          ${
-          var outfiles = []
-          for(let step in inputs.parameters_input){
-            step = inputs.parameters_input[step]
-            for(let parameter in step['parameters']){
-              parameter = step['parameters'][parameter]
-
-              if (parameter != null && parameter.class =='File'){
-                outfiles.push(parameter)
-              }
+  - id: output_parset
+    doc: Parset output file
+    type: File
+    outputBinding:
+      glob: output_parset
+  - id: input_files
+    doc: additional input files
+    type: File[]
+    outputBinding:
+      outputEval: |-
+        ${
+        var outfiles = []
+        for(let step in inputs.parameters_input){
+          step = inputs.parameters_input[step]
+          for(let parameter in step['parameters']){
+            parameter = step['parameters'][parameter]
+
+            if (parameter != null && parameter.class =='File'){
+              outfiles.push(parameter)
             }
           }
-          return outfiles
-          }
-    - id: input_directories
-      doc: additional input directory
-      type: Directory[]
-      outputBinding:
-        outputEval: |-
-          ${
-          var outdirs = []
-          for(let step in inputs.parameters_input){
-            step = inputs.parameters_input[step]
-            for(let parameter in step['parameters']){
-              parameter = step['parameters'][parameter]
-              if (parameter != null && parameter.class=='Directory'){
-                outdirs.push(parameter)
-              }
+        }
+        return outfiles
+        }
+  - id: input_directories
+    doc: additional input directory
+    type: Directory[]
+    outputBinding:
+      outputEval: |
+        ${
+        var outdirs = []
+        for(let step in inputs.parameters_input){
+          step = inputs.parameters_input[step]
+          for(let parameter in step['parameters']){
+            parameter = step['parameters'][parameter]
+            if (parameter != null && parameter.class=='Directory'){
+              outdirs.push(parameter)
             }
           }
-          return outdirs
-          }
-    - id: output_files
-      doc: expected output files
-      type: Any
-      outputBinding:
-        outputEval: |-
-          ${
-          var out_names = {}
-          for(let step in inputs.parameters_input){
-            step = inputs.parameters_input[step]
-
-            if(!Object.hasOwnProperty("output_files")) continue;
-
-            for(var index in step['output_files']){
-              var file_id = step['output_files'][index]
-              var file_name = step['output_files'][file_id]
-              out_names[file_id] = file_name
-            }
+        }
+        return outdirs
+        }
+
+  - id: output_files
+    doc: expected output files
+    type: Any
+    outputBinding:
+      outputEval: |
+        ${
+        var out_names = {}
+        for(var step_idx in inputs.parameters_input){
+          var step = inputs.parameters_input[step_idx]
+          var step_id = step['step_id']
+          var step_dirs = {}
+          if(!step.hasOwnProperty("output_files")) continue;
+
+          var step_files = {}
+
+          for(var index in step['output_files']){
+            var file_id = index
+            var file_name = step['output_files'][file_id]
+            step_files[file_id] = file_name
           }
-          return out_names
+
+          out_names[step_id] = step_files
+        }
+        return out_names
+        }
+  - id: output_directories
+    doc: expected output directories
+    type: Any
+    outputBinding:
+      outputEval: |-
+        ${
+        var out_names = {}
+        for(var step_idx in inputs.parameters_input){
+          var step = inputs.parameters_input[step_idx]
+          var step_id = step['step_id']
+          var step_dirs = {}
+          if(!step.hasOwnProperty("output_directories")) continue;
+
+          for(var index in step['output_directories']){
+            var file_id = index
+            var file_name = step['output_directories'][file_id]
+            step_dirs[file_id] = file_name
           }
-      - id: output_directories
-        doc: expected output directories
-        type: Any
-        outputBinding:
-          outputEval: |-
-            ${
-            var out_names = {}
-            for(let step in inputs.parameters_input){
-              step = inputs.parameters_input[step]
-
-              if(!Object.hasOwnProperty("output_directories")) continue;
-
-              for(var index in step['output_directories']){
-                var file_id = step['output_directories'][index]
-                var file_name = step['output_directories'][file_id]
-                out_names[file_id] = file_name
-              }
-            }
-            return out_names
-            }
+          out_names[step_id] = step_dirs
+        }
+        return out_names
+        }
 stdout:
   output_parset
diff --git a/steps/FileDirSelector.cwl b/steps/FileDirSelector.cwl
new file mode 100644
index 00000000..fc1aaf99
--- /dev/null
+++ b/steps/FileDirSelector.cwl
@@ -0,0 +1,24 @@
+class: ExpressionTool
+cwlVersion: v1.0
+id: parsetselector
+inputs:
+  - id: inputs
+    type: Any
+    doc: input files
+  - id: step_name
+    type: string
+    doc: 'if true selects parset_a, files_a if false selects parset_b files_b'
+  - id: type
+    type: string
+outputs:
+  - id: output
+    type: [File, Directory]
+
+expression: |
+  $(
+    {'output': inputs.inputs[step_name][type]}
+  )
+label: ParsetSelector
+
+requirements:
+  - class: InlineJavascriptRequirement
diff --git a/test_jobs/parset_generator_file_input.json b/test_jobs/parset_generator_file_input.json
new file mode 100644
index 00000000..c29a5a08
--- /dev/null
+++ b/test_jobs/parset_generator_file_input.json
@@ -0,0 +1,22 @@
+{
+  "parameters_input": [{
+            "step_type": "averager",
+            "step_id": "average",
+            "output_files": {
+                "parmdb": "fily"
+            },
+            "output_directories": {
+                "parmdb": "diry"
+            },
+            "parameters": {
+                "timestep": 1,
+                "freqstep": 1,
+                "strategy": {
+                    "class": "File",
+                    "location": "file:///etc/hostname",
+                    "size": 0,
+                    "nameext": ""
+                }
+            }
+}]
+}
-- 
GitLab