From 6f5daa159a0c547ad0e007bb04266716c347acab Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 12:26:34 +0000 Subject: [PATCH 01/24] New helper function to help with file downloads --- .../java/nf_core/nf/test/utils/Methods.java | 44 ++++++++++++++---- .../nf_core/nf/test/utils/NfCoreUtils.java | 19 ++------ .../java/nf_core/nf/test/utils/Utils.java | 46 +++++++++++++++++++ 3 files changed, 85 insertions(+), 24 deletions(-) create mode 100644 src/main/java/nf_core/nf/test/utils/Utils.java diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 646985f..b322cd8 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -3,11 +3,8 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; -import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; -import java.nio.file.FileAlreadyExistsException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; @@ -19,12 +16,6 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import org.yaml.snakeyaml.Yaml; @@ -752,4 +743,39 @@ public static TreeMap sanitizeOutput(TreeMap chann public static TreeMap sanitizeOutput(HashMap options, TreeMap channel) { return OutputSanitizer.sanitizeOutput(options, channel); } + + /** + * Run `curl -L --retry 5 $URL | tar xzf - -C $DEST` via `bash -c`. + * Uses safe single-quoting for the URL and destination path. + * + * @param urlString the URL to fetch + * @param destPath directory to extract the tarball into + * @throws IOException on failure + */ + public static void curlAndExtract(String urlString, String destPath) throws IOException { + Path destDir = Paths.get(destPath); + Files.createDirectories(destDir); + + String escUrl = Utils.shellEscape(urlString); + String escDest = Utils.shellEscape(destPath); + String cmd = "curl -L --retry 5 " + escUrl + " | tar xzf - -C " + escDest; + + ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd); + try { + Utils.ProcessResult result = Utils.runProcess(pb); + if (result.exitCode != 0) { + System.err.println("Error downloading and extracting file " + urlString + ": exit code " + result.exitCode + "\n"); + System.out.println("Bash command: \n" + cmd); + System.err.println("command output: \n"); + System.err.println(result.stderr); + } else { + System.out.println("Successfully downloaded and extracted file: " + urlString); + } + } catch (IOException | InterruptedException e) { + System.err.println("Error downloading and extracting file " + urlString + ": " + e.getMessage()); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + } + } } diff --git a/src/main/java/nf_core/nf/test/utils/NfCoreUtils.java b/src/main/java/nf_core/nf/test/utils/NfCoreUtils.java index 98ccd55..81ade27 100644 --- a/src/main/java/nf_core/nf/test/utils/NfCoreUtils.java +++ b/src/main/java/nf_core/nf/test/utils/NfCoreUtils.java @@ -1,10 +1,8 @@ package nf_core.nf.test.utils; -import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.io.InputStreamReader; import java.nio.file.Files; import java.util.LinkedHashMap; import java.util.List; @@ -99,23 +97,14 @@ private static void installModule(String libDir, String name, String sha, String } ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", command.toString()); - Process process = processBuilder.start(); - - // Capture stderr from nf-core tools - BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - StringBuilder stderr = new StringBuilder(); - String line; - while ((line = stderrReader.readLine()) != null) { - stderr.append(line).append("\n"); - } - int exitCode = process.waitFor(); + Utils.ProcessResult result = Utils.runProcess(processBuilder); // Spit out nf-core tools stderr if install fails - if (exitCode != 0) { - System.err.println("Error installing module " + name + ": exit code " + exitCode + "\n"); + if (result.exitCode != 0) { + System.err.println("Error installing module " + name + ": exit code " + result.exitCode + "\n"); System.out.println("Installation command: \n" + command.toString()); System.err.println("nf-core tools output: \n"); - System.err.println(stderr.toString()); + System.err.println(result.stderr); } else { System.out.println("Successfully installed module: " + name); } diff --git a/src/main/java/nf_core/nf/test/utils/Utils.java b/src/main/java/nf_core/nf/test/utils/Utils.java new file mode 100644 index 0000000..15f024c --- /dev/null +++ b/src/main/java/nf_core/nf/test/utils/Utils.java @@ -0,0 +1,46 @@ +package nf_core.nf.test.utils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Utils { + + /** + * Result of running a process started from a {@link ProcessBuilder}. + */ + public static class ProcessResult { + public final int exitCode; + public final String stderr; + + public ProcessResult(int exitCode, String stderr) { + this.exitCode = exitCode; + this.stderr = stderr; + } + } + + /** + * Starts the given {@link ProcessBuilder}, captures stderr, waits for exit, + * and returns a {@link ProcessResult}. + */ + public static ProcessResult runProcess(ProcessBuilder pb) throws IOException, InterruptedException { + // If stdout isn't already redirected, discard it to avoid blocking + pb.redirectOutput(ProcessBuilder.Redirect.DISCARD); + Process process = pb.start(); + BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + StringBuilder stderr = new StringBuilder(); + String line; + while ((line = stderrReader.readLine()) != null) { + stderr.append(line).append("\n"); + } + int exitCode = process.waitFor(); + return new ProcessResult(exitCode, stderr.toString()); + } + + // Helper to single-quote a string for safe shell usage: '...' + public static String shellEscape(String s) { + if (s == null) return "''"; + return "'" + s.replace("'", "'" + "\"'\"" + "'") + "'"; + } +} From 0407c7ddd3dc9c3fe602cd75ae364dcf516f888c Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 15:38:28 +0000 Subject: [PATCH 02/24] Any shell should be able to run this Co-authored-by: Jim Downie <19718667+prototaxites@users.noreply.github.com> --- src/main/java/nf_core/nf/test/utils/Methods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index b322cd8..9f50b26 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -760,7 +760,7 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx String escDest = Utils.shellEscape(destPath); String cmd = "curl -L --retry 5 " + escUrl + " | tar xzf - -C " + escDest; - ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd); + ProcessBuilder pb = new ProcessBuilder("sh", "-c", cmd); try { Utils.ProcessResult result = Utils.runProcess(pb); if (result.exitCode != 0) { From 2da0ffc5c1cc62b1870b41bc53307fcde856cac9 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 15:59:51 +0000 Subject: [PATCH 03/24] Simple test --- tests/curlAndExtract/main.nf.test | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/curlAndExtract/main.nf.test diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test new file mode 100644 index 0000000..8a2a2af --- /dev/null +++ b/tests/curlAndExtract/main.nf.test @@ -0,0 +1,20 @@ +nextflow_process { + + name "Test Process curlAndExtract" + tag "test" + + test("test plugin") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") + } + + then { + assertAll( + { assert path("${launchDir}/dbs/").exists() }, + { assert path("${launchDir}/dbs/hello.txt").exists() }, + { assert path("${launchDir}/dbs/hello.txt").lines().find { it.contains('Hello World') } } + ) + } + } +} From 81c4eebc9ae45e722e9a7a146198d76ddaa958fa Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 16:33:20 +0000 Subject: [PATCH 04/24] Support any tar format --- src/main/java/nf_core/nf/test/utils/Methods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 9f50b26..7d4db71 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -758,7 +758,7 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx String escUrl = Utils.shellEscape(urlString); String escDest = Utils.shellEscape(destPath); - String cmd = "curl -L --retry 5 " + escUrl + " | tar xzf - -C " + escDest; + String cmd = "curl -L --retry 5 " + escUrl + " | tar xaf - -C " + escDest; ProcessBuilder pb = new ProcessBuilder("sh", "-c", cmd); try { From 93ec824f6c75d10e130ec3804b5ffb353bea4309 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 16:58:24 +0000 Subject: [PATCH 05/24] Another method for zip files --- .../java/nf_core/nf/test/utils/Methods.java | 73 ++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 7d4db71..aac3397 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -745,14 +745,15 @@ public static TreeMap sanitizeOutput(HashMap optio } /** - * Run `curl -L --retry 5 $URL | tar xzf - -C $DEST` via `bash -c`. + * Download a tar archive and extract it in the given destination directory. + * The file is streamed directly with `curl` into `tar` via a pipe. * Uses safe single-quoting for the URL and destination path. * * @param urlString the URL to fetch * @param destPath directory to extract the tarball into * @throws IOException on failure */ - public static void curlAndExtract(String urlString, String destPath) throws IOException { + public static void curlAndUntar(String urlString, String destPath) throws IOException { Path destDir = Paths.get(destPath); Files.createDirectories(destDir); @@ -778,4 +779,72 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx } } } + + /** + * Download a zip file and extract it in the given destination directory. + * The file is first downloaded with `curl` to a temporary file, then we + * call `unzip` and delete the temporary file. + * + * @param urlString the URL to fetch + * @param destPath directory to extract the zip into + * @throws IOException on failure + */ + public static void curlAndUnzip(String urlString, String destPath) throws IOException { + Path destDir = Paths.get(destPath); + Files.createDirectories(destDir); + + // Create a temporary file in the destination directory for the downloaded zip + Path tempFile = Files.createTempFile(destDir, "download", ".zip"); + + // Run curl + ProcessBuilder pb = new ProcessBuilder( + "curl", + "-L", + "--retry", + "5", + "-o", + tempFile.toString(), + urlString + ); + + try { + Utils.ProcessResult result = Utils.runProcess(pb); + if (result.exitCode != 0) { + System.err.println("Error downloading file " + urlString + ": exit code " + result.exitCode + "\n"); + System.out.println("Command: " + String.join(" ", pb.command())); + System.err.println("command output: \n"); + System.err.println(result.stderr); + return; + } + // Run unzip + pb = new ProcessBuilder( + "unzip", + "-o", + tempFile.toString(), + "-d", + destPath + ); + result = Utils.runProcess(pb); + if (result.exitCode != 0) { + System.err.println("Error extracting zip " + tempFile + ": exit code " + result.exitCode + "\n"); + System.out.println("Command: " + String.join(" ", pb.command())); + System.err.println("command output: \n"); + System.err.println(result.stderr); + } else { + System.out.println("Successfully downloaded and extracted file: " + urlString); + } + } catch (IOException | InterruptedException e) { + System.err.println("Error downloading and extracting file " + urlString + ": " + e.getMessage()); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + } finally { + try { + Files.deleteIfExists(tempFile); + } catch (IOException e) { + // Do not fail the operation if temp file cleanup fails; just log it + System.err.println("Warning: failed to delete temporary file " + tempFile + ": " + e.getMessage()); + } + } + } } From 10ac537632a819ce06be24b3ee0ccb0250a799b4 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 16:59:46 +0000 Subject: [PATCH 06/24] Documentation --- docs/usage.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index a10b93c..65f3c70 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -542,3 +542,51 @@ then { assert snapshot(sanitizeOutput(process.out, unstableKeys:["zip"])).match() } ``` + +### `curlAndUntar()` - Download and extract a Tar archive + +The `curlAndUntar()` function is used to download a tar archive (possibly compressed) +from the Internet with `curl` and extract it in the required destination +directory. `tar` automatically recognises compressed archives such as `tar.gz`, `tar.bz2`, etc. + +You are responsible for deleting the data in the `cleanup` phase. + +```groovy +setup { + curlAndUntar("https://www.example.com/database.tar.gz", "${launchDir}/data_dir") +} + +when { + params { + db_path = "${launchDir}/data_dir/db/" + } +} + +cleanup { + new File("${launchDir}/data_dir/db").deleteDir() +} +``` + +### `curlAndUnzip()` - Download and extract a Zip archive + +The `curlAndUnzip()` function is used to download a zip archive +from the Internet with `curl` and extract it in the required destination +directory. + +You are responsible for deleting the data in the `cleanup` phase. + +```groovy +setup { + curlAndUnzip("https://www.example.com/database.zip", "${launchDir}/data_dir") +} + +when { + params { + db_path = "${launchDir}/data_dir/db/" + } +} + +cleanup { + new File("${launchDir}/data_dir/db").deleteDir() +} +``` From b0944e0c2ce6feff38ec6e4a25124ec117fb9269 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 17:30:12 +0000 Subject: [PATCH 07/24] Added a dispatcher --- .../java/nf_core/nf/test/utils/Methods.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index aac3397..311f3f5 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -847,4 +847,36 @@ public static void curlAndUnzip(String urlString, String destPath) throws IOExce } } } + + /** + * Download an archive and extract it in the given destination directory. + * Dispatches to `curlAndUnzip` for ZIP files and to `curlAndUntar` for + * tar archives based on the URL's file extension. + * + * @param urlString the URL to fetch + * @param destPath directory to extract the archive into + * @throws IOException on failure or if archive type is unsupported + */ + public static void curlAndExtract(String urlString, String destPath) throws IOException { + // Try to extract a path portion from the URL (strip query strings) + String pathPart = urlString; + try { + java.net.URI uri = new java.net.URI(urlString); + if (uri.getPath() != null && !uri.getPath().isEmpty()) { + pathPart = uri.getPath(); + } + } catch (Exception e) { + // If parsing fails, fall back to raw urlString + pathPart = urlString; + } + + String lower = pathPart.toLowerCase(Locale.ROOT); + // .zip is the only definitve extension. tar has too many and + // will be considered the default + if (lower.endsWith(".zip")) { + curlAndUnzip(urlString, destPath); + } else { + curlAndUntar(urlString, destPath); + } + } } From 034afdbb5ae11387355ce509c090a76157639c55 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 18:09:12 +0000 Subject: [PATCH 08/24] Tests ! --- tests/curlAndExtract/main.nf | 9 +++++++++ tests/curlAndExtract/main.nf.test | 20 +++++++++++++------- tests/curlAndExtract/main.nf.test.snap | 12 ++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 tests/curlAndExtract/main.nf create mode 100644 tests/curlAndExtract/main.nf.test.snap diff --git a/tests/curlAndExtract/main.nf b/tests/curlAndExtract/main.nf new file mode 100644 index 0000000..120927c --- /dev/null +++ b/tests/curlAndExtract/main.nf @@ -0,0 +1,9 @@ +process TEST_MODULE { + output: + path ("test.txt"), emit: output + + script: + """ + echo "hello!" > test.txt + """ +} diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index 8a2a2af..c371534 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -1,20 +1,26 @@ nextflow_process { - name "Test Process curlAndExtract" + name "Test Process curlAndUntar" + script "./main.nf" + process "TEST_MODULE" + tag "test" - test("test plugin") { + test("test curlAndUntar") { setup { - curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") + curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") } - then { + def expected_file = "${launchDir}/dbs/hello.txt" assertAll( - { assert path("${launchDir}/dbs/").exists() }, - { assert path("${launchDir}/dbs/hello.txt").exists() }, - { assert path("${launchDir}/dbs/hello.txt").lines().find { it.contains('Hello World') } } + { assert path(expected_file).exists() }, + { assert path(expected_file).exists() }, + { assert snapshot(expected_file).match() }, ) } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } } } diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap new file mode 100644 index 0000000..be91367 --- /dev/null +++ b/tests/curlAndExtract/main.nf.test.snap @@ -0,0 +1,12 @@ +{ + "test curlAndUntar": { + "content": [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:08:36.000435" + } +} \ No newline at end of file From 1cd222f75a55fd80fced97620710b9e8312e268f Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 18:10:32 +0000 Subject: [PATCH 09/24] More tests --- tests/curlAndExtract/main.nf.test | 19 +++++++++++++++++++ tests/curlAndExtract/main.nf.test.snap | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index c371534..7f90159 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -23,4 +23,23 @@ nextflow_process { new File("${launchDir}/dbs").deleteDir() } } + + + test("test curlAndExtract - tar file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") + } + then { + def expected_file = "${launchDir}/dbs/hello.txt" + assertAll( + { assert path(expected_file).exists() }, + { assert path(expected_file).exists() }, + { assert snapshot(expected_file).match() }, + ) + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } } diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index be91367..4d4a745 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,4 +1,14 @@ { + "test curlAndExtract - tar file": { + "content": [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:09:58.396939" + }, "test curlAndUntar": { "content": [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" From 603b9b919bc73011105183d1c3cba783ee05e9e5 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 18:15:57 +0000 Subject: [PATCH 10/24] More tests ! --- tests/curlAndExtract/main.nf.test | 45 +++++++++++-- tests/curlAndExtract/main.nf.test.snap | 90 ++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 4 deletions(-) diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index 7f90159..67c7512 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -6,7 +6,7 @@ nextflow_process { tag "test" - test("test curlAndUntar") { + test("test curlAndUntar - tar.gz file") { setup { curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") @@ -14,7 +14,6 @@ nextflow_process { then { def expected_file = "${launchDir}/dbs/hello.txt" assertAll( - { assert path(expected_file).exists() }, { assert path(expected_file).exists() }, { assert snapshot(expected_file).match() }, ) @@ -24,8 +23,27 @@ nextflow_process { } } + test("test curlAndUnzip") { - test("test curlAndExtract - tar file") { + setup { + curlAndUnzip("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs") + } + then { + def expected_file1 = "${launchDir}/dbs/ncbi.tre" + def expected_file2 = "${launchDir}/dbs/ncbi.map" + assertAll( + { assert path(expected_file1).exists() }, + { assert path(expected_file2).exists() }, + { assert snapshot(expected_file1).match("curlAndUnzip:ncbi.tre") }, + { assert snapshot(expected_file2).match("curlAndUnzip:ncbi.map") }, + ) + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + + test("test curlAndExtract - tar.gz file") { setup { curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") @@ -33,7 +51,6 @@ nextflow_process { then { def expected_file = "${launchDir}/dbs/hello.txt" assertAll( - { assert path(expected_file).exists() }, { assert path(expected_file).exists() }, { assert snapshot(expected_file).match() }, ) @@ -42,4 +59,24 @@ nextflow_process { new File("${launchDir}/dbs").deleteDir() } } + + test("test curlAndExtract - zip file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs") + } + then { + def expected_file1 = "${launchDir}/dbs/ncbi.tre" + def expected_file2 = "${launchDir}/dbs/ncbi.map" + assertAll( + { assert path(expected_file1).exists() }, + { assert path(expected_file2).exists() }, + { assert snapshot(expected_file1).match("curlAndExtract:ncbi.tre") }, + { assert snapshot(expected_file2).match("curlAndExtract:ncbi.map") }, + ) + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } } diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 4d4a745..3fe071a 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,4 +1,24 @@ { + "test curlAndUntar - tar.gz file": { + "content": [ + "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/99d04a37d921676abee32e4e8b009a96/dbs/hello.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:18.388651" + }, + "curlAndExtract:ncbi.map": { + "content": [ + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:31.586426" + }, "test curlAndExtract - tar file": { "content": [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" @@ -9,6 +29,66 @@ }, "timestamp": "2025-12-08T18:09:58.396939" }, + "test curlAndExtract - tar.gz file": { + "content": [ + "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/9abafa0eede6518438d02fc7cdfa7d76/dbs/hello.txt" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:27.556287" + }, + "curlAndExtract:ncbi.tre": { + "content": [ + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:31.577887" + }, + "ncbi.tre": { + "content": [ + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:14:00.631636" + }, + "test curlAndUnzip": { + "content": [ + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:12:17.78509" + }, + "ncbi.map": { + "content": [ + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:14:00.643146" + }, + "curlAndUnzip:ncbi.tre": { + "content": [ + "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.tre" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:22.913108" + }, "test curlAndUntar": { "content": [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" @@ -18,5 +98,15 @@ "nextflow": "24.04.2" }, "timestamp": "2025-12-08T18:08:36.000435" + }, + "curlAndUnzip:ncbi.map": { + "content": [ + "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.map" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:15:22.922001" } } \ No newline at end of file From c34a26e476c4fab9e2ca5aaecafe81bd3892e3d1 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 18:19:15 +0000 Subject: [PATCH 11/24] More tests ! --- tests/curlAndExtract/main.nf.test | 14 + tests/curlAndExtract/main.nf.test.snap | 405 +++++++++++++++++++++++++ 2 files changed, 419 insertions(+) diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index 67c7512..61784c4 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -6,6 +6,20 @@ nextflow_process { tag "test" + test("test curlAndUntar - tar file") { + + setup { + curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/genome/index/igblast/igblast_base.tar", "${launchDir}/dbs") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + test("test curlAndUntar - tar.gz file") { setup { diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 3fe071a..e16f751 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -19,6 +19,411 @@ }, "timestamp": "2025-12-08T18:15:31.586426" }, + "test curlAndUntar - tar file": { + "content": [ + [ + "airr_c_human.tar:md5,a29a0c8d1520ff884e873d9a114684f6", + "airr_c_mouse.tar:md5,b46a8b195eb6d15ed3f84fc51434d126", + "imgt_aa_human_ig_v.pdb:md5,bca60bc424936bd3049579b9d904106b", + "imgt_aa_human_ig_v.phr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_aa_human_ig_v.pin:md5,beb81f86dfd78b84d100049adadd8736", + "imgt_aa_human_ig_v.pjs:md5,8b6a254db719992d738febc70fbfc340", + "imgt_aa_human_ig_v.pog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_aa_human_ig_v.pos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_aa_human_ig_v.pot:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_aa_human_ig_v.psq:md5,1050c1905867e66eb6d6ed82ca81966f", + "imgt_aa_human_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_ig_v.pto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_aa_human_tr_v.pdb:md5,b20fb1d634bcac4e7b3b641f46ee6572", + "imgt_aa_human_tr_v.phr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_aa_human_tr_v.pin:md5,b1029173840eb6a118c103feac3f7e7a", + "imgt_aa_human_tr_v.pjs:md5,e352b4ffa68c204068c3c0398f1c8f06", + "imgt_aa_human_tr_v.pog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_aa_human_tr_v.pos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_aa_human_tr_v.pot:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_aa_human_tr_v.psq:md5,02a78615a1d0630d98a323be4bc34fc1", + "imgt_aa_human_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_tr_v.pto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_aa_mouse_ig_v.pdb:md5,58ea125f6ab44075e31bd89324263398", + "imgt_aa_mouse_ig_v.phr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_aa_mouse_ig_v.pin:md5,d6e3e85522830f9c07a3ca23638b1645", + "imgt_aa_mouse_ig_v.pjs:md5,3676804d02cab0a65c0d62b5ab3eb350", + "imgt_aa_mouse_ig_v.pog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_aa_mouse_ig_v.pos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_aa_mouse_ig_v.pot:md5,81c46146154842750edbc3923e291198", + "imgt_aa_mouse_ig_v.psq:md5,5ec21c57d53c2313513076565b8fbe32", + "imgt_aa_mouse_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_ig_v.pto:md5,688627d85d01244e960293af8801aa6b", + "imgt_aa_mouse_tr_v.pdb:md5,fdebe60bd497eed071bed4bf9e2c2c23", + "imgt_aa_mouse_tr_v.phr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_aa_mouse_tr_v.pin:md5,7b205e758c0d20885e60d43d4ed951f5", + "imgt_aa_mouse_tr_v.pjs:md5,b2c080a95c7cb06442409b42de0b260e", + "imgt_aa_mouse_tr_v.pog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_aa_mouse_tr_v.pos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_aa_mouse_tr_v.pot:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_aa_mouse_tr_v.psq:md5,b8c61da709681a273f414d7013a0870b", + "imgt_aa_mouse_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_tr_v.pto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "imgt_human_ig_c.ndb:md5,bab6dfb53156e3e0234ecf260feeb242", + "imgt_human_ig_c.nhr:md5,fb276ae5f21e244aca3be962caa02140", + "imgt_human_ig_c.nin:md5,2fce33436614bed3ecbde7fbc85bd089", + "imgt_human_ig_c.njs:md5,7be706d5b0183bc843c89216cb486087", + "imgt_human_ig_c.nog:md5,277272dc12bd9fe292f2d246e79ae285", + "imgt_human_ig_c.nos:md5,f635fb577ef680c93f8ad2fffb2c56da", + "imgt_human_ig_c.not:md5,595be8a48ce988e8b1fc9ae81d9820a1", + "imgt_human_ig_c.nsq:md5,ce0f34cca8391e736b389b538fcd582e", + "imgt_human_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_c.nto:md5,6d94619292c57dcc852a16207808a186", + "imgt_human_ig_d.ndb:md5,cfb6c207cc3e15edd6dff7a512da2f05", + "imgt_human_ig_d.nhr:md5,df5706fd3491f0654676701d2d983a02", + "imgt_human_ig_d.nin:md5,4bb0200ca933ebc0d40f3093da3f079b", + "imgt_human_ig_d.njs:md5,21e632ea22f6c2b2cfcafa5a7c07bea8", + "imgt_human_ig_d.nog:md5,2fe6ddc46991f9d261bb3f4217555b37", + "imgt_human_ig_d.nos:md5,2d6e790963695bea5f32d238deb67bbb", + "imgt_human_ig_d.not:md5,f9385bcae5f780aa6bd2acf5f03d3a28", + "imgt_human_ig_d.nsq:md5,eeed28974865d16f4aacef1ba1ad2769", + "imgt_human_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_d.nto:md5,259f033be03d566926d716eab2077919", + "imgt_human_ig_j.ndb:md5,b2732139bfc1f3651e90e326a60a43f1", + "imgt_human_ig_j.nhr:md5,eab83a9cdc96b3153c28a1b42a4a0926", + "imgt_human_ig_j.nin:md5,e26f9f57799e442c05c59836ed6d4a7c", + "imgt_human_ig_j.njs:md5,1181e1865512cf31c07c828a42c0f7df", + "imgt_human_ig_j.nog:md5,eb76e077a2b5101fc51c45fe2cc3a4ef", + "imgt_human_ig_j.nos:md5,b3879f5f8e1b42c0232c56d2dd74436a", + "imgt_human_ig_j.not:md5,c1a4db8fc9de9569a2b05532bd10573b", + "imgt_human_ig_j.nsq:md5,cc0890d3aeb8ca90207fdc55ca73ea6a", + "imgt_human_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_j.nto:md5,b454eda6ec47d3ba37106ffb7234eb6a", + "imgt_human_ig_v.ndb:md5,7f54a4459b22dff18182858ff7eb6736", + "imgt_human_ig_v.nhr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_human_ig_v.nin:md5,3f3fc9b5681c2975fdd1f346bbb5f57b", + "imgt_human_ig_v.njs:md5,5beea91d2e64d2d3cc025711a3aac6be", + "imgt_human_ig_v.nog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_human_ig_v.nos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_human_ig_v.not:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_human_ig_v.nsq:md5,65fd7c7490d4724b046b19b8d5089152", + "imgt_human_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_v.nto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_human_tr_c.ndb:md5,207888a1424c2e28967db58976515959", + "imgt_human_tr_c.nhr:md5,d60efc0d8d6d239cf137c6bbf9145f2c", + "imgt_human_tr_c.nin:md5,0e9a3bc083040702cea7e8593fef5589", + "imgt_human_tr_c.njs:md5,959a466665a3fb37678e35cabe519740", + "imgt_human_tr_c.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "imgt_human_tr_c.nos:md5,6cddf70aab94ff06f4ff094aa111d0db", + "imgt_human_tr_c.not:md5,2030b82268722e50fbbe0c3f4977a24a", + "imgt_human_tr_c.nsq:md5,1b38231f546d64850369b16eb32ab6b4", + "imgt_human_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_c.nto:md5,fe1ae01c06a57e09fa931e1ba7889c29", + "imgt_human_tr_d.ndb:md5,9f380ca23aba188a66a7dd63a55e0306", + "imgt_human_tr_d.nhr:md5,30ab9fd7b8e05a3cf04aed8bf5820ed1", + "imgt_human_tr_d.nin:md5,31445ebf0c14a1373ec555b1e728f1b7", + "imgt_human_tr_d.njs:md5,d4ba25a8a9f3b127cebe364e71fa179b", + "imgt_human_tr_d.nog:md5,5eaf4848fc8cde9e6a10e7fbff9cf338", + "imgt_human_tr_d.nos:md5,43df4232aeccb54c78c8865e5f5f08e5", + "imgt_human_tr_d.not:md5,0d634bbc846724bcf18d4dd3404c7902", + "imgt_human_tr_d.nsq:md5,12ab7e82d181c77ed36ff79e58cbcbcd", + "imgt_human_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_d.nto:md5,c1107debee8ee834a6d9383035dfe8a1", + "imgt_human_tr_j.ndb:md5,88d22d2662f17cc129b2b9fe05738439", + "imgt_human_tr_j.nhr:md5,e98a94e6de1d6af434b0ee8b9626a83c", + "imgt_human_tr_j.nin:md5,1175a138c8927ecf75fa90e83481869c", + "imgt_human_tr_j.njs:md5,7ffea2f9852c975ed4567969149a73bc", + "imgt_human_tr_j.nog:md5,c54125652e33caa645ed3157c2b57930", + "imgt_human_tr_j.nos:md5,f3c8792cd4b84eb72f412583e7a79de9", + "imgt_human_tr_j.not:md5,bbc18fbbcd4769570f8fbee3684cafbd", + "imgt_human_tr_j.nsq:md5,07b64be165c909fa66608b25d7bb25b1", + "imgt_human_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_j.nto:md5,0028dd1ab17d0c47acf5840c6a8d5e59", + "imgt_human_tr_v.ndb:md5,140edbe154feaa4ff6f1e162a6b14779", + "imgt_human_tr_v.nhr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_human_tr_v.nin:md5,24d1391a35a39a37f72cb3d564b6e5e5", + "imgt_human_tr_v.njs:md5,228f5e48054b3486fd82d32f93f6c0b3", + "imgt_human_tr_v.nog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_human_tr_v.nos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_human_tr_v.not:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_human_tr_v.nsq:md5,6a1d58da1db798ed8a726f51bf4edcc0", + "imgt_human_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_v.nto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_mouse_ig_c.ndb:md5,b74c2efc68a76ab4205d14ad853d5454", + "imgt_mouse_ig_c.nhr:md5,67d730c045ccba37591ae7f8d16b9d17", + "imgt_mouse_ig_c.nin:md5,f610dcf38c2d7c5537be6e4fc036a6b4", + "imgt_mouse_ig_c.njs:md5,c244ec84002cca1d696aa604fa6701c4", + "imgt_mouse_ig_c.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "imgt_mouse_ig_c.nos:md5,7cf6c745889857e2598735a49039c6b5", + "imgt_mouse_ig_c.not:md5,873faccbdcaadf20738757ff3fd83f33", + "imgt_mouse_ig_c.nsq:md5,4b97fc13d8ef76fadbfd5ed6124a2ba9", + "imgt_mouse_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_c.nto:md5,706b67145a22e8efbb8670a43b1e0cd3", + "imgt_mouse_ig_d.ndb:md5,b19fad9596341e0c288c0d58f4e2a81a", + "imgt_mouse_ig_d.nhr:md5,15b3f325ded60f6fcd020f5952503aba", + "imgt_mouse_ig_d.nin:md5,403de5e9bfebe7e0ca6b9e0db4bde562", + "imgt_mouse_ig_d.njs:md5,7cb6b95a853297946722ccdfae82e1cb", + "imgt_mouse_ig_d.nog:md5,d982f8a082df6bd7192e24229d555974", + "imgt_mouse_ig_d.nos:md5,249fc0539304e158d34d6ffa85db0a83", + "imgt_mouse_ig_d.not:md5,8f4cf856e9c39e1d1a83048ae9875d33", + "imgt_mouse_ig_d.nsq:md5,96e233401ac56520d13ad7ab72349185", + "imgt_mouse_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_d.nto:md5,f299f5722008a1205618f210439834ae", + "imgt_mouse_ig_j.ndb:md5,39e3dc08e5b0f00302d82e3920c643c9", + "imgt_mouse_ig_j.nhr:md5,e84cc08006969b9826af412b6f6626d7", + "imgt_mouse_ig_j.nin:md5,682a0c1e72e0b1422e3b661349531f1d", + "imgt_mouse_ig_j.njs:md5,7be4e74aaa67e4d7b55ac66a58e77291", + "imgt_mouse_ig_j.nog:md5,2f6aeaf3176b34332fcaf214f1698e55", + "imgt_mouse_ig_j.nos:md5,ee8f7ec3b1bba39b01a5f19df20da7dc", + "imgt_mouse_ig_j.not:md5,68fee53d6fc665eb87e45b866468ac32", + "imgt_mouse_ig_j.nsq:md5,17c0295a1202e26cdb670acaef745e16", + "imgt_mouse_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_j.nto:md5,a31324bf954edb7631e885d85d78103b", + "imgt_mouse_ig_v.ndb:md5,2de2e989ea109e09da297f30ca20667a", + "imgt_mouse_ig_v.nhr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_mouse_ig_v.nin:md5,030c13edc786cf4c8e1ad4491f36892c", + "imgt_mouse_ig_v.njs:md5,1f29a9ae41a04cc765d7b68cd560c1f1", + "imgt_mouse_ig_v.nog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_mouse_ig_v.nos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_mouse_ig_v.not:md5,81c46146154842750edbc3923e291198", + "imgt_mouse_ig_v.nsq:md5,8341057557b2c8a6a01185f8a4bedbcc", + "imgt_mouse_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_v.nto:md5,688627d85d01244e960293af8801aa6b", + "imgt_mouse_tr_c.ndb:md5,c699657e06c538df1abab26d54ba41d2", + "imgt_mouse_tr_c.nhr:md5,d73e399d3210fd72ec295fe9255204c6", + "imgt_mouse_tr_c.nin:md5,39c38148a1dd0cf8f5ffb617e40ddc3d", + "imgt_mouse_tr_c.njs:md5,fe326257dad06b92387369475bd42ba7", + "imgt_mouse_tr_c.nog:md5,df85d18647b8f011ed85756b3145e111", + "imgt_mouse_tr_c.nos:md5,721c50deeef515303652f32f27a9ab2b", + "imgt_mouse_tr_c.not:md5,24f16daf335352fe2bfca7094bdbd79d", + "imgt_mouse_tr_c.nsq:md5,bd58d1eeca6249ba5ea4b7fffbb14a76", + "imgt_mouse_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_c.nto:md5,6df5535bce3294d057801d66a7c7701e", + "imgt_mouse_tr_d.ndb:md5,a8b37cb08e95964af2b6e1c219f5b53f", + "imgt_mouse_tr_d.nhr:md5,0f6ae6f691944d27b89811f64e7619e7", + "imgt_mouse_tr_d.nin:md5,2ef920a85e448c680ca25cb7424d83a7", + "imgt_mouse_tr_d.njs:md5,269418b7c005a66988da4444c90306b6", + "imgt_mouse_tr_d.nog:md5,c5aa62546a588032ae22df69236ab525", + "imgt_mouse_tr_d.nos:md5,e43e912b61ba5e5d5ef4331ae3ac36b2", + "imgt_mouse_tr_d.not:md5,667c9af4cfdc07e4bbb6ef858e9e6fb3", + "imgt_mouse_tr_d.nsq:md5,7a3189aa9369c6eac91ec418a851fbed", + "imgt_mouse_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_d.nto:md5,afd0f544d132c4f72e97c866cc192fe1", + "imgt_mouse_tr_j.ndb:md5,e9d0ffcf8e6090ad2513cebc3e95f05a", + "imgt_mouse_tr_j.nhr:md5,bbd8b1aef821763537766eaae1b23c63", + "imgt_mouse_tr_j.nin:md5,96d6a34a7d54d9a77c70116ad249e3b3", + "imgt_mouse_tr_j.njs:md5,612c17d3e7c517844c79e03ba352a0b4", + "imgt_mouse_tr_j.nog:md5,6e8d11a76190d47ae644aa68e418cd3a", + "imgt_mouse_tr_j.nos:md5,3eff94779164fd38e60a1b6b9e38db6a", + "imgt_mouse_tr_j.not:md5,a65680020c287f8ece6787a63536c91d", + "imgt_mouse_tr_j.nsq:md5,3e751130114bfae43aa5cc9641b77db4", + "imgt_mouse_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_j.nto:md5,a4083c809fe1a59ce4590d033579345d", + "imgt_mouse_tr_v.ndb:md5,9c96b5a88aecf92990d2a9478981f5bc", + "imgt_mouse_tr_v.nhr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_mouse_tr_v.nin:md5,b3f3f09ead35acbd41931ed8290fee71", + "imgt_mouse_tr_v.njs:md5,82aaf433290049914a9d70c1f323ceb0", + "imgt_mouse_tr_v.nog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_mouse_tr_v.nos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_mouse_tr_v.not:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_mouse_tr_v.nsq:md5,89774a3086001a0238cef3462633c2fb", + "imgt_mouse_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_v.nto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "mouse_gl_D.nhr:md5,a832b15e9a5449f42a54dfd6c9f53cd0", + "mouse_gl_D.nin:md5,e7f91f781cf6ccc50868f7dfffda69e8", + "mouse_gl_D.nog:md5,7f4fff8e3d0dbcd4ca2a3b1f3673f5d5", + "mouse_gl_D.nsd:md5,5e49254772451138f955e36b8027cd19", + "mouse_gl_D.nsi:md5,653a7177b44c583aff703c83408d657f", + "mouse_gl_D.nsq:md5,3259c782003b3e425410aa255a515ebe", + "mouse_gl_J.nhr:md5,89c7a3cbe897890ac294243ba283ba6b", + "mouse_gl_J.nin:md5,ffd09e9e8fd21ccb2ed1ab24d3dfe8b9", + "mouse_gl_J.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "mouse_gl_J.nsd:md5,e94a6ad2cfe42c76593e16fd040bb929", + "mouse_gl_J.nsi:md5,61e91a6d1fa9b56587406dfcf7167dd2", + "mouse_gl_J.nsq:md5,26397eca0849e81f650001d316f592b6", + "mouse_gl_V.nhr:md5,0abe6bdca2b08e47bee3679bcce0b63b", + "mouse_gl_V.nin:md5,47c2c821445f55ea2d1191b090fdb132", + "mouse_gl_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_gl_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_gl_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_gl_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_gl_V.phr:md5,d204d83e0b7c698e13ef12e5e3b9bf60", + "mouse_gl_V.pin:md5,23b5ce4a46a3d81c6f8f7aabc6e7824d", + "mouse_gl_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_gl_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_gl_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_gl_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "mouse_gl_VDJ.tar:md5,e3485278d8ba068638a9d3428553e6a2", + "ncbi_human_c_genes.tar:md5,a8f1112969c8b552bdab3f488bbd0c47", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,fdbf43e4459fad96eeba391ec598c958", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,d273393e8dc187c816414f260348944e", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f25deb7f0151944e411af5880b8c8a55", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "rhesus_monkey_VJ.tar:md5,9e918cf291f34a391bb6398325a78db5", + "imgt_aa_human_ig_v.fasta:md5,30b9ca0f29a61c2459482fe30cfe19b6", + "imgt_aa_human_tr_v.fasta:md5,43f11ae863217d575626c20b7d84adb8", + "imgt_aa_mouse_ig_v.fasta:md5,edac8c37e0408f9f6c8d232d79ffc8be", + "imgt_aa_mouse_tr_v.fasta:md5,3e172585de3b78916c2711c5f3ddcb25", + "imgt_human_ig_c.fasta:md5,d660c41cc2bec165cd5ace32405eff39", + "imgt_human_ig_d.fasta:md5,935b4bb5442897f8d97051a4f2fe37d0", + "imgt_human_ig_j.fasta:md5,d7c28fd1c42b3d72b630e290d76fe409", + "imgt_human_ig_v.fasta:md5,0f604ba84709db16f9d4f0eafbd261ba", + "imgt_human_tr_c.fasta:md5,71b3865449c1a42a9e4f59b3ecdf3256", + "imgt_human_tr_d.fasta:md5,fe5ac92ba4d4e2ef0a001685e07b3914", + "imgt_human_tr_j.fasta:md5,dcae2f9293af89398f5df0b4acd60981", + "imgt_human_tr_v.fasta:md5,bcb1b21e6943da537f1e7fdcfce31119", + "imgt_mouse_ig_c.fasta:md5,b778e2bcea4e0a170404b28bd648522c", + "imgt_mouse_ig_d.fasta:md5,aa246ba4e5fa2eaad83ac7daab234772", + "imgt_mouse_ig_j.fasta:md5,3b220b309cc4d15b4cb120aae9e88170", + "imgt_mouse_ig_v.fasta:md5,875b17ff8b5ab819c3e1b332492c494d", + "imgt_mouse_tr_c.fasta:md5,b476e7d4fbd8768ace3877633c6b22de", + "imgt_mouse_tr_d.fasta:md5,3cf6735d31ca794bcf684fa2ccc3d148", + "imgt_mouse_tr_j.fasta:md5,4ef4d35a0e1d770873ae84dd0336d475", + "imgt_mouse_tr_v.fasta:md5,db73f796a88b77f1bbf2964f57a02285", + "human.ndm.imgt:md5,d6cea490480cecfeb082c66607126ff0", + "human.ndm.kabat:md5,294da2ace8c28701ba26406226acf9af", + "human.pdm.imgt:md5,eee1e720fe17bc2b74055dad690c5c3c", + "human.pdm.kabat:md5,2a09fe4aafb06a24ae09866ee2e874e2", + "human_TR_V.nhr:md5,05e85d4422ddd63b251798ad52afbb07", + "human_TR_V.nin:md5,479cf56d41b7708db836278c6090297a", + "human_TR_V.nog:md5,27b8711de1d9cb4a09de4fffd52cd7b4", + "human_TR_V.nsd:md5,1bd3fc688986ca1cd3cbf0ba341e6e88", + "human_TR_V.nsi:md5,902ee2023646ab9d5c2e8bd9e7cd9a74", + "human_TR_V.nsq:md5,1d6eaff8a9696dfb81f54c253adb3e8f", + "human_TR_V.phr:md5,289fad3fda3ca9a4b9dc62a436bb8ba1", + "human_TR_V.pin:md5,b974c4c2e06a7b15e8113b8a114e2a01", + "human_TR_V.pog:md5,0e477541fc88a535d10ec37531198245", + "human_TR_V.psd:md5,9afcedfab46fdad1283dc6932796a56f", + "human_TR_V.psi:md5,9247ca05fe82fb5a528120b3098108b3", + "human_TR_V.psq:md5,4a127b625dcef63b5d0412f7b3e7972b", + "human_V.nhr:md5,18e1447dbb688d21f30781c0a3602cb2", + "human_V.nin:md5,34d4976f789560a3f954203bb8765e2e", + "human_V.nog:md5,3308e60e960e48c12c4a0446aa2ce485", + "human_V.nsd:md5,34506dc9f4d6d385942ea574806669e3", + "human_V.nsi:md5,387635abc8f8ca09293b0bf792bbbfb8", + "human_V.nsq:md5,d3ebdd064a158bdde2708cd19c9cd7d9", + "human_V.phr:md5,d461e9be5047f30963ee7b78c963553a", + "human_V.pin:md5,c0f35ffe97886fe2025a15a829c48749", + "human_V.pog:md5,2aaff4653db578472761e0759b64a768", + "human_V.psd:md5,d1f08d3c624a3770b1232addd7668508", + "human_V.psi:md5,887ac2a9d4cc0e69a94b7543629ab784", + "human_V.psq:md5,35791ac164354b70ad4a35ad9f486f2f", + "mouse.ndm.imgt:md5,352c7f46597497ebf713698fa440ed95", + "mouse.ndm.kabat:md5,2720ae1c09623777e37a116cf9f73823", + "mouse.pdm.imgt:md5,e97ea4cec66d10bceee1ce3518c44082", + "mouse.pdm.kabat:md5,fbce28354f68f4cb6be6333eff6aa0dc", + "mouse_TR_V.nhr:md5,d116d1ef618402cfdbfa75f267813608", + "mouse_TR_V.nin:md5,fcec1baff7bcbe28e71a1e00c24efab7", + "mouse_TR_V.nog:md5,e3dda143f2afc7aa44eb22524049d98e", + "mouse_TR_V.nsd:md5,2d642f4bb76f77bd38f8737f58e9f0f0", + "mouse_TR_V.nsi:md5,9aa022b79d9d063f61ea591ff7a88e7d", + "mouse_TR_V.nsq:md5,61a73abedabb5e8963671f725beb2873", + "mouse_TR_V.phr:md5,4e7cfac13eb50b0b8d8e6d3d49bc5b76", + "mouse_TR_V.pin:md5,2d66648ed028872ac56338a666237a02", + "mouse_TR_V.pog:md5,54a77b456076c55bab9262c76fd7f54f", + "mouse_TR_V.psd:md5,b91ac864d59b2bf1f271255e86c17294", + "mouse_TR_V.psi:md5,b9df1a625a63b5d74499b8c8d7d02e9a", + "mouse_TR_V.psq:md5,6d996ab0e41026b1e28438f25d43c359", + "mouse_V.nhr:md5,32e46aa6a9b13c2e6058a57b11a1cb38", + "mouse_V.nin:md5,319645b00f94d159208f8204c192e89c", + "mouse_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_V.phr:md5,300cf56525199abafa7f69d21ec90d7f", + "mouse_V.pin:md5,32f2c58b40925b798b8c07c98520c625", + "mouse_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "rabbit.ndm.imgt:md5,29910940f8994455d5b632effdb4571f", + "rabbit.ndm.kabat:md5,2a45cb3a7c9e5d103ad6ef1cba3253a9", + "rabbit.pdm.imgt:md5,3ad8b9bb42c7c1e17929cf89f32c549b", + "rabbit.pdm.kabat:md5,5943bba3fcd0d1ba7234843e65876f1f", + "rabbit_V.nhr:md5,83bce87d624c8bd7be460050b81c624d", + "rabbit_V.nin:md5,4b831ea6dac84f0f9db2503d2812a101", + "rabbit_V.nog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.nsd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.nsi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.nsq:md5,6d4450cc6cdd47c35c383c105a2922f6", + "rabbit_V.phr:md5,3c4cac38b9a4a9d74eb5097745c82f2a", + "rabbit_V.pin:md5,78b0eead25d92252420ae988a057977a", + "rabbit_V.pog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.psd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.psi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.psq:md5,4223f96b39e2919008bf46ebf4bc8086", + "rat.ndm.imgt:md5,7317c7d30271cf5eb55dcaaa8d21d08f", + "rat.ndm.kabat:md5,2fd65f271ac90dc2f845053a18bc8136", + "rat.pdm.imgt:md5,6df63cc9e6531a29a592078e26178def", + "rat.pdm.kabat:md5,99996aab7e318763d2f5b3cf45a01c3d", + "rat_V.nhr:md5,bd4c6684859c91444a2ec36f50ce19be", + "rat_V.nin:md5,dd19ca8cd6641846a73681f00590c58e", + "rat_V.nog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.nsd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.nsi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.nsq:md5,08a7b14ce61dab2dfc980e37511ffdba", + "rat_V.phr:md5,10dde83b2bcc323c1f594cd2cf1943db", + "rat_V.pin:md5,f637df718130398afe844085dbe00e61", + "rat_V.pog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.psd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.psi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.psq:md5,7afff0d34e3ac4ce5e27ffcca802f167", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "Entries:md5,637aaed90638717490c792d7db1380ad", + "Repository:md5,e7f792f89c1401fef550063f8ee5e7c8", + "Root:md5,064d27aa012c3bdd8b586bdfa152ae85", + "rhesus_monkey.ndm.imgt:md5,66c289aefc8d7fddf9bf4c9fa34e5f5b", + "rhesus_monkey.ndm.kabat:md5,5f13f6532cb44ae9049e04d108a32b9d", + "rhesus_monkey.pdm.imgt:md5,81629757b65a58851db23647cc6e130c", + "rhesus_monkey.pdm.kabat:md5,c3be9bef7c01b976419fa29121f12b08", + "rhesus_monkey_D.nhr:md5,5dbd53d004414cf37936705f0091f80b", + "rhesus_monkey_D.nin:md5,497cb469125caec99387cc30c244ed7f", + "rhesus_monkey_D.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "rhesus_monkey_D.nsd:md5,421c91caee071b623b25caaa5d37d56b", + "rhesus_monkey_D.nsi:md5,3b0f500e9d51c4a5b25897462b4d3769", + "rhesus_monkey_D.nsq:md5,1280769a0559128141088ee02864674b", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,0717ec6ff45f06b9d3d22b7bb128dcab", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,19c96733bfb8de3b6a177541cae21ed6", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f275f17c6893512860ba23c66e87d865", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "human_gl.aux:md5,5801b62a007c5d98501116d8b6a7dde7", + "human_gl.aux.testonly:md5,b51b2475f3366e8e01a433149341d730", + "mouse_gl.aux:md5,8da2b395709c472408f1f7900a72e986", + "rabbit_gl.aux:md5,c14ec0d70f8fb8274f04521e684579c6", + "rat_gl.aux:md5,8c293acaa9173e734dc99cf32115d5c3", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "rhesus_monkey_gl.aux:md5,92d38df5fe92bf01ff82beb62ec8e43d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T18:18:33.373288" + }, "test curlAndExtract - tar file": { "content": [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" From 5243f3fff905c89c7b55ef1edf0b8f42aec07cf5 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 18:20:46 +0000 Subject: [PATCH 12/24] More tests ! --- tests/curlAndExtract/main.nf.test | 14 + tests/curlAndExtract/main.nf.test.snap | 399 ++++++++++++++++++++++++- 2 files changed, 411 insertions(+), 2 deletions(-) diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index 61784c4..da93cf3 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -57,6 +57,20 @@ nextflow_process { } } + test("test curlAndExtract - tar file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/genome/index/igblast/igblast_base.tar", "${launchDir}/dbs") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + test("test curlAndExtract - tar.gz file") { setup { diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index e16f751..f15280c 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -426,13 +426,408 @@ }, "test curlAndExtract - tar file": { "content": [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + [ + "airr_c_human.tar:md5,a29a0c8d1520ff884e873d9a114684f6", + "airr_c_mouse.tar:md5,b46a8b195eb6d15ed3f84fc51434d126", + "imgt_aa_human_ig_v.pdb:md5,bca60bc424936bd3049579b9d904106b", + "imgt_aa_human_ig_v.phr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_aa_human_ig_v.pin:md5,beb81f86dfd78b84d100049adadd8736", + "imgt_aa_human_ig_v.pjs:md5,8b6a254db719992d738febc70fbfc340", + "imgt_aa_human_ig_v.pog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_aa_human_ig_v.pos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_aa_human_ig_v.pot:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_aa_human_ig_v.psq:md5,1050c1905867e66eb6d6ed82ca81966f", + "imgt_aa_human_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_ig_v.pto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_aa_human_tr_v.pdb:md5,b20fb1d634bcac4e7b3b641f46ee6572", + "imgt_aa_human_tr_v.phr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_aa_human_tr_v.pin:md5,b1029173840eb6a118c103feac3f7e7a", + "imgt_aa_human_tr_v.pjs:md5,e352b4ffa68c204068c3c0398f1c8f06", + "imgt_aa_human_tr_v.pog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_aa_human_tr_v.pos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_aa_human_tr_v.pot:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_aa_human_tr_v.psq:md5,02a78615a1d0630d98a323be4bc34fc1", + "imgt_aa_human_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_tr_v.pto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_aa_mouse_ig_v.pdb:md5,58ea125f6ab44075e31bd89324263398", + "imgt_aa_mouse_ig_v.phr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_aa_mouse_ig_v.pin:md5,d6e3e85522830f9c07a3ca23638b1645", + "imgt_aa_mouse_ig_v.pjs:md5,3676804d02cab0a65c0d62b5ab3eb350", + "imgt_aa_mouse_ig_v.pog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_aa_mouse_ig_v.pos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_aa_mouse_ig_v.pot:md5,81c46146154842750edbc3923e291198", + "imgt_aa_mouse_ig_v.psq:md5,5ec21c57d53c2313513076565b8fbe32", + "imgt_aa_mouse_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_ig_v.pto:md5,688627d85d01244e960293af8801aa6b", + "imgt_aa_mouse_tr_v.pdb:md5,fdebe60bd497eed071bed4bf9e2c2c23", + "imgt_aa_mouse_tr_v.phr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_aa_mouse_tr_v.pin:md5,7b205e758c0d20885e60d43d4ed951f5", + "imgt_aa_mouse_tr_v.pjs:md5,b2c080a95c7cb06442409b42de0b260e", + "imgt_aa_mouse_tr_v.pog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_aa_mouse_tr_v.pos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_aa_mouse_tr_v.pot:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_aa_mouse_tr_v.psq:md5,b8c61da709681a273f414d7013a0870b", + "imgt_aa_mouse_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_tr_v.pto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "imgt_human_ig_c.ndb:md5,bab6dfb53156e3e0234ecf260feeb242", + "imgt_human_ig_c.nhr:md5,fb276ae5f21e244aca3be962caa02140", + "imgt_human_ig_c.nin:md5,2fce33436614bed3ecbde7fbc85bd089", + "imgt_human_ig_c.njs:md5,7be706d5b0183bc843c89216cb486087", + "imgt_human_ig_c.nog:md5,277272dc12bd9fe292f2d246e79ae285", + "imgt_human_ig_c.nos:md5,f635fb577ef680c93f8ad2fffb2c56da", + "imgt_human_ig_c.not:md5,595be8a48ce988e8b1fc9ae81d9820a1", + "imgt_human_ig_c.nsq:md5,ce0f34cca8391e736b389b538fcd582e", + "imgt_human_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_c.nto:md5,6d94619292c57dcc852a16207808a186", + "imgt_human_ig_d.ndb:md5,cfb6c207cc3e15edd6dff7a512da2f05", + "imgt_human_ig_d.nhr:md5,df5706fd3491f0654676701d2d983a02", + "imgt_human_ig_d.nin:md5,4bb0200ca933ebc0d40f3093da3f079b", + "imgt_human_ig_d.njs:md5,21e632ea22f6c2b2cfcafa5a7c07bea8", + "imgt_human_ig_d.nog:md5,2fe6ddc46991f9d261bb3f4217555b37", + "imgt_human_ig_d.nos:md5,2d6e790963695bea5f32d238deb67bbb", + "imgt_human_ig_d.not:md5,f9385bcae5f780aa6bd2acf5f03d3a28", + "imgt_human_ig_d.nsq:md5,eeed28974865d16f4aacef1ba1ad2769", + "imgt_human_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_d.nto:md5,259f033be03d566926d716eab2077919", + "imgt_human_ig_j.ndb:md5,b2732139bfc1f3651e90e326a60a43f1", + "imgt_human_ig_j.nhr:md5,eab83a9cdc96b3153c28a1b42a4a0926", + "imgt_human_ig_j.nin:md5,e26f9f57799e442c05c59836ed6d4a7c", + "imgt_human_ig_j.njs:md5,1181e1865512cf31c07c828a42c0f7df", + "imgt_human_ig_j.nog:md5,eb76e077a2b5101fc51c45fe2cc3a4ef", + "imgt_human_ig_j.nos:md5,b3879f5f8e1b42c0232c56d2dd74436a", + "imgt_human_ig_j.not:md5,c1a4db8fc9de9569a2b05532bd10573b", + "imgt_human_ig_j.nsq:md5,cc0890d3aeb8ca90207fdc55ca73ea6a", + "imgt_human_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_j.nto:md5,b454eda6ec47d3ba37106ffb7234eb6a", + "imgt_human_ig_v.ndb:md5,7f54a4459b22dff18182858ff7eb6736", + "imgt_human_ig_v.nhr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_human_ig_v.nin:md5,3f3fc9b5681c2975fdd1f346bbb5f57b", + "imgt_human_ig_v.njs:md5,5beea91d2e64d2d3cc025711a3aac6be", + "imgt_human_ig_v.nog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_human_ig_v.nos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_human_ig_v.not:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_human_ig_v.nsq:md5,65fd7c7490d4724b046b19b8d5089152", + "imgt_human_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_v.nto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_human_tr_c.ndb:md5,207888a1424c2e28967db58976515959", + "imgt_human_tr_c.nhr:md5,d60efc0d8d6d239cf137c6bbf9145f2c", + "imgt_human_tr_c.nin:md5,0e9a3bc083040702cea7e8593fef5589", + "imgt_human_tr_c.njs:md5,959a466665a3fb37678e35cabe519740", + "imgt_human_tr_c.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "imgt_human_tr_c.nos:md5,6cddf70aab94ff06f4ff094aa111d0db", + "imgt_human_tr_c.not:md5,2030b82268722e50fbbe0c3f4977a24a", + "imgt_human_tr_c.nsq:md5,1b38231f546d64850369b16eb32ab6b4", + "imgt_human_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_c.nto:md5,fe1ae01c06a57e09fa931e1ba7889c29", + "imgt_human_tr_d.ndb:md5,9f380ca23aba188a66a7dd63a55e0306", + "imgt_human_tr_d.nhr:md5,30ab9fd7b8e05a3cf04aed8bf5820ed1", + "imgt_human_tr_d.nin:md5,31445ebf0c14a1373ec555b1e728f1b7", + "imgt_human_tr_d.njs:md5,d4ba25a8a9f3b127cebe364e71fa179b", + "imgt_human_tr_d.nog:md5,5eaf4848fc8cde9e6a10e7fbff9cf338", + "imgt_human_tr_d.nos:md5,43df4232aeccb54c78c8865e5f5f08e5", + "imgt_human_tr_d.not:md5,0d634bbc846724bcf18d4dd3404c7902", + "imgt_human_tr_d.nsq:md5,12ab7e82d181c77ed36ff79e58cbcbcd", + "imgt_human_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_d.nto:md5,c1107debee8ee834a6d9383035dfe8a1", + "imgt_human_tr_j.ndb:md5,88d22d2662f17cc129b2b9fe05738439", + "imgt_human_tr_j.nhr:md5,e98a94e6de1d6af434b0ee8b9626a83c", + "imgt_human_tr_j.nin:md5,1175a138c8927ecf75fa90e83481869c", + "imgt_human_tr_j.njs:md5,7ffea2f9852c975ed4567969149a73bc", + "imgt_human_tr_j.nog:md5,c54125652e33caa645ed3157c2b57930", + "imgt_human_tr_j.nos:md5,f3c8792cd4b84eb72f412583e7a79de9", + "imgt_human_tr_j.not:md5,bbc18fbbcd4769570f8fbee3684cafbd", + "imgt_human_tr_j.nsq:md5,07b64be165c909fa66608b25d7bb25b1", + "imgt_human_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_j.nto:md5,0028dd1ab17d0c47acf5840c6a8d5e59", + "imgt_human_tr_v.ndb:md5,140edbe154feaa4ff6f1e162a6b14779", + "imgt_human_tr_v.nhr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_human_tr_v.nin:md5,24d1391a35a39a37f72cb3d564b6e5e5", + "imgt_human_tr_v.njs:md5,228f5e48054b3486fd82d32f93f6c0b3", + "imgt_human_tr_v.nog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_human_tr_v.nos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_human_tr_v.not:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_human_tr_v.nsq:md5,6a1d58da1db798ed8a726f51bf4edcc0", + "imgt_human_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_v.nto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_mouse_ig_c.ndb:md5,b74c2efc68a76ab4205d14ad853d5454", + "imgt_mouse_ig_c.nhr:md5,67d730c045ccba37591ae7f8d16b9d17", + "imgt_mouse_ig_c.nin:md5,f610dcf38c2d7c5537be6e4fc036a6b4", + "imgt_mouse_ig_c.njs:md5,c244ec84002cca1d696aa604fa6701c4", + "imgt_mouse_ig_c.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "imgt_mouse_ig_c.nos:md5,7cf6c745889857e2598735a49039c6b5", + "imgt_mouse_ig_c.not:md5,873faccbdcaadf20738757ff3fd83f33", + "imgt_mouse_ig_c.nsq:md5,4b97fc13d8ef76fadbfd5ed6124a2ba9", + "imgt_mouse_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_c.nto:md5,706b67145a22e8efbb8670a43b1e0cd3", + "imgt_mouse_ig_d.ndb:md5,b19fad9596341e0c288c0d58f4e2a81a", + "imgt_mouse_ig_d.nhr:md5,15b3f325ded60f6fcd020f5952503aba", + "imgt_mouse_ig_d.nin:md5,403de5e9bfebe7e0ca6b9e0db4bde562", + "imgt_mouse_ig_d.njs:md5,7cb6b95a853297946722ccdfae82e1cb", + "imgt_mouse_ig_d.nog:md5,d982f8a082df6bd7192e24229d555974", + "imgt_mouse_ig_d.nos:md5,249fc0539304e158d34d6ffa85db0a83", + "imgt_mouse_ig_d.not:md5,8f4cf856e9c39e1d1a83048ae9875d33", + "imgt_mouse_ig_d.nsq:md5,96e233401ac56520d13ad7ab72349185", + "imgt_mouse_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_d.nto:md5,f299f5722008a1205618f210439834ae", + "imgt_mouse_ig_j.ndb:md5,39e3dc08e5b0f00302d82e3920c643c9", + "imgt_mouse_ig_j.nhr:md5,e84cc08006969b9826af412b6f6626d7", + "imgt_mouse_ig_j.nin:md5,682a0c1e72e0b1422e3b661349531f1d", + "imgt_mouse_ig_j.njs:md5,7be4e74aaa67e4d7b55ac66a58e77291", + "imgt_mouse_ig_j.nog:md5,2f6aeaf3176b34332fcaf214f1698e55", + "imgt_mouse_ig_j.nos:md5,ee8f7ec3b1bba39b01a5f19df20da7dc", + "imgt_mouse_ig_j.not:md5,68fee53d6fc665eb87e45b866468ac32", + "imgt_mouse_ig_j.nsq:md5,17c0295a1202e26cdb670acaef745e16", + "imgt_mouse_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_j.nto:md5,a31324bf954edb7631e885d85d78103b", + "imgt_mouse_ig_v.ndb:md5,2de2e989ea109e09da297f30ca20667a", + "imgt_mouse_ig_v.nhr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_mouse_ig_v.nin:md5,030c13edc786cf4c8e1ad4491f36892c", + "imgt_mouse_ig_v.njs:md5,1f29a9ae41a04cc765d7b68cd560c1f1", + "imgt_mouse_ig_v.nog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_mouse_ig_v.nos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_mouse_ig_v.not:md5,81c46146154842750edbc3923e291198", + "imgt_mouse_ig_v.nsq:md5,8341057557b2c8a6a01185f8a4bedbcc", + "imgt_mouse_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_v.nto:md5,688627d85d01244e960293af8801aa6b", + "imgt_mouse_tr_c.ndb:md5,c699657e06c538df1abab26d54ba41d2", + "imgt_mouse_tr_c.nhr:md5,d73e399d3210fd72ec295fe9255204c6", + "imgt_mouse_tr_c.nin:md5,39c38148a1dd0cf8f5ffb617e40ddc3d", + "imgt_mouse_tr_c.njs:md5,fe326257dad06b92387369475bd42ba7", + "imgt_mouse_tr_c.nog:md5,df85d18647b8f011ed85756b3145e111", + "imgt_mouse_tr_c.nos:md5,721c50deeef515303652f32f27a9ab2b", + "imgt_mouse_tr_c.not:md5,24f16daf335352fe2bfca7094bdbd79d", + "imgt_mouse_tr_c.nsq:md5,bd58d1eeca6249ba5ea4b7fffbb14a76", + "imgt_mouse_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_c.nto:md5,6df5535bce3294d057801d66a7c7701e", + "imgt_mouse_tr_d.ndb:md5,a8b37cb08e95964af2b6e1c219f5b53f", + "imgt_mouse_tr_d.nhr:md5,0f6ae6f691944d27b89811f64e7619e7", + "imgt_mouse_tr_d.nin:md5,2ef920a85e448c680ca25cb7424d83a7", + "imgt_mouse_tr_d.njs:md5,269418b7c005a66988da4444c90306b6", + "imgt_mouse_tr_d.nog:md5,c5aa62546a588032ae22df69236ab525", + "imgt_mouse_tr_d.nos:md5,e43e912b61ba5e5d5ef4331ae3ac36b2", + "imgt_mouse_tr_d.not:md5,667c9af4cfdc07e4bbb6ef858e9e6fb3", + "imgt_mouse_tr_d.nsq:md5,7a3189aa9369c6eac91ec418a851fbed", + "imgt_mouse_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_d.nto:md5,afd0f544d132c4f72e97c866cc192fe1", + "imgt_mouse_tr_j.ndb:md5,e9d0ffcf8e6090ad2513cebc3e95f05a", + "imgt_mouse_tr_j.nhr:md5,bbd8b1aef821763537766eaae1b23c63", + "imgt_mouse_tr_j.nin:md5,96d6a34a7d54d9a77c70116ad249e3b3", + "imgt_mouse_tr_j.njs:md5,612c17d3e7c517844c79e03ba352a0b4", + "imgt_mouse_tr_j.nog:md5,6e8d11a76190d47ae644aa68e418cd3a", + "imgt_mouse_tr_j.nos:md5,3eff94779164fd38e60a1b6b9e38db6a", + "imgt_mouse_tr_j.not:md5,a65680020c287f8ece6787a63536c91d", + "imgt_mouse_tr_j.nsq:md5,3e751130114bfae43aa5cc9641b77db4", + "imgt_mouse_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_j.nto:md5,a4083c809fe1a59ce4590d033579345d", + "imgt_mouse_tr_v.ndb:md5,9c96b5a88aecf92990d2a9478981f5bc", + "imgt_mouse_tr_v.nhr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_mouse_tr_v.nin:md5,b3f3f09ead35acbd41931ed8290fee71", + "imgt_mouse_tr_v.njs:md5,82aaf433290049914a9d70c1f323ceb0", + "imgt_mouse_tr_v.nog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_mouse_tr_v.nos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_mouse_tr_v.not:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_mouse_tr_v.nsq:md5,89774a3086001a0238cef3462633c2fb", + "imgt_mouse_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_v.nto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "mouse_gl_D.nhr:md5,a832b15e9a5449f42a54dfd6c9f53cd0", + "mouse_gl_D.nin:md5,e7f91f781cf6ccc50868f7dfffda69e8", + "mouse_gl_D.nog:md5,7f4fff8e3d0dbcd4ca2a3b1f3673f5d5", + "mouse_gl_D.nsd:md5,5e49254772451138f955e36b8027cd19", + "mouse_gl_D.nsi:md5,653a7177b44c583aff703c83408d657f", + "mouse_gl_D.nsq:md5,3259c782003b3e425410aa255a515ebe", + "mouse_gl_J.nhr:md5,89c7a3cbe897890ac294243ba283ba6b", + "mouse_gl_J.nin:md5,ffd09e9e8fd21ccb2ed1ab24d3dfe8b9", + "mouse_gl_J.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "mouse_gl_J.nsd:md5,e94a6ad2cfe42c76593e16fd040bb929", + "mouse_gl_J.nsi:md5,61e91a6d1fa9b56587406dfcf7167dd2", + "mouse_gl_J.nsq:md5,26397eca0849e81f650001d316f592b6", + "mouse_gl_V.nhr:md5,0abe6bdca2b08e47bee3679bcce0b63b", + "mouse_gl_V.nin:md5,47c2c821445f55ea2d1191b090fdb132", + "mouse_gl_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_gl_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_gl_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_gl_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_gl_V.phr:md5,d204d83e0b7c698e13ef12e5e3b9bf60", + "mouse_gl_V.pin:md5,23b5ce4a46a3d81c6f8f7aabc6e7824d", + "mouse_gl_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_gl_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_gl_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_gl_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "mouse_gl_VDJ.tar:md5,e3485278d8ba068638a9d3428553e6a2", + "ncbi_human_c_genes.tar:md5,a8f1112969c8b552bdab3f488bbd0c47", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,fdbf43e4459fad96eeba391ec598c958", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,d273393e8dc187c816414f260348944e", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f25deb7f0151944e411af5880b8c8a55", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "rhesus_monkey_VJ.tar:md5,9e918cf291f34a391bb6398325a78db5", + "imgt_aa_human_ig_v.fasta:md5,30b9ca0f29a61c2459482fe30cfe19b6", + "imgt_aa_human_tr_v.fasta:md5,43f11ae863217d575626c20b7d84adb8", + "imgt_aa_mouse_ig_v.fasta:md5,edac8c37e0408f9f6c8d232d79ffc8be", + "imgt_aa_mouse_tr_v.fasta:md5,3e172585de3b78916c2711c5f3ddcb25", + "imgt_human_ig_c.fasta:md5,d660c41cc2bec165cd5ace32405eff39", + "imgt_human_ig_d.fasta:md5,935b4bb5442897f8d97051a4f2fe37d0", + "imgt_human_ig_j.fasta:md5,d7c28fd1c42b3d72b630e290d76fe409", + "imgt_human_ig_v.fasta:md5,0f604ba84709db16f9d4f0eafbd261ba", + "imgt_human_tr_c.fasta:md5,71b3865449c1a42a9e4f59b3ecdf3256", + "imgt_human_tr_d.fasta:md5,fe5ac92ba4d4e2ef0a001685e07b3914", + "imgt_human_tr_j.fasta:md5,dcae2f9293af89398f5df0b4acd60981", + "imgt_human_tr_v.fasta:md5,bcb1b21e6943da537f1e7fdcfce31119", + "imgt_mouse_ig_c.fasta:md5,b778e2bcea4e0a170404b28bd648522c", + "imgt_mouse_ig_d.fasta:md5,aa246ba4e5fa2eaad83ac7daab234772", + "imgt_mouse_ig_j.fasta:md5,3b220b309cc4d15b4cb120aae9e88170", + "imgt_mouse_ig_v.fasta:md5,875b17ff8b5ab819c3e1b332492c494d", + "imgt_mouse_tr_c.fasta:md5,b476e7d4fbd8768ace3877633c6b22de", + "imgt_mouse_tr_d.fasta:md5,3cf6735d31ca794bcf684fa2ccc3d148", + "imgt_mouse_tr_j.fasta:md5,4ef4d35a0e1d770873ae84dd0336d475", + "imgt_mouse_tr_v.fasta:md5,db73f796a88b77f1bbf2964f57a02285", + "human.ndm.imgt:md5,d6cea490480cecfeb082c66607126ff0", + "human.ndm.kabat:md5,294da2ace8c28701ba26406226acf9af", + "human.pdm.imgt:md5,eee1e720fe17bc2b74055dad690c5c3c", + "human.pdm.kabat:md5,2a09fe4aafb06a24ae09866ee2e874e2", + "human_TR_V.nhr:md5,05e85d4422ddd63b251798ad52afbb07", + "human_TR_V.nin:md5,479cf56d41b7708db836278c6090297a", + "human_TR_V.nog:md5,27b8711de1d9cb4a09de4fffd52cd7b4", + "human_TR_V.nsd:md5,1bd3fc688986ca1cd3cbf0ba341e6e88", + "human_TR_V.nsi:md5,902ee2023646ab9d5c2e8bd9e7cd9a74", + "human_TR_V.nsq:md5,1d6eaff8a9696dfb81f54c253adb3e8f", + "human_TR_V.phr:md5,289fad3fda3ca9a4b9dc62a436bb8ba1", + "human_TR_V.pin:md5,b974c4c2e06a7b15e8113b8a114e2a01", + "human_TR_V.pog:md5,0e477541fc88a535d10ec37531198245", + "human_TR_V.psd:md5,9afcedfab46fdad1283dc6932796a56f", + "human_TR_V.psi:md5,9247ca05fe82fb5a528120b3098108b3", + "human_TR_V.psq:md5,4a127b625dcef63b5d0412f7b3e7972b", + "human_V.nhr:md5,18e1447dbb688d21f30781c0a3602cb2", + "human_V.nin:md5,34d4976f789560a3f954203bb8765e2e", + "human_V.nog:md5,3308e60e960e48c12c4a0446aa2ce485", + "human_V.nsd:md5,34506dc9f4d6d385942ea574806669e3", + "human_V.nsi:md5,387635abc8f8ca09293b0bf792bbbfb8", + "human_V.nsq:md5,d3ebdd064a158bdde2708cd19c9cd7d9", + "human_V.phr:md5,d461e9be5047f30963ee7b78c963553a", + "human_V.pin:md5,c0f35ffe97886fe2025a15a829c48749", + "human_V.pog:md5,2aaff4653db578472761e0759b64a768", + "human_V.psd:md5,d1f08d3c624a3770b1232addd7668508", + "human_V.psi:md5,887ac2a9d4cc0e69a94b7543629ab784", + "human_V.psq:md5,35791ac164354b70ad4a35ad9f486f2f", + "mouse.ndm.imgt:md5,352c7f46597497ebf713698fa440ed95", + "mouse.ndm.kabat:md5,2720ae1c09623777e37a116cf9f73823", + "mouse.pdm.imgt:md5,e97ea4cec66d10bceee1ce3518c44082", + "mouse.pdm.kabat:md5,fbce28354f68f4cb6be6333eff6aa0dc", + "mouse_TR_V.nhr:md5,d116d1ef618402cfdbfa75f267813608", + "mouse_TR_V.nin:md5,fcec1baff7bcbe28e71a1e00c24efab7", + "mouse_TR_V.nog:md5,e3dda143f2afc7aa44eb22524049d98e", + "mouse_TR_V.nsd:md5,2d642f4bb76f77bd38f8737f58e9f0f0", + "mouse_TR_V.nsi:md5,9aa022b79d9d063f61ea591ff7a88e7d", + "mouse_TR_V.nsq:md5,61a73abedabb5e8963671f725beb2873", + "mouse_TR_V.phr:md5,4e7cfac13eb50b0b8d8e6d3d49bc5b76", + "mouse_TR_V.pin:md5,2d66648ed028872ac56338a666237a02", + "mouse_TR_V.pog:md5,54a77b456076c55bab9262c76fd7f54f", + "mouse_TR_V.psd:md5,b91ac864d59b2bf1f271255e86c17294", + "mouse_TR_V.psi:md5,b9df1a625a63b5d74499b8c8d7d02e9a", + "mouse_TR_V.psq:md5,6d996ab0e41026b1e28438f25d43c359", + "mouse_V.nhr:md5,32e46aa6a9b13c2e6058a57b11a1cb38", + "mouse_V.nin:md5,319645b00f94d159208f8204c192e89c", + "mouse_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_V.phr:md5,300cf56525199abafa7f69d21ec90d7f", + "mouse_V.pin:md5,32f2c58b40925b798b8c07c98520c625", + "mouse_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "rabbit.ndm.imgt:md5,29910940f8994455d5b632effdb4571f", + "rabbit.ndm.kabat:md5,2a45cb3a7c9e5d103ad6ef1cba3253a9", + "rabbit.pdm.imgt:md5,3ad8b9bb42c7c1e17929cf89f32c549b", + "rabbit.pdm.kabat:md5,5943bba3fcd0d1ba7234843e65876f1f", + "rabbit_V.nhr:md5,83bce87d624c8bd7be460050b81c624d", + "rabbit_V.nin:md5,4b831ea6dac84f0f9db2503d2812a101", + "rabbit_V.nog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.nsd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.nsi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.nsq:md5,6d4450cc6cdd47c35c383c105a2922f6", + "rabbit_V.phr:md5,3c4cac38b9a4a9d74eb5097745c82f2a", + "rabbit_V.pin:md5,78b0eead25d92252420ae988a057977a", + "rabbit_V.pog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.psd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.psi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.psq:md5,4223f96b39e2919008bf46ebf4bc8086", + "rat.ndm.imgt:md5,7317c7d30271cf5eb55dcaaa8d21d08f", + "rat.ndm.kabat:md5,2fd65f271ac90dc2f845053a18bc8136", + "rat.pdm.imgt:md5,6df63cc9e6531a29a592078e26178def", + "rat.pdm.kabat:md5,99996aab7e318763d2f5b3cf45a01c3d", + "rat_V.nhr:md5,bd4c6684859c91444a2ec36f50ce19be", + "rat_V.nin:md5,dd19ca8cd6641846a73681f00590c58e", + "rat_V.nog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.nsd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.nsi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.nsq:md5,08a7b14ce61dab2dfc980e37511ffdba", + "rat_V.phr:md5,10dde83b2bcc323c1f594cd2cf1943db", + "rat_V.pin:md5,f637df718130398afe844085dbe00e61", + "rat_V.pog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.psd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.psi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.psq:md5,7afff0d34e3ac4ce5e27ffcca802f167", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "Entries:md5,637aaed90638717490c792d7db1380ad", + "Repository:md5,e7f792f89c1401fef550063f8ee5e7c8", + "Root:md5,064d27aa012c3bdd8b586bdfa152ae85", + "rhesus_monkey.ndm.imgt:md5,66c289aefc8d7fddf9bf4c9fa34e5f5b", + "rhesus_monkey.ndm.kabat:md5,5f13f6532cb44ae9049e04d108a32b9d", + "rhesus_monkey.pdm.imgt:md5,81629757b65a58851db23647cc6e130c", + "rhesus_monkey.pdm.kabat:md5,c3be9bef7c01b976419fa29121f12b08", + "rhesus_monkey_D.nhr:md5,5dbd53d004414cf37936705f0091f80b", + "rhesus_monkey_D.nin:md5,497cb469125caec99387cc30c244ed7f", + "rhesus_monkey_D.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "rhesus_monkey_D.nsd:md5,421c91caee071b623b25caaa5d37d56b", + "rhesus_monkey_D.nsi:md5,3b0f500e9d51c4a5b25897462b4d3769", + "rhesus_monkey_D.nsq:md5,1280769a0559128141088ee02864674b", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,0717ec6ff45f06b9d3d22b7bb128dcab", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,19c96733bfb8de3b6a177541cae21ed6", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f275f17c6893512860ba23c66e87d865", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "human_gl.aux:md5,5801b62a007c5d98501116d8b6a7dde7", + "human_gl.aux.testonly:md5,b51b2475f3366e8e01a433149341d730", + "mouse_gl.aux:md5,8da2b395709c472408f1f7900a72e986", + "rabbit_gl.aux:md5,c14ec0d70f8fb8274f04521e684579c6", + "rat_gl.aux:md5,8c293acaa9173e734dc99cf32115d5c3", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "rhesus_monkey_gl.aux:md5,92d38df5fe92bf01ff82beb62ec8e43d" + ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:09:58.396939" + "timestamp": "2025-12-08T18:19:59.270286" }, "test curlAndExtract - tar.gz file": { "content": [ From 61518c12bfba3d3d7f8c8e3a6492feb843e72746 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 22:38:42 +0000 Subject: [PATCH 13/24] Snapshots not used --- tests/curlAndExtract/main.nf.test.snap | 40 -------------------------- 1 file changed, 40 deletions(-) diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index f15280c..29e16cd 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -849,36 +849,6 @@ }, "timestamp": "2025-12-08T18:15:31.577887" }, - "ncbi.tre": { - "content": [ - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:14:00.631636" - }, - "test curlAndUnzip": { - "content": [ - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:12:17.78509" - }, - "ncbi.map": { - "content": [ - "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:14:00.643146" - }, "curlAndUnzip:ncbi.tre": { "content": [ "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.tre" @@ -889,16 +859,6 @@ }, "timestamp": "2025-12-08T18:15:22.913108" }, - "test curlAndUntar": { - "content": [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:08:36.000435" - }, "curlAndUnzip:ncbi.map": { "content": [ "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.map" From 6857bb4686722040a39b19e573c66107fd29fc58 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 22:49:47 +0000 Subject: [PATCH 14/24] Added checksums --- tests/curlAndExtract/main.nf.test.snap | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 29e16cd..1f352bc 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,7 +1,7 @@ { "test curlAndUntar - tar.gz file": { "content": [ - "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/99d04a37d921676abee32e4e8b009a96/dbs/hello.txt" + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" ], "meta": { "nf-test": "0.8.4", @@ -831,7 +831,7 @@ }, "test curlAndExtract - tar.gz file": { "content": [ - "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/9abafa0eede6518438d02fc7cdfa7d76/dbs/hello.txt" + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" ], "meta": { "nf-test": "0.8.4", @@ -851,7 +851,7 @@ }, "curlAndUnzip:ncbi.tre": { "content": [ - "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.tre" + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" ], "meta": { "nf-test": "0.8.4", @@ -861,7 +861,7 @@ }, "curlAndUnzip:ncbi.map": { "content": [ - "/Users/mm49/workspace/tol-it/nextflow/nf-test/nft-utils/.nf-test/tests/edfac76b3b8f0c4ecd3bd5cacb54bd53/dbs/ncbi.map" + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" ], "meta": { "nf-test": "0.8.4", From b2f80b67e3dcd6f12fd36a14b07ee62d5aa0e981 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 23:00:11 +0000 Subject: [PATCH 15/24] More documentation --- docs/usage.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 65f3c70..1f7ecfb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -590,3 +590,29 @@ cleanup { new File("${launchDir}/data_dir/db").deleteDir() } ``` + +### `curlAndExtract()` - Download and extract an archive + +The `curlAndExtract()` function is used to download an archive +from the Internet with `curl` and extract it in the required destination +directory. +Zip and Tar archives are currently supported, thanks to the above +`curlAndUntar` and `curlAndUnzip`. + +You are responsible for deleting the data in the `cleanup` phase. + +```groovy +setup { + curlAndExtract("https://www.example.com/database.zip", "${launchDir}/data_dir") +} + +when { + params { + db_path = "${launchDir}/data_dir/db/" + } +} + +cleanup { + new File("${launchDir}/data_dir/db").deleteDir() +} +``` From 5bd11e324840c71e62a918390e9d2a3a6257fb7d Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 23:04:01 +0000 Subject: [PATCH 16/24] Not used --- src/main/java/nf_core/nf/test/utils/Utils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/nf_core/nf/test/utils/Utils.java b/src/main/java/nf_core/nf/test/utils/Utils.java index 15f024c..2b51e37 100644 --- a/src/main/java/nf_core/nf/test/utils/Utils.java +++ b/src/main/java/nf_core/nf/test/utils/Utils.java @@ -1,7 +1,6 @@ package nf_core.nf.test.utils; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStreamReader; From 6b9bbad20f49c660da865b1fe4cea726fba5f9f6 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 23:05:03 +0000 Subject: [PATCH 17/24] stdout is always discarded here --- src/main/java/nf_core/nf/test/utils/Utils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/nf_core/nf/test/utils/Utils.java b/src/main/java/nf_core/nf/test/utils/Utils.java index 2b51e37..4c787e6 100644 --- a/src/main/java/nf_core/nf/test/utils/Utils.java +++ b/src/main/java/nf_core/nf/test/utils/Utils.java @@ -24,7 +24,6 @@ public ProcessResult(int exitCode, String stderr) { * and returns a {@link ProcessResult}. */ public static ProcessResult runProcess(ProcessBuilder pb) throws IOException, InterruptedException { - // If stdout isn't already redirected, discard it to avoid blocking pb.redirectOutput(ProcessBuilder.Redirect.DISCARD); Process process = pb.start(); BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); From d98456acfc22c955d3c0d8f4846bf8ea34568e44 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Mon, 8 Dec 2025 23:35:58 +0000 Subject: [PATCH 18/24] For simplicity and reliability, use getAllFilesFromDir everywhere --- tests/curlAndExtract/main.nf.test | 34 +++++------------- tests/curlAndExtract/main.nf.test.snap | 50 +++++++++++--------------- 2 files changed, 28 insertions(+), 56 deletions(-) diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index da93cf3..ef052b0 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -26,11 +26,8 @@ nextflow_process { curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") } then { - def expected_file = "${launchDir}/dbs/hello.txt" - assertAll( - { assert path(expected_file).exists() }, - { assert snapshot(expected_file).match() }, - ) + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() } cleanup { new File("${launchDir}/dbs").deleteDir() @@ -43,14 +40,8 @@ nextflow_process { curlAndUnzip("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs") } then { - def expected_file1 = "${launchDir}/dbs/ncbi.tre" - def expected_file2 = "${launchDir}/dbs/ncbi.map" - assertAll( - { assert path(expected_file1).exists() }, - { assert path(expected_file2).exists() }, - { assert snapshot(expected_file1).match("curlAndUnzip:ncbi.tre") }, - { assert snapshot(expected_file2).match("curlAndUnzip:ncbi.map") }, - ) + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() } cleanup { new File("${launchDir}/dbs").deleteDir() @@ -77,11 +68,8 @@ nextflow_process { curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") } then { - def expected_file = "${launchDir}/dbs/hello.txt" - assertAll( - { assert path(expected_file).exists() }, - { assert snapshot(expected_file).match() }, - ) + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() } cleanup { new File("${launchDir}/dbs").deleteDir() @@ -94,14 +82,8 @@ nextflow_process { curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs") } then { - def expected_file1 = "${launchDir}/dbs/ncbi.tre" - def expected_file2 = "${launchDir}/dbs/ncbi.map" - assertAll( - { assert path(expected_file1).exists() }, - { assert path(expected_file2).exists() }, - { assert snapshot(expected_file1).match("curlAndExtract:ncbi.tre") }, - { assert snapshot(expected_file2).match("curlAndExtract:ncbi.map") }, - ) + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() } cleanup { new File("${launchDir}/dbs").deleteDir() diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 1f352bc..61a9fb5 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,23 +1,15 @@ { "test curlAndUntar - tar.gz file": { "content": [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:15:18.388651" - }, - "curlAndExtract:ncbi.map": { - "content": [ - "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:15:31.586426" + "timestamp": "2025-12-08T23:27:19.495861" }, "test curlAndUntar - tar file": { "content": [ @@ -831,42 +823,40 @@ }, "test curlAndExtract - tar.gz file": { "content": [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:15:27.556287" - }, - "curlAndExtract:ncbi.tre": { - "content": [ - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:15:31.577887" + "timestamp": "2025-12-08T23:29:52.440355" }, - "curlAndUnzip:ncbi.tre": { + "test curlAndExtract - zip file": { "content": [ - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + [ + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:15:22.913108" + "timestamp": "2025-12-08T23:32:07.753491" }, - "curlAndUnzip:ncbi.map": { + "test curlAndUnzip": { "content": [ - "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952" + [ + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:15:22.922001" + "timestamp": "2025-12-08T23:33:12.404121" } } \ No newline at end of file From 9500d1ef916f05a9322fbdf775bbb4edc514e4c4 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 10:05:59 +0000 Subject: [PATCH 19/24] Ubuntu's tar cannot detect the compression type from a pipe --- docs/usage.md | 60 +-- .../java/nf_core/nf/test/utils/Methods.java | 62 ++- tests/curlAndExtract/main.nf.test | 44 +- tests/curlAndExtract/main.nf.test.snap | 434 +----------------- 4 files changed, 62 insertions(+), 538 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 1f7ecfb..cf2fe19 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -543,72 +543,28 @@ then { } ``` -### `curlAndUntar()` - Download and extract a Tar archive - -The `curlAndUntar()` function is used to download a tar archive (possibly compressed) -from the Internet with `curl` and extract it in the required destination -directory. `tar` automatically recognises compressed archives such as `tar.gz`, `tar.bz2`, etc. - -You are responsible for deleting the data in the `cleanup` phase. - -```groovy -setup { - curlAndUntar("https://www.example.com/database.tar.gz", "${launchDir}/data_dir") -} - -when { - params { - db_path = "${launchDir}/data_dir/db/" - } -} - -cleanup { - new File("${launchDir}/data_dir/db").deleteDir() -} -``` - -### `curlAndUnzip()` - Download and extract a Zip archive - -The `curlAndUnzip()` function is used to download a zip archive -from the Internet with `curl` and extract it in the required destination -directory. - -You are responsible for deleting the data in the `cleanup` phase. - -```groovy -setup { - curlAndUnzip("https://www.example.com/database.zip", "${launchDir}/data_dir") -} - -when { - params { - db_path = "${launchDir}/data_dir/db/" - } -} - -cleanup { - new File("${launchDir}/data_dir/db").deleteDir() -} -``` - ### `curlAndExtract()` - Download and extract an archive The `curlAndExtract()` function is used to download an archive from the Internet with `curl` and extract it in the required destination directory. -Zip and Tar archives are currently supported, thanks to the above -`curlAndUntar` and `curlAndUnzip`. +Zip and Tar archives are currently supported. Tar archives can be compressed +with any of these algorithms: gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd. +The choice of archive format and compression algorithm is based on +the name of the archive. You are responsible for deleting the data in the `cleanup` phase. ```groovy setup { - curlAndExtract("https://www.example.com/database.zip", "${launchDir}/data_dir") + curlAndExtract("https://www.example.com/pretty_database.zip", "${launchDir}/data_dir") + curlAndExtract("https://www.example.com/beautiful_database.tar.gz", "${launchDir}/data_dir") } when { params { - db_path = "${launchDir}/data_dir/db/" + pretty_db_path = "${launchDir}/data_dir/pretty_db" + beautiful_db_path = "${launchDir}/data_dir/db/beauty_db" } } diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 311f3f5..0cc5788 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -747,13 +747,15 @@ public static TreeMap sanitizeOutput(HashMap optio /** * Download a tar archive and extract it in the given destination directory. * The file is streamed directly with `curl` into `tar` via a pipe. + * The compression type must be provided if applicable. * Uses safe single-quoting for the URL and destination path. * * @param urlString the URL to fetch * @param destPath directory to extract the tarball into + * @param compression compression type: gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd * @throws IOException on failure */ - public static void curlAndUntar(String urlString, String destPath) throws IOException { + private static void curlAndUntar(String urlString, String destPath, String compression) throws IOException { Path destDir = Paths.get(destPath); Files.createDirectories(destDir); @@ -761,6 +763,27 @@ public static void curlAndUntar(String urlString, String destPath) throws IOExce String escDest = Utils.shellEscape(destPath); String cmd = "curl -L --retry 5 " + escUrl + " | tar xaf - -C " + escDest; + if (compression != null) { + if (compression.equals("gzip") || compression.equals("gz")) { + compression = "gzip"; + } else if (compression.equals("bzip2") || compression.equals("bz2")) { + compression = "bzip2"; + } else if (compression.equals("xz")) { + compression = "xz"; + } else if (compression.equals("lz4")) { + compression = "lz4"; + } else if (compression.equals("lzma")) { + compression = "lzma"; + } else if (compression.equals("lzop")) { + compression = "lzop"; + } else if (compression.equals("zstd") || compression.equals("zst")) { + compression = "zstd"; + } else { + throw new IllegalArgumentException("Unsupported compression type: " + compression); + } + cmd += " --" + compression; + } + ProcessBuilder pb = new ProcessBuilder("sh", "-c", cmd); try { Utils.ProcessResult result = Utils.runProcess(pb); @@ -789,7 +812,7 @@ public static void curlAndUntar(String urlString, String destPath) throws IOExce * @param destPath directory to extract the zip into * @throws IOException on failure */ - public static void curlAndUnzip(String urlString, String destPath) throws IOException { + private static void curlAndUnzip(String urlString, String destPath) throws IOException { Path destDir = Paths.get(destPath); Files.createDirectories(destDir); @@ -858,6 +881,31 @@ public static void curlAndUnzip(String urlString, String destPath) throws IOExce * @throws IOException on failure or if archive type is unsupported */ public static void curlAndExtract(String urlString, String destPath) throws IOException { + String lower = getURLFileName(urlString); + // .zip is the only definitve extension. tar has too many and + // will be considered the default + if (lower.endsWith(".zip")) { + curlAndUnzip(urlString, destPath); + } else if (lower.endsWith("gz")) { + curlAndUntar(urlString, destPath, "gzip"); + } else if (lower.endsWith("bz2")) { + curlAndUntar(urlString, destPath, "bzip2"); + } else if (lower.endsWith("xz")) { + curlAndUntar(urlString, destPath, "xz"); + } else if (lower.endsWith("lz4")) { + curlAndUntar(urlString, destPath, "lz4"); + } else if (lower.endsWith("lzma")) { + curlAndUntar(urlString, destPath, "lzma"); + } else if (lower.endsWith("lzop")) { + curlAndUntar(urlString, destPath, "lzop"); + } else if (lower.endsWith("zst") || lower.endsWith("zstd")) { + curlAndUntar(urlString, destPath, "zstd"); + } else { + curlAndUntar(urlString, destPath, null); + } + } + + private static String getURLFileName(String urlString) { // Try to extract a path portion from the URL (strip query strings) String pathPart = urlString; try { @@ -869,14 +917,6 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx // If parsing fails, fall back to raw urlString pathPart = urlString; } - - String lower = pathPart.toLowerCase(Locale.ROOT); - // .zip is the only definitve extension. tar has too many and - // will be considered the default - if (lower.endsWith(".zip")) { - curlAndUnzip(urlString, destPath); - } else { - curlAndUntar(urlString, destPath); - } + return pathPart.toLowerCase(Locale.ROOT); } } diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index ef052b0..510e8fe 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -1,53 +1,11 @@ nextflow_process { - name "Test Process curlAndUntar" + name "Test Process curlAndExtract" script "./main.nf" process "TEST_MODULE" tag "test" - test("test curlAndUntar - tar file") { - - setup { - curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/genome/index/igblast/igblast_base.tar", "${launchDir}/dbs") - } - then { - def files = getAllFilesFromDir("${launchDir}/dbs") - assert snapshot(files).match() - } - cleanup { - new File("${launchDir}/dbs").deleteDir() - } - } - - test("test curlAndUntar - tar.gz file") { - - setup { - curlAndUntar("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs") - } - then { - def files = getAllFilesFromDir("${launchDir}/dbs") - assert snapshot(files).match() - } - cleanup { - new File("${launchDir}/dbs").deleteDir() - } - } - - test("test curlAndUnzip") { - - setup { - curlAndUnzip("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs") - } - then { - def files = getAllFilesFromDir("${launchDir}/dbs") - assert snapshot(files).match() - } - cleanup { - new File("${launchDir}/dbs").deleteDir() - } - } - test("test curlAndExtract - tar file") { setup { diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 61a9fb5..0db8633 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,5 +1,5 @@ { - "test curlAndUntar - tar.gz file": { + "test curlAndExtract - tar.gz file": { "content": [ [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" @@ -11,411 +11,6 @@ }, "timestamp": "2025-12-08T23:27:19.495861" }, - "test curlAndUntar - tar file": { - "content": [ - [ - "airr_c_human.tar:md5,a29a0c8d1520ff884e873d9a114684f6", - "airr_c_mouse.tar:md5,b46a8b195eb6d15ed3f84fc51434d126", - "imgt_aa_human_ig_v.pdb:md5,bca60bc424936bd3049579b9d904106b", - "imgt_aa_human_ig_v.phr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", - "imgt_aa_human_ig_v.pin:md5,beb81f86dfd78b84d100049adadd8736", - "imgt_aa_human_ig_v.pjs:md5,8b6a254db719992d738febc70fbfc340", - "imgt_aa_human_ig_v.pog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", - "imgt_aa_human_ig_v.pos:md5,83f0e145736976dcb2588d547b468b84", - "imgt_aa_human_ig_v.pot:md5,6e4f2ab5fce4ab1ce32894e6e0461547", - "imgt_aa_human_ig_v.psq:md5,1050c1905867e66eb6d6ed82ca81966f", - "imgt_aa_human_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_aa_human_ig_v.pto:md5,192d4564c68d5e02b06978fc001ac933", - "imgt_aa_human_tr_v.pdb:md5,b20fb1d634bcac4e7b3b641f46ee6572", - "imgt_aa_human_tr_v.phr:md5,db542a16a852056e01fc373c481d82ec", - "imgt_aa_human_tr_v.pin:md5,b1029173840eb6a118c103feac3f7e7a", - "imgt_aa_human_tr_v.pjs:md5,e352b4ffa68c204068c3c0398f1c8f06", - "imgt_aa_human_tr_v.pog:md5,aab4b8fdc68806d86dd8a66c21c9721d", - "imgt_aa_human_tr_v.pos:md5,abf41ed496f63ef73be355bfe9315d33", - "imgt_aa_human_tr_v.pot:md5,4bda50a4bf1154c98fcc644da73863bf", - "imgt_aa_human_tr_v.psq:md5,02a78615a1d0630d98a323be4bc34fc1", - "imgt_aa_human_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_aa_human_tr_v.pto:md5,4af9dffb2f255cb43b31c994f2aec269", - "imgt_aa_mouse_ig_v.pdb:md5,58ea125f6ab44075e31bd89324263398", - "imgt_aa_mouse_ig_v.phr:md5,248cbba3aadbdf814da8706f666c9f91", - "imgt_aa_mouse_ig_v.pin:md5,d6e3e85522830f9c07a3ca23638b1645", - "imgt_aa_mouse_ig_v.pjs:md5,3676804d02cab0a65c0d62b5ab3eb350", - "imgt_aa_mouse_ig_v.pog:md5,6fe25de2b124ecf14453d8507ab536fa", - "imgt_aa_mouse_ig_v.pos:md5,bd4f375790dd4c2ac0fb9627387d6112", - "imgt_aa_mouse_ig_v.pot:md5,81c46146154842750edbc3923e291198", - "imgt_aa_mouse_ig_v.psq:md5,5ec21c57d53c2313513076565b8fbe32", - "imgt_aa_mouse_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_aa_mouse_ig_v.pto:md5,688627d85d01244e960293af8801aa6b", - "imgt_aa_mouse_tr_v.pdb:md5,fdebe60bd497eed071bed4bf9e2c2c23", - "imgt_aa_mouse_tr_v.phr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", - "imgt_aa_mouse_tr_v.pin:md5,7b205e758c0d20885e60d43d4ed951f5", - "imgt_aa_mouse_tr_v.pjs:md5,b2c080a95c7cb06442409b42de0b260e", - "imgt_aa_mouse_tr_v.pog:md5,6c016394ec2c70ae8c89827f49b977a7", - "imgt_aa_mouse_tr_v.pos:md5,b735b8fe72a2e279ae8cc603fe6e973b", - "imgt_aa_mouse_tr_v.pot:md5,4ce6eda1c5ae1f7dea5540256c0349b9", - "imgt_aa_mouse_tr_v.psq:md5,b8c61da709681a273f414d7013a0870b", - "imgt_aa_mouse_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_aa_mouse_tr_v.pto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", - "imgt_human_ig_c.ndb:md5,bab6dfb53156e3e0234ecf260feeb242", - "imgt_human_ig_c.nhr:md5,fb276ae5f21e244aca3be962caa02140", - "imgt_human_ig_c.nin:md5,2fce33436614bed3ecbde7fbc85bd089", - "imgt_human_ig_c.njs:md5,7be706d5b0183bc843c89216cb486087", - "imgt_human_ig_c.nog:md5,277272dc12bd9fe292f2d246e79ae285", - "imgt_human_ig_c.nos:md5,f635fb577ef680c93f8ad2fffb2c56da", - "imgt_human_ig_c.not:md5,595be8a48ce988e8b1fc9ae81d9820a1", - "imgt_human_ig_c.nsq:md5,ce0f34cca8391e736b389b538fcd582e", - "imgt_human_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_ig_c.nto:md5,6d94619292c57dcc852a16207808a186", - "imgt_human_ig_d.ndb:md5,cfb6c207cc3e15edd6dff7a512da2f05", - "imgt_human_ig_d.nhr:md5,df5706fd3491f0654676701d2d983a02", - "imgt_human_ig_d.nin:md5,4bb0200ca933ebc0d40f3093da3f079b", - "imgt_human_ig_d.njs:md5,21e632ea22f6c2b2cfcafa5a7c07bea8", - "imgt_human_ig_d.nog:md5,2fe6ddc46991f9d261bb3f4217555b37", - "imgt_human_ig_d.nos:md5,2d6e790963695bea5f32d238deb67bbb", - "imgt_human_ig_d.not:md5,f9385bcae5f780aa6bd2acf5f03d3a28", - "imgt_human_ig_d.nsq:md5,eeed28974865d16f4aacef1ba1ad2769", - "imgt_human_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_ig_d.nto:md5,259f033be03d566926d716eab2077919", - "imgt_human_ig_j.ndb:md5,b2732139bfc1f3651e90e326a60a43f1", - "imgt_human_ig_j.nhr:md5,eab83a9cdc96b3153c28a1b42a4a0926", - "imgt_human_ig_j.nin:md5,e26f9f57799e442c05c59836ed6d4a7c", - "imgt_human_ig_j.njs:md5,1181e1865512cf31c07c828a42c0f7df", - "imgt_human_ig_j.nog:md5,eb76e077a2b5101fc51c45fe2cc3a4ef", - "imgt_human_ig_j.nos:md5,b3879f5f8e1b42c0232c56d2dd74436a", - "imgt_human_ig_j.not:md5,c1a4db8fc9de9569a2b05532bd10573b", - "imgt_human_ig_j.nsq:md5,cc0890d3aeb8ca90207fdc55ca73ea6a", - "imgt_human_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_ig_j.nto:md5,b454eda6ec47d3ba37106ffb7234eb6a", - "imgt_human_ig_v.ndb:md5,7f54a4459b22dff18182858ff7eb6736", - "imgt_human_ig_v.nhr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", - "imgt_human_ig_v.nin:md5,3f3fc9b5681c2975fdd1f346bbb5f57b", - "imgt_human_ig_v.njs:md5,5beea91d2e64d2d3cc025711a3aac6be", - "imgt_human_ig_v.nog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", - "imgt_human_ig_v.nos:md5,83f0e145736976dcb2588d547b468b84", - "imgt_human_ig_v.not:md5,6e4f2ab5fce4ab1ce32894e6e0461547", - "imgt_human_ig_v.nsq:md5,65fd7c7490d4724b046b19b8d5089152", - "imgt_human_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_ig_v.nto:md5,192d4564c68d5e02b06978fc001ac933", - "imgt_human_tr_c.ndb:md5,207888a1424c2e28967db58976515959", - "imgt_human_tr_c.nhr:md5,d60efc0d8d6d239cf137c6bbf9145f2c", - "imgt_human_tr_c.nin:md5,0e9a3bc083040702cea7e8593fef5589", - "imgt_human_tr_c.njs:md5,959a466665a3fb37678e35cabe519740", - "imgt_human_tr_c.nog:md5,8c00fc1af854bba9ef32efca74e02a19", - "imgt_human_tr_c.nos:md5,6cddf70aab94ff06f4ff094aa111d0db", - "imgt_human_tr_c.not:md5,2030b82268722e50fbbe0c3f4977a24a", - "imgt_human_tr_c.nsq:md5,1b38231f546d64850369b16eb32ab6b4", - "imgt_human_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_tr_c.nto:md5,fe1ae01c06a57e09fa931e1ba7889c29", - "imgt_human_tr_d.ndb:md5,9f380ca23aba188a66a7dd63a55e0306", - "imgt_human_tr_d.nhr:md5,30ab9fd7b8e05a3cf04aed8bf5820ed1", - "imgt_human_tr_d.nin:md5,31445ebf0c14a1373ec555b1e728f1b7", - "imgt_human_tr_d.njs:md5,d4ba25a8a9f3b127cebe364e71fa179b", - "imgt_human_tr_d.nog:md5,5eaf4848fc8cde9e6a10e7fbff9cf338", - "imgt_human_tr_d.nos:md5,43df4232aeccb54c78c8865e5f5f08e5", - "imgt_human_tr_d.not:md5,0d634bbc846724bcf18d4dd3404c7902", - "imgt_human_tr_d.nsq:md5,12ab7e82d181c77ed36ff79e58cbcbcd", - "imgt_human_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_tr_d.nto:md5,c1107debee8ee834a6d9383035dfe8a1", - "imgt_human_tr_j.ndb:md5,88d22d2662f17cc129b2b9fe05738439", - "imgt_human_tr_j.nhr:md5,e98a94e6de1d6af434b0ee8b9626a83c", - "imgt_human_tr_j.nin:md5,1175a138c8927ecf75fa90e83481869c", - "imgt_human_tr_j.njs:md5,7ffea2f9852c975ed4567969149a73bc", - "imgt_human_tr_j.nog:md5,c54125652e33caa645ed3157c2b57930", - "imgt_human_tr_j.nos:md5,f3c8792cd4b84eb72f412583e7a79de9", - "imgt_human_tr_j.not:md5,bbc18fbbcd4769570f8fbee3684cafbd", - "imgt_human_tr_j.nsq:md5,07b64be165c909fa66608b25d7bb25b1", - "imgt_human_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_tr_j.nto:md5,0028dd1ab17d0c47acf5840c6a8d5e59", - "imgt_human_tr_v.ndb:md5,140edbe154feaa4ff6f1e162a6b14779", - "imgt_human_tr_v.nhr:md5,db542a16a852056e01fc373c481d82ec", - "imgt_human_tr_v.nin:md5,24d1391a35a39a37f72cb3d564b6e5e5", - "imgt_human_tr_v.njs:md5,228f5e48054b3486fd82d32f93f6c0b3", - "imgt_human_tr_v.nog:md5,aab4b8fdc68806d86dd8a66c21c9721d", - "imgt_human_tr_v.nos:md5,abf41ed496f63ef73be355bfe9315d33", - "imgt_human_tr_v.not:md5,4bda50a4bf1154c98fcc644da73863bf", - "imgt_human_tr_v.nsq:md5,6a1d58da1db798ed8a726f51bf4edcc0", - "imgt_human_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_human_tr_v.nto:md5,4af9dffb2f255cb43b31c994f2aec269", - "imgt_mouse_ig_c.ndb:md5,b74c2efc68a76ab4205d14ad853d5454", - "imgt_mouse_ig_c.nhr:md5,67d730c045ccba37591ae7f8d16b9d17", - "imgt_mouse_ig_c.nin:md5,f610dcf38c2d7c5537be6e4fc036a6b4", - "imgt_mouse_ig_c.njs:md5,c244ec84002cca1d696aa604fa6701c4", - "imgt_mouse_ig_c.nog:md5,8c329c52cf5919b234d822f23e3ffeae", - "imgt_mouse_ig_c.nos:md5,7cf6c745889857e2598735a49039c6b5", - "imgt_mouse_ig_c.not:md5,873faccbdcaadf20738757ff3fd83f33", - "imgt_mouse_ig_c.nsq:md5,4b97fc13d8ef76fadbfd5ed6124a2ba9", - "imgt_mouse_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_ig_c.nto:md5,706b67145a22e8efbb8670a43b1e0cd3", - "imgt_mouse_ig_d.ndb:md5,b19fad9596341e0c288c0d58f4e2a81a", - "imgt_mouse_ig_d.nhr:md5,15b3f325ded60f6fcd020f5952503aba", - "imgt_mouse_ig_d.nin:md5,403de5e9bfebe7e0ca6b9e0db4bde562", - "imgt_mouse_ig_d.njs:md5,7cb6b95a853297946722ccdfae82e1cb", - "imgt_mouse_ig_d.nog:md5,d982f8a082df6bd7192e24229d555974", - "imgt_mouse_ig_d.nos:md5,249fc0539304e158d34d6ffa85db0a83", - "imgt_mouse_ig_d.not:md5,8f4cf856e9c39e1d1a83048ae9875d33", - "imgt_mouse_ig_d.nsq:md5,96e233401ac56520d13ad7ab72349185", - "imgt_mouse_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_ig_d.nto:md5,f299f5722008a1205618f210439834ae", - "imgt_mouse_ig_j.ndb:md5,39e3dc08e5b0f00302d82e3920c643c9", - "imgt_mouse_ig_j.nhr:md5,e84cc08006969b9826af412b6f6626d7", - "imgt_mouse_ig_j.nin:md5,682a0c1e72e0b1422e3b661349531f1d", - "imgt_mouse_ig_j.njs:md5,7be4e74aaa67e4d7b55ac66a58e77291", - "imgt_mouse_ig_j.nog:md5,2f6aeaf3176b34332fcaf214f1698e55", - "imgt_mouse_ig_j.nos:md5,ee8f7ec3b1bba39b01a5f19df20da7dc", - "imgt_mouse_ig_j.not:md5,68fee53d6fc665eb87e45b866468ac32", - "imgt_mouse_ig_j.nsq:md5,17c0295a1202e26cdb670acaef745e16", - "imgt_mouse_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_ig_j.nto:md5,a31324bf954edb7631e885d85d78103b", - "imgt_mouse_ig_v.ndb:md5,2de2e989ea109e09da297f30ca20667a", - "imgt_mouse_ig_v.nhr:md5,248cbba3aadbdf814da8706f666c9f91", - "imgt_mouse_ig_v.nin:md5,030c13edc786cf4c8e1ad4491f36892c", - "imgt_mouse_ig_v.njs:md5,1f29a9ae41a04cc765d7b68cd560c1f1", - "imgt_mouse_ig_v.nog:md5,6fe25de2b124ecf14453d8507ab536fa", - "imgt_mouse_ig_v.nos:md5,bd4f375790dd4c2ac0fb9627387d6112", - "imgt_mouse_ig_v.not:md5,81c46146154842750edbc3923e291198", - "imgt_mouse_ig_v.nsq:md5,8341057557b2c8a6a01185f8a4bedbcc", - "imgt_mouse_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_ig_v.nto:md5,688627d85d01244e960293af8801aa6b", - "imgt_mouse_tr_c.ndb:md5,c699657e06c538df1abab26d54ba41d2", - "imgt_mouse_tr_c.nhr:md5,d73e399d3210fd72ec295fe9255204c6", - "imgt_mouse_tr_c.nin:md5,39c38148a1dd0cf8f5ffb617e40ddc3d", - "imgt_mouse_tr_c.njs:md5,fe326257dad06b92387369475bd42ba7", - "imgt_mouse_tr_c.nog:md5,df85d18647b8f011ed85756b3145e111", - "imgt_mouse_tr_c.nos:md5,721c50deeef515303652f32f27a9ab2b", - "imgt_mouse_tr_c.not:md5,24f16daf335352fe2bfca7094bdbd79d", - "imgt_mouse_tr_c.nsq:md5,bd58d1eeca6249ba5ea4b7fffbb14a76", - "imgt_mouse_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_tr_c.nto:md5,6df5535bce3294d057801d66a7c7701e", - "imgt_mouse_tr_d.ndb:md5,a8b37cb08e95964af2b6e1c219f5b53f", - "imgt_mouse_tr_d.nhr:md5,0f6ae6f691944d27b89811f64e7619e7", - "imgt_mouse_tr_d.nin:md5,2ef920a85e448c680ca25cb7424d83a7", - "imgt_mouse_tr_d.njs:md5,269418b7c005a66988da4444c90306b6", - "imgt_mouse_tr_d.nog:md5,c5aa62546a588032ae22df69236ab525", - "imgt_mouse_tr_d.nos:md5,e43e912b61ba5e5d5ef4331ae3ac36b2", - "imgt_mouse_tr_d.not:md5,667c9af4cfdc07e4bbb6ef858e9e6fb3", - "imgt_mouse_tr_d.nsq:md5,7a3189aa9369c6eac91ec418a851fbed", - "imgt_mouse_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_tr_d.nto:md5,afd0f544d132c4f72e97c866cc192fe1", - "imgt_mouse_tr_j.ndb:md5,e9d0ffcf8e6090ad2513cebc3e95f05a", - "imgt_mouse_tr_j.nhr:md5,bbd8b1aef821763537766eaae1b23c63", - "imgt_mouse_tr_j.nin:md5,96d6a34a7d54d9a77c70116ad249e3b3", - "imgt_mouse_tr_j.njs:md5,612c17d3e7c517844c79e03ba352a0b4", - "imgt_mouse_tr_j.nog:md5,6e8d11a76190d47ae644aa68e418cd3a", - "imgt_mouse_tr_j.nos:md5,3eff94779164fd38e60a1b6b9e38db6a", - "imgt_mouse_tr_j.not:md5,a65680020c287f8ece6787a63536c91d", - "imgt_mouse_tr_j.nsq:md5,3e751130114bfae43aa5cc9641b77db4", - "imgt_mouse_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_tr_j.nto:md5,a4083c809fe1a59ce4590d033579345d", - "imgt_mouse_tr_v.ndb:md5,9c96b5a88aecf92990d2a9478981f5bc", - "imgt_mouse_tr_v.nhr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", - "imgt_mouse_tr_v.nin:md5,b3f3f09ead35acbd41931ed8290fee71", - "imgt_mouse_tr_v.njs:md5,82aaf433290049914a9d70c1f323ceb0", - "imgt_mouse_tr_v.nog:md5,6c016394ec2c70ae8c89827f49b977a7", - "imgt_mouse_tr_v.nos:md5,b735b8fe72a2e279ae8cc603fe6e973b", - "imgt_mouse_tr_v.not:md5,4ce6eda1c5ae1f7dea5540256c0349b9", - "imgt_mouse_tr_v.nsq:md5,89774a3086001a0238cef3462633c2fb", - "imgt_mouse_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", - "imgt_mouse_tr_v.nto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", - "mouse_gl_D.nhr:md5,a832b15e9a5449f42a54dfd6c9f53cd0", - "mouse_gl_D.nin:md5,e7f91f781cf6ccc50868f7dfffda69e8", - "mouse_gl_D.nog:md5,7f4fff8e3d0dbcd4ca2a3b1f3673f5d5", - "mouse_gl_D.nsd:md5,5e49254772451138f955e36b8027cd19", - "mouse_gl_D.nsi:md5,653a7177b44c583aff703c83408d657f", - "mouse_gl_D.nsq:md5,3259c782003b3e425410aa255a515ebe", - "mouse_gl_J.nhr:md5,89c7a3cbe897890ac294243ba283ba6b", - "mouse_gl_J.nin:md5,ffd09e9e8fd21ccb2ed1ab24d3dfe8b9", - "mouse_gl_J.nog:md5,8c00fc1af854bba9ef32efca74e02a19", - "mouse_gl_J.nsd:md5,e94a6ad2cfe42c76593e16fd040bb929", - "mouse_gl_J.nsi:md5,61e91a6d1fa9b56587406dfcf7167dd2", - "mouse_gl_J.nsq:md5,26397eca0849e81f650001d316f592b6", - "mouse_gl_V.nhr:md5,0abe6bdca2b08e47bee3679bcce0b63b", - "mouse_gl_V.nin:md5,47c2c821445f55ea2d1191b090fdb132", - "mouse_gl_V.nog:md5,2c59132ed7f37b70751aeb4264409942", - "mouse_gl_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", - "mouse_gl_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", - "mouse_gl_V.nsq:md5,8235994044728f17e8e685d42a01ffae", - "mouse_gl_V.phr:md5,d204d83e0b7c698e13ef12e5e3b9bf60", - "mouse_gl_V.pin:md5,23b5ce4a46a3d81c6f8f7aabc6e7824d", - "mouse_gl_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", - "mouse_gl_V.psd:md5,e981f48453020d8555feec4c6e40cd70", - "mouse_gl_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", - "mouse_gl_V.psq:md5,971b28104884d594b328a249e06f7ee1", - "mouse_gl_VDJ.tar:md5,e3485278d8ba068638a9d3428553e6a2", - "ncbi_human_c_genes.tar:md5,a8f1112969c8b552bdab3f488bbd0c47", - "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", - "rhesus_monkey_J.nin:md5,fdbf43e4459fad96eeba391ec598c958", - "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", - "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", - "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", - "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", - "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", - "rhesus_monkey_V.nin:md5,d273393e8dc187c816414f260348944e", - "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", - "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", - "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", - "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", - "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", - "rhesus_monkey_V.pin:md5,f25deb7f0151944e411af5880b8c8a55", - "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", - "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", - "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", - "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", - "rhesus_monkey_VJ.tar:md5,9e918cf291f34a391bb6398325a78db5", - "imgt_aa_human_ig_v.fasta:md5,30b9ca0f29a61c2459482fe30cfe19b6", - "imgt_aa_human_tr_v.fasta:md5,43f11ae863217d575626c20b7d84adb8", - "imgt_aa_mouse_ig_v.fasta:md5,edac8c37e0408f9f6c8d232d79ffc8be", - "imgt_aa_mouse_tr_v.fasta:md5,3e172585de3b78916c2711c5f3ddcb25", - "imgt_human_ig_c.fasta:md5,d660c41cc2bec165cd5ace32405eff39", - "imgt_human_ig_d.fasta:md5,935b4bb5442897f8d97051a4f2fe37d0", - "imgt_human_ig_j.fasta:md5,d7c28fd1c42b3d72b630e290d76fe409", - "imgt_human_ig_v.fasta:md5,0f604ba84709db16f9d4f0eafbd261ba", - "imgt_human_tr_c.fasta:md5,71b3865449c1a42a9e4f59b3ecdf3256", - "imgt_human_tr_d.fasta:md5,fe5ac92ba4d4e2ef0a001685e07b3914", - "imgt_human_tr_j.fasta:md5,dcae2f9293af89398f5df0b4acd60981", - "imgt_human_tr_v.fasta:md5,bcb1b21e6943da537f1e7fdcfce31119", - "imgt_mouse_ig_c.fasta:md5,b778e2bcea4e0a170404b28bd648522c", - "imgt_mouse_ig_d.fasta:md5,aa246ba4e5fa2eaad83ac7daab234772", - "imgt_mouse_ig_j.fasta:md5,3b220b309cc4d15b4cb120aae9e88170", - "imgt_mouse_ig_v.fasta:md5,875b17ff8b5ab819c3e1b332492c494d", - "imgt_mouse_tr_c.fasta:md5,b476e7d4fbd8768ace3877633c6b22de", - "imgt_mouse_tr_d.fasta:md5,3cf6735d31ca794bcf684fa2ccc3d148", - "imgt_mouse_tr_j.fasta:md5,4ef4d35a0e1d770873ae84dd0336d475", - "imgt_mouse_tr_v.fasta:md5,db73f796a88b77f1bbf2964f57a02285", - "human.ndm.imgt:md5,d6cea490480cecfeb082c66607126ff0", - "human.ndm.kabat:md5,294da2ace8c28701ba26406226acf9af", - "human.pdm.imgt:md5,eee1e720fe17bc2b74055dad690c5c3c", - "human.pdm.kabat:md5,2a09fe4aafb06a24ae09866ee2e874e2", - "human_TR_V.nhr:md5,05e85d4422ddd63b251798ad52afbb07", - "human_TR_V.nin:md5,479cf56d41b7708db836278c6090297a", - "human_TR_V.nog:md5,27b8711de1d9cb4a09de4fffd52cd7b4", - "human_TR_V.nsd:md5,1bd3fc688986ca1cd3cbf0ba341e6e88", - "human_TR_V.nsi:md5,902ee2023646ab9d5c2e8bd9e7cd9a74", - "human_TR_V.nsq:md5,1d6eaff8a9696dfb81f54c253adb3e8f", - "human_TR_V.phr:md5,289fad3fda3ca9a4b9dc62a436bb8ba1", - "human_TR_V.pin:md5,b974c4c2e06a7b15e8113b8a114e2a01", - "human_TR_V.pog:md5,0e477541fc88a535d10ec37531198245", - "human_TR_V.psd:md5,9afcedfab46fdad1283dc6932796a56f", - "human_TR_V.psi:md5,9247ca05fe82fb5a528120b3098108b3", - "human_TR_V.psq:md5,4a127b625dcef63b5d0412f7b3e7972b", - "human_V.nhr:md5,18e1447dbb688d21f30781c0a3602cb2", - "human_V.nin:md5,34d4976f789560a3f954203bb8765e2e", - "human_V.nog:md5,3308e60e960e48c12c4a0446aa2ce485", - "human_V.nsd:md5,34506dc9f4d6d385942ea574806669e3", - "human_V.nsi:md5,387635abc8f8ca09293b0bf792bbbfb8", - "human_V.nsq:md5,d3ebdd064a158bdde2708cd19c9cd7d9", - "human_V.phr:md5,d461e9be5047f30963ee7b78c963553a", - "human_V.pin:md5,c0f35ffe97886fe2025a15a829c48749", - "human_V.pog:md5,2aaff4653db578472761e0759b64a768", - "human_V.psd:md5,d1f08d3c624a3770b1232addd7668508", - "human_V.psi:md5,887ac2a9d4cc0e69a94b7543629ab784", - "human_V.psq:md5,35791ac164354b70ad4a35ad9f486f2f", - "mouse.ndm.imgt:md5,352c7f46597497ebf713698fa440ed95", - "mouse.ndm.kabat:md5,2720ae1c09623777e37a116cf9f73823", - "mouse.pdm.imgt:md5,e97ea4cec66d10bceee1ce3518c44082", - "mouse.pdm.kabat:md5,fbce28354f68f4cb6be6333eff6aa0dc", - "mouse_TR_V.nhr:md5,d116d1ef618402cfdbfa75f267813608", - "mouse_TR_V.nin:md5,fcec1baff7bcbe28e71a1e00c24efab7", - "mouse_TR_V.nog:md5,e3dda143f2afc7aa44eb22524049d98e", - "mouse_TR_V.nsd:md5,2d642f4bb76f77bd38f8737f58e9f0f0", - "mouse_TR_V.nsi:md5,9aa022b79d9d063f61ea591ff7a88e7d", - "mouse_TR_V.nsq:md5,61a73abedabb5e8963671f725beb2873", - "mouse_TR_V.phr:md5,4e7cfac13eb50b0b8d8e6d3d49bc5b76", - "mouse_TR_V.pin:md5,2d66648ed028872ac56338a666237a02", - "mouse_TR_V.pog:md5,54a77b456076c55bab9262c76fd7f54f", - "mouse_TR_V.psd:md5,b91ac864d59b2bf1f271255e86c17294", - "mouse_TR_V.psi:md5,b9df1a625a63b5d74499b8c8d7d02e9a", - "mouse_TR_V.psq:md5,6d996ab0e41026b1e28438f25d43c359", - "mouse_V.nhr:md5,32e46aa6a9b13c2e6058a57b11a1cb38", - "mouse_V.nin:md5,319645b00f94d159208f8204c192e89c", - "mouse_V.nog:md5,2c59132ed7f37b70751aeb4264409942", - "mouse_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", - "mouse_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", - "mouse_V.nsq:md5,8235994044728f17e8e685d42a01ffae", - "mouse_V.phr:md5,300cf56525199abafa7f69d21ec90d7f", - "mouse_V.pin:md5,32f2c58b40925b798b8c07c98520c625", - "mouse_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", - "mouse_V.psd:md5,e981f48453020d8555feec4c6e40cd70", - "mouse_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", - "mouse_V.psq:md5,971b28104884d594b328a249e06f7ee1", - "rabbit.ndm.imgt:md5,29910940f8994455d5b632effdb4571f", - "rabbit.ndm.kabat:md5,2a45cb3a7c9e5d103ad6ef1cba3253a9", - "rabbit.pdm.imgt:md5,3ad8b9bb42c7c1e17929cf89f32c549b", - "rabbit.pdm.kabat:md5,5943bba3fcd0d1ba7234843e65876f1f", - "rabbit_V.nhr:md5,83bce87d624c8bd7be460050b81c624d", - "rabbit_V.nin:md5,4b831ea6dac84f0f9db2503d2812a101", - "rabbit_V.nog:md5,a57586e2151edc9054d42613c0f333ea", - "rabbit_V.nsd:md5,e90aab1550962796e8f4a74df53d681d", - "rabbit_V.nsi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", - "rabbit_V.nsq:md5,6d4450cc6cdd47c35c383c105a2922f6", - "rabbit_V.phr:md5,3c4cac38b9a4a9d74eb5097745c82f2a", - "rabbit_V.pin:md5,78b0eead25d92252420ae988a057977a", - "rabbit_V.pog:md5,a57586e2151edc9054d42613c0f333ea", - "rabbit_V.psd:md5,e90aab1550962796e8f4a74df53d681d", - "rabbit_V.psi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", - "rabbit_V.psq:md5,4223f96b39e2919008bf46ebf4bc8086", - "rat.ndm.imgt:md5,7317c7d30271cf5eb55dcaaa8d21d08f", - "rat.ndm.kabat:md5,2fd65f271ac90dc2f845053a18bc8136", - "rat.pdm.imgt:md5,6df63cc9e6531a29a592078e26178def", - "rat.pdm.kabat:md5,99996aab7e318763d2f5b3cf45a01c3d", - "rat_V.nhr:md5,bd4c6684859c91444a2ec36f50ce19be", - "rat_V.nin:md5,dd19ca8cd6641846a73681f00590c58e", - "rat_V.nog:md5,11b45f728cd8e07aac3bcd2e0118a114", - "rat_V.nsd:md5,f7c62ad597376b7e4aeba5539fea1947", - "rat_V.nsi:md5,1dca7089ad10f865f24d0c460548e4eb", - "rat_V.nsq:md5,08a7b14ce61dab2dfc980e37511ffdba", - "rat_V.phr:md5,10dde83b2bcc323c1f594cd2cf1943db", - "rat_V.pin:md5,f637df718130398afe844085dbe00e61", - "rat_V.pog:md5,11b45f728cd8e07aac3bcd2e0118a114", - "rat_V.psd:md5,f7c62ad597376b7e4aeba5539fea1947", - "rat_V.psi:md5,1dca7089ad10f865f24d0c460548e4eb", - "rat_V.psq:md5,7afff0d34e3ac4ce5e27ffcca802f167", - "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", - "Entries:md5,637aaed90638717490c792d7db1380ad", - "Repository:md5,e7f792f89c1401fef550063f8ee5e7c8", - "Root:md5,064d27aa012c3bdd8b586bdfa152ae85", - "rhesus_monkey.ndm.imgt:md5,66c289aefc8d7fddf9bf4c9fa34e5f5b", - "rhesus_monkey.ndm.kabat:md5,5f13f6532cb44ae9049e04d108a32b9d", - "rhesus_monkey.pdm.imgt:md5,81629757b65a58851db23647cc6e130c", - "rhesus_monkey.pdm.kabat:md5,c3be9bef7c01b976419fa29121f12b08", - "rhesus_monkey_D.nhr:md5,5dbd53d004414cf37936705f0091f80b", - "rhesus_monkey_D.nin:md5,497cb469125caec99387cc30c244ed7f", - "rhesus_monkey_D.nog:md5,8c329c52cf5919b234d822f23e3ffeae", - "rhesus_monkey_D.nsd:md5,421c91caee071b623b25caaa5d37d56b", - "rhesus_monkey_D.nsi:md5,3b0f500e9d51c4a5b25897462b4d3769", - "rhesus_monkey_D.nsq:md5,1280769a0559128141088ee02864674b", - "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", - "rhesus_monkey_J.nin:md5,0717ec6ff45f06b9d3d22b7bb128dcab", - "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", - "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", - "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", - "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", - "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", - "rhesus_monkey_V.nin:md5,19c96733bfb8de3b6a177541cae21ed6", - "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", - "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", - "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", - "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", - "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", - "rhesus_monkey_V.pin:md5,f275f17c6893512860ba23c66e87d865", - "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", - "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", - "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", - "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", - "human_gl.aux:md5,5801b62a007c5d98501116d8b6a7dde7", - "human_gl.aux.testonly:md5,b51b2475f3366e8e01a433149341d730", - "mouse_gl.aux:md5,8da2b395709c472408f1f7900a72e986", - "rabbit_gl.aux:md5,c14ec0d70f8fb8274f04521e684579c6", - "rat_gl.aux:md5,8c293acaa9173e734dc99cf32115d5c3", - "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", - "rhesus_monkey_gl.aux:md5,92d38df5fe92bf01ff82beb62ec8e43d" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T18:18:33.373288" - }, "test curlAndExtract - tar file": { "content": [ [ @@ -819,19 +414,7 @@ "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T18:19:59.270286" - }, - "test curlAndExtract - tar.gz file": { - "content": [ - [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T23:29:52.440355" + "timestamp": "2025-12-09T10:08:33.373288" }, "test curlAndExtract - zip file": { "content": [ @@ -845,18 +428,5 @@ "nextflow": "24.04.2" }, "timestamp": "2025-12-08T23:32:07.753491" - }, - "test curlAndUnzip": { - "content": [ - [ - "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T23:33:12.404121" } } \ No newline at end of file From 9ac5f038484db6d23d0e831486a1fd8b4593d80a Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 10:38:22 +0000 Subject: [PATCH 20/24] This fits better in Utils --- .../java/nf_core/nf/test/utils/Methods.java | 17 +---------------- src/main/java/nf_core/nf/test/utils/Utils.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 0cc5788..5573cd1 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -881,7 +881,7 @@ private static void curlAndUnzip(String urlString, String destPath) throws IOExc * @throws IOException on failure or if archive type is unsupported */ public static void curlAndExtract(String urlString, String destPath) throws IOException { - String lower = getURLFileName(urlString); + String lower = Utils.getURLFileName(urlString); // .zip is the only definitve extension. tar has too many and // will be considered the default if (lower.endsWith(".zip")) { @@ -904,19 +904,4 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx curlAndUntar(urlString, destPath, null); } } - - private static String getURLFileName(String urlString) { - // Try to extract a path portion from the URL (strip query strings) - String pathPart = urlString; - try { - java.net.URI uri = new java.net.URI(urlString); - if (uri.getPath() != null && !uri.getPath().isEmpty()) { - pathPart = uri.getPath(); - } - } catch (Exception e) { - // If parsing fails, fall back to raw urlString - pathPart = urlString; - } - return pathPart.toLowerCase(Locale.ROOT); - } } diff --git a/src/main/java/nf_core/nf/test/utils/Utils.java b/src/main/java/nf_core/nf/test/utils/Utils.java index 4c787e6..6221d02 100644 --- a/src/main/java/nf_core/nf/test/utils/Utils.java +++ b/src/main/java/nf_core/nf/test/utils/Utils.java @@ -3,6 +3,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Locale; public class Utils { @@ -41,4 +42,19 @@ public static String shellEscape(String s) { if (s == null) return "''"; return "'" + s.replace("'", "'" + "\"'\"" + "'") + "'"; } + + public static String getURLFileName(String urlString) { + // Try to extract a path portion from the URL (strip query strings) + String pathPart = urlString; + try { + java.net.URI uri = new java.net.URI(urlString); + if (uri.getPath() != null && !uri.getPath().isEmpty()) { + pathPart = uri.getPath(); + } + } catch (Exception e) { + // If parsing fails, fall back to raw urlString + pathPart = urlString; + } + return pathPart.toLowerCase(Locale.ROOT); + } } From 1a1333e6c0f20dd224e9aa64762857b40606a247 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 11:04:03 +0000 Subject: [PATCH 21/24] Added a method to specify the compression name in case it cannot be automatically detected --- docs/usage.md | 6 +- .../java/nf_core/nf/test/utils/Methods.java | 32 +- tests/curlAndExtract/main.nf.test | 56 +++ tests/curlAndExtract/main.nf.test.snap | 459 ++++++++++++++++++ 4 files changed, 548 insertions(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index cf2fe19..c4c5d83 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -550,8 +550,8 @@ from the Internet with `curl` and extract it in the required destination directory. Zip and Tar archives are currently supported. Tar archives can be compressed with any of these algorithms: gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd. -The choice of archive format and compression algorithm is based on -the name of the archive. +By default, the choice of archive format and compression algorithm is based on +the name of the archive, but it can also be passed as an argument. You are responsible for deleting the data in the `cleanup` phase. @@ -559,12 +559,14 @@ You are responsible for deleting the data in the `cleanup` phase. setup { curlAndExtract("https://www.example.com/pretty_database.zip", "${launchDir}/data_dir") curlAndExtract("https://www.example.com/beautiful_database.tar.gz", "${launchDir}/data_dir") + curlAndExtract("https://www.example.com/secret/data", "${launchDir}/data_dir", "bz2") } when { params { pretty_db_path = "${launchDir}/data_dir/pretty_db" beautiful_db_path = "${launchDir}/data_dir/db/beauty_db" + secret_db_path = "${launchDir}/data_dir/db/secret" } } diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 5573cd1..897b180 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -763,7 +763,8 @@ private static void curlAndUntar(String urlString, String destPath, String compr String escDest = Utils.shellEscape(destPath); String cmd = "curl -L --retry 5 " + escUrl + " | tar xaf - -C " + escDest; - if (compression != null) { + // Convert compression name to tar option + if (compression != null && !compression.equals("tar")) { if (compression.equals("gzip") || compression.equals("gz")) { compression = "gzip"; } else if (compression.equals("bzip2") || compression.equals("bz2")) { @@ -882,8 +883,9 @@ private static void curlAndUnzip(String urlString, String destPath) throws IOExc */ public static void curlAndExtract(String urlString, String destPath) throws IOException { String lower = Utils.getURLFileName(urlString); - // .zip is the only definitve extension. tar has too many and - // will be considered the default + // Convert file name (extension) to compression name. + // Zip is the only clearly defined archive format. + // Everything else is assumed to be Tar if (lower.endsWith(".zip")) { curlAndUnzip(urlString, destPath); } else if (lower.endsWith("gz")) { @@ -904,4 +906,28 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx curlAndUntar(urlString, destPath, null); } } + + /** + * Download an archive and extract it in the given destination directory. + * Dispatches to `curlAndUnzip` for ZIP files and to `curlAndUntar` for + * tar archives based on the `compression` parameter. + * + * @param urlString the URL to fetch + * @param destPath directory to extract the archive into + * @param compression compression type: zip, gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd, tar + * @throws IOException on failure or if archive type is unsupported + */ + public static void curlAndExtract(String urlString, String destPath, String compression) throws IOException { + if (compression == null || compression.isEmpty()) { + throw new IllegalArgumentException("The 'compression' parameter is required."); + } + String lower = compression.toLowerCase(Locale.ROOT); + // Zip is the only clearly defined archive format. + // Everything else is assumed to be Tar + if (lower.equals("zip")) { + curlAndUnzip(urlString, destPath); + } else { + curlAndUntar(urlString, destPath, compression); + } + } } diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index 510e8fe..b7f867f 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -47,4 +47,60 @@ nextflow_process { new File("${launchDir}/dbs").deleteDir() } } + + test("test curlAndExtract with type - tar file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/genome/index/igblast/igblast_base.tar", "${launchDir}/dbs", "tar") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + + test("test curlAndExtract with type - tar.gz file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs", "gzip") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + + test("test curlAndExtract with type - zip file") { + + setup { + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip", "${launchDir}/dbs", "zip") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } + + test("test curlAndExtract with type - tar.bz2 file") { + + setup { + curlAndExtract("https://card.mcmaster.ca/latest/data", "${launchDir}/dbs", "bzip2") + } + then { + def files = getAllFilesFromDir("${launchDir}/dbs") + assert snapshot(files).match() + } + cleanup { + new File("${launchDir}/dbs").deleteDir() + } + } } diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 0db8633..5da6451 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -1,4 +1,450 @@ { + "test curlAndExtract with type - tar file": { + "content": [ + [ + "airr_c_human.tar:md5,a29a0c8d1520ff884e873d9a114684f6", + "airr_c_mouse.tar:md5,b46a8b195eb6d15ed3f84fc51434d126", + "imgt_aa_human_ig_v.pdb:md5,bca60bc424936bd3049579b9d904106b", + "imgt_aa_human_ig_v.phr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_aa_human_ig_v.pin:md5,beb81f86dfd78b84d100049adadd8736", + "imgt_aa_human_ig_v.pjs:md5,8b6a254db719992d738febc70fbfc340", + "imgt_aa_human_ig_v.pog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_aa_human_ig_v.pos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_aa_human_ig_v.pot:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_aa_human_ig_v.psq:md5,1050c1905867e66eb6d6ed82ca81966f", + "imgt_aa_human_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_ig_v.pto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_aa_human_tr_v.pdb:md5,b20fb1d634bcac4e7b3b641f46ee6572", + "imgt_aa_human_tr_v.phr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_aa_human_tr_v.pin:md5,b1029173840eb6a118c103feac3f7e7a", + "imgt_aa_human_tr_v.pjs:md5,e352b4ffa68c204068c3c0398f1c8f06", + "imgt_aa_human_tr_v.pog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_aa_human_tr_v.pos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_aa_human_tr_v.pot:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_aa_human_tr_v.psq:md5,02a78615a1d0630d98a323be4bc34fc1", + "imgt_aa_human_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_human_tr_v.pto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_aa_mouse_ig_v.pdb:md5,58ea125f6ab44075e31bd89324263398", + "imgt_aa_mouse_ig_v.phr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_aa_mouse_ig_v.pin:md5,d6e3e85522830f9c07a3ca23638b1645", + "imgt_aa_mouse_ig_v.pjs:md5,3676804d02cab0a65c0d62b5ab3eb350", + "imgt_aa_mouse_ig_v.pog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_aa_mouse_ig_v.pos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_aa_mouse_ig_v.pot:md5,81c46146154842750edbc3923e291198", + "imgt_aa_mouse_ig_v.psq:md5,5ec21c57d53c2313513076565b8fbe32", + "imgt_aa_mouse_ig_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_ig_v.pto:md5,688627d85d01244e960293af8801aa6b", + "imgt_aa_mouse_tr_v.pdb:md5,fdebe60bd497eed071bed4bf9e2c2c23", + "imgt_aa_mouse_tr_v.phr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_aa_mouse_tr_v.pin:md5,7b205e758c0d20885e60d43d4ed951f5", + "imgt_aa_mouse_tr_v.pjs:md5,b2c080a95c7cb06442409b42de0b260e", + "imgt_aa_mouse_tr_v.pog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_aa_mouse_tr_v.pos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_aa_mouse_tr_v.pot:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_aa_mouse_tr_v.psq:md5,b8c61da709681a273f414d7013a0870b", + "imgt_aa_mouse_tr_v.ptf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_aa_mouse_tr_v.pto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "imgt_human_ig_c.ndb:md5,bab6dfb53156e3e0234ecf260feeb242", + "imgt_human_ig_c.nhr:md5,fb276ae5f21e244aca3be962caa02140", + "imgt_human_ig_c.nin:md5,2fce33436614bed3ecbde7fbc85bd089", + "imgt_human_ig_c.njs:md5,7be706d5b0183bc843c89216cb486087", + "imgt_human_ig_c.nog:md5,277272dc12bd9fe292f2d246e79ae285", + "imgt_human_ig_c.nos:md5,f635fb577ef680c93f8ad2fffb2c56da", + "imgt_human_ig_c.not:md5,595be8a48ce988e8b1fc9ae81d9820a1", + "imgt_human_ig_c.nsq:md5,ce0f34cca8391e736b389b538fcd582e", + "imgt_human_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_c.nto:md5,6d94619292c57dcc852a16207808a186", + "imgt_human_ig_d.ndb:md5,cfb6c207cc3e15edd6dff7a512da2f05", + "imgt_human_ig_d.nhr:md5,df5706fd3491f0654676701d2d983a02", + "imgt_human_ig_d.nin:md5,4bb0200ca933ebc0d40f3093da3f079b", + "imgt_human_ig_d.njs:md5,21e632ea22f6c2b2cfcafa5a7c07bea8", + "imgt_human_ig_d.nog:md5,2fe6ddc46991f9d261bb3f4217555b37", + "imgt_human_ig_d.nos:md5,2d6e790963695bea5f32d238deb67bbb", + "imgt_human_ig_d.not:md5,f9385bcae5f780aa6bd2acf5f03d3a28", + "imgt_human_ig_d.nsq:md5,eeed28974865d16f4aacef1ba1ad2769", + "imgt_human_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_d.nto:md5,259f033be03d566926d716eab2077919", + "imgt_human_ig_j.ndb:md5,b2732139bfc1f3651e90e326a60a43f1", + "imgt_human_ig_j.nhr:md5,eab83a9cdc96b3153c28a1b42a4a0926", + "imgt_human_ig_j.nin:md5,e26f9f57799e442c05c59836ed6d4a7c", + "imgt_human_ig_j.njs:md5,1181e1865512cf31c07c828a42c0f7df", + "imgt_human_ig_j.nog:md5,eb76e077a2b5101fc51c45fe2cc3a4ef", + "imgt_human_ig_j.nos:md5,b3879f5f8e1b42c0232c56d2dd74436a", + "imgt_human_ig_j.not:md5,c1a4db8fc9de9569a2b05532bd10573b", + "imgt_human_ig_j.nsq:md5,cc0890d3aeb8ca90207fdc55ca73ea6a", + "imgt_human_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_j.nto:md5,b454eda6ec47d3ba37106ffb7234eb6a", + "imgt_human_ig_v.ndb:md5,7f54a4459b22dff18182858ff7eb6736", + "imgt_human_ig_v.nhr:md5,95b6ccbf8b5035e4ed224516c3d0ef91", + "imgt_human_ig_v.nin:md5,3f3fc9b5681c2975fdd1f346bbb5f57b", + "imgt_human_ig_v.njs:md5,5beea91d2e64d2d3cc025711a3aac6be", + "imgt_human_ig_v.nog:md5,cc647a49e1a8f3054d9dc28d8ad963fe", + "imgt_human_ig_v.nos:md5,83f0e145736976dcb2588d547b468b84", + "imgt_human_ig_v.not:md5,6e4f2ab5fce4ab1ce32894e6e0461547", + "imgt_human_ig_v.nsq:md5,65fd7c7490d4724b046b19b8d5089152", + "imgt_human_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_ig_v.nto:md5,192d4564c68d5e02b06978fc001ac933", + "imgt_human_tr_c.ndb:md5,207888a1424c2e28967db58976515959", + "imgt_human_tr_c.nhr:md5,d60efc0d8d6d239cf137c6bbf9145f2c", + "imgt_human_tr_c.nin:md5,0e9a3bc083040702cea7e8593fef5589", + "imgt_human_tr_c.njs:md5,959a466665a3fb37678e35cabe519740", + "imgt_human_tr_c.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "imgt_human_tr_c.nos:md5,6cddf70aab94ff06f4ff094aa111d0db", + "imgt_human_tr_c.not:md5,2030b82268722e50fbbe0c3f4977a24a", + "imgt_human_tr_c.nsq:md5,1b38231f546d64850369b16eb32ab6b4", + "imgt_human_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_c.nto:md5,fe1ae01c06a57e09fa931e1ba7889c29", + "imgt_human_tr_d.ndb:md5,9f380ca23aba188a66a7dd63a55e0306", + "imgt_human_tr_d.nhr:md5,30ab9fd7b8e05a3cf04aed8bf5820ed1", + "imgt_human_tr_d.nin:md5,31445ebf0c14a1373ec555b1e728f1b7", + "imgt_human_tr_d.njs:md5,d4ba25a8a9f3b127cebe364e71fa179b", + "imgt_human_tr_d.nog:md5,5eaf4848fc8cde9e6a10e7fbff9cf338", + "imgt_human_tr_d.nos:md5,43df4232aeccb54c78c8865e5f5f08e5", + "imgt_human_tr_d.not:md5,0d634bbc846724bcf18d4dd3404c7902", + "imgt_human_tr_d.nsq:md5,12ab7e82d181c77ed36ff79e58cbcbcd", + "imgt_human_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_d.nto:md5,c1107debee8ee834a6d9383035dfe8a1", + "imgt_human_tr_j.ndb:md5,88d22d2662f17cc129b2b9fe05738439", + "imgt_human_tr_j.nhr:md5,e98a94e6de1d6af434b0ee8b9626a83c", + "imgt_human_tr_j.nin:md5,1175a138c8927ecf75fa90e83481869c", + "imgt_human_tr_j.njs:md5,7ffea2f9852c975ed4567969149a73bc", + "imgt_human_tr_j.nog:md5,c54125652e33caa645ed3157c2b57930", + "imgt_human_tr_j.nos:md5,f3c8792cd4b84eb72f412583e7a79de9", + "imgt_human_tr_j.not:md5,bbc18fbbcd4769570f8fbee3684cafbd", + "imgt_human_tr_j.nsq:md5,07b64be165c909fa66608b25d7bb25b1", + "imgt_human_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_j.nto:md5,0028dd1ab17d0c47acf5840c6a8d5e59", + "imgt_human_tr_v.ndb:md5,140edbe154feaa4ff6f1e162a6b14779", + "imgt_human_tr_v.nhr:md5,db542a16a852056e01fc373c481d82ec", + "imgt_human_tr_v.nin:md5,24d1391a35a39a37f72cb3d564b6e5e5", + "imgt_human_tr_v.njs:md5,228f5e48054b3486fd82d32f93f6c0b3", + "imgt_human_tr_v.nog:md5,aab4b8fdc68806d86dd8a66c21c9721d", + "imgt_human_tr_v.nos:md5,abf41ed496f63ef73be355bfe9315d33", + "imgt_human_tr_v.not:md5,4bda50a4bf1154c98fcc644da73863bf", + "imgt_human_tr_v.nsq:md5,6a1d58da1db798ed8a726f51bf4edcc0", + "imgt_human_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_human_tr_v.nto:md5,4af9dffb2f255cb43b31c994f2aec269", + "imgt_mouse_ig_c.ndb:md5,b74c2efc68a76ab4205d14ad853d5454", + "imgt_mouse_ig_c.nhr:md5,67d730c045ccba37591ae7f8d16b9d17", + "imgt_mouse_ig_c.nin:md5,f610dcf38c2d7c5537be6e4fc036a6b4", + "imgt_mouse_ig_c.njs:md5,c244ec84002cca1d696aa604fa6701c4", + "imgt_mouse_ig_c.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "imgt_mouse_ig_c.nos:md5,7cf6c745889857e2598735a49039c6b5", + "imgt_mouse_ig_c.not:md5,873faccbdcaadf20738757ff3fd83f33", + "imgt_mouse_ig_c.nsq:md5,4b97fc13d8ef76fadbfd5ed6124a2ba9", + "imgt_mouse_ig_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_c.nto:md5,706b67145a22e8efbb8670a43b1e0cd3", + "imgt_mouse_ig_d.ndb:md5,b19fad9596341e0c288c0d58f4e2a81a", + "imgt_mouse_ig_d.nhr:md5,15b3f325ded60f6fcd020f5952503aba", + "imgt_mouse_ig_d.nin:md5,403de5e9bfebe7e0ca6b9e0db4bde562", + "imgt_mouse_ig_d.njs:md5,7cb6b95a853297946722ccdfae82e1cb", + "imgt_mouse_ig_d.nog:md5,d982f8a082df6bd7192e24229d555974", + "imgt_mouse_ig_d.nos:md5,249fc0539304e158d34d6ffa85db0a83", + "imgt_mouse_ig_d.not:md5,8f4cf856e9c39e1d1a83048ae9875d33", + "imgt_mouse_ig_d.nsq:md5,96e233401ac56520d13ad7ab72349185", + "imgt_mouse_ig_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_d.nto:md5,f299f5722008a1205618f210439834ae", + "imgt_mouse_ig_j.ndb:md5,39e3dc08e5b0f00302d82e3920c643c9", + "imgt_mouse_ig_j.nhr:md5,e84cc08006969b9826af412b6f6626d7", + "imgt_mouse_ig_j.nin:md5,682a0c1e72e0b1422e3b661349531f1d", + "imgt_mouse_ig_j.njs:md5,7be4e74aaa67e4d7b55ac66a58e77291", + "imgt_mouse_ig_j.nog:md5,2f6aeaf3176b34332fcaf214f1698e55", + "imgt_mouse_ig_j.nos:md5,ee8f7ec3b1bba39b01a5f19df20da7dc", + "imgt_mouse_ig_j.not:md5,68fee53d6fc665eb87e45b866468ac32", + "imgt_mouse_ig_j.nsq:md5,17c0295a1202e26cdb670acaef745e16", + "imgt_mouse_ig_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_j.nto:md5,a31324bf954edb7631e885d85d78103b", + "imgt_mouse_ig_v.ndb:md5,2de2e989ea109e09da297f30ca20667a", + "imgt_mouse_ig_v.nhr:md5,248cbba3aadbdf814da8706f666c9f91", + "imgt_mouse_ig_v.nin:md5,030c13edc786cf4c8e1ad4491f36892c", + "imgt_mouse_ig_v.njs:md5,1f29a9ae41a04cc765d7b68cd560c1f1", + "imgt_mouse_ig_v.nog:md5,6fe25de2b124ecf14453d8507ab536fa", + "imgt_mouse_ig_v.nos:md5,bd4f375790dd4c2ac0fb9627387d6112", + "imgt_mouse_ig_v.not:md5,81c46146154842750edbc3923e291198", + "imgt_mouse_ig_v.nsq:md5,8341057557b2c8a6a01185f8a4bedbcc", + "imgt_mouse_ig_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_ig_v.nto:md5,688627d85d01244e960293af8801aa6b", + "imgt_mouse_tr_c.ndb:md5,c699657e06c538df1abab26d54ba41d2", + "imgt_mouse_tr_c.nhr:md5,d73e399d3210fd72ec295fe9255204c6", + "imgt_mouse_tr_c.nin:md5,39c38148a1dd0cf8f5ffb617e40ddc3d", + "imgt_mouse_tr_c.njs:md5,fe326257dad06b92387369475bd42ba7", + "imgt_mouse_tr_c.nog:md5,df85d18647b8f011ed85756b3145e111", + "imgt_mouse_tr_c.nos:md5,721c50deeef515303652f32f27a9ab2b", + "imgt_mouse_tr_c.not:md5,24f16daf335352fe2bfca7094bdbd79d", + "imgt_mouse_tr_c.nsq:md5,bd58d1eeca6249ba5ea4b7fffbb14a76", + "imgt_mouse_tr_c.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_c.nto:md5,6df5535bce3294d057801d66a7c7701e", + "imgt_mouse_tr_d.ndb:md5,a8b37cb08e95964af2b6e1c219f5b53f", + "imgt_mouse_tr_d.nhr:md5,0f6ae6f691944d27b89811f64e7619e7", + "imgt_mouse_tr_d.nin:md5,2ef920a85e448c680ca25cb7424d83a7", + "imgt_mouse_tr_d.njs:md5,269418b7c005a66988da4444c90306b6", + "imgt_mouse_tr_d.nog:md5,c5aa62546a588032ae22df69236ab525", + "imgt_mouse_tr_d.nos:md5,e43e912b61ba5e5d5ef4331ae3ac36b2", + "imgt_mouse_tr_d.not:md5,667c9af4cfdc07e4bbb6ef858e9e6fb3", + "imgt_mouse_tr_d.nsq:md5,7a3189aa9369c6eac91ec418a851fbed", + "imgt_mouse_tr_d.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_d.nto:md5,afd0f544d132c4f72e97c866cc192fe1", + "imgt_mouse_tr_j.ndb:md5,e9d0ffcf8e6090ad2513cebc3e95f05a", + "imgt_mouse_tr_j.nhr:md5,bbd8b1aef821763537766eaae1b23c63", + "imgt_mouse_tr_j.nin:md5,96d6a34a7d54d9a77c70116ad249e3b3", + "imgt_mouse_tr_j.njs:md5,612c17d3e7c517844c79e03ba352a0b4", + "imgt_mouse_tr_j.nog:md5,6e8d11a76190d47ae644aa68e418cd3a", + "imgt_mouse_tr_j.nos:md5,3eff94779164fd38e60a1b6b9e38db6a", + "imgt_mouse_tr_j.not:md5,a65680020c287f8ece6787a63536c91d", + "imgt_mouse_tr_j.nsq:md5,3e751130114bfae43aa5cc9641b77db4", + "imgt_mouse_tr_j.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_j.nto:md5,a4083c809fe1a59ce4590d033579345d", + "imgt_mouse_tr_v.ndb:md5,9c96b5a88aecf92990d2a9478981f5bc", + "imgt_mouse_tr_v.nhr:md5,ce80dacb605c6fc3f4af0cbd1eff9f8d", + "imgt_mouse_tr_v.nin:md5,b3f3f09ead35acbd41931ed8290fee71", + "imgt_mouse_tr_v.njs:md5,82aaf433290049914a9d70c1f323ceb0", + "imgt_mouse_tr_v.nog:md5,6c016394ec2c70ae8c89827f49b977a7", + "imgt_mouse_tr_v.nos:md5,b735b8fe72a2e279ae8cc603fe6e973b", + "imgt_mouse_tr_v.not:md5,4ce6eda1c5ae1f7dea5540256c0349b9", + "imgt_mouse_tr_v.nsq:md5,89774a3086001a0238cef3462633c2fb", + "imgt_mouse_tr_v.ntf:md5,de1250813f0c7affc6d12dac9d0fb6bb", + "imgt_mouse_tr_v.nto:md5,f0fd3f43dfc1c2c7a5f09db5ff8958fc", + "mouse_gl_D.nhr:md5,a832b15e9a5449f42a54dfd6c9f53cd0", + "mouse_gl_D.nin:md5,e7f91f781cf6ccc50868f7dfffda69e8", + "mouse_gl_D.nog:md5,7f4fff8e3d0dbcd4ca2a3b1f3673f5d5", + "mouse_gl_D.nsd:md5,5e49254772451138f955e36b8027cd19", + "mouse_gl_D.nsi:md5,653a7177b44c583aff703c83408d657f", + "mouse_gl_D.nsq:md5,3259c782003b3e425410aa255a515ebe", + "mouse_gl_J.nhr:md5,89c7a3cbe897890ac294243ba283ba6b", + "mouse_gl_J.nin:md5,ffd09e9e8fd21ccb2ed1ab24d3dfe8b9", + "mouse_gl_J.nog:md5,8c00fc1af854bba9ef32efca74e02a19", + "mouse_gl_J.nsd:md5,e94a6ad2cfe42c76593e16fd040bb929", + "mouse_gl_J.nsi:md5,61e91a6d1fa9b56587406dfcf7167dd2", + "mouse_gl_J.nsq:md5,26397eca0849e81f650001d316f592b6", + "mouse_gl_V.nhr:md5,0abe6bdca2b08e47bee3679bcce0b63b", + "mouse_gl_V.nin:md5,47c2c821445f55ea2d1191b090fdb132", + "mouse_gl_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_gl_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_gl_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_gl_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_gl_V.phr:md5,d204d83e0b7c698e13ef12e5e3b9bf60", + "mouse_gl_V.pin:md5,23b5ce4a46a3d81c6f8f7aabc6e7824d", + "mouse_gl_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_gl_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_gl_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_gl_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "mouse_gl_VDJ.tar:md5,e3485278d8ba068638a9d3428553e6a2", + "ncbi_human_c_genes.tar:md5,a8f1112969c8b552bdab3f488bbd0c47", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,fdbf43e4459fad96eeba391ec598c958", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,d273393e8dc187c816414f260348944e", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f25deb7f0151944e411af5880b8c8a55", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "rhesus_monkey_VJ.tar:md5,9e918cf291f34a391bb6398325a78db5", + "imgt_aa_human_ig_v.fasta:md5,30b9ca0f29a61c2459482fe30cfe19b6", + "imgt_aa_human_tr_v.fasta:md5,43f11ae863217d575626c20b7d84adb8", + "imgt_aa_mouse_ig_v.fasta:md5,edac8c37e0408f9f6c8d232d79ffc8be", + "imgt_aa_mouse_tr_v.fasta:md5,3e172585de3b78916c2711c5f3ddcb25", + "imgt_human_ig_c.fasta:md5,d660c41cc2bec165cd5ace32405eff39", + "imgt_human_ig_d.fasta:md5,935b4bb5442897f8d97051a4f2fe37d0", + "imgt_human_ig_j.fasta:md5,d7c28fd1c42b3d72b630e290d76fe409", + "imgt_human_ig_v.fasta:md5,0f604ba84709db16f9d4f0eafbd261ba", + "imgt_human_tr_c.fasta:md5,71b3865449c1a42a9e4f59b3ecdf3256", + "imgt_human_tr_d.fasta:md5,fe5ac92ba4d4e2ef0a001685e07b3914", + "imgt_human_tr_j.fasta:md5,dcae2f9293af89398f5df0b4acd60981", + "imgt_human_tr_v.fasta:md5,bcb1b21e6943da537f1e7fdcfce31119", + "imgt_mouse_ig_c.fasta:md5,b778e2bcea4e0a170404b28bd648522c", + "imgt_mouse_ig_d.fasta:md5,aa246ba4e5fa2eaad83ac7daab234772", + "imgt_mouse_ig_j.fasta:md5,3b220b309cc4d15b4cb120aae9e88170", + "imgt_mouse_ig_v.fasta:md5,875b17ff8b5ab819c3e1b332492c494d", + "imgt_mouse_tr_c.fasta:md5,b476e7d4fbd8768ace3877633c6b22de", + "imgt_mouse_tr_d.fasta:md5,3cf6735d31ca794bcf684fa2ccc3d148", + "imgt_mouse_tr_j.fasta:md5,4ef4d35a0e1d770873ae84dd0336d475", + "imgt_mouse_tr_v.fasta:md5,db73f796a88b77f1bbf2964f57a02285", + "human.ndm.imgt:md5,d6cea490480cecfeb082c66607126ff0", + "human.ndm.kabat:md5,294da2ace8c28701ba26406226acf9af", + "human.pdm.imgt:md5,eee1e720fe17bc2b74055dad690c5c3c", + "human.pdm.kabat:md5,2a09fe4aafb06a24ae09866ee2e874e2", + "human_TR_V.nhr:md5,05e85d4422ddd63b251798ad52afbb07", + "human_TR_V.nin:md5,479cf56d41b7708db836278c6090297a", + "human_TR_V.nog:md5,27b8711de1d9cb4a09de4fffd52cd7b4", + "human_TR_V.nsd:md5,1bd3fc688986ca1cd3cbf0ba341e6e88", + "human_TR_V.nsi:md5,902ee2023646ab9d5c2e8bd9e7cd9a74", + "human_TR_V.nsq:md5,1d6eaff8a9696dfb81f54c253adb3e8f", + "human_TR_V.phr:md5,289fad3fda3ca9a4b9dc62a436bb8ba1", + "human_TR_V.pin:md5,b974c4c2e06a7b15e8113b8a114e2a01", + "human_TR_V.pog:md5,0e477541fc88a535d10ec37531198245", + "human_TR_V.psd:md5,9afcedfab46fdad1283dc6932796a56f", + "human_TR_V.psi:md5,9247ca05fe82fb5a528120b3098108b3", + "human_TR_V.psq:md5,4a127b625dcef63b5d0412f7b3e7972b", + "human_V.nhr:md5,18e1447dbb688d21f30781c0a3602cb2", + "human_V.nin:md5,34d4976f789560a3f954203bb8765e2e", + "human_V.nog:md5,3308e60e960e48c12c4a0446aa2ce485", + "human_V.nsd:md5,34506dc9f4d6d385942ea574806669e3", + "human_V.nsi:md5,387635abc8f8ca09293b0bf792bbbfb8", + "human_V.nsq:md5,d3ebdd064a158bdde2708cd19c9cd7d9", + "human_V.phr:md5,d461e9be5047f30963ee7b78c963553a", + "human_V.pin:md5,c0f35ffe97886fe2025a15a829c48749", + "human_V.pog:md5,2aaff4653db578472761e0759b64a768", + "human_V.psd:md5,d1f08d3c624a3770b1232addd7668508", + "human_V.psi:md5,887ac2a9d4cc0e69a94b7543629ab784", + "human_V.psq:md5,35791ac164354b70ad4a35ad9f486f2f", + "mouse.ndm.imgt:md5,352c7f46597497ebf713698fa440ed95", + "mouse.ndm.kabat:md5,2720ae1c09623777e37a116cf9f73823", + "mouse.pdm.imgt:md5,e97ea4cec66d10bceee1ce3518c44082", + "mouse.pdm.kabat:md5,fbce28354f68f4cb6be6333eff6aa0dc", + "mouse_TR_V.nhr:md5,d116d1ef618402cfdbfa75f267813608", + "mouse_TR_V.nin:md5,fcec1baff7bcbe28e71a1e00c24efab7", + "mouse_TR_V.nog:md5,e3dda143f2afc7aa44eb22524049d98e", + "mouse_TR_V.nsd:md5,2d642f4bb76f77bd38f8737f58e9f0f0", + "mouse_TR_V.nsi:md5,9aa022b79d9d063f61ea591ff7a88e7d", + "mouse_TR_V.nsq:md5,61a73abedabb5e8963671f725beb2873", + "mouse_TR_V.phr:md5,4e7cfac13eb50b0b8d8e6d3d49bc5b76", + "mouse_TR_V.pin:md5,2d66648ed028872ac56338a666237a02", + "mouse_TR_V.pog:md5,54a77b456076c55bab9262c76fd7f54f", + "mouse_TR_V.psd:md5,b91ac864d59b2bf1f271255e86c17294", + "mouse_TR_V.psi:md5,b9df1a625a63b5d74499b8c8d7d02e9a", + "mouse_TR_V.psq:md5,6d996ab0e41026b1e28438f25d43c359", + "mouse_V.nhr:md5,32e46aa6a9b13c2e6058a57b11a1cb38", + "mouse_V.nin:md5,319645b00f94d159208f8204c192e89c", + "mouse_V.nog:md5,2c59132ed7f37b70751aeb4264409942", + "mouse_V.nsd:md5,33b7ada29dd6f6b1d848cecffcbfca25", + "mouse_V.nsi:md5,301886dfff9ed7550ab3a2d0b3d916eb", + "mouse_V.nsq:md5,8235994044728f17e8e685d42a01ffae", + "mouse_V.phr:md5,300cf56525199abafa7f69d21ec90d7f", + "mouse_V.pin:md5,32f2c58b40925b798b8c07c98520c625", + "mouse_V.pog:md5,cab625c3365b65a1bf041cf7dbae15b1", + "mouse_V.psd:md5,e981f48453020d8555feec4c6e40cd70", + "mouse_V.psi:md5,d0cd444dc6de67a8e240be0fef5d5949", + "mouse_V.psq:md5,971b28104884d594b328a249e06f7ee1", + "rabbit.ndm.imgt:md5,29910940f8994455d5b632effdb4571f", + "rabbit.ndm.kabat:md5,2a45cb3a7c9e5d103ad6ef1cba3253a9", + "rabbit.pdm.imgt:md5,3ad8b9bb42c7c1e17929cf89f32c549b", + "rabbit.pdm.kabat:md5,5943bba3fcd0d1ba7234843e65876f1f", + "rabbit_V.nhr:md5,83bce87d624c8bd7be460050b81c624d", + "rabbit_V.nin:md5,4b831ea6dac84f0f9db2503d2812a101", + "rabbit_V.nog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.nsd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.nsi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.nsq:md5,6d4450cc6cdd47c35c383c105a2922f6", + "rabbit_V.phr:md5,3c4cac38b9a4a9d74eb5097745c82f2a", + "rabbit_V.pin:md5,78b0eead25d92252420ae988a057977a", + "rabbit_V.pog:md5,a57586e2151edc9054d42613c0f333ea", + "rabbit_V.psd:md5,e90aab1550962796e8f4a74df53d681d", + "rabbit_V.psi:md5,fc30fdc8baf22f8855ee54dc6fccf96a", + "rabbit_V.psq:md5,4223f96b39e2919008bf46ebf4bc8086", + "rat.ndm.imgt:md5,7317c7d30271cf5eb55dcaaa8d21d08f", + "rat.ndm.kabat:md5,2fd65f271ac90dc2f845053a18bc8136", + "rat.pdm.imgt:md5,6df63cc9e6531a29a592078e26178def", + "rat.pdm.kabat:md5,99996aab7e318763d2f5b3cf45a01c3d", + "rat_V.nhr:md5,bd4c6684859c91444a2ec36f50ce19be", + "rat_V.nin:md5,dd19ca8cd6641846a73681f00590c58e", + "rat_V.nog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.nsd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.nsi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.nsq:md5,08a7b14ce61dab2dfc980e37511ffdba", + "rat_V.phr:md5,10dde83b2bcc323c1f594cd2cf1943db", + "rat_V.pin:md5,f637df718130398afe844085dbe00e61", + "rat_V.pog:md5,11b45f728cd8e07aac3bcd2e0118a114", + "rat_V.psd:md5,f7c62ad597376b7e4aeba5539fea1947", + "rat_V.psi:md5,1dca7089ad10f865f24d0c460548e4eb", + "rat_V.psq:md5,7afff0d34e3ac4ce5e27ffcca802f167", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "Entries:md5,637aaed90638717490c792d7db1380ad", + "Repository:md5,e7f792f89c1401fef550063f8ee5e7c8", + "Root:md5,064d27aa012c3bdd8b586bdfa152ae85", + "rhesus_monkey.ndm.imgt:md5,66c289aefc8d7fddf9bf4c9fa34e5f5b", + "rhesus_monkey.ndm.kabat:md5,5f13f6532cb44ae9049e04d108a32b9d", + "rhesus_monkey.pdm.imgt:md5,81629757b65a58851db23647cc6e130c", + "rhesus_monkey.pdm.kabat:md5,c3be9bef7c01b976419fa29121f12b08", + "rhesus_monkey_D.nhr:md5,5dbd53d004414cf37936705f0091f80b", + "rhesus_monkey_D.nin:md5,497cb469125caec99387cc30c244ed7f", + "rhesus_monkey_D.nog:md5,8c329c52cf5919b234d822f23e3ffeae", + "rhesus_monkey_D.nsd:md5,421c91caee071b623b25caaa5d37d56b", + "rhesus_monkey_D.nsi:md5,3b0f500e9d51c4a5b25897462b4d3769", + "rhesus_monkey_D.nsq:md5,1280769a0559128141088ee02864674b", + "rhesus_monkey_J.nhr:md5,28e5129ca9c6f265cdc2722615fc8846", + "rhesus_monkey_J.nin:md5,0717ec6ff45f06b9d3d22b7bb128dcab", + "rhesus_monkey_J.nog:md5,efc67de033c690611bd5b79b620b00da", + "rhesus_monkey_J.nsd:md5,7d90a63a1b7018a694412a1002a66418", + "rhesus_monkey_J.nsi:md5,b176549a4f1046e883bdfd236e7d3c09", + "rhesus_monkey_J.nsq:md5,a6f699c77221eaa00558b9c4a59ff7d7", + "rhesus_monkey_V.nhr:md5,0d6c4ea2e7c48cacaaae03f1d33ac0cf", + "rhesus_monkey_V.nin:md5,19c96733bfb8de3b6a177541cae21ed6", + "rhesus_monkey_V.nog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.nsd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.nsi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.nsq:md5,313784b20eac86058819a7454801cafe", + "rhesus_monkey_V.phr:md5,0f6ef1c769c62ef1b782e748fcdda6e0", + "rhesus_monkey_V.pin:md5,f275f17c6893512860ba23c66e87d865", + "rhesus_monkey_V.pog:md5,1f06eac1e426e1fcf1d8cb865d5ef73b", + "rhesus_monkey_V.psd:md5,b5b2ca588d397badadac3545ab123524", + "rhesus_monkey_V.psi:md5,e0d3641d1bf83271d1da0316304b6185", + "rhesus_monkey_V.psq:md5,75030219251f33c6296959efaaa24c2f", + "human_gl.aux:md5,5801b62a007c5d98501116d8b6a7dde7", + "human_gl.aux.testonly:md5,b51b2475f3366e8e01a433149341d730", + "mouse_gl.aux:md5,8da2b395709c472408f1f7900a72e986", + "rabbit_gl.aux:md5,c14ec0d70f8fb8274f04521e684579c6", + "rat_gl.aux:md5,8c293acaa9173e734dc99cf32115d5c3", + "readme:md5,a8da9737a87ea30634d9c76daff9e3a7", + "rhesus_monkey_gl.aux:md5,92d38df5fe92bf01ff82beb62ec8e43d" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-09T10:08:33.373288" + }, + "test curlAndExtract with type - tar.bz2 file": { + "content": [ + [ + "CARD-Download-README.txt:md5,b57364cc1a5fab0541e13a01fabe5dea", + "PMID.tsv:md5,e3ce79c4b5dcf0a9e3117ed683f96e54", + "aro_categories.tsv:md5,6f9c4b0410b9e2b3cf5867a2a3f1db07", + "aro_categories_index.tsv:md5,d5fbc673c0de6601b07c8016b3909f8e", + "aro_index.tsv:md5,0f183c7869876fa32c8f86aade0df7b5", + "card.json:md5,72156d00155f69e637664bfb5d3b5395", + "nucleotide_fasta_protein_homolog_model.fasta:md5,696d1aa4f04bd08fc4bdeea33ab9db43", + "nucleotide_fasta_protein_knockout_model.fasta:md5,d8224ce019ad69a041d83ccf7877b4e0", + "nucleotide_fasta_protein_overexpression_model.fasta:md5,80a1e7957c79d311446e06c6dd49db8e", + "nucleotide_fasta_protein_variant_model.fasta:md5,7450e559045c9d1d8f13c73054c64f4c", + "nucleotide_fasta_rRNA_gene_variant_model.fasta:md5,bd53f46d630f652c9f6b7584c2126e1f", + "protein_fasta_protein_homolog_model.fasta:md5,36ea300133fd7c5a45de2fee4c5050bf", + "protein_fasta_protein_knockout_model.fasta:md5,f16667df70d1a5f910d3ae45f5250c3d", + "protein_fasta_protein_overexpression_model.fasta:md5,723e8762be5c96aed8c379a6499cecee", + "protein_fasta_protein_variant_model.fasta:md5,8c02d8fc84c9a90953f8534355244019", + "shortname_antibiotics.tsv:md5,9a4ba742fd8a3a49c7f50744001a4129", + "shortname_pathogens.tsv:md5,5211712be4f4c3306cbe4052cafae1d7", + "snps.txt:md5,529d4fdb74c8940c0930ec1a7a6d4980" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-09T11:01:00.867726" + }, + "test curlAndExtract with type - tar.gz file": { + "content": [ + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T23:27:19.495861" + }, "test curlAndExtract - tar.gz file": { "content": [ [ @@ -416,6 +862,19 @@ }, "timestamp": "2025-12-09T10:08:33.373288" }, + "test curlAndExtract with type - zip file": { + "content": [ + [ + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T23:32:07.753491" + }, "test curlAndExtract - zip file": { "content": [ [ From 1c8eaa193e98de8ac26014b8499a878de5f28b7b Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 11:06:00 +0000 Subject: [PATCH 22/24] With documentation --- src/main/java/nf_core/nf/test/utils/Utils.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/nf_core/nf/test/utils/Utils.java b/src/main/java/nf_core/nf/test/utils/Utils.java index 6221d02..109241e 100644 --- a/src/main/java/nf_core/nf/test/utils/Utils.java +++ b/src/main/java/nf_core/nf/test/utils/Utils.java @@ -37,12 +37,21 @@ public static ProcessResult runProcess(ProcessBuilder pb) throws IOException, In return new ProcessResult(exitCode, stderr.toString()); } - // Helper to single-quote a string for safe shell usage: '...' + /** + * Shell escape a string by wrapping in single quotes and escaping existing single quotes. + * @param s + * @return The shell-escaped string + */ public static String shellEscape(String s) { if (s == null) return "''"; return "'" + s.replace("'", "'" + "\"'\"" + "'") + "'"; } + /** + * Extract a lower-cased file name portion from a URL string for extension checking. + * @param urlString The URL string + * @return The lower-cased file name portion of the URL + */ public static String getURLFileName(String urlString) { // Try to extract a path portion from the URL (strip query strings) String pathPart = urlString; From 7c2d53951deec1e61ab07725b4e97ba794d1b888 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 11:27:35 +0000 Subject: [PATCH 23/24] User must specify the format is tar, not more defaulting to it --- docs/usage.md | 4 +- .../java/nf_core/nf/test/utils/Methods.java | 54 +++++++++++-------- tests/curlAndExtract/main.nf.test | 8 +-- tests/curlAndExtract/main.nf.test.snap | 40 +++++++------- 4 files changed, 60 insertions(+), 46 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index c4c5d83..2fc1fdd 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -552,6 +552,8 @@ Zip and Tar archives are currently supported. Tar archives can be compressed with any of these algorithms: gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd. By default, the choice of archive format and compression algorithm is based on the name of the archive, but it can also be passed as an argument. +For compressed Tar archives, the format to provide is "tar.bz2" or "tbz2" +(adapting to your compression algorithm of choice). You are responsible for deleting the data in the `cleanup` phase. @@ -559,7 +561,7 @@ You are responsible for deleting the data in the `cleanup` phase. setup { curlAndExtract("https://www.example.com/pretty_database.zip", "${launchDir}/data_dir") curlAndExtract("https://www.example.com/beautiful_database.tar.gz", "${launchDir}/data_dir") - curlAndExtract("https://www.example.com/secret/data", "${launchDir}/data_dir", "bz2") + curlAndExtract("https://www.example.com/secret/data", "${launchDir}/data_dir", "tar.bz2") } when { diff --git a/src/main/java/nf_core/nf/test/utils/Methods.java b/src/main/java/nf_core/nf/test/utils/Methods.java index 897b180..9696fd2 100644 --- a/src/main/java/nf_core/nf/test/utils/Methods.java +++ b/src/main/java/nf_core/nf/test/utils/Methods.java @@ -752,7 +752,8 @@ public static TreeMap sanitizeOutput(HashMap optio * * @param urlString the URL to fetch * @param destPath directory to extract the tarball into - * @param compression compression type: gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd + * @param compression compression type: tar, gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd + * or any of these prefixed with "tar." or "t" * @throws IOException on failure */ private static void curlAndUntar(String urlString, String destPath, String compression) throws IOException { @@ -765,6 +766,13 @@ private static void curlAndUntar(String urlString, String destPath, String compr // Convert compression name to tar option if (compression != null && !compression.equals("tar")) { + // Remove leading "tar." or "t" if present + if (compression.startsWith("tar.")) { + compression = compression.substring(4); + } else if (compression.startsWith("t")) { + compression = compression.substring(1); + } + if (compression.equals("gzip") || compression.equals("gz")) { compression = "gzip"; } else if (compression.equals("bzip2") || compression.equals("bz2")) { @@ -883,28 +891,25 @@ private static void curlAndUnzip(String urlString, String destPath) throws IOExc */ public static void curlAndExtract(String urlString, String destPath) throws IOException { String lower = Utils.getURLFileName(urlString); - // Convert file name (extension) to compression name. - // Zip is the only clearly defined archive format. - // Everything else is assumed to be Tar + if (lower.endsWith(".zip")) { curlAndUnzip(urlString, destPath); - } else if (lower.endsWith("gz")) { - curlAndUntar(urlString, destPath, "gzip"); - } else if (lower.endsWith("bz2")) { - curlAndUntar(urlString, destPath, "bzip2"); - } else if (lower.endsWith("xz")) { - curlAndUntar(urlString, destPath, "xz"); - } else if (lower.endsWith("lz4")) { - curlAndUntar(urlString, destPath, "lz4"); - } else if (lower.endsWith("lzma")) { - curlAndUntar(urlString, destPath, "lzma"); - } else if (lower.endsWith("lzop")) { - curlAndUntar(urlString, destPath, "lzop"); - } else if (lower.endsWith("zst") || lower.endsWith("zstd")) { - curlAndUntar(urlString, destPath, "zstd"); - } else { + return; + } + + for (String suffix: new String [] {"gz", "bz2", "xz", "lz4", "lzma", "lzop", "zst", "zstd"}) { + if (lower.endsWith(".tar." + suffix) || lower.endsWith(".t" + suffix)) { + curlAndUntar(urlString, destPath, suffix); + return; + } + } + + if (lower.endsWith(".tar")) { curlAndUntar(urlString, destPath, null); + return; } + + throw new IllegalArgumentException("Unsupported archive type in URL: " + urlString); } /** @@ -914,7 +919,8 @@ public static void curlAndExtract(String urlString, String destPath) throws IOEx * * @param urlString the URL to fetch * @param destPath directory to extract the archive into - * @param compression compression type: zip, gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd, tar + * @param compression compression type: zip, tar, or any of the following prefixed with "tar." or "t": + * gzip, gz, bzip2, bz2, xz, lz4, lzma, lzop, zstd * @throws IOException on failure or if archive type is unsupported */ public static void curlAndExtract(String urlString, String destPath, String compression) throws IOException { @@ -926,8 +932,14 @@ public static void curlAndExtract(String urlString, String destPath, String comp // Everything else is assumed to be Tar if (lower.equals("zip")) { curlAndUnzip(urlString, destPath); - } else { + } else if (lower.equals("tar")) { + curlAndUntar(urlString, destPath, null); + } else if (lower.startsWith("tar.")) { curlAndUntar(urlString, destPath, compression); + } else if (lower.startsWith("t")) { + curlAndUntar(urlString, destPath, compression); + } else { + throw new IllegalArgumentException("Unsupported compression type: " + compression); } } } diff --git a/tests/curlAndExtract/main.nf.test b/tests/curlAndExtract/main.nf.test index b7f867f..bcf96d6 100644 --- a/tests/curlAndExtract/main.nf.test +++ b/tests/curlAndExtract/main.nf.test @@ -62,10 +62,10 @@ nextflow_process { } } - test("test curlAndExtract with type - tar.gz file") { + test("test curlAndExtract with type - tar.gzip file") { setup { - curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs", "gzip") + curlAndExtract("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/generic/tar/hello.tar.gz", "${launchDir}/dbs", "tar.gzip") } then { def files = getAllFilesFromDir("${launchDir}/dbs") @@ -90,10 +90,10 @@ nextflow_process { } } - test("test curlAndExtract with type - tar.bz2 file") { + test("test curlAndExtract with type - tbzip2 file") { setup { - curlAndExtract("https://card.mcmaster.ca/latest/data", "${launchDir}/dbs", "bzip2") + curlAndExtract("https://card.mcmaster.ca/latest/data", "${launchDir}/dbs", "tbzip2") } then { def files = getAllFilesFromDir("${launchDir}/dbs") diff --git a/tests/curlAndExtract/main.nf.test.snap b/tests/curlAndExtract/main.nf.test.snap index 5da6451..ac9beb6 100644 --- a/tests/curlAndExtract/main.nf.test.snap +++ b/tests/curlAndExtract/main.nf.test.snap @@ -404,7 +404,19 @@ }, "timestamp": "2025-12-09T10:08:33.373288" }, - "test curlAndExtract with type - tar.bz2 file": { + "test curlAndExtract with type - tar.gzip file": { + "content": [ + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2025-12-08T23:27:19.495861" + }, + "test curlAndExtract with type - tbzip2 file": { "content": [ [ "CARD-Download-README.txt:md5,b57364cc1a5fab0541e13a01fabe5dea", @@ -433,29 +445,18 @@ }, "timestamp": "2025-12-09T11:01:00.867726" }, - "test curlAndExtract with type - tar.gz file": { - "content": [ - [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" - }, - "timestamp": "2025-12-08T23:27:19.495861" - }, - "test curlAndExtract - tar.gz file": { + "test curlAndExtract with type - zip file": { "content": [ [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", + "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T23:27:19.495861" + "timestamp": "2025-12-08T23:32:07.753491" }, "test curlAndExtract - tar file": { "content": [ @@ -862,18 +863,17 @@ }, "timestamp": "2025-12-09T10:08:33.373288" }, - "test curlAndExtract with type - zip file": { + "test curlAndExtract - tar.gz file": { "content": [ [ - "ncbi.map:md5,de30dbba85f9070612b632e2a5a95952", - "ncbi.tre:md5,4029dd2091c685b9a86ddd9d0d870db0" + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "24.04.2" }, - "timestamp": "2025-12-08T23:32:07.753491" + "timestamp": "2025-12-08T23:27:19.495861" }, "test curlAndExtract - zip file": { "content": [ From e334cefabbc499532d6395db5fd19771fb3b9719 Mon Sep 17 00:00:00 2001 From: Matthieu Muffato Date: Tue, 9 Dec 2025 11:31:17 +0000 Subject: [PATCH 24/24] Fixed the cleanup --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 2fc1fdd..9e02fde 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -573,6 +573,6 @@ when { } cleanup { - new File("${launchDir}/data_dir/db").deleteDir() + new File("${launchDir}/data_dir").deleteDir() } ```