diff options
-rw-r--r-- | ravanan/reader.scm | 14 | ||||
-rw-r--r-- | tests/reader.scm | 111 |
2 files changed, 119 insertions, 6 deletions
diff --git a/ravanan/reader.scm b/ravanan/reader.scm index c287dfc..5d1644f 100644 --- a/ravanan/reader.scm +++ b/ravanan/reader.scm @@ -25,6 +25,7 @@ #:use-module (yaml) #:use-module (ravanan work command-line-tool) #:use-module (ravanan work monads) + #:use-module (ravanan work types) #:use-module (ravanan work utils) #:use-module (ravanan work vectors) #:export (read-workflow @@ -135,10 +136,16 @@ the @code{required} field when it is not specified." (vector `(("pattern" . ,secondary-files) ("required" . ,default-required)))))) +(define (some-file-type? type) + "Return @code{#t} if @var{type} is a @code{File}, an array of @code{File}s, an +array of array of @code{File}s, etc. Else, return @code{#f}" + (or (eq? type 'File) + (and (array-type? type) + (some-file-type? (array-type-subtype type))))) + (define (normalize-formal-input input) "Normalize formal @var{input}." - (if (eq? (formal-parameter-type (assoc-ref input "type")) - 'File) + (if (some-file-type? (formal-parameter-type (assoc-ref input "type"))) (maybe-assoc-set input (cons (list "default" "location") (maybe-let* ((location (maybe-assoc-ref (just input) @@ -152,8 +159,7 @@ the @code{required} field when it is not specified." (define (normalize-formal-output output) "Normalize formal @var{output}." - (if (eq? (formal-parameter-type (assoc-ref output "type")) - 'File) + (if (some-file-type? (formal-parameter-type (assoc-ref output "type"))) (maybe-assoc-set output (cons "secondaryFiles" (maybe-bind (maybe-assoc-ref (just output) "secondaryFiles") diff --git a/tests/reader.scm b/tests/reader.scm index 4737ed6..ea6472c 100644 --- a/tests/reader.scm +++ b/tests/reader.scm @@ -1,5 +1,5 @@ ;;; ravanan --- High-reproducibility CWL runner powered by Guix -;;; Copyright © 2024 Arun Isaac <arunisaac@systemreboot.net> +;;; Copyright © 2024, 2025 Arun Isaac <arunisaac@systemreboot.net> ;;; ;;; This file is part of ravanan. ;;; @@ -16,13 +16,120 @@ ;;; 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-1) + (srfi srfi-64) + (ice-9 match) (ravanan reader)) +(define normalize-formal-input + (@@ (ravanan reader) normalize-formal-input)) + +(define normalize-formal-output + (@@ (ravanan reader) normalize-formal-output)) + +(define (json=? tree1 tree2) + (cond + ;; Arrays + ((vector? tree1) + (lset= json=? + (vector->list tree1) + (vector->list tree2))) + ;; Dictionaries + ((list? tree1) + (lset= (match-lambda* + (((key1 . value1) (key2 . value2)) + (and (string=? key1 key2) + (json=? value1 value2)))) + tree1 + tree2)) + ;; Atoms + (else + (equal? tree1 tree2)))) + (test-begin "reader") (test-equal "Coerce number to number" 37 (coerce-type 37 'number)) +(test-assert "Normalize File type formal input" + (json=? '(("type" . "File") + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #t))))) + (normalize-formal-input + '(("type" . "File") + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + +(test-assert "Normalize File array type formal input" + (json=? '(("type" + ("type" . "array") + ("items" . "File")) + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #t))))) + (normalize-formal-input + '(("type" + ("type" . "array") + ("items" . "File")) + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + +(test-assert "Normalize array of File arrays type formal input" + (json=? '(("type" + ("type" . "array") + ("items" . (("type" . "array") + ("items" . "File")))) + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #t))))) + (normalize-formal-input + '(("type" + ("type" . "array") + ("items" . (("type" . "array") + ("items" . "File")))) + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + +(test-assert "Normalize File type formal output" + (json=? '(("type" . "File") + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #f))))) + (normalize-formal-output + '(("type" . "File") + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + +(test-assert "Normalize File array type formal output" + (json=? '(("type" + ("type" . "array") + ("items" . "File")) + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #f))))) + (normalize-formal-output + '(("type" + ("type" . "array") + ("items" . "File")) + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + +(test-assert "Normalize array of File arrays type formal output" + (json=? '(("type" + ("type" . "array") + ("items" . (("type" . "array") + ("items" . "File")))) + ("id" . "foo") + ("secondaryFiles" . #((("pattern" . ".bai") + ("required" . #t))))) + (normalize-formal-input + '(("type" + ("type" . "array") + ("items" . (("type" . "array") + ("items" . "File")))) + ("id" . "foo") + ("secondaryFiles" . #(".bai")))))) + (test-end "reader") |