From 4053de4a85411ff9e0d2dac677cd7b91b0b5a027 Mon Sep 17 00:00:00 2001 From: "Bruno P. Kinoshita" Date: Mon, 10 Jun 2024 09:29:17 +0200 Subject: [PATCH 1/3] GL-1207: add experiment path in autosubmit describe --- .gitlab-ci.yml | 12 ---- CHANGELOG | 1 + autosubmit/autosubmit.py | 3 +- test/unit/conftest.py | 117 +++++++++++++++++++++++++++++++++++++ test/unit/test_describe.py | 87 +++++++++++++++++++++++++++ 5 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 test/unit/conftest.py create mode 100644 test/unit/test_describe.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1c09128b8..fc6931e89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,10 +16,6 @@ cache: prepare: stage: prepare - rules: - - changes: - - 'docker/**' - when: never script: - git submodule sync --recursive - git submodule update --init --recursive @@ -30,10 +26,6 @@ prepare: test_python3: stage: test - rules: - - changes: - - 'docker/**' - when: never script: - conda activate autosubmit3 - pytest @@ -60,9 +52,5 @@ test_python3: clean: stage: clean - rules: - - changes: - - 'docker/**' - when: never script: - conda clean --all --yes diff --git a/CHANGELOG b/CHANGELOG index 42bf3b0b3..af69e6800 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ Included sample helm charts (tested with minikube). - #1373: Update installation instructions with `rsync`, and fix our `Dockerfile` adding `rsync` and `subversion`. +- #1207: Add experiment path in `autosubmit describe`. 4.1.10 - Hotfix =============== diff --git a/autosubmit/autosubmit.py b/autosubmit/autosubmit.py index edbf41341..73dcdf46d 100644 --- a/autosubmit/autosubmit.py +++ b/autosubmit/autosubmit.py @@ -3395,9 +3395,10 @@ class Autosubmit: return False hpc = as_conf.get_platform() description = get_experiment_descrip(experiment_id) - Log.info("Describing {0}", experiment_id) + Log.result("Describing {0}", experiment_id) Log.result("Owner: {0}", user) + Log.result("Location: {0}", exp_path) Log.result("Created: {0}", created) Log.result("Model: {0}", model) Log.result("Branch: {0}", branch) diff --git a/test/unit/conftest.py b/test/unit/conftest.py new file mode 100644 index 000000000..7b9d8e87e --- /dev/null +++ b/test/unit/conftest.py @@ -0,0 +1,117 @@ +# Fixtures available to multiple test files must be created in this file. + +import pytest +from dataclasses import dataclass +from pathlib import Path +from ruamel.yaml import YAML +from shutil import rmtree +from tempfile import TemporaryDirectory +from typing import Any, Dict, Callable, List + +from autosubmit.autosubmit import Autosubmit +from autosubmit.platforms.slurmplatform import SlurmPlatform, ParamikoPlatform +from autosubmitconfigparser.config.basicconfig import BasicConfig +from autosubmitconfigparser.config.configcommon import AutosubmitConfig +from autosubmitconfigparser.config.yamlparser import YAMLParserFactory + + +@dataclass +class AutosubmitExperiment: + """This holds information about an experiment created by Autosubmit.""" + expid: str + autosubmit: Autosubmit + exp_path: Path + tmp_dir: Path + aslogs_dir: Path + status_dir: Path + platform: ParamikoPlatform + + +@pytest.fixture(scope='function') +def autosubmit_exp(autosubmit: Autosubmit, request: pytest.FixtureRequest) -> Callable: + """Create an instance of ``Autosubmit`` with an experiment.""" + + original_root_dir = BasicConfig.LOCAL_ROOT_DIR + tmp_dir = TemporaryDirectory() + tmp_path = Path(tmp_dir.name) + + def _create_autosubmit_exp(expid: str): + # directories used when searching for logs to cat + root_dir = tmp_path + BasicConfig.LOCAL_ROOT_DIR = str(root_dir) + exp_path = root_dir / expid + exp_tmp_dir = exp_path / BasicConfig.LOCAL_TMP_DIR + aslogs_dir = exp_tmp_dir / BasicConfig.LOCAL_ASLOG_DIR + status_dir = exp_path / 'status' + aslogs_dir.mkdir(parents=True, exist_ok=True) + status_dir.mkdir(parents=True, exist_ok=True) + + platform_config = { + "LOCAL_ROOT_DIR": BasicConfig.LOCAL_ROOT_DIR, + "LOCAL_TMP_DIR": str(exp_tmp_dir), + "LOCAL_ASLOG_DIR": str(aslogs_dir) + } + platform = SlurmPlatform(expid=expid, name='slurm_platform', config=platform_config) + platform.job_status = { + 'COMPLETED': [], + 'RUNNING': [], + 'QUEUING': [], + 'FAILED': [] + } + submit_platform_script = aslogs_dir / 'submit_local.sh' + submit_platform_script.touch(exist_ok=True) + + return AutosubmitExperiment( + expid=expid, + autosubmit=autosubmit, + exp_path=exp_path, + tmp_dir=exp_tmp_dir, + aslogs_dir=aslogs_dir, + status_dir=status_dir, + platform=platform + ) + + def finalizer(): + BasicConfig.LOCAL_ROOT_DIR = original_root_dir + if tmp_path and tmp_path.exists(): + rmtree(tmp_path) + + request.addfinalizer(finalizer) + + return _create_autosubmit_exp + + +@pytest.fixture(scope='module') +def autosubmit() -> Autosubmit: + """Create an instance of ``Autosubmit``. + + Useful when you need ``Autosubmit`` but do not need any experiments.""" + autosubmit = Autosubmit() + return autosubmit + + +@pytest.fixture(scope='function') +def create_as_conf() -> Callable: + def _create_as_conf(autosubmit_exp: AutosubmitExperiment, yaml_files: List[Path], experiment_data: Dict[str, Any]): + conf_dir = autosubmit_exp.exp_path / 'conf' + conf_dir.mkdir(parents=False, exist_ok=False) + basic_config = BasicConfig + parser_factory = YAMLParserFactory() + as_conf = AutosubmitConfig( + expid=autosubmit_exp.expid, + basic_config=basic_config, + parser_factory=parser_factory + ) + for yaml_file in yaml_files: + with open(conf_dir / yaml_file.name, 'w+') as f: + f.write(yaml_file.read_text()) + f.flush() + # add user-provided experiment data + with open(conf_dir / 'conftest_as.yml', 'w+') as f: + yaml = YAML() + yaml.indent(sequence=4, offset=2) + yaml.dump(experiment_data, f) + f.flush() + return as_conf + + return _create_as_conf diff --git a/test/unit/test_describe.py b/test/unit/test_describe.py new file mode 100644 index 000000000..97f6946f2 --- /dev/null +++ b/test/unit/test_describe.py @@ -0,0 +1,87 @@ +import pytest +from pathlib import Path +from pytest_mock import MockerFixture +from typing import Callable + +from autosubmit.autosubmit import Autosubmit + +_EXPIDS = ['z000', 'z001'] + + +@pytest.mark.parametrize( + 'input_experiment_list,get_from_user,not_described', + [ + (' '.join(_EXPIDS), '', False), # It accepts expids separated by spaces, + (','.join(_EXPIDS), '', False), # or by commas, + (_EXPIDS[0], '', False), # or a single experiment ID. + ('zzzz', '', True), # An expid that does not exist. + ('', '', True), # If nothing is provided. + ] +) +def test_describe( + input_experiment_list, + get_from_user, + not_described, + autosubmit_exp: Callable, + create_as_conf: Callable, + mocker: MockerFixture) -> None: + Log = mocker.patch('autosubmit.autosubmit.Log') + + exp = None + expids = input_experiment_list.replace(',', ' ').split(' ') + for expid in expids: + if expid not in _EXPIDS: + continue + exp = autosubmit_exp(expid) + + basic_config = mocker.MagicMock() + config_values = { + 'LOCAL_ROOT_DIR': str(exp.exp_path.parent), + 'LOCAL_ASLOG_DIR': str(exp.aslogs_dir) + } + for key, value in config_values.items(): + basic_config.__setattr__(key, value) + basic_config.get.side_effect = lambda key, default='': config_values.get(key, default) + for basic_config_location in [ + 'autosubmit.autosubmit.BasicConfig', + 'autosubmitconfigparser.config.configcommon.BasicConfig' + ]: + # TODO: Better design how ``BasicConfig`` is used/injected/IOC/etc.. + mocker.patch(basic_config_location, basic_config) + mocked_get_submitter = mocker.patch.object(Autosubmit, '_get_submitter') + submitter = mocker.MagicMock() + mocked_get_submitter.return_value = submitter + submitter.platforms = [1, 2] + + get_experiment_descrip = mocker.patch('autosubmit.autosubmit.get_experiment_descrip') + get_experiment_descrip.return_value = [[f'{expid} description']] + + create_as_conf( + autosubmit_exp=exp, + yaml_files=[ + Path(__file__).resolve().parent / "files/fake-jobs.yml", + Path(__file__).resolve().parent / "files/fake-platforms.yml" + ], + experiment_data={ + 'DEFAULT': { + 'HPCARCH': 'ARM' + } + } + ) + + Autosubmit.describe( + input_experiment_list=input_experiment_list, + get_from_user=get_from_user + ) + + # Log.printlog is only called when an experiment is not described + # TODO: We could re-design the class to make this behaviour clearer. + assert Log.printlog.call_count == (1 if not_described else 0) + + if exp and not not_described: + log_result_output = [ + line_tuple.args[0].format(line_tuple.args[1]) for line_tuple in Log.result.mock_calls + ] + root_dir = exp.exp_path.parent + for expid in expids: + assert f'Location: {str(root_dir / expid)}' in log_result_output -- GitLab From b8e768dc2b9c27e4d8bef4046cc09c29ee31f89e Mon Sep 17 00:00:00 2001 From: "Bruno P. Kinoshita" Date: Wed, 4 Sep 2024 12:26:49 +0200 Subject: [PATCH 2/3] Fix our CICD pipeline, and upgrade to Python 3.9+ --- .gitlab-ci.yml | 49 ++++++++----------- .gitmodules | 0 docs/README.md | 2 +- docs/requirements.txt | 6 --- docs/source/userguide/configure/index.rst | 3 +- docs/source/userguide/create/index.rst | 1 + docs/source/userguide/manage/index.rst | 23 ++++++--- .../userguide/monitor_and_check/index.rst | 3 ++ docs/source/userguide/run/index.rst | 1 + environment.yml | 46 ----------------- requeriments.txt | 26 ---------- setup.py | 10 ++++ 12 files changed, 53 insertions(+), 117 deletions(-) delete mode 100644 .gitmodules delete mode 100644 docs/requirements.txt delete mode 100644 environment.yml delete mode 100644 requeriments.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fc6931e89..9fc0c0082 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,33 +1,33 @@ before_script: - export GIT_SSL_NO_VERIFY=1 - export PATH="$HOME/miniconda2/bin:$PATH" + # 2024-09-04: We deleted autosubmit3 env (00:00:04). + # - conda env remove -y -n autosubmit3 + # 2024-09-04: Installed a new env autosubmit4 (00:00:55). + # - conda create -n autosubmit4 python=3.9 graphviz bcrypt pip sqlite rsync curl + # And then we use this environment to create venv's (faster) and install Autosubmit. + # We always activate the same environment + - conda activate autosubmit4 + - test -f venv/bin/python || python3 -m venv venv + - source venv/bin/activate + - python3 -V stages: - - prepare - - docs - test - - report - - clean + - docs cache: paths: - test/coverage.xml - test/unit/files - -prepare: - stage: prepare - script: - - git submodule sync --recursive - - git submodule update --init --recursive - - conda update -n base -c defaults conda - - conda update conda - - conda install -n autosubmit3 pytest pytest-cov pytest-mock - - conda env update -f environment.yml -n autosubmit3 python=3.7.3 + - venv test_python3: stage: test script: - - conda activate autosubmit3 + - pip install --upgrade pip + # This installs default dependencies, plus those for running tests and for building docs. + - pip install -e .[tests] - 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 @@ -39,18 +39,9 @@ test_python3: coverage_format: cobertura path: test/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 +docs: + stage: docs script: - - conda clean --all --yes + - pip install -e .[docs] + - cd docs + - make html diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/README.md b/docs/README.md index de53f5433..80ef6ca65 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -To build the docs, install the `requirements.txt` in this folder and then run +To build the docs, install the optional group `docs` with `pip`, and then run `make html`. That should create a version identical to the one from ReadTheDocs, which can diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 5deaf0fcd..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -livereload -pydata-sphinx-theme==0.15.* -sphinx==5.* -sphinx-autobuild==2021.3.* -sphinx_rtd_theme -sphinx-reredirects==0.1.* diff --git a/docs/source/userguide/configure/index.rst b/docs/source/userguide/configure/index.rst index 543f3c917..ecbcce89d 100644 --- a/docs/source/userguide/configure/index.rst +++ b/docs/source/userguide/configure/index.rst @@ -40,7 +40,8 @@ Experiment workflow, which contains all the jobs and its dependencies, will be s Options: :: - usage: autosubmit create [-h] [-np] [--hide] [-d] [-o {pdf,png,ps,svg}] [-group_by {date,member,chunk,split,automatic}] + + usage: autosubmit create [-h] [-np] [--hide] [-d] [-o {pdf,png,ps,svg}] [-group_by {date,member,chunk,split,automatic}] [-expand EXPAND] [-expand_status EXPAND_STATUS] [-nt] [-cw] [-v] [-p] [-f] EXPID diff --git a/docs/source/userguide/create/index.rst b/docs/source/userguide/create/index.rst index d11eea351..93b23b523 100644 --- a/docs/source/userguide/create/index.rst +++ b/docs/source/userguide/create/index.rst @@ -194,6 +194,7 @@ To test the experiment, use the command: Options: :: + usage: autosubmit test [-h] -c CHUNKS [-m MEMBER] [-s STARDATE] [-H HPC] [-b BRANCH] [-v] EXPID test experiment diff --git a/docs/source/userguide/manage/index.rst b/docs/source/userguide/manage/index.rst index 3ed135256..56137b56b 100644 --- a/docs/source/userguide/manage/index.rst +++ b/docs/source/userguide/manage/index.rst @@ -69,6 +69,7 @@ use, unless it is unarchived. Options: :: + usage: autosubmit archive [-h] [-nclean] [-uc] [-v] [--rocrate] EXPID archives an experiment @@ -101,6 +102,7 @@ To unarchive an experiment, use the command: Options: :: + usage: autosubmit unarchive [-h] [-nclean] [-uc] [-v] [--rocrate] EXPID unarchives an experiment @@ -131,6 +133,7 @@ To delete the experiment, use the command: Options: :: + usage: autosubmit delete [-h] [-f] [-v] EXPID delete specified experiment @@ -157,10 +160,12 @@ How to migrate an experiment The Autosubmit Migrate command is used to migrate data from one user to another. :: + autosubmit migrate EXPID Options: :: + usage: autosubmit migrate [-h] [-o] [-p] [-r] [-v] [-fs {Any,READY,COMPLETED,WAITING,SUSPENDED,FAILED,UNKNOWN}] EXPID Migrate experiments from current user to another @@ -267,6 +272,7 @@ It checks experiment configuration and copy code from original repository to pro Options: :: + usage: autosubmit refresh [-h] [-mc] [-jc] [-v] EXPID refresh project directory for an experiment @@ -302,17 +308,18 @@ Use the command: Options: :: - usage: autosubmit updatedescrip [-h] [-v] EXPID DESCRIPTION - Updates the experiment's description. + usage: autosubmit updatedescrip [-h] [-v] EXPID DESCRIPTION - positional arguments: - EXPID experiment identifier - DESCRIPTION New description. + Updates the experiment's description. - options: - -h, --help show this help message and exit - -v, --update_version Update experiment version + positional arguments: + EXPID experiment identifier + DESCRIPTION New description. + + options: + -h, --help show this help message and exit + -v, --update_version Update experiment version Autosubmit will validate the provided data and print the results in the command line. diff --git a/docs/source/userguide/monitor_and_check/index.rst b/docs/source/userguide/monitor_and_check/index.rst index da42e93d2..221efe97a 100644 --- a/docs/source/userguide/monitor_and_check/index.rst +++ b/docs/source/userguide/monitor_and_check/index.rst @@ -98,6 +98,7 @@ To generate the cmd files of the current non-active jobs experiment, it is poss EXPID is the experiment identifier. Options: :: + usage: autosubmit inspect [-h] [-nt] [-f] [-cw] [-v] [-q] [-fl LIST | -fc FILTER_CHUNKS | -fs {Any,READY,COMPLETED,WAITING,SUSPENDED,FAILED,UNKNOWN} | -ft FILTER_TYPE] EXPID @@ -491,6 +492,7 @@ Options: Examples: :: + autosubmit describe cxxx autosubmit describe "cxxx cyyy" autosubmit describe cxxx,cyyy @@ -669,6 +671,7 @@ Or combined as follows: Options: :: + usage: autosubmit report [-h] [-t TEMPLATE] [-all] [-fp FOLDER_PATH] [-p] [-v] EXPID Show metrics.. diff --git a/docs/source/userguide/run/index.rst b/docs/source/userguide/run/index.rst index 251da82b9..7dff7b93d 100644 --- a/docs/source/userguide/run/index.rst +++ b/docs/source/userguide/run/index.rst @@ -18,6 +18,7 @@ otherwise. Options: :: + usage: autosubmit run [-h] [-nt] [-v] [-st START_TIME] [-sa START_AFTER] [-rom RUN_ONLY_MEMBERS] [-p] EXPID runs specified experiment diff --git a/environment.yml b/environment.yml deleted file mode 100644 index a92b1b01c..000000000 --- a/environment.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: autosubmit3 -channels: - - conda-forge - -dependencies: -- python=3.7 -- paramiko -- graphviz -- python-dateutil -- pyparsing -- matplotlib -- bcrypt -- pip -- mock -- portalocker -- networkx -- sqlite -- pip: - - autosubmitconfigparser - - argparse>=1.4.0 - - bcrypt>=3.2.0 - - python-dateutil>=2.8.2 - - matplotlib>=3.5.1 - - py3dotplus>=1.1.0 - - pyparsing>=3.0.7 - - paramiko>=2.9.2 - - mock>=4.0.3 - - portalocker>=2.3.2 - - networkx>=2.6.3 - - requests>=2.27.1 - - bscearth.utils>=0.5.2 - - cryptography>=36.0.1 - - setuptools>=60.8.2 - - six>=1.10.0 - - xlib>=0.21 - - ruamel.yaml - - pythondialog - - pytest - - pytest-cov - - pytest-mock - - nose - - requests - - configobj - - psutil - - setproctitle - diff --git a/requeriments.txt b/requeriments.txt deleted file mode 100644 index 96dcaa63e..000000000 --- a/requeriments.txt +++ /dev/null @@ -1,26 +0,0 @@ -setproctitle -xlib==0.21 -setuptools<=68.2.2 -bscearth.utils<=0.5.2 -requests<=2.31.0 -networkx<=2.6.3 -portalocker<=2.7.0 -paramiko<=3.4 -pyparsing==3.1.1 -matplotlib<=3.8.3 -packaging<=23.2 -ruamel.yaml.clib<=0.2.8 -typing_extensions<=4.9.0 -typing<=3.7.4.3 -psutil<=5.6.1 -networkx<=2.6.3 -py3dotplus==1.1.0 -matplotlib<=3.8.3 -numpy<2 -ruamel.yaml==0.17.21 -rocrate==0.* -autosubmitconfigparser==1.0.67 -configparser -pytest -pytest-cov -pytest-mock diff --git a/setup.py b/setup.py index e20989e1d..8d1f5b100 100644 --- a/setup.py +++ b/setup.py @@ -58,6 +58,15 @@ pg_require = [ 'psycopg2' ] +docs_require = [ + 'livereload', + 'pydata-sphinx-theme==0.15.*', + 'sphinx==5.*', + 'sphinx-autobuild==2021.3.*', + 'sphinx_rtd_theme', + 'sphinx-reredirects==0.1.*' +] + tests_require = [ 'pytest==8.2.*', 'pytest-cov', @@ -71,6 +80,7 @@ all_require = tests_require + pg_require extras_require = { 'postgres': pg_require, 'tests': tests_require, + 'docs': docs_require, 'all': all_require } -- GitLab From 429196ab9e371e92705cac502af9e7ecb45c588f Mon Sep 17 00:00:00 2001 From: "Bruno P. Kinoshita" Date: Wed, 4 Sep 2024 14:09:02 +0200 Subject: [PATCH 3/3] Replace deprecated assertEquals/assertEqual and assertNotEquals/assertNotEqual --- test/unit/helpers/test_parameters.py | 8 ++-- test/unit/provenance/test_rocrate.py | 58 ++++++++++++++-------------- test/unit/test_expid.py | 2 +- test/unit/test_job.py | 2 +- test/unit/test_job_list.py | 8 ++-- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/test/unit/helpers/test_parameters.py b/test/unit/helpers/test_parameters.py index 93b2c290a..5e2860db1 100644 --- a/test/unit/helpers/test_parameters.py +++ b/test/unit/helpers/test_parameters.py @@ -31,7 +31,7 @@ class TestParameters(TestCase): # ``Job`` becomes ``JOB``. self.assertTrue(parameter_group in PARAMETERS) self.assertTrue(parameter_name in PARAMETERS[parameter_group]) - self.assertEquals('This parameter is the job name.', PARAMETERS[parameter_group][parameter_name]) + self.assertEqual('This parameter is the job name.', PARAMETERS[parameter_group][parameter_name]) def test_autosubmit_decorator_using_array(self): @@ -56,7 +56,7 @@ class TestParameters(TestCase): self.assertTrue(parameter_group in PARAMETERS) for parameter_name in parameter_names: self.assertTrue(parameter_name in PARAMETERS[parameter_group]) - self.assertEquals('This parameter is the job name.', PARAMETERS[parameter_group][parameter_name]) + self.assertEqual('This parameter is the job name.', PARAMETERS[parameter_group][parameter_name]) def test_autosubmit_decorator_no_group(self): @@ -79,7 +79,7 @@ class TestParameters(TestCase): # ``Job`` becomes ``JOB``. self.assertTrue(Job.__name__.upper() in PARAMETERS) self.assertTrue(parameter_name in PARAMETERS[Job.__name__.upper()]) - self.assertEquals('This parameter is the job name.', PARAMETERS[Job.__name__.upper()][parameter_name]) + self.assertEqual('This parameter is the job name.', PARAMETERS[Job.__name__.upper()][parameter_name]) def test_autosubmit_class_decorator(self): @@ -102,6 +102,6 @@ class TestParameters(TestCase): self.assertTrue(len(PARAMETERS) > 0) self.assertTrue('JOB' in PARAMETERS) self.assertTrue('JOBNAME' in PARAMETERS['JOB']) - self.assertEquals('The value!', PARAMETERS['JOB']['JOBNAME']) + self.assertEqual('The value!', PARAMETERS['JOB']['JOBNAME']) diff --git a/test/unit/provenance/test_rocrate.py b/test/unit/provenance/test_rocrate.py index da12e8e4f..8e0b4e1ca 100644 --- a/test/unit/provenance/test_rocrate.py +++ b/test/unit/provenance/test_rocrate.py @@ -59,7 +59,7 @@ class TestRoCrate(TestCase): relative_path=d, encoding_format=None ) - self.assertEquals(1, len(self.empty_rocrate.data_entities)) + self.assertEqual(1, len(self.empty_rocrate.data_entities)) def test_add_dir_and_files(self): with TemporaryDirectory() as d: @@ -75,13 +75,13 @@ class TestRoCrate(TestCase): relative_path=str(sub_path), encoding_format=None ) - self.assertEquals(2, len(self.empty_rocrate.data_entities)) + self.assertEqual(2, len(self.empty_rocrate.data_entities)) for entity in self.empty_rocrate.data_entities: if entity.source.name == 'file.txt': properties = entity.properties() self.assertTrue(properties['sdDatePublished']) self.assertTrue(properties['dateModified']) - self.assertEquals(properties['encodingFormat'], 'text/plain') + self.assertEqual(properties['encodingFormat'], 'text/plain') break else: self.fail('Failed to locate the entity for files/file.txt') @@ -102,13 +102,13 @@ class TestRoCrate(TestCase): relative_path=str(sub_path), encoding_format=encoding ) - self.assertEquals(2, len(self.empty_rocrate.data_entities)) + self.assertEqual(2, len(self.empty_rocrate.data_entities)) for entity in self.empty_rocrate.data_entities: if entity.source.name == 'file.txt': properties = entity.properties() self.assertTrue(properties['sdDatePublished']) self.assertTrue(properties['dateModified']) - self.assertEquals(properties['encodingFormat'], encoding) + self.assertEqual(properties['encodingFormat'], encoding) break else: self.fail('Failed to locate the entity for files/file.txt') @@ -123,14 +123,14 @@ class TestRoCrate(TestCase): jobs = tests[0] expected = tests[1] result = _get_action_status(jobs) - self.assertEquals(expected, result) + self.assertEqual(expected, result) def test_create_formal_parameter(self): formal_parameter = _create_formal_parameter(self.empty_rocrate, 'Name') properties = formal_parameter.properties() - self.assertEquals('#Name-param', properties['@id']) - self.assertEquals('FormalParameter', properties['@type']) - self.assertEquals('Name', properties['name']) + self.assertEqual('#Name-param', properties['@id']) + self.assertEqual('FormalParameter', properties['@type']) + self.assertEqual('Name', properties['name']) def test_create_parameter(self): formal_parameter = _create_formal_parameter(self.empty_rocrate, 'Answer') @@ -143,8 +143,8 @@ class TestRoCrate(TestCase): extra='test' ) properties = parameter.properties() - self.assertEquals(42, properties['value']) - self.assertEquals('test', properties['extra']) + self.assertEqual(42, properties['value']) + self.assertEqual('test', properties['extra']) def test_get_local_project_entity(self): project_path = '/tmp/project' @@ -162,10 +162,10 @@ class TestRoCrate(TestCase): self.empty_rocrate ) - self.assertEquals(project_entity['@id'], project_url) - self.assertEquals(project_entity['targetProduct'], 'Autosubmit') - self.assertEquals(project_entity['codeRepository'], project_url) - self.assertEquals(project_entity['version'], '') + self.assertEqual(project_entity['@id'], project_url) + self.assertEqual(project_entity['targetProduct'], 'Autosubmit') + self.assertEqual(project_entity['codeRepository'], project_url) + self.assertEqual(project_entity['version'], '') def test_get_dummy_project_entity(self): project_url = '' @@ -179,10 +179,10 @@ class TestRoCrate(TestCase): self.empty_rocrate ) - self.assertEquals(project_entity['@id'], project_url) - self.assertEquals(project_entity['targetProduct'], 'Autosubmit') - self.assertEquals(project_entity['codeRepository'], project_url) - self.assertEquals(project_entity['version'], '') + self.assertEqual(project_entity['@id'], project_url) + self.assertEqual(project_entity['targetProduct'], 'Autosubmit') + self.assertEqual(project_entity['codeRepository'], project_url) + self.assertEqual(project_entity['version'], '') def test_get_subversion_or_other_project_entity(self): for key in ['SVN', 'SUBVERSION', 'MERCURY', '', ' ']: @@ -214,9 +214,9 @@ class TestRoCrate(TestCase): self.as_conf, self.empty_rocrate ) - self.assertEquals(project_entity['@id'], self.project_url) - self.assertEquals(project_entity['targetProduct'], 'Autosubmit') - self.assertEquals(project_entity['codeRepository'], self.project_url) + self.assertEqual(project_entity['@id'], self.project_url) + self.assertEqual(project_entity['targetProduct'], 'Autosubmit') + self.assertEqual(project_entity['codeRepository'], self.project_url) self.assertTrue(len(project_entity['version']) > 0) @patch('subprocess.check_output') @@ -226,14 +226,14 @@ class TestRoCrate(TestCase): with self.assertRaises(AutosubmitCritical) as cm: _get_git_branch_and_commit(project_path='') - self.assertEquals(cm.exception.message, 'Failed to retrieve project branch...') + self.assertEqual(cm.exception.message, 'Failed to retrieve project branch...') mocked_check_output.reset_mock() mocked_check_output.side_effect = ['master', error] with self.assertRaises(AutosubmitCritical) as cm: _get_git_branch_and_commit(project_path='') - self.assertEquals(cm.exception.message, 'Failed to retrieve project commit SHA...') + self.assertEqual(cm.exception.message, 'Failed to retrieve project commit SHA...') @patch('autosubmit.provenance.rocrate.BasicConfig') @patch('autosubmit.provenance.rocrate.get_experiment_descrip') @@ -376,7 +376,7 @@ class TestRoCrate(TestCase): path=Path(temp_dir) ) - self.assertEquals(cm.exception.message, 'Failed to read the Autosubmit Project for RO-Crate...') + self.assertEqual(cm.exception.message, 'Failed to read the Autosubmit Project for RO-Crate...') @patch('autosubmit.provenance.rocrate.BasicConfig') @patch('autosubmit.provenance.rocrate.get_experiment_descrip') @@ -446,7 +446,7 @@ class TestRoCrate(TestCase): path=Path(temp_dir) ) - self.assertEquals(cm.exception.message, + self.assertEqual(cm.exception.message, 'Could not locate a type in RO-Crate for parameter APP.OBJ type object') @patch('autosubmit.autosubmit.Log') @@ -466,8 +466,8 @@ class TestRoCrate(TestCase): with self.assertRaises(AutosubmitCritical) as cm, tempfile.TemporaryDirectory() as temp_dir: autosubmit.rocrate(self.expid, path=Path(path=Path(temp_dir))) - self.assertEquals(cm.exception.message, 'You must provide an ROCRATE configuration key when using RO-Crate...') - self.assertEquals(mocked_Log.error.call_count, 1) + self.assertEqual(cm.exception.message, 'You must provide an ROCRATE configuration key when using RO-Crate...') + self.assertEqual(mocked_Log.error.call_count, 1) @patch('autosubmit.autosubmit.JobList') @patch('autosubmit.autosubmit.AutosubmitConfig') @@ -754,5 +754,5 @@ class TestRoCrate(TestCase): ) self.assertIsNotNone(crate) data_entities_ids = [data_entity['@id'] for data_entity in crate.data_entities] - self.assertEquals(len(data_entities_ids), len(set(data_entities_ids)), f'Duplicate IDs found in the RO-Crate data entities: {str(data_entities_ids)}') + self.assertEqual(len(data_entities_ids), len(set(data_entities_ids)), f'Duplicate IDs found in the RO-Crate data entities: {str(data_entities_ids)}') diff --git a/test/unit/test_expid.py b/test/unit/test_expid.py index 466e3879d..fd789aa49 100644 --- a/test/unit/test_expid.py +++ b/test/unit/test_expid.py @@ -97,7 +97,7 @@ CONFIG: source_name = Path(source_yaml.name) output_text = Path(temp_dir, expid, 'conf', f'{source_name.stem}_{expid}.yml').read_text() - self.assertNotEquals(source_text, output_text) + self.assertNotEqual(source_text, output_text) self.assertFalse('# sim' in source_text) self.assertTrue('# sim' in output_text) self.assertFalse('# 42' in source_text) diff --git a/test/unit/test_job.py b/test/unit/test_job.py index 2306579aa..02133f1af 100644 --- a/test/unit/test_job.py +++ b/test/unit/test_job.py @@ -1179,7 +1179,7 @@ CONFIG: ]: self.job.date = test[0] self.job.date_format = test[1] - self.assertEquals(test[2], self.job.sdate) + self.assertEqual(test[2], self.job.sdate) def test__repr__(self): self.job.name = "dummy-name" diff --git a/test/unit/test_job_list.py b/test/unit/test_job_list.py index 39f91529c..6e204b143 100644 --- a/test/unit/test_job_list.py +++ b/test/unit/test_job_list.py @@ -554,10 +554,10 @@ class TestJobList(TestCase): # check that name is the same for index,job in enumerate(job_list._job_list): - self.assertEquals(job_list2._job_list[index].name, job.name) + self.assertEqual(job_list2._job_list[index].name, job.name) # check that status is the same for index,job in enumerate(job_list._job_list): - self.assertEquals(job_list2._job_list[index].status, job.status) + self.assertEqual(job_list2._job_list[index].status, job.status) self.assertEqual(job_list2._date_list, job_list._date_list) self.assertEqual(job_list2._member_list, job_list._member_list) self.assertEqual(job_list2._chunk_list, job_list._chunk_list) @@ -582,10 +582,10 @@ class TestJobList(TestCase): # assert # check that name is the same for index, job in enumerate(job_list._job_list): - self.assertEquals(job_list3._job_list[index].name, job.name) + self.assertEqual(job_list3._job_list[index].name, job.name) # check that status is the same for index,job in enumerate(job_list._job_list): - self.assertEquals(job_list3._job_list[index].status, job.status) + self.assertEqual(job_list3._job_list[index].status, job.status) self.assertEqual(job_list3._date_list, job_list._date_list) self.assertEqual(job_list3._member_list, job_list._member_list) self.assertEqual(job_list3._chunk_list, job_list._chunk_list) -- GitLab