diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..bbf169a20f4dca13e6fed47b34cb02c4b7020bc9 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,54 @@ +before_script: + - export GIT_SSL_NO_VERIFY=1 + - export PATH="$HOME/miniconda2/bin:$PATH" + +stages: + - prepare + - docs + - test + - report + - clean + + +prepare: + stage: prepare + script: + - git submodule sync --recursive + - git submodule update --init --recursive + - conda update -n base -c defaults conda + - conda update conda + - conda create -n autosubmit_api python=3.9 + - conda install -n autosubmit_api graphviz pytest pytest-cov pytest-mock + - conda activate autosubmit_api + - pip install . + +test_python3: + stage: test + script: + - conda activate autosubmit_api + - pytest + coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' + # These artifacts are saved with every build in GitLab and can be reviewed later. If + # we have a folder with HTML files, as in this example, users can navigate with their + # browser. + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage.xml + +# FIXME: Our GitLab worker has 3.7, but pydata-sphinx-theme requires 3.8+ +# docs: +# stage: docs +# script: +# - conda activate autosubmit3 +# - pip install -e . +# - cd docs +# - pip install -r requirements.txt +# - make html + + +clean: + stage: clean + script: + - conda clean --all --yes diff --git a/CHANGELOG.md b/CHANGELOG.md index cf1bb5d3b9e98ea2d519236baf593173720b38da..ae77535977604f93d10313507c4adb9f5dfcff6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +### Pre-release v4.0.0b9 - Release date: 2024-07-03 + +* Added support to Python 3.12 and dropped support to Python <= 3.8 +* Minor bug fixes + ### Pre-release v4.0.0b8 - Release date: 2024-05-28 * Fixed major bug: Prevent accidental `job_data_{expid}.db` file creation diff --git a/autosubmit_api/__init__.py b/autosubmit_api/__init__.py index a539f1b993b62ca52ed101a7855a3aebb82d1caa..426bac53e21629b8ae49d614d934aedd3acf5241 100644 --- a/autosubmit_api/__init__.py +++ b/autosubmit_api/__init__.py @@ -17,6 +17,6 @@ # You should have received a copy of the GNU General Public License # along with Autosubmit. If not, see . -__version__ = "4.0.0b8" +__version__ = "4.0.0b9" __author__ = "Luiggi Tenorio, Bruno P. Kinoshita, Cristian GutiƩrrez, Julian Berlin, Wilmer Uruchi" __credits__ = "Barcelona Supercomputing Center" \ No newline at end of file diff --git a/autosubmit_api/config/IConfigStrategy.py b/autosubmit_api/config/IConfigStrategy.py index cf552bdfc6c7a1a0a66fa9c1a2e1450f18e08c93..9fcdb8e0ee30b7152945cd8baf971a1c25bdfbb5 100644 --- a/autosubmit_api/config/IConfigStrategy.py +++ b/autosubmit_api/config/IConfigStrategy.py @@ -17,15 +17,8 @@ # You should have received a copy of the GNU General Public License # along with Autosubmit. If not, see . -try: - # noinspection PyCompatibility - from configparser import SafeConfigParser - from autosubmitconfigparser.config.configcommon import AutosubmitConfig as Autosubmit4Config -except ImportError: - # noinspection PyCompatibility - from configparser import SafeConfigParser - - +from configparser import ConfigParser as PyConfigParser +from autosubmitconfigparser.config.configcommon import AutosubmitConfig as Autosubmit4Config import os import re import subprocess @@ -61,12 +54,11 @@ class IConfigStrategy(ABC): return self._exp_parser_file @abstractmethod - def platforms_parser(self): + def platforms_parser(self) -> PyConfigParser: """ Returns experiment's platforms parser object :return: platforms config parser object - :rtype: SafeConfigParser """ pass @@ -459,11 +451,10 @@ class IConfigStrategy(ABC): """ - def set_git_project_commit(self, as_conf): + def set_git_project_commit(self, as_conf: Autosubmit4Config): """ Function to register in the configuration the commit SHA of the git project version. :param as_conf: Configuration class for exteriment - :type as_conf: AutosubmitConfig """ def get_svn_project_url(self): diff --git a/autosubmit_api/config/basicConfig.py b/autosubmit_api/config/basicConfig.py index 95acbff22e737fec77104603dd8bf939fa80bbdf..c73a51e566dff683733d026114bd28bb8ffb2ad0 100644 --- a/autosubmit_api/config/basicConfig.py +++ b/autosubmit_api/config/basicConfig.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with Autosubmit. If not, see . -from configparser import SafeConfigParser +from configparser import ConfigParser from autosubmitconfigparser.config.basicconfig import BasicConfig import os # from log.log import Log, AutosubmitError, AutosubmitCritical @@ -39,7 +39,7 @@ class APIBasicConfig(BasicConfig): if not os.path.isfile(file_path): return #Log.debug('Reading config from ' + file_path) - parser = SafeConfigParser() + parser = ConfigParser() parser.optionxform = str parser.read(file_path) diff --git a/autosubmit_api/config/confConfigStrategy.py b/autosubmit_api/config/confConfigStrategy.py index 2bbadb2e438f81b17188e2dc353f030023dc039c..46687a4b7e0fb6ed440dcdcf012ceda04b853a4d 100644 --- a/autosubmit_api/config/confConfigStrategy.py +++ b/autosubmit_api/config/confConfigStrategy.py @@ -17,14 +17,9 @@ # You should have received a copy of the GNU General Public License # along with Autosubmit. If not, see . -try: - # noinspection PyCompatibility - from configparser import SafeConfigParser - from autosubmitconfigparser.config.configcommon import AutosubmitConfig as Autosubmit4Config -except ImportError: - # noinspection PyCompatibility - from configparser import SafeConfigParser +from configparser import ConfigParser as PyConfigParser +from autosubmitconfigparser.config.configcommon import AutosubmitConfig as Autosubmit4Config import os import re @@ -104,12 +99,11 @@ class confConfigStrategy(IConfigStrategy): return self._exp_parser_file @property - def platforms_parser(self): + def platforms_parser(self) -> PyConfigParser: """ Returns experiment's platforms parser object :return: platforms config parser object - :rtype: SafeConfigParser """ return self._platforms_parser @@ -838,11 +832,10 @@ class confConfigStrategy(IConfigStrategy): '/')[-1].split('.')[-2] return value - def set_git_project_commit(self, as_conf): + def set_git_project_commit(self, as_conf: Autosubmit4Config): """ Function to register in the configuration the commit SHA of the git project version. :param as_conf: Configuration class for exteriment - :type as_conf: AutosubmitConfig """ full_project_path = as_conf.get_project_dir() try: @@ -1321,8 +1314,7 @@ class confConfigStrategy(IConfigStrategy): return origin_exists and (branch is not None or commit is not None) @staticmethod - def get_parser(parser_factory, file_path): - # type: (ConfigParserFactory, str) -> ConfigParser + def get_parser(parser_factory: ConfigParserFactory, file_path: str) -> PyConfigParser: """ Gets parser for given file @@ -1330,7 +1322,6 @@ class confConfigStrategy(IConfigStrategy): :param file_path: path to file to be parsed :type file_path: str :return: parser - :rtype: SafeConfigParser """ parser = parser_factory.create_parser() parser.optionxform = str diff --git a/autosubmit_api/config/config_common.py b/autosubmit_api/config/config_common.py index 1f2aad5e616697cb30ac3714140252b4f7bbdf27..567fb8446c4eefee1a7dfa360bda3d14cca376ef 100644 --- a/autosubmit_api/config/config_common.py +++ b/autosubmit_api/config/config_common.py @@ -69,12 +69,11 @@ class AutosubmitConfigResolver(object): @property - def platforms_parser(self): + def platforms_parser(self)-> ConfigParser: """ Returns experiment's platforms parser object :return: platforms config parser object - :rtype: SafeConfigParser """ return self._configWrapper.platforms_parser @@ -818,7 +817,7 @@ class AutosubmitConfigResolver(object): return self._configWrapper.is_valid_git_repository() - def get_parser(self, parser_factory, file_path): + def get_parser(self, parser_factory, file_path) -> ConfigParser: # type: (ConfigParserFactory, str) -> ConfigParser """ Gets parser for given file @@ -827,7 +826,6 @@ class AutosubmitConfigResolver(object): :param file_path: path to file to be parsed :type file_path: str :return: parser - :rtype: SafeConfigParser """ # TODO: this was static method, check usages diff --git a/autosubmit_api/config/ymlConfigStrategy.py b/autosubmit_api/config/ymlConfigStrategy.py index 3f60ea00a46aebb107bff82b25e9f48acd1f32e8..9dbd6719e7162b4bd74f3e0253419ebbe42cabb1 100644 --- a/autosubmit_api/config/ymlConfigStrategy.py +++ b/autosubmit_api/config/ymlConfigStrategy.py @@ -114,7 +114,7 @@ class ymlConfigStrategy(IConfigStrategy): def get_job_platform(self, section: str) -> str: # return the JOBS.
.PLATFORM or DEFAULT.HPCARCH - return self._conf_parser.jobs_data.get(section, {}).get("PLATFORM", self.get_platform()) + return self._conf_parser.jobs_data.get(section, {}).get("PLATFORM", self.get_platform()).upper() def get_platform_queue(self, platform: str) -> str: logger.debug("get_platform_queue") diff --git a/pytest.ini b/pytest.ini index da75339225a307b2aa8beeb87be4a0a9755100fe..3c0119a4b82aa960d24314aaf0e706e6ad7642c2 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,6 +1,7 @@ [pytest] addopts = --cov=autosubmit_api --cov-config=.coveragerc --cov-report=html + --cov-report=xml:coverage.xml testpaths = tests/ doctest_optionflags = diff --git a/setup.py b/setup.py index 06ebda7f003432a77fe97c0595d3875631211173..272f191830b998a4be610fd0c718e9f8624475cd 100644 --- a/setup.py +++ b/setup.py @@ -25,13 +25,12 @@ install_requires = [ "requests~=2.28.1", "flask_cors~=3.0.10", "bscearth.utils~=0.5.2", - "pysqlite-binary", "pydotplus~=2.0.2", "portalocker~=2.6.0", - "networkx~=2.6.3", - "scipy~=1.7.3", + "networkx<=2.6.3", + "scipy~=1.11.4", "python-dotenv", - "autosubmitconfigparser~=1.0.48", + "autosubmitconfigparser>=1.0.65", "autosubmit>=3.13", "Flask-APScheduler", "gunicorn", @@ -63,7 +62,7 @@ setup( license="GNU GPL", packages=find_packages(), keywords=["autosubmit", "API"], - python_requires=">=3.8", + python_requires=">=3.9", install_requires=install_requires, extras_require=extras_require, include_package_data=True, @@ -73,7 +72,7 @@ setup( "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", ], entry_points={ "console_scripts": [ diff --git a/tests/experiments/a6zj/tmp/LOG_a6zj/.gitkeep b/tests/experiments/a6zj/tmp/LOG_a6zj/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391