diff options
| -rw-r--r-- | Makefile | 3 | ||||
| -rwxr-xr-x | bin/ravanan | 7 | ||||
| -rw-r--r-- | ravanan/reader.scm | 28 | ||||
| -rw-r--r-- | test-data/inputs-with-type-ambiguities.yaml | 5 | ||||
| -rw-r--r-- | test-data/workflow-for-inputs-with-type-ambiguities.cwl | 11 | ||||
| -rw-r--r-- | tests/reader.scm | 16 |
6 files changed, 61 insertions, 9 deletions
diff --git a/Makefile b/Makefile index f4669d1..b37072e 100644 --- a/Makefile +++ b/Makefile @@ -44,8 +44,9 @@ sources = $(filter-out $(config_file), \ objects = $(sources:.scm=.go) $(config_file:.scm=.go) scripts = $(wildcard bin/*) tests = $(wildcard tests/*.scm) $(wildcard tests/work/*.scm) +test_data = $(wildcard test-data/*) distribute_files = $(sources) $(config_file_template) $(scripts) \ - $(tests) pre-inst-env guix.scm \ + $(tests) $(test_data) pre-inst-env guix.scm \ .guix/ravanan-package.scm Makefile \ COPYING README.md diff --git a/bin/ravanan b/bin/ravanan index c8d37e9..2cb05e2 100755 --- a/bin/ravanan +++ b/bin/ravanan @@ -24,6 +24,7 @@ exec guile --no-auto-compile -e main -s "$0" "$@" (rnrs io ports) (srfi srfi-26) (srfi srfi-37) + (srfi srfi-71) (ice-9 filesystem) (ice-9 match) (web uri) @@ -259,6 +260,8 @@ files that have the token in the @verbatim{SLURM_JWT=token} format." (store (if (file-name-absolute? (assq-ref args 'store)) (assq-ref args 'store) (canonicalize-path (assq-ref args 'store)))) + (workflow inputs (read-workflow+inputs workflow-file + inputs-file)) (outputs (guard (c ((manifest-file-error? c) ;; Steps may provide their own ;; SoftwareRequirement. So, at this @@ -288,8 +291,8 @@ files that have the token in the @verbatim{SLURM_JWT=token} format." (assq-ref args 'guix-channels-file)) #:modules '((guile) (guix channels)))) - (read-workflow workflow-file) - (read-inputs inputs-file) + workflow + inputs (case (assq-ref args 'batch-system) ((single-machine) (or (assq-ref args 'scratch) diff --git a/ravanan/reader.scm b/ravanan/reader.scm index b8687b0..c30aa9f 100644 --- a/ravanan/reader.scm +++ b/ravanan/reader.scm @@ -31,8 +31,7 @@ #:use-module (ravanan work ui) #:use-module (ravanan work utils) #:use-module (ravanan work vectors) - #:export (read-workflow - read-inputs + #:export (read-workflow+inputs coerce-type)) (define-condition-type &type-coercion-violation &violation @@ -300,8 +299,10 @@ array of array of @code{File}s, etc. Else, return @code{#f}" (canonicalize-file-value input)) (else input))) -(define (read-inputs inputs-file) - "Read @var{inputs-file} resolving file paths if any." +(define (read-inputs inputs-file types) + "Read @var{inputs-file} resolving file paths if any. If @var{inputs-file} is an +YAML file, coerce inputs to @var{types}. @var{types} is an association list +mapping input identifiers to CWL types." (guard (c ((and (who-condition? c) (memq (condition-who c) '(read-json-file read-yaml-file)) @@ -327,7 +328,24 @@ array of array of @code{File}s, etc. Else, return @code{#f}" (if (string=? (file-name-extension inputs-path) ".json") (read-json-file (basename inputs-path)) - (read-yaml-file (basename inputs-path))))))))) + (map (match-lambda + ((input-id . input) + (cons input-id + (cond + ((assoc-ref types input-id) + => (cut coerce-type input <>)) + (else input))))) + (read-yaml-file (basename inputs-path)))))))))) + +(define (read-workflow+inputs workflow-file inputs-file) + (let ((workflow-cwl (read-workflow workflow-file))) + (values workflow-cwl + (read-inputs inputs-file + (vector-map->list (lambda (formal-input) + (cons (assoc-ref formal-input "id") + (formal-parameter-type + (assoc-ref formal-input "type")))) + (assoc-ref workflow-cwl "inputs")))))) (define (coerce-type val type) "Coerce @var{val} to CWL @var{type}." diff --git a/test-data/inputs-with-type-ambiguities.yaml b/test-data/inputs-with-type-ambiguities.yaml new file mode 100644 index 0000000..119b72f --- /dev/null +++ b/test-data/inputs-with-type-ambiguities.yaml @@ -0,0 +1,5 @@ +number: 13 +flag: true +reverseflag: false +foo: bar +arr: [1, 2, 3] diff --git a/test-data/workflow-for-inputs-with-type-ambiguities.cwl b/test-data/workflow-for-inputs-with-type-ambiguities.cwl new file mode 100644 index 0000000..4e33148 --- /dev/null +++ b/test-data/workflow-for-inputs-with-type-ambiguities.cwl @@ -0,0 +1,11 @@ +class: Workflow +inputs: + number: int + flag: boolean + reverseflag: boolean + foo: string + arr: + type: + type: array + items: int +outputs: [] diff --git a/tests/reader.scm b/tests/reader.scm index 8ac18ec..77d6034 100644 --- a/tests/reader.scm +++ b/tests/reader.scm @@ -16,7 +16,8 @@ ;;; You should have received a copy of the GNU General Public License ;;; along with ravanan. If not, see <https://www.gnu.org/licenses/>. -(use-modules (srfi srfi-64) +(use-modules (srfi srfi-26) + (srfi srfi-64) (ice-9 filesystem) (ice-9 match) (web uri) @@ -217,4 +218,17 @@ (normalize-input '(("class" . "File") ("path" . "foo"))))))))) +(test-equal "Read YAML inputs file with type ambiguities" + '(("number" . 13) + ("flag" . #t) + ("reverseflag" . #f) + ("foo" . "bar") + ("arr" . #(1 2 3))) + (call-with-values + (cut read-workflow+inputs + "test-data/workflow-for-inputs-with-type-ambiguities.cwl" + "test-data/inputs-with-type-ambiguities.yaml") + (lambda (workflow inputs) + inputs))) + (test-end "reader") |
