From 3a7abb9f295409c93db8ee12909c69dee9730e71 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Wed, 22 Jan 2025 23:54:45 +0000 Subject: reader: Normalize File array type formals too. * ravanan/reader.scm: Import (ravanan work types). (some-file-type?): New function. (normalize-formal-input, normalize-formal-output): Normalize File array type formals too. * tests/reader.scm: Import (srfi srfi-1) and (ice-9 match). (normalize-formal-input, normalize-formal-output): New variables. (json=?): New function. ("Normalize File type formal input", "Normalize File array type formal input", "Normalize array of File arrays type formal input", "Normalize File type formal output", "Normalize File array type formal output", "Normalize array of File arrays type formal output"): New tests. --- ravanan/reader.scm | 14 +++++-- 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 +;;; Copyright © 2024, 2025 Arun Isaac ;;; ;;; 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 . -(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") -- cgit v1.2.3