From b9128542bf1de39ac04195ad7e615f415d9a5d37 Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 12:02:48 +0000 Subject: [PATCH 1/7] add mars integration tests --- .../multi-omics-submission-test.yaml | 110 ++++++++++ .../{test-mars.yml => test-mars-cli.yml} | 2 +- scripts/isa_generator.py | 194 ++++++++++++++++++ scripts/prepare_poc_submission.py | 145 +++++++++++++ 4 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/multi-omics-submission-test.yaml rename .github/workflows/{test-mars.yml => test-mars-cli.yml} (98%) create mode 100644 scripts/isa_generator.py create mode 100644 scripts/prepare_poc_submission.py diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml new file mode 100644 index 0000000..b9fd542 --- /dev/null +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -0,0 +1,110 @@ +name: Integration - MARS PoC +on: + workflow_dispatch: + push: + branches: [ main ] + +jobs: + poc-mars-cli: + runs-on: ubuntu-latest + + env: + # Where mars-cli will put .mars/ + MARS_SETTINGS_DIR: ${{ github.workspace }}/mars_settings + + # Paths for MARS repo and ISA template + MARS_REPOSITORY_SERVICES_PATH: ${{ github.workspace }}/MARS/repository-services + MARS_ISA_TEMPLATE_PATH: ${{ github.workspace }}/MARS/test-data/biosamples-input-isa.json + + # Credentials from GitHub secrets + MARS_WEBIN_USERNAME: ${{ secrets.MARS_WEBIN_USERNAME }} + MARS_WEBIN_PASSWORD: ${{ secrets.MARS_WEBIN_PASSWORD }} + MARS_METABOLIGHTS_METADATA_USERNAME: ${{ secrets.MARS_METABOLIGHTS_METADATA_USERNAME }} + MARS_METABOLIGHTS_METADATA_PASSWORD: ${{ secrets.MARS_METABOLIGHTS_METADATA_PASSWORD }} + MARS_METABOLIGHTS_DATA_USERNAME: ${{ secrets.MARS_METABOLIGHTS_DATA_USERNAME }} + MARS_METABOLIGHTS_DATA_PASSWORD: ${{ secrets.MARS_METABOLIGHTS_DATA_PASSWORD }} + + steps: + - name: Checkout MARS (for repository-services + test-data) + uses: actions/checkout@v4 + with: + repository: elixir-europe/MARS + path: MARS + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install mars-cli + run: | + pip install --upgrade pip + pip install . + + - name: Start repository-services (docker compose up) + working-directory: ${{ env.MARS_REPOSITORY_SERVICES_PATH }} + run: | + docker compose up -d --build + + - name: Wait for services to start + run: | + # Wait for both services to become healthy (max ~150s) + for i in {1..30}; do + echo "Health check attempt $i..." + + ISAENA_OK=0 + ISABIOSAMPLES_OK=0 + + curl -fsS http://localhost:8042/isaena >/dev/null && ISAENA_OK=1 || ISAENA_OK=0 + curl -fsS http://localhost:8032/isabiosamples >/dev/null && ISABIOSAMPLES_OK=1 || ISABIOSAMPLES_OK=0 + + if [ "$ISAENA_OK" -eq 1 ] && [ "$ISABIOSAMPLES_OK" -eq 1 ]; then + echo "Both services are up ✅" + exit 0 + fi + + echo "Services not ready yet. isaena=$ISAENA_OK isabiosamples=$ISABIOSAMPLES_OK" + sleep 5 + done + + echo "Services did not become healthy in time ❌" + exit 1 + + - name: Prepare PoC - settings, ISA JSON, credentials, dataFiles + run: | + python scripts/prepare_poc_submission.py + + - name: Run mars-cli submit (dev ENA + BioSamples, no MetaboLights) + run: | + set -euo pipefail + + # Build list of --data-files arguments from generated .fastq.gz files + DATA_ARGS=() + for f in poc_work/data/*.fastq.gz; do + echo "Using data file: ./$f" + DATA_ARGS+=( "./$f" ) + done + + echo "Running mars-cli with data args: $DATA_ARGS" + + mars-cli --development submit \ + --submit-to-metabolights False \ + --file-transfer ftp \ + --data-files $DATA_ARGS \ + --credentials-file ./poc_work/credentials.json \ + ./poc_work/isa.json + + - name: Upload run artifacts + uses: actions/upload-artifact@v4 + with: + name: run-artifacts + path: | + poc_work/ + mars_settings/ + output_*.json + + - name: Stop repository-services (docker compose down) + if: always() + working-directory: ${{ env.MARS_REPOSITORY_SERVICES_PATH }} + run: | + docker compose down --volumes \ No newline at end of file diff --git a/.github/workflows/test-mars.yml b/.github/workflows/test-mars-cli.yml similarity index 98% rename from .github/workflows/test-mars.yml rename to .github/workflows/test-mars-cli.yml index 150d3d7..389ab2c 100644 --- a/.github/workflows/test-mars.yml +++ b/.github/workflows/test-mars-cli.yml @@ -1,4 +1,4 @@ -name: Test MARS +name: Test mars-cli on: push: paths: diff --git a/scripts/isa_generator.py b/scripts/isa_generator.py new file mode 100644 index 0000000..c2b7692 --- /dev/null +++ b/scripts/isa_generator.py @@ -0,0 +1,194 @@ +# tests/utils/isa_generator.py +from __future__ import annotations + +from pathlib import Path +from datetime import datetime, UTC +import uuid +import json +import gzip +import hashlib +from typing import Any, List, Tuple + + +def _timestamp_suffix() -> str: + """Unique suffix for this run (used for data file names).""" + return datetime.now(UTC).strftime("%Y%m%d%H%M%S") + "_" + uuid.uuid4().hex[:6] + + +def _write_dummy_fastq_gz(path: Path) -> None: + """ + Write a tiny dummy FASTQ dataset into a .fastq.gz file. + Content doesn't matter, as long as it's valid-ish FASTQ text. + """ + path.parent.mkdir(parents=True, exist_ok=True) + with gzip.open(path, "wt") as fh: + fh.write( + "@read1\n" + "ACGTACGTACGTACGT\n" + "+\n" + "FFFFFFFFFFFFFFFF\n" + ) + + +def _md5_of_file(path: Path) -> str: + """ + Compute MD5 checksum of the given file (binary content). + """ + h = hashlib.md5() + with path.open("rb") as fh: + for chunk in iter(lambda: fh.read(8192), b""): + h.update(chunk) + return h.hexdigest() + + +def _get_first_assay(isa_obj: dict[str, Any]) -> dict[str, Any] | None: + """ + Navigate to investigation.studies[0].assays[0] (if present). + """ + inv = isa_obj.get("investigation") + if inv is None: + inv = isa_obj + + if not isinstance(inv, dict): + return None + + studies = inv.get("studies") or [] + if not isinstance(studies, list) or not studies: + return None + + first_study = studies[0] + if not isinstance(first_study, dict): + return None + + assays = first_study.get("assays") or [] + if not isinstance(assays, list) or not assays: + return None + + first_assay = assays[0] + if not isinstance(first_assay, dict): + return None + + return first_assay + + +def _ensure_comment(comments: List[dict[str, Any]], name: str, value: str) -> None: + """ + Ensure there is a comment with the given name, updating it if it exists, + or appending a new one if not. + """ + for c in comments: + if isinstance(c, dict) and c.get("name") == name: + c["value"] = value + return + comments.append({"name": name, "value": value}) + + +def _update_datafiles_with_generated_files( + assay: dict[str, Any], + data_dir: Path, + n_files: int, +) -> List[Path]: + """ + For the first assay, update its dataFiles entries with newly generated .fastq.gz files. + + Behaviour per dataFiles[i] (for i < n_files): + + - Generate a unique .fastq.gz file based on the existing 'name': + e.g. ENA_TEST2.R2.fastq.gz -> ENA_TEST2.R2_.fastq.gz + (if name doesn't end with .fastq.gz, just append _.fastq.gz) + + - Write a dummy FASTQ into that file and compute its MD5. + + - Update the dataFiles[i] object: + * "name" = new file name + * in "comments": + - "file name" -> new file name + - "file type" -> "fastq" + - "file checksum" -> MD5 of the .fastq.gz + - "checksum_method" -> "MD5" + (existing "accession", "submission date", etc. are kept as-is) + """ + data_files_json = assay.get("dataFiles") or [] + if not isinstance(data_files_json, list): + return [] + + generated_paths: List[Path] = [] + suffix = _timestamp_suffix() + + # We only touch up to n_files entries, and only those that look like objects + for i, df_json in enumerate(data_files_json): + if i >= n_files: + break + if not isinstance(df_json, dict): + continue + + original_name = df_json.get("name") + if not isinstance(original_name, str) or not original_name: + continue + + # Build unique .fastq.gz name + if original_name.endswith(".fastq.gz"): + base = original_name[:-len(".fastq.gz")] + new_name = f"{base}_{suffix}.fastq.gz" + else: + new_name = f"{original_name}_{suffix}.fastq.gz" + + file_path = data_dir / new_name + _write_dummy_fastq_gz(file_path) + md5 = _md5_of_file(file_path) + + # Update the JSON entry + df_json["name"] = new_name + + comments = df_json.get("comments") + if not isinstance(comments, list): + comments = [] + df_json["comments"] = comments + + _ensure_comment(comments, "file name", new_name) + _ensure_comment(comments, "file type", "fastq") + _ensure_comment(comments, "file checksum", md5) + _ensure_comment(comments, "checksum_method", "MD5") + # DO NOT touch 'accession' or 'submission date' if present + + generated_paths.append(file_path) + + return generated_paths + + +def generate_isa_json_with_data( + work_dir: Path, + template_path: Path, + n_files: int = 2, +) -> Tuple[Path, List[Path]]: + """ + PoC behaviour: + + 1. Load ISA-JSON template from template_path. + 2. Find investigation.studies[0].assays[0].dataFiles. + 3. For up to n_files entries in dataFiles, generate UNIQUE .fastq.gz files + and update: + - dataFiles[i]["name"] + - dataFiles[i]["comments"] entries for file name, type, checksum, method. + 4. Write the resulting ISA-JSON to work_dir / 'isa.json'. + + We DO NOT change other identifiers or comments (including 'target_repository'). + """ + work_dir.mkdir(parents=True, exist_ok=True) + + isa_obj = json.loads(template_path.read_text()) + + assay = _get_first_assay(isa_obj) + generated_paths: List[Path] = [] + if assay is not None: + data_dir = work_dir / "data" + generated_paths = _update_datafiles_with_generated_files( + assay=assay, + data_dir=data_dir, + n_files=n_files, + ) + + isa_path = work_dir / "isa.json" + isa_path.write_text(json.dumps(isa_obj, indent=2)) + + return isa_path, generated_paths diff --git a/scripts/prepare_poc_submission.py b/scripts/prepare_poc_submission.py new file mode 100644 index 0000000..8e772b6 --- /dev/null +++ b/scripts/prepare_poc_submission.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python +""" +Prepare a PoC environment for MARS-CLI (no pytest, no run script): + +- Ensure settings.ini exists in $MARS_SETTINGS_DIR/.mars or ~/.mars +- Generate an ISA-JSON from a template, where: + * dataFiles entries in the first assay are updated to point to + UNIQUE .fastq.gz files + * 'file name', 'file type', 'file checksum', 'checksum_method' + comments are updated accordingly (MD5 over the .fastq.gz) +- Create poc_work/credentials.json from environment variables + +The GitHub Action (or you, locally) will then call mars_cli.py directly using: + + ISA JSON: poc_work/isa.json + Credentials: poc_work/credentials.json + Data files: whatever generate_isa_json_with_data() returned + (typically poc_work/data/*.fastq.gz) +""" + +from __future__ import annotations + +import json +import os +import textwrap +from pathlib import Path + +from isa_generator import generate_isa_json_with_data + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +def ensure_settings_ini() -> Path: + parent_str = os.environ.get("MARS_SETTINGS_DIR") + mars_dir = Path(parent_str) / ".mars" + mars_dir.mkdir(parents=True, exist_ok=True) + + settings_path = mars_dir / "settings.ini" + + if not settings_path.exists(): + content = textwrap.dedent( + f""" + [logging] + log_level = DEBUG + log_file = {mars_dir / "app.log"} + log_max_size = 1024 + log_max_files = 5 + + [ena] + development-url = http://localhost:8042/isaena + development-submission-url = http://localhost:8042/isaena/submit + + [biosamples] + development-url = http://localhost:8032/isabiosamples + development-submission-url = http://localhost:8032/isabiosamples/submit + + [metabolights] + development-url = https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/ + development-submission-url = https://www-test.ebi.ac.uk/metabolights/mars/ws3/submissions/ + development-token-url = https://www-test.ebi.ac.uk/metabolights/mars/ws3/auth/token + """ + ).strip() + "\n" + + settings_path.write_text(content) + + return settings_path + + +def write_credentials_json(work_dir: Path) -> Path: + required_vars = [ + "MARS_WEBIN_USERNAME", + "MARS_WEBIN_PASSWORD", + "MARS_METABOLIGHTS_METADATA_USERNAME", + "MARS_METABOLIGHTS_METADATA_PASSWORD", + "MARS_METABOLIGHTS_DATA_USERNAME", + "MARS_METABOLIGHTS_DATA_PASSWORD", + ] + + missing = [v for v in required_vars if not os.environ.get(v)] + if missing: + raise RuntimeError( + f"Missing environment variables for credentials: {', '.join(missing)}" + ) + + creds = { + "webin": { + "username": os.environ["MARS_WEBIN_USERNAME"], + "password": os.environ["MARS_WEBIN_PASSWORD"], + }, + "metabolights_metadata": { + "username": os.environ["MARS_METABOLIGHTS_METADATA_USERNAME"], + "password": os.environ["MARS_METABOLIGHTS_METADATA_PASSWORD"], + }, + "metabolights_data": { + "username": os.environ["MARS_METABOLIGHTS_DATA_USERNAME"], + "password": os.environ["MARS_METABOLIGHTS_DATA_PASSWORD"], + }, + } + + cred_path = work_dir / "credentials.json" + cred_path.write_text(json.dumps(creds, indent=2)) + return cred_path + + +def resolve_isa_template() -> Path: + template_env = os.environ.get("MARS_ISA_TEMPLATE_PATH") + if template_env: + src = Path(template_env) + else: + src = PROJECT_ROOT.parent / "MARS" / "test-data" / "biosamples-input-isa.json" + + if not src.exists(): + raise FileNotFoundError(f"ISA template not found at {src}") + + return src + + +def main() -> None: + settings_path = ensure_settings_ini() + + work_dir = PROJECT_ROOT / "poc_work" + work_dir.mkdir(parents=True, exist_ok=True) + + isa_template = resolve_isa_template() + + isa_path, data_files = generate_isa_json_with_data( + work_dir=work_dir, + template_path=isa_template, + n_files=2, + ) + + cred_path = write_credentials_json(work_dir) + + print(f"[MARS-POC] settings.ini: {settings_path}") + print(f"[MARS-POC] work dir: {work_dir}") + print(f"[MARS-POC] ISA JSON file: {isa_path}") + print(f"[MARS-POC] credentials: {cred_path}") + print(f"[MARS-POC] data files:") + for df in data_files: + print(f" - {df}") + + +if __name__ == "__main__": + main() From 7ab60a88646be84432b303ef37dd95d89de8adab Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 13:18:04 +0000 Subject: [PATCH 2/7] axecute upon PR --- .github/workflows/multi-omics-submission-test.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml index b9fd542..47e8920 100644 --- a/.github/workflows/multi-omics-submission-test.yaml +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -3,6 +3,9 @@ on: workflow_dispatch: push: branches: [ main ] + pull_request: + branches: + - main jobs: poc-mars-cli: From dbe142b5f23931f393305a7eb87c08c8caae118a Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 13:18:28 +0000 Subject: [PATCH 3/7] take unnecessary import away --- scripts/prepare_poc_submission.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/prepare_poc_submission.py b/scripts/prepare_poc_submission.py index 8e772b6..77edc80 100644 --- a/scripts/prepare_poc_submission.py +++ b/scripts/prepare_poc_submission.py @@ -18,7 +18,6 @@ (typically poc_work/data/*.fastq.gz) """ -from __future__ import annotations import json import os From 397e5039a4547c945ae346527cb918d535480208 Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 13:35:48 +0000 Subject: [PATCH 4/7] recursive --- .github/workflows/multi-omics-submission-test.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml index 47e8920..30a1029 100644 --- a/.github/workflows/multi-omics-submission-test.yaml +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -29,10 +29,9 @@ jobs: steps: - name: Checkout MARS (for repository-services + test-data) - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: - repository: elixir-europe/MARS - path: MARS + submodules: 'recursive' - name: Set up Python uses: actions/setup-python@v5 From 701ad31be6c379e48784720460a1bb2628d26471 Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 14:13:46 +0000 Subject: [PATCH 5/7] nicer secret names --- .../multi-omics-submission-test.yaml | 24 +++++++-------- scripts/prepare_poc_submission.py | 30 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml index 30a1029..2927ab6 100644 --- a/.github/workflows/multi-omics-submission-test.yaml +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -13,19 +13,19 @@ jobs: env: # Where mars-cli will put .mars/ - MARS_SETTINGS_DIR: ${{ github.workspace }}/mars_settings + SETTINGS_DIR: ${{ github.workspace }}/mars_settings # Paths for MARS repo and ISA template - MARS_REPOSITORY_SERVICES_PATH: ${{ github.workspace }}/MARS/repository-services - MARS_ISA_TEMPLATE_PATH: ${{ github.workspace }}/MARS/test-data/biosamples-input-isa.json + REPOSITORY_SERVICES_PATH: ${{ github.workspace }}/MARS/repository-services + ISA_TEMPLATE_PATH: ${{ github.workspace }}/MARS/test-data/biosamples-input-isa.json # Credentials from GitHub secrets - MARS_WEBIN_USERNAME: ${{ secrets.MARS_WEBIN_USERNAME }} - MARS_WEBIN_PASSWORD: ${{ secrets.MARS_WEBIN_PASSWORD }} - MARS_METABOLIGHTS_METADATA_USERNAME: ${{ secrets.MARS_METABOLIGHTS_METADATA_USERNAME }} - MARS_METABOLIGHTS_METADATA_PASSWORD: ${{ secrets.MARS_METABOLIGHTS_METADATA_PASSWORD }} - MARS_METABOLIGHTS_DATA_USERNAME: ${{ secrets.MARS_METABOLIGHTS_DATA_USERNAME }} - MARS_METABOLIGHTS_DATA_PASSWORD: ${{ secrets.MARS_METABOLIGHTS_DATA_PASSWORD }} + WEBIN_USERNAME: ${{ secrets.WEBIN_USERNAME }} + WEBIN_PASSWORD: ${{ secrets.WEBIN_PASSWORD }} + METABOLIGHTS_METADATA_USERNAME: ${{ secrets.METABOLIGHTS_METADATA_USERNAME }} + METABOLIGHTS_METADATA_PASSWORD: ${{ secrets.METABOLIGHTS_METADATA_PASSWORD }} + METABOLIGHTS_DATA_USERNAME: ${{ secrets.METABOLIGHTS_DATA_USERNAME }} + METABOLIGHTS_DATA_PASSWORD: ${{ secrets.METABOLIGHTS_DATA_PASSWORD }} steps: - name: Checkout MARS (for repository-services + test-data) @@ -36,7 +36,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install mars-cli run: | @@ -44,7 +44,7 @@ jobs: pip install . - name: Start repository-services (docker compose up) - working-directory: ${{ env.MARS_REPOSITORY_SERVICES_PATH }} + working-directory: ${{ env.REPOSITORY_SERVICES_PATH }} run: | docker compose up -d --build @@ -107,6 +107,6 @@ jobs: - name: Stop repository-services (docker compose down) if: always() - working-directory: ${{ env.MARS_REPOSITORY_SERVICES_PATH }} + working-directory: ${{ env.REPOSITORY_SERVICES_PATH }} run: | docker compose down --volumes \ No newline at end of file diff --git a/scripts/prepare_poc_submission.py b/scripts/prepare_poc_submission.py index 77edc80..da76ec6 100644 --- a/scripts/prepare_poc_submission.py +++ b/scripts/prepare_poc_submission.py @@ -2,7 +2,7 @@ """ Prepare a PoC environment for MARS-CLI (no pytest, no run script): -- Ensure settings.ini exists in $MARS_SETTINGS_DIR/.mars or ~/.mars +- Ensure settings.ini exists in $SETTINGS_DIR/.mars or ~/.mars - Generate an ISA-JSON from a template, where: * dataFiles entries in the first assay are updated to point to UNIQUE .fastq.gz files @@ -31,7 +31,7 @@ def ensure_settings_ini() -> Path: - parent_str = os.environ.get("MARS_SETTINGS_DIR") + parent_str = os.environ.get("SETTINGS_DIR") mars_dir = Path(parent_str) / ".mars" mars_dir.mkdir(parents=True, exist_ok=True) @@ -68,12 +68,12 @@ def ensure_settings_ini() -> Path: def write_credentials_json(work_dir: Path) -> Path: required_vars = [ - "MARS_WEBIN_USERNAME", - "MARS_WEBIN_PASSWORD", - "MARS_METABOLIGHTS_METADATA_USERNAME", - "MARS_METABOLIGHTS_METADATA_PASSWORD", - "MARS_METABOLIGHTS_DATA_USERNAME", - "MARS_METABOLIGHTS_DATA_PASSWORD", + "WEBIN_USERNAME", + "WEBIN_PASSWORD", + "METABOLIGHTS_METADATA_USERNAME", + "METABOLIGHTS_METADATA_PASSWORD", + "METABOLIGHTS_DATA_USERNAME", + "METABOLIGHTS_DATA_PASSWORD", ] missing = [v for v in required_vars if not os.environ.get(v)] @@ -84,16 +84,16 @@ def write_credentials_json(work_dir: Path) -> Path: creds = { "webin": { - "username": os.environ["MARS_WEBIN_USERNAME"], - "password": os.environ["MARS_WEBIN_PASSWORD"], + "username": os.environ["WEBIN_USERNAME"], + "password": os.environ["WEBIN_PASSWORD"], }, "metabolights_metadata": { - "username": os.environ["MARS_METABOLIGHTS_METADATA_USERNAME"], - "password": os.environ["MARS_METABOLIGHTS_METADATA_PASSWORD"], + "username": os.environ["METABOLIGHTS_METADATA_USERNAME"], + "password": os.environ["METABOLIGHTS_METADATA_PASSWORD"], }, "metabolights_data": { - "username": os.environ["MARS_METABOLIGHTS_DATA_USERNAME"], - "password": os.environ["MARS_METABOLIGHTS_DATA_PASSWORD"], + "username": os.environ["METABOLIGHTS_DATA_USERNAME"], + "password": os.environ["METABOLIGHTS_DATA_PASSWORD"], }, } @@ -103,7 +103,7 @@ def write_credentials_json(work_dir: Path) -> Path: def resolve_isa_template() -> Path: - template_env = os.environ.get("MARS_ISA_TEMPLATE_PATH") + template_env = os.environ.get("ISA_TEMPLATE_PATH") if template_env: src = Path(template_env) else: From 491153e5a0027cc66e58c96f90fb1a4e595e058b Mon Sep 17 00:00:00 2001 From: Bert Droesbeke Date: Tue, 25 Nov 2025 14:29:17 +0000 Subject: [PATCH 6/7] update to latest version --- .github/workflows/multi-omics-submission-test.yaml | 2 +- MARS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml index 2927ab6..1985680 100644 --- a/.github/workflows/multi-omics-submission-test.yaml +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -76,7 +76,7 @@ jobs: run: | python scripts/prepare_poc_submission.py - - name: Run mars-cli submit (dev ENA + BioSamples, no MetaboLights) + - name: Run mars-cli submit run: | set -euo pipefail diff --git a/MARS b/MARS index ed97522..2199aeb 160000 --- a/MARS +++ b/MARS @@ -1 +1 @@ -Subproject commit ed975227017f592650d9fa700a35f33bd672fcda +Subproject commit 2199aeb0fa59b301de6641bd04231a62e92aeb3f From bcf486a8f2808782d7daf68d9ee05de226fb93ce Mon Sep 17 00:00:00 2001 From: Bert Droesbeke <44875756+bedroesb@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:31:00 +0100 Subject: [PATCH 7/7] Update multi-omics-submission-test.yaml --- .github/workflows/multi-omics-submission-test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/multi-omics-submission-test.yaml b/.github/workflows/multi-omics-submission-test.yaml index 1985680..8a65c6b 100644 --- a/.github/workflows/multi-omics-submission-test.yaml +++ b/.github/workflows/multi-omics-submission-test.yaml @@ -109,4 +109,5 @@ jobs: if: always() working-directory: ${{ env.REPOSITORY_SERVICES_PATH }} run: | - docker compose down --volumes \ No newline at end of file + docker compose down --volumes +