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