From 2746c77bb3c96f5fe7d098673dd41e6af04d7a38 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 13 Oct 2024 15:30:08 +0100 Subject: [PATCH 1/7] Update Traveler version --- base_image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_image/Dockerfile b/base_image/Dockerfile index 826581873..12c26bedd 100644 --- a/base_image/Dockerfile +++ b/base_image/Dockerfile @@ -2,7 +2,7 @@ FROM gcc:13 AS build ENV tRNAscan_VER=2.0.11 \ BioEasel_COMMIT=a52f0f7f7cae879bb95489bb794c04c1a0110aa7 \ - traveler_COMMIT=0ee67cbb9c5aaa2f98340065fd047c9a8feea53e \ + traveler_COMMIT=8054f5bee8327bb158385893e0633d4242676f95 \ jiffy_COMMIT=31d6c3b826d432a30620507830749cee58e15e68 \ Rscape_VER=v2.0.4.c \ Ribovore_COMMIT=5df943c6f2866d7979bb13c948ca9d8531076898 \ From 6879c54f86840d0cde2e5f74b56dec85d66088dc Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 13 Oct 2024 15:38:02 +0100 Subject: [PATCH 2/7] Update tests --- .../animate/PZ39_Dfold_3.animated.svg | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/examples/animate/PZ39_Dfold_3.animated.svg b/tests/examples/animate/PZ39_Dfold_3.animated.svg index d452a9139..c771750a0 100644 --- a/tests/examples/animate/PZ39_Dfold_3.animated.svg +++ b/tests/examples/animate/PZ39_Dfold_3.animated.svg @@ -1,11 +1,10 @@ - diff --git a/tests/tests.py b/tests/tests.py index 70bbfc888..4cbf64842 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -760,5 +760,20 @@ def test_template_free_mode(self): self.check_examples() +class TestBadFastaName(R2dtTestCase): + """Check that the program can handle fasta files with bad names.""" + + fasta_input = os.path.join("examples", "bad-fasta-name.fasta") + test_results = os.path.join("tests", "results", "bad-fasta-name") + test_results_subfolder = os.path.join("results", "svg") + precomputed_results = os.path.join("tests", "examples", "bad-fasta-name") + cmd = f"r2dt.py draw {fasta_input} {test_results} --quiet" + files = ["DB_TEXT_MORE-d.5.e.H.sapiens.2.colored.svg"] + + def test_examples(self): + """Check that files exist and are identical to examples.""" + self.check_examples() + + if __name__ == "__main__": unittest.main() diff --git a/utils/shared.py b/utils/shared.py index 35ed1387a..e1054d61f 100644 --- a/utils/shared.py +++ b/utils/shared.py @@ -13,6 +13,7 @@ import os import re +import tempfile from pathlib import Path import requests # pylint: disable=import-error @@ -493,3 +494,30 @@ def generate_thumbnail(image, description): thumbnail += " ".join(points) thumbnail += '"/>' return thumbnail + + +def sanitise_fasta(filename): + """ + Replace unsafe characters in a fasta file with underscores. + Return the filename of the sanitised file or the original filename. + """ + unsafe_chars = r'[<:"/\\|?*\0]' + sanitized = [] + content_changed = False + + with open(filename, "r", encoding="utf-8") as f_fasta: + for line in f_fasta: + if line.startswith(">"): + new_line = re.sub(unsafe_chars, "_", line) + if new_line != line: + content_changed = True + else: + new_line = line + sanitized.append(new_line) + + if content_changed: + with tempfile.NamedTemporaryFile(mode="w", delete=False) as f_fasta: + f_fasta.writelines(sanitized) + sanitised_filename = f_fasta.name + return sanitised_filename + return filename From 74af8e90154bf5c605039b6b7a9904e88e4559b3 Mon Sep 17 00:00:00 2001 From: Alexey Naiden <17383+anayden@users.noreply.github.com> Date: Sat, 21 Dec 2024 20:02:38 +0400 Subject: [PATCH 5/7] Less agressive docker caching --- .github/workflows/base-image.yml | 8 +++-- .github/workflows/parallel-base-image.yml | 40 ++++++++++++++--------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/.github/workflows/base-image.yml b/.github/workflows/base-image.yml index 80d95b970..2809262b6 100644 --- a/.github/workflows/base-image.yml +++ b/.github/workflows/base-image.yml @@ -35,6 +35,10 @@ jobs: tags: | type=ref,event=pr + - name: Calculate Dockerfile hash + id: dockerfile_hash + run: echo "hash=$(sha256sum base_image/Dockerfile | cut -d' ' -f1)" >> $GITHUB_OUTPUT + - name: Build and push Docker image id: build uses: docker/build-push-action@v6 @@ -43,7 +47,7 @@ jobs: push: true labels: ${{ steps.docker_meta.outputs.labels }} tags: ${{ steps.docker_meta.outputs.tags }} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=registry,ref=rnacentral/r2dt-base:cache-${{ steps.dockerfile_hash.outputs.hash }} + cache-to: type=registry,ref=rnacentral/r2dt-base:cache-${{ steps.dockerfile_hash.outputs.hash }},mode=max file: base_image/Dockerfile context: base_image/ diff --git a/.github/workflows/parallel-base-image.yml b/.github/workflows/parallel-base-image.yml index 47d948ebe..242c4e7e6 100644 --- a/.github/workflows/parallel-base-image.yml +++ b/.github/workflows/parallel-base-image.yml @@ -34,13 +34,17 @@ jobs: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Calculate Dockerfile hash + id: dockerfile_hash + run: echo "hash=$(sha256sum base_image/Dockerfile | cut -d' ' -f1)" >> $GITHUB_OUTPUT + - name: Build ${{ matrix.stage }} stage uses: docker/build-push-action@v6 with: platforms: ${{ matrix.platform }} target: ${{ matrix.stage }} - cache-from: type=registry,ref=rnacentral/r2dt-base:cache-${{ matrix.stage }}-${{ matrix.shorthand }} - cache-to: type=registry,ref=rnacentral/r2dt-base:cache-${{ matrix.stage }}-${{ matrix.shorthand }},mode=max + cache-from: type=registry,ref=rnacentral/r2dt-base:cache-${{ matrix.stage }}-${{ matrix.shorthand }}-${{ steps.dockerfile_hash.outputs.hash }} + cache-to: type=registry,ref=rnacentral/r2dt-base:cache-${{ matrix.stage }}-${{ matrix.shorthand }}-${{ steps.dockerfile_hash.outputs.hash }},mode=max file: base_image/Dockerfile context: base_image/ @@ -66,6 +70,10 @@ jobs: tags: | type=ref,event=pr + - name: Calculate Dockerfile hash + id: dockerfile_hash + run: echo "hash=$(sha256sum base_image/Dockerfile | cut -d' ' -f1)" >> $GITHUB_OUTPUT + - name: Log in to DockerHub uses: docker/login-action@v3 with: @@ -80,22 +88,22 @@ jobs: labels: ${{ steps.docker_meta.outputs.labels }} tags: ${{ steps.docker_meta.outputs.tags }} cache-from: | - type=registry,ref=rnacentral/r2dt-base:cache-rscape-amd64 - type=registry,ref=rnacentral/r2dt-base:cache-tRNAscan-SE-amd64 - type=registry,ref=rnacentral/r2dt-base:cache-Bio-Easel-amd64 - type=registry,ref=rnacentral/r2dt-base:cache-traveler-amd64 - type=registry,ref=rnacentral/r2dt-base:cache-scripts-amd64 - type=registry,ref=rnacentral/r2dt-base:cache-ribovore-infernal-easel-amd64 + type=registry,ref=rnacentral/r2dt-base:cache-rscape-amd64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-tRNAscan-SE-amd64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-Bio-Easel-amd64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-traveler-amd64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-scripts-amd64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-ribovore-infernal-easel-amd64-${{ steps.dockerfile_hash.outputs.hash }} - type=registry,ref=rnacentral/r2dt-base:cache-rscape-arm64 - type=registry,ref=rnacentral/r2dt-base:cache-tRNAscan-SE-arm64 - type=registry,ref=rnacentral/r2dt-base:cache-Bio-Easel-arm64 - type=registry,ref=rnacentral/r2dt-base:cache-traveler-arm64 - type=registry,ref=rnacentral/r2dt-base:cache-scripts-arm64 - type=registry,ref=rnacentral/r2dt-base:cache-ribovore-infernal-easel-arm64 + type=registry,ref=rnacentral/r2dt-base:cache-rscape-arm64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-tRNAscan-SE-arm64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-Bio-Easel-arm64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-traveler-arm64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-scripts-arm64-${{ steps.dockerfile_hash.outputs.hash }} + type=registry,ref=rnacentral/r2dt-base:cache-ribovore-infernal-easel-arm64-${{ steps.dockerfile_hash.outputs.hash }} - type=registry,ref=rnacentral/r2dt-base:cache-final - cache-to: type=registry,ref=rnacentral/r2dt-base:cache-final,mode=max + type=registry,ref=rnacentral/r2dt-base:cache-final-${{ steps.dockerfile_hash.outputs.hash }} + cache-to: type=registry,ref=rnacentral/r2dt-base:cache-final-${{ steps.dockerfile_hash.outputs.hash }},mode=max file: base_image/Dockerfile context: base_image/ target: final-build From d4e469559bad50532b01946d1b958722b513899f Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sat, 21 Dec 2024 20:10:53 +0000 Subject: [PATCH 6/7] Update base image to v2.0.1 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c9572cb73..f34ea3146 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE_VERSION=v2.0 +ARG BASE_IMAGE_VERSION=v2.0.1 FROM rnacentral/r2dt-base:${BASE_IMAGE_VERSION} From 5b24eb76d418a87a9f08b781f92ad494ac69b63c Mon Sep 17 00:00:00 2001 From: Alexey Naiden <17383+anayden@users.noreply.github.com> Date: Sun, 22 Dec 2024 12:25:36 +0400 Subject: [PATCH 7/7] Run main workflow on pushes to the develop branch --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7a18c40ba..d5873b6c8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - develop pull_request: branches: - main