about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ravanan/reader.scm14
-rw-r--r--tests/reader.scm111
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")