From 667d3b5a8a313cb6285bd589a1fb8246716002d3 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 10 Jul 2023 14:35:15 -0400 Subject: [PATCH 01/14] ENH: simple pyproject.toml --- pyproject.toml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..f1ecdb30 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[build-system] +requires = ["setuptools >= 38.6", "pip >= 10"] +build-backend = "setuptools.build_meta" + +[project] +name = "pysatModels" +version = "0.1.0" +description = "pysat support for NASA Instruments" +readme = "README.md" +requires-python = ">=3.6" +dependencies = [ + "numpy", + "packaging", + "pandas", + "pyForecastTools", + "pysat >= 3.0.4", + "pysatNASA >= 0.0.5", + "requests", + "scipy", + "xarray" +] From 00bf9ed367208ce577667d8e039b48ce87578e9d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 6 Dec 2023 11:21:30 -0500 Subject: [PATCH 02/14] MAINT: version caps --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f1ecdb30..b15e573f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "pandas", "pyForecastTools", "pysat >= 3.0.4", - "pysatNASA >= 0.0.5", + "pysatNASA <= 0.0.4", "requests", "scipy", "xarray" From a5507813ba9457dea40c7fbd99c9089c340319ab Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 19 Dec 2023 15:44:08 -0500 Subject: [PATCH 03/14] STY: pyproject --- pyproject.toml | 55 ++++++++++++++++++++++++++++++++++++++++- pysatModels/__init__.py | 12 +++++---- pysatModels/version.txt | 1 - setup.cfg | 50 +------------------------------------ 4 files changed, 62 insertions(+), 56 deletions(-) delete mode 100644 pysatModels/version.txt diff --git a/pyproject.toml b/pyproject.toml index b15e573f..25d5976d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,9 +5,28 @@ build-backend = "setuptools.build_meta" [project] name = "pysatModels" version = "0.1.0" -description = "pysat support for NASA Instruments" +description = "Supports model analysis and model-data comparisons" readme = "README.md" requires-python = ">=3.6" +license = {file = "LICENSE"} +authors = [ + {name = "Pysat Development Team", email = "pysat.developers@gmail.com"}, +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Topic :: Scientific/Engineering :: Physics", + "Intended Audience :: Science/Research", + "License :: Freely Distributable", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Operating System :: MacOS :: MacOS X", + "Operating System :: POSIX :: Linux", + "Operating System :: Microsoft :: Windows" +] dependencies = [ "numpy", "packaging", @@ -19,3 +38,37 @@ dependencies = [ "scipy", "xarray" ] + +[project.optional-dependencies] +test = [ + "coveralls < 3.3", + "flake8", + "flake8-docstrings", + "hacking >= 1.0", + "pytest-cov", + "pytest-ordering" +] +doc = [ + "extras_require", + "m2r2", + "numpydoc", + "sphinx", + "sphinx_rtd_theme >= 1.2.2, < 2.0.0" +] + +[project.urls] +Documentation = "https://pysatmodels.readthedocs.io/en/latest/" +Source = "https://github.com/pysat/pysatModels" + +[tool.coverage.report] + +[tool.pytest.ini_options] +addopts = "--cov=pysatModels" +markers = [ + "all_inst", + "download", + "no_download", + "load_options", + "first", + "second" +] diff --git a/pysatModels/__init__.py b/pysatModels/__init__.py index dbef61b1..1ac1e5b4 100644 --- a/pysatModels/__init__.py +++ b/pysatModels/__init__.py @@ -10,17 +10,19 @@ """ +try: + from importlib import metadata +except ImportError: + import importlib_metadata as metadata + import logging -import os # Import key modules and skip F401 testing in flake8 from pysatModels import models # noqa: F401 from pysatModels import utils # noqa: F401 # Set the version -local_dir = os.path.abspath(os.path.dirname(__file__)) -with open(os.path.join(local_dir, 'version.txt')) as version_file: - __version__ = version_file.read().strip() +__version__ = metadata.version('pysatModels') # Define a logger object to allow easier log handling logging.raiseExceptions = False @@ -30,4 +32,4 @@ logger.addHandler(handler) # Clean up variables -del handler, local_dir, version_file +del handler diff --git a/pysatModels/version.txt b/pysatModels/version.txt deleted file mode 100644 index 6e8bf73a..00000000 --- a/pysatModels/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.1.0 diff --git a/setup.cfg b/setup.cfg index df9c3d20..a9566a18 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,46 +1,6 @@ [metadata] name = pysatModels -version = file: pysatModels/version.txt -url = https://github.com/pysat/pysatModels -author = Pysat Development Team -author_email = pysat.developers@gmail.com -description = 'Supports model analysis and model-data comparisons' -long_description = file: README.md -long_description_content_type = text/markdown -classifiers = - Development Status :: 3 - Alpha - Topic :: Scientific/Engineering :: Physics - Intended Audience :: Science/Research - License :: Freely Distributable - Natural Language :: English - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.9 - Programming Language :: Python :: 3.10 - Programming Language :: Python :: 3.11 - Operating System :: MacOS :: MacOS X - Operating System :: POSIX :: Linux - Operating System :: Microsoft :: Windows -license_file = LICENSE - -[options] -python_requires = >= 3.6 -setup_requires = setuptools >= 38.6; pip >= 10 -packages = find: -include_package_data = True -zip_safe = False -install_requires = numpy - packaging - pandas - pyForecastTools - pysat - pysatNASA - scipy - xarray - -[coverage:run] - -[coverage:report] +version = '0.1.0' [flake8] max-line-length = 80 @@ -49,11 +9,3 @@ ignore = D202 H105 W503 - -[tool:pytest] -markers = - all_inst: tests all instruments - download: tests for downloadable instruments - no_download: tests for instruments without download support - first: first tests to run - second: second tests to run From e117ca779611673833cbe7ed92fa1bfc2fde4f71 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 19 Dec 2023 15:44:18 -0500 Subject: [PATCH 04/14] MAINT: workflow --- .github/workflows/main.yml | 15 ++++++++++++++- .github/workflows/pysat_rc.yml | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 00c54682..dc1b44d0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -84,4 +84,17 @@ jobs: - name: Publish results to coveralls env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --rcfile=setup.cfg --service=github + COVERALLS_PARALLEL: true + run: coveralls --rcfile=pyproject.toml --service=github + + finish: + name: Finish Coverage Analysis + needs: build + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pip install --upgrade coveralls + coveralls --service=github --finish diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index 57113c3d..284f9994 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -45,4 +45,17 @@ jobs: - name: Publish results to coveralls env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --rcfile=setup.cfg --service=github + COVERALLS_PARALLEL: true + run: coveralls --rcfile=pyproject.toml --service=github + + finish: + name: Finish Coverage Analysis + needs: build + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pip install --upgrade coveralls + coveralls --service=github --finish From b9094f764bdabf7812e90a8d24346491bfe8244b Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 19 Dec 2023 15:44:33 -0500 Subject: [PATCH 05/14] MAINT: new test inst --- pysatModels/tests/test_utils_convert.py | 4 ++-- pysatModels/tests/test_utils_extract.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pysatModels/tests/test_utils_convert.py b/pysatModels/tests/test_utils_convert.py index ce4ddf3e..142bff4a 100644 --- a/pysatModels/tests/test_utils_convert.py +++ b/pysatModels/tests/test_utils_convert.py @@ -66,10 +66,10 @@ class TestUtilsConvertLoadModelXarray(object): def setup_method(self): """Create a clean testing setup before each method.""" - self.ftime = pysat.instruments.pysat_testing_xarray._test_dates[''][''] + self.ftime = pysat.instruments.pysat_ndtesting._test_dates[''][''] self.filename = "%Y-%m-%d.nofile" self.model_kwargs = {'platform': str('pysat'), - 'name': str('testing_xarray'), + 'name': str('ndtesting'), 'num_samples': 12, 'clean_level': 'clean'} self.model_inst = None diff --git a/pysatModels/tests/test_utils_extract.py b/pysatModels/tests/test_utils_extract.py index 5cf9a9aa..ce81ef80 100644 --- a/pysatModels/tests/test_utils_extract.py +++ b/pysatModels/tests/test_utils_extract.py @@ -341,7 +341,7 @@ class TestUtilsExtractModObsXarray(TestUtilsExtractModObs): def setup_method(self): """Set up the unit test environment for each method.""" - self.inst = pysat.Instrument(platform='pysat', name='testing_xarray') + self.inst = pysat.Instrument(platform='pysat', name='ndtesting') self.model = pysat.Instrument(inst_module=pysat_testmodel, tag='') # Load the data in the instruments @@ -377,7 +377,7 @@ class TestUtilsExtractModObsXarray2D(TestUtilsExtractModObs): def setup_method(self): """Set up the unit test environment for each method.""" - self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray') + self.inst = pysat.Instrument(platform='pysat', name='ndtesting') self.model = pysat.Instrument(inst_module=pysat_testmodel, tag='') # Load the data in the instruments @@ -413,7 +413,7 @@ class TestUtilsExtractInstModViewXarray(TestUtilsExtractInstThroughMod): def setup_method(self): """Run before every method to create a clean testing setup.""" - self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray') + self.inst = pysat.Instrument(platform='pysat', name='ndtesting') self.model = pysat.Instrument(inst_module=pysat_testmodel) # Load the data in the instruments @@ -588,7 +588,7 @@ class TestUtilsAltitudePressureXarray(TestUtilsAltitudePressure): def setup_method(self): """Set up the unit test environment for each method.""" - self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray') + self.inst = pysat.Instrument(platform='pysat', name='ndtesting') self.model = pysat.Instrument(inst_module=pysat_testmodel, tag='pressure_levels') @@ -731,7 +731,7 @@ class TestUtilsExtractInstModIrregViewXarray(TestUtilsExtractInstModIrregView): def setup_method(self): """Run before every method to create a clean testing setup.""" - self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray', + self.inst = pysat.Instrument(platform='pysat', name='ndtesting', num_samples=3, max_latitude=45.) self.model = pysat.Instrument(inst_module=pysat_testmodel, tag='pressure_levels', From 7c4636bc8839a7b07265cef5ebabc184979db720 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 09:54:00 -0500 Subject: [PATCH 06/14] MAINT: update workflows --- .github/workflows/docs.yml | 5 ++--- .github/workflows/main.yml | 9 ++------- .github/workflows/pysat_rc.yml | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ee347903..e22cbb33 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.9] + python-version: ["3.11"] # Keep this version at the highest supported Python version name: Documentation tests steps: @@ -26,8 +26,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r test_requirements.txt - pip install -r requirements.txt + pip install .[doc] - name: Set up pysat run: | diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc1b44d0..97255f80 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -50,16 +50,11 @@ jobs: if: ${{ matrix.test_config == 'NEP29'}} run: | pip install numpy==${{ matrix.numpy_ver }} - pip install --upgrade-strategy only-if-needed -r requirements.txt - pip install --upgrade-strategy only-if-needed -r test_requirements.txt - pip install . + pip install --upgrade-strategy only-if-needed .[test] - name: Install standard dependencies if: ${{ matrix.test_config == 'latest'}} - run: | - pip install -r test_requirements.txt - pip install -r requirements.txt - pip install . + run: pip install .[test] - name: Set up pysat run: | diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index 284f9994..b6daa878 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] - python-version: ["3.10"] + python-version: ["3.11"] # Keep this version at the highest supported Python version rc-package: ["pysat", "pysatNASA"] name: ${{ matrix.os }} with ${{ matrix.rc-package }} RC From d6085087c359ef9a76c69691a458a8cecadec79e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:29:02 -0500 Subject: [PATCH 07/14] MAINT: minimum pysat required, remove old compat lines --- pysatModels/tests/test_utils_testing.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/pysatModels/tests/test_utils_testing.py b/pysatModels/tests/test_utils_testing.py index 67121924..9dc765e9 100644 --- a/pysatModels/tests/test_utils_testing.py +++ b/pysatModels/tests/test_utils_testing.py @@ -6,7 +6,6 @@ """Unit tests for `pysatModels.utils.testing`.""" import numpy as np -from packaging import version as pack_version import pytest import pysat @@ -25,9 +24,7 @@ def setup_method(self): # Load the data in the instruments load_kwargs = {'date': pysat_testmodel._test_dates['']['']} - if(pack_version.Version(pysat.__version__) - > pack_version.Version('3.0.1')): - load_kwargs['use_header'] = True + load_kwargs['use_header'] = True self.model.load(**load_kwargs) @@ -92,10 +89,6 @@ def test_compare_model_name_coordinates_failure(self, var, coords, msg, return -@pytest.mark.skipif(pack_version.Version(pysat.__version__) - <= pack_version.Version('3.0.1'), - reason=''.join(('Requires test model in pysat ', - ' v3.0.2 or later.'))) class TestUtilsCompareModNamePressure(TestUtilsCompareModName): """Unit tests for `compare_mod_name_coordinates`.""" @@ -107,9 +100,7 @@ def setup_method(self): # Load the data in the instruments load_kwargs = {'date': pysat_testmodel._test_dates['']['']} - if(pack_version.Version(pysat.__version__) - > pack_version.Version('3.0.1')): - load_kwargs['use_header'] = True + load_kwargs['use_header'] = True self.model.load(**load_kwargs) From b84fefb15736eb880aabb8ac1efb3db1ec83fc45 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:29:10 -0500 Subject: [PATCH 08/14] STY: pep8 --- pysatModels/utils/extract.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysatModels/utils/extract.py b/pysatModels/utils/extract.py index f15b7c8c..6d3b037c 100644 --- a/pysatModels/utils/extract.py +++ b/pysatModels/utils/extract.py @@ -859,8 +859,8 @@ def extract_modelled_observations(inst, model, inst_name, mod_name, if mod_ind in mind and pair_method == 'closest': # Test to see if this model observation has multiple pairings old_ind = mind.index(mod_ind) - if(del_sec[inst_ind, mod_ind] - < del_sec[iind[old_ind], mind[old_ind]]): + if (del_sec[inst_ind, mod_ind] < del_sec[iind[old_ind], + mind[old_ind]]): # If this one is closer, keep it iind[old_ind] = inst_ind mind[old_ind] = mod_ind From 8c35bac0cc012e84b2afaf50d81abcc1c9e163ad Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:33:11 -0500 Subject: [PATCH 09/14] BUG: setup.cfg format --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index a9566a18..a83efd4a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pysatModels -version = '0.1.0' +version = 0.1.0 [flake8] max-line-length = 80 From ff13110259702c5509456b6a77f4f76df3208452 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:33:26 -0500 Subject: [PATCH 10/14] MAINT: update conf for pyproject --- docs/conf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4eed61d6..7fdf9904 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,6 +16,7 @@ import datetime as dt import json import os +import pkg_resources import sys sys.path.insert(0, os.path.abspath('..')) @@ -72,9 +73,7 @@ # # The short X.Y version. module_dir = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0] -version_file = os.path.join(module_dir, project, 'version.txt') -with open(version_file, 'r') as fin: - version = fin.read().strip() +version = pkg_resources.get_distribution('pysatModels').version # The full version, including alpha/beta/rc tags. release = '{:s}-alpha'.format(version) From 5f95464a34d50a22b7ae8798117651bd8003190c Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:35:02 -0500 Subject: [PATCH 11/14] MAINT: update language in conf --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 7fdf9904..4deb4c35 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -83,7 +83,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From c3e4ba9d8c6bc838ed0272a5c5168336ba99c4aa Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 10:36:32 -0500 Subject: [PATCH 12/14] BUG: remove test code --- .github/workflows/main.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 97255f80..002f64c3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -67,12 +67,6 @@ jobs: - name: Evaluate complexity run: flake8 . --count --exit-zero --max-complexity=10 --statistics - - name: Install Operational dependencies success - if: ${{ matrix.test_config == 'Ops'}} - run: | - pip install pysatNASA==0.0.5 - python -c "import pysatNASA; print(pysatNASA.__version__)" - - name: Run unit and integration tests run: pytest --cov=pysatModels/ From 2ef2a700e591db50fa57813b2a5b7739f9f1c83c Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 11:04:52 -0500 Subject: [PATCH 13/14] MAINT: turn off icon tiegcm tests --- pyproject.toml | 2 +- pysatModels/models/ucar_tiegcm.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 25d5976d..9db6e4a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "pandas", "pyForecastTools", "pysat >= 3.0.4", - "pysatNASA <= 0.0.4", + "pysatNASA", "requests", "scipy", "xarray" diff --git a/pysatModels/models/ucar_tiegcm.py b/pysatModels/models/ucar_tiegcm.py index 1bb827eb..7cb9ae79 100644 --- a/pysatModels/models/ucar_tiegcm.py +++ b/pysatModels/models/ucar_tiegcm.py @@ -53,7 +53,8 @@ _test_dates = {'': {'': dt.datetime(2019, 1, 1), 'icon': dt.datetime(2020, 1, 10)}} -_test_download = {'': {'': False, 'icon': True}} +# TODO (#132): Turn on ICON download tests once pysatNASA 0.0.6 is released. +_test_download = {'': {'': False, 'icon': False}} _clean_warn = {'': {tag: general.clean_warn for tag in tags.keys()}} # ---------------------------------------------------------------------------- From e595747c4bde1889fffac3bf3abad1204bfeb07e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 11:14:35 -0500 Subject: [PATCH 14/14] BUG: turn off icon downloads --- pysatModels/models/ucar_tiegcm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pysatModels/models/ucar_tiegcm.py b/pysatModels/models/ucar_tiegcm.py index 7cb9ae79..738a8123 100644 --- a/pysatModels/models/ucar_tiegcm.py +++ b/pysatModels/models/ucar_tiegcm.py @@ -53,7 +53,7 @@ _test_dates = {'': {'': dt.datetime(2019, 1, 1), 'icon': dt.datetime(2020, 1, 10)}} -# TODO (#132): Turn on ICON download tests once pysatNASA 0.0.6 is released. +# TODO(#132): Turn on ICON download tests once pysatNASA 0.0.6 is released. _test_download = {'': {'': False, 'icon': False}} _clean_warn = {'': {tag: general.clean_warn for tag in tags.keys()}} @@ -245,7 +245,10 @@ def download(date_array, tag, inst_id, data_path=None, **kwargs): if tag == '': warnings.warn('Not implemented, currently no support for Globus.') + # TODO(#132): Ensure new download routine is used after pysatNASA release. elif tag == 'icon': + warnings.warn('Not implemented, requires pysatNASA 0.0.6.') + elif tag == 'future_icon': # Set up temporary directory for zip files temp_dir = tempfile.TemporaryDirectory()