From a05dc7b99a54b422039f067a07256dcf7626a8ea Mon Sep 17 00:00:00 2001 From: Qiang Gu Date: Sun, 11 Oct 2020 22:16:38 -0700 Subject: [PATCH 01/13] make avivator GEDA for ome tiff --- display_applications/image/avivator.xml | 7 +++++++ .../config/sample/datatypes_conf.xml.sample | 4 +++- lib/galaxy/datatypes/images.py | 20 +++++++++++++++++++ .../pipfiles/default/pinned-requirements.txt | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 display_applications/image/avivator.xml diff --git a/display_applications/image/avivator.xml b/display_applications/image/avivator.xml new file mode 100644 index 00000000000..b1c54b8a89d --- /dev/null +++ b/display_applications/image/avivator.xml @@ -0,0 +1,7 @@ + + + http://avivator.gehlenborglab.org/?image_url=${qp($tiff_file.url)} + + + + diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 583a82ec613..645080c91aa 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -204,7 +204,9 @@ - + + + diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index 1a3ad984643..85975ca8281 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -2,10 +2,13 @@ Image classes """ import base64 +import json import logging +import tifffile import zipfile from urllib.parse import quote_plus +from galaxy.datatypes.metadata import FileParameter, MetadataElement from galaxy.datatypes.text import Html as HtmlFromText from galaxy.util import nice_size from galaxy.util.image_util import check_image_type @@ -73,6 +76,23 @@ class Tiff(Image): file_ext = "tiff" +class OMETiff(Tiff): + file_ext = "ome.tiff" + MetadataElement(name="offsets", desc="Offsets File", param=FileParameter, file_ext="json", readonly=True, no_value=None, visible=False, optional=True) + + def set_meta(self, dataset, overwrite=True, **kwd): + + spec_key = 'offsets' + offsets_file = dataset.metadata.offsets + if not offsets_file: + offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) + with tifffile.TiffFile(dataset.file_name) as tif: + offsets = [page.offset for page in tif.pages] + with open(offsets_file.file_name, 'w') as f: + json.dump(offsets, f) + dataset.metadata.offsets = offsets_file + + class Hamamatsu(Image): file_ext = "vms" diff --git a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt index bc6b194f9a0..0117b50b1f1 100644 --- a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt @@ -177,6 +177,7 @@ stevedore==1.32.0 svgwrite==1.3.1 tempita==0.5.2 tenacity==4.12.0 +tifffile>=2018.10.18 tqdm==4.46.1 typing-extensions==3.7.4.2 typing==3.7.4.1 ; python_version < '3.5' From 336d84f44f8ede256fb1952cbe1f0f0777eb8ff7 Mon Sep 17 00:00:00 2001 From: Qiang Gu Date: Wed, 14 Oct 2020 18:30:12 -0700 Subject: [PATCH 02/13] add ome.tiff datatype sniffer --- lib/galaxy/config/sample/datatypes_conf.xml.sample | 1 + lib/galaxy/util/image_util.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 645080c91aa..fd1c5ee230d 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -1004,6 +1004,7 @@ + diff --git a/lib/galaxy/util/image_util.py b/lib/galaxy/util/image_util.py index d24a75f1072..ad2c285ea02 100644 --- a/lib/galaxy/util/image_util.py +++ b/lib/galaxy/util/image_util.py @@ -2,6 +2,7 @@ import imghdr import logging +import tifffile try: import Image as PIL @@ -28,7 +29,12 @@ def image_type(filename): if not fmt: fmt = imghdr.what(filename) if fmt: - return fmt.upper() + fmt = fmt.upper() + if fmt == 'TIFF': + with tifffile.TiffFile(filename) as tif: + if tif.is_ome: + fmt = 'OME.TIFF' + return fmt else: return False From 6694473165c60f8715ff273434279cb470d69cc4 Mon Sep 17 00:00:00 2001 From: Qiang Gu Date: Wed, 14 Oct 2020 18:36:46 -0700 Subject: [PATCH 03/13] make set_meta relaxed for ome.tiff datatype --- lib/galaxy/datatypes/images.py | 22 ++++++++++--------- .../pipfiles/default/pinned-requirements.txt | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index 85975ca8281..c561776dd92 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -81,16 +81,18 @@ class OMETiff(Tiff): MetadataElement(name="offsets", desc="Offsets File", param=FileParameter, file_ext="json", readonly=True, no_value=None, visible=False, optional=True) def set_meta(self, dataset, overwrite=True, **kwd): - - spec_key = 'offsets' - offsets_file = dataset.metadata.offsets - if not offsets_file: - offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) - with tifffile.TiffFile(dataset.file_name) as tif: - offsets = [page.offset for page in tif.pages] - with open(offsets_file.file_name, 'w') as f: - json.dump(offsets, f) - dataset.metadata.offsets = offsets_file + try: + spec_key = 'offsets' + offsets_file = dataset.metadata.offsets + if not offsets_file: + offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) + with tifffile.TiffFile(dataset.file_name) as tif: + offsets = [page.offset for page in tif.pages] + with open(offsets_file.file_name, 'w') as f: + json.dump(offsets, f) + dataset.metadata.offsets = offsets_file + except: + pass class Hamamatsu(Image): diff --git a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt index 0117b50b1f1..512f9f13b4d 100644 --- a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt @@ -177,7 +177,7 @@ stevedore==1.32.0 svgwrite==1.3.1 tempita==0.5.2 tenacity==4.12.0 -tifffile>=2018.10.18 +tifffile==2020.9.3 tqdm==4.46.1 typing-extensions==3.7.4.2 typing==3.7.4.1 ; python_version < '3.5' From c1bbce6cb4f2fed680b75f14e910843d0953e91e Mon Sep 17 00:00:00 2001 From: qiagu Date: Tue, 2 Mar 2021 18:00:03 -0800 Subject: [PATCH 04/13] Add a test for ome.tiff datatype --- lib/galaxy/datatypes/images.py | 5 ++++- lib/galaxy_test/api/test_tools_upload.py | 7 +++++++ test-data/1.ome.tiff | Bin 0 -> 50475 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test-data/1.ome.tiff diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index cf4f381be71..38cc3baed38 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -11,7 +11,10 @@ from urllib.parse import quote_plus import numpy as np from galaxy.datatypes.binary import Binary -from galaxy.datatypes.metadata import FileParameter, MetadataElement +from galaxy.datatypes.metadata import ( + FileParameter, + MetadataElement, +) from galaxy.datatypes.text import Html as HtmlFromText from galaxy.util import nice_size from galaxy.util.image_util import check_image_type diff --git a/lib/galaxy_test/api/test_tools_upload.py b/lib/galaxy_test/api/test_tools_upload.py index af035505f09..09c696067dd 100644 --- a/lib/galaxy_test/api/test_tools_upload.py +++ b/lib/galaxy_test/api/test_tools_upload.py @@ -223,6 +223,13 @@ class ToolsUploadTestCase(ApiTestCase): tiff_metadata = self._upload_and_get_details(fh, file_type="auto") self.assertEqual(tiff_metadata["file_ext"], "tiff") + @skip_without_datatype("ome.tiff") + def test_image_upload_auto(self): + tiff_path = TestDataResolver().get_filename("1.ome.tiff") + with open(tiff_path, "rb") as fh: + tiff_metadata = self._upload_and_get_details(fh, file_type="auto") + self.assertEqual(tiff_metadata["file_ext"], "ome.tiff") + @uses_test_history(require_new=False) def test_newlines_stage_fetch(self, history_id): job = { diff --git a/test-data/1.ome.tiff b/test-data/1.ome.tiff new file mode 100644 index 0000000000000000000000000000000000000000..57b6b411b2c9f1fdccdef20844ae4758df657907 GIT binary patch literal 50475 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 aGnRkWlI|~Z(i=Z+ue-CN{u*11!~X;DU`ww6 literal 0 HcmV?d00001 From e739866eefe79a05a13492e763e759d8443b6210 Mon Sep 17 00:00:00 2001 From: qiagu Date: Tue, 2 Mar 2021 20:03:32 -0800 Subject: [PATCH 05/13] Make sniff method for ome.tiff datatype --- lib/galaxy/datatypes/images.py | 13 +++++++++++-- lib/galaxy/util/image_util.py | 8 +------- lib/galaxy_test/api/test_tools_upload.py | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index 38cc3baed38..de004766082 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -4,11 +4,11 @@ Image classes import base64 import json import logging -import tifffile import zipfile from urllib.parse import quote_plus import numpy as np +import tifffile from galaxy.datatypes.binary import Binary from galaxy.datatypes.metadata import ( @@ -99,9 +99,18 @@ class OMETiff(Tiff): with open(offsets_file.file_name, 'w') as f: json.dump(offsets, f) dataset.metadata.offsets = offsets_file - except: + except Exception: pass + def sniff(self, filename): + is_tiff = Tiff().sniff(filename) + if not is_tiff: + return False + with tifffile.TiffFile(filename) as tif: + if tif.is_ome: + return True + return False + class Hamamatsu(Image): file_ext = "vms" diff --git a/lib/galaxy/util/image_util.py b/lib/galaxy/util/image_util.py index ad2c285ea02..d24a75f1072 100644 --- a/lib/galaxy/util/image_util.py +++ b/lib/galaxy/util/image_util.py @@ -2,7 +2,6 @@ import imghdr import logging -import tifffile try: import Image as PIL @@ -29,12 +28,7 @@ def image_type(filename): if not fmt: fmt = imghdr.what(filename) if fmt: - fmt = fmt.upper() - if fmt == 'TIFF': - with tifffile.TiffFile(filename) as tif: - if tif.is_ome: - fmt = 'OME.TIFF' - return fmt + return fmt.upper() else: return False diff --git a/lib/galaxy_test/api/test_tools_upload.py b/lib/galaxy_test/api/test_tools_upload.py index 09c696067dd..1f026e9c60e 100644 --- a/lib/galaxy_test/api/test_tools_upload.py +++ b/lib/galaxy_test/api/test_tools_upload.py @@ -224,7 +224,7 @@ class ToolsUploadTestCase(ApiTestCase): self.assertEqual(tiff_metadata["file_ext"], "tiff") @skip_without_datatype("ome.tiff") - def test_image_upload_auto(self): + def test_ometiff_upload_sniff(self): tiff_path = TestDataResolver().get_filename("1.ome.tiff") with open(tiff_path, "rb") as fh: tiff_metadata = self._upload_and_get_details(fh, file_type="auto") From 201b4090b0e3cb247d038b90965207eb75f80044 Mon Sep 17 00:00:00 2001 From: qiagu Date: Tue, 2 Mar 2021 20:42:30 -0800 Subject: [PATCH 06/13] Fix tifffile in dependencies --- lib/galaxy/dependencies/dev-requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt index 4c00a59e444..ae5f7ef7eb8 100644 --- a/lib/galaxy/dependencies/dev-requirements.txt +++ b/lib/galaxy/dependencies/dev-requirements.txt @@ -218,6 +218,7 @@ svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==6.3.1 testfixtures==6.17.1 +tifffile==2021.2.26 toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" tqdm==4.56.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" twill==2.0.1 From 7fde8fe7eaf8bf9053c7cff6d668d9d6405b3a73 Mon Sep 17 00:00:00 2001 From: qiagu Date: Wed, 3 Mar 2021 11:30:58 -0800 Subject: [PATCH 07/13] Revise test for ome.tiff datatype --- lib/galaxy/datatypes/test/1.ome.tiff | Bin 0 -> 29775 bytes lib/galaxy_test/api/test_tools_upload.py | 7 ------- pyproject.toml | 1 + test-data/1.ome.tiff | Bin 50475 -> 0 bytes 4 files changed, 1 insertion(+), 7 deletions(-) create mode 100644 lib/galaxy/datatypes/test/1.ome.tiff delete mode 100644 test-data/1.ome.tiff diff --git a/lib/galaxy/datatypes/test/1.ome.tiff b/lib/galaxy/datatypes/test/1.ome.tiff new file mode 100644 index 0000000000000000000000000000000000000000..805dd66e62f4de52e19240eb05bdf146569bfb1e GIT binary patch literal 29775 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 aGnRkWlI|~Z(i=Z+ue-CN{u*11!~X;DU`ww6 From 5686c368f6210367a80f60f64fcb7139cdfb9f7b Mon Sep 17 00:00:00 2001 From: qiagu Date: Tue, 16 Mar 2021 22:28:58 -0700 Subject: [PATCH 08/13] Update tifffile version --- lib/galaxy/dependencies/dev-requirements.txt | 2 +- lib/galaxy/dependencies/pinned-requirements.txt | 2 +- packages/data/requirements.txt | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt index bb4ca5735e7..ea635296ea3 100644 --- a/lib/galaxy/dependencies/dev-requirements.txt +++ b/lib/galaxy/dependencies/dev-requirements.txt @@ -219,7 +219,7 @@ svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==6.3.1 testfixtures==6.17.1 -tifffile==2021.2.26 +tifffile==2021.3.16 toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" tqdm==4.56.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" twill==2.0.1 diff --git a/lib/galaxy/dependencies/pinned-requirements.txt b/lib/galaxy/dependencies/pinned-requirements.txt index 747c88a2c90..a46a4828fdb 100644 --- a/lib/galaxy/dependencies/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pinned-requirements.txt @@ -175,7 +175,7 @@ stevedore==3.3.0; python_version >= "3.6" svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==6.3.1 -tifffile==2021.2.26 +tifffile==2021.3.16 tqdm==4.56.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" typing-extensions==3.7.4.3; python_version >= "3.6" and python_version < "3.8" tzlocal==2.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version < "4" diff --git a/packages/data/requirements.txt b/packages/data/requirements.txt index c60f014771d..4aa35d837a5 100644 --- a/packages/data/requirements.txt +++ b/packages/data/requirements.txt @@ -15,4 +15,5 @@ social-auth-core[openidconnect]==3.3.0 SQLAlchemy>=1.3.0,<1.4.0 # https://github.com/kvesteri/sqlalchemy-utils/issues/474 sqlalchemy-migrate sqlalchemy-utils +tifffile WebOb From a0470246539479d1484cde19f11ce11ba32e3e37 Mon Sep 17 00:00:00 2001 From: qiagu Date: Wed, 17 Mar 2021 10:46:12 -0700 Subject: [PATCH 09/13] Revise sniff method for OMETiff --- lib/galaxy/datatypes/images.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index de004766082..94fdcbf4483 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -89,27 +89,24 @@ class OMETiff(Tiff): MetadataElement(name="offsets", desc="Offsets File", param=FileParameter, file_ext="json", readonly=True, no_value=None, visible=False, optional=True) def set_meta(self, dataset, overwrite=True, **kwd): - try: - spec_key = 'offsets' - offsets_file = dataset.metadata.offsets - if not offsets_file: - offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) - with tifffile.TiffFile(dataset.file_name) as tif: - offsets = [page.offset for page in tif.pages] - with open(offsets_file.file_name, 'w') as f: - json.dump(offsets, f) - dataset.metadata.offsets = offsets_file - except Exception: - pass + spec_key = 'offsets' + offsets_file = dataset.metadata.offsets + if not offsets_file: + offsets_file = dataset.metadata.spec[spec_key].param.new_file(dataset=dataset) + with tifffile.TiffFile(dataset.file_name) as tif: + offsets = [page.offset for page in tif.pages] + with open(offsets_file.file_name, 'w') as f: + json.dump(offsets, f) + dataset.metadata.offsets = offsets_file def sniff(self, filename): - is_tiff = Tiff().sniff(filename) - if not is_tiff: + try: + with tifffile.TiffFile(filename) as tif: + if tif.is_ome: + return True + return False + except tifffile.TiffFileError: return False - with tifffile.TiffFile(filename) as tif: - if tif.is_ome: - return True - return False class Hamamatsu(Image): From bf63abd293d3efed7a314ee0ae6fa93eca2c911b Mon Sep 17 00:00:00 2001 From: qiagu Date: Wed, 17 Mar 2021 11:00:03 -0700 Subject: [PATCH 10/13] Remove error catch for sniff method --- lib/galaxy/datatypes/images.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/galaxy/datatypes/images.py b/lib/galaxy/datatypes/images.py index 94fdcbf4483..7fa5bccdb68 100644 --- a/lib/galaxy/datatypes/images.py +++ b/lib/galaxy/datatypes/images.py @@ -100,13 +100,10 @@ class OMETiff(Tiff): dataset.metadata.offsets = offsets_file def sniff(self, filename): - try: - with tifffile.TiffFile(filename) as tif: - if tif.is_ome: - return True - return False - except tifffile.TiffFileError: - return False + with tifffile.TiffFile(filename) as tif: + if tif.is_ome: + return True + return False class Hamamatsu(Image): From 3278d01dcb5dedc2ea289f53452b73e9cf46691d Mon Sep 17 00:00:00 2001 From: qiagu Date: Wed, 7 Apr 2021 10:37:05 -0700 Subject: [PATCH 11/13] Lower down tifffile version to fit python 3.6 --- lib/galaxy/dependencies/dev-requirements.txt | 2 +- lib/galaxy/dependencies/pinned-requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt index 0453f7eb7ee..7f828096e0d 100644 --- a/lib/galaxy/dependencies/dev-requirements.txt +++ b/lib/galaxy/dependencies/dev-requirements.txt @@ -226,7 +226,7 @@ svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==7.0.0 testfixtures==6.17.1 -tifffile==2021.3.16 +tifffile==2020.9.3 toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" tqdm==4.59.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" twill==3.0 diff --git a/lib/galaxy/dependencies/pinned-requirements.txt b/lib/galaxy/dependencies/pinned-requirements.txt index b8561ac2899..90399d097fd 100644 --- a/lib/galaxy/dependencies/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pinned-requirements.txt @@ -179,7 +179,7 @@ stevedore==3.3.0; python_version >= "3.6" svgwrite==1.4.1; python_version >= "3.6" tempita==0.5.2 tenacity==7.0.0 -tifffile==2021.3.16 +tifffile==2020.9.3 tqdm==4.59.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" typing-extensions==3.7.4.3; python_version >= "3.6" and python_version < "3.8" tzlocal==2.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" From 66f8ad90a0ec21077d6d87ff0193f7b65132b225 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 8 Apr 2021 09:52:36 +0200 Subject: [PATCH 12/13] Add pyproject.toml pin --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1e516fedbe3..b6aa16e2369 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,7 +76,7 @@ sqlparse = "*" starlette = "*" starlette-context = {version = "*", python = ">=3.7"} svgwrite = "*" -tifffile = "*" +tifffile = "<=2020.9.3" # Last version compatible with python 3.6 uvicorn = "*" WebOb = "*" Whoosh = "*" From 17adb6aa1ad2e1d29555ab96ae1027dddf864400 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 8 Apr 2021 09:53:54 +0200 Subject: [PATCH 13/13] Pin data package requirement --- packages/data/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/data/requirements.txt b/packages/data/requirements.txt index 0bce14256f7..8fa2fe55212 100644 --- a/packages/data/requirements.txt +++ b/packages/data/requirements.txt @@ -16,5 +16,5 @@ social-auth-core[openidconnect]==3.3.0 SQLAlchemy>=1.3.0,<1.4.0 # https://github.com/kvesteri/sqlalchemy-utils/issues/474 sqlalchemy-migrate sqlalchemy-utils -tifffile +tifffile<=2020.9.3 # Last version compatible with python 3.6 WebOb