From 1f73f17971433eddc4e7f6cad05372d5593ec48f Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Mon, 16 Oct 2023 10:25:09 -0700 Subject: [PATCH 01/13] Add Python 3.12 to GHA pytest-with-coverage workflow This lets us use the workflow to test whether all the packages NEMO-Cmd depends on have been updated to support Python 3.12. --- .github/workflows/pytest-with-coverage.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pytest-with-coverage.yaml b/.github/workflows/pytest-with-coverage.yaml index 421f3a7..2527945 100644 --- a/.github/workflows/pytest-with-coverage.yaml +++ b/.github/workflows/pytest-with-coverage.yaml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ '3.10', '3.11' ] + python-version: [ '3.10', '3.11', '3.12' ] uses: UBC-MOAD/gha-workflows/.github/workflows/pytest-with-coverage.yaml@main with: python-version: ${{ matrix.python-version }} From 5c1fe508770ea9401845796377cfba0e984df01b Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Mon, 16 Oct 2023 10:42:18 -0700 Subject: [PATCH 02/13] Add workflow_dispatch trigger to GHA CI workflow Enables workflow to be triggered from GitHub CLI, browser, or via API. This is primarily to allow the workflow to be run via gh workflow run pytest-with-coverage --ref py312 during the conda-forge Python 3.12 migration to test if the environment is solvable yet. --- .github/workflows/pytest-with-coverage.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pytest-with-coverage.yaml b/.github/workflows/pytest-with-coverage.yaml index 2527945..0c3fe23 100644 --- a/.github/workflows/pytest-with-coverage.yaml +++ b/.github/workflows/pytest-with-coverage.yaml @@ -3,6 +3,9 @@ name: pytest-with-coverage on: push: branches: [ '*' ] + # Enable workflow to be triggered from GitHub CLI, browser, or via API + # primarily for testing conda env solution for new Python versions + workflow_dispatch: jobs: pytest-with-coverage: From 2df3e2685e0820cdb7d58fef52a31e93ebb80b90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 12:17:21 -0700 Subject: [PATCH 03/13] Bump urllib3 from 1.26.17 to 1.26.18 in /envs (#50) Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.17 to 1.26.18. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.17...1.26.18) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- envs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/requirements.txt b/envs/requirements.txt index 639c4d6..b796814 100644 --- a/envs/requirements.txt +++ b/envs/requirements.txt @@ -107,7 +107,7 @@ tomlkit==0.11.7 trove-classifiers==2023.4.18 typing_extensions==4.5.0 ukkonen==1.0.1 -urllib3==1.26.17 +urllib3==1.26.18 userpath==1.7.0 virtualenv==20.22.0 wcwidth==0.2.6 From ce0cbfe23fd1bc368062caad4e29bfeb7569d857 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:24:07 -0700 Subject: [PATCH 04/13] Bump pip from 23.1 to 23.3 in /envs (#52) Bumps [pip](https://github.com/pypa/pip) from 23.1 to 23.3. - [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/pip/compare/23.1...23.3) --- updated-dependencies: - dependency-name: pip dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- envs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/requirements.txt b/envs/requirements.txt index b796814..adfb5c6 100644 --- a/envs/requirements.txt +++ b/envs/requirements.txt @@ -62,7 +62,7 @@ packaging==23.1 pathspec==0.11.1 pbr==5.11.1 pexpect==4.8.0 -pip==23.1 +pip==23.3 platformdirs==3.2.0 pluggy==1.0.0 pre-commit==3.3.3 From 9196f3f1fa2670751e2a73c5ef9cbd0495badf0e Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Mon, 6 Nov 2023 10:40:12 -0800 Subject: [PATCH 05/13] Change to use SLURM scheduler on sockeye cluster (#51) * Update pkgs & versions used in recent dev env * pre-commit autoupdate * Add Software_Collection/ARC_2023 module load This may only be necessary for the testing period prior to the 31-Oct-2023 scheduler change-over. * Drop python & py-setuptools module loads They are no longer required because the SalishSeaCmd package is installed in a conda environment that provides its dependencies, but via the --user scheme that makes it available in the job script. * Change to sbatch directives on sockeye cluster * Drop Software_Collection/ARC_2023 module load It was only necessary during the pre-transition testing period on sockeye. --- .pre-commit-config.yaml | 4 +- envs/requirements.txt | 128 ++++++++++++++--------------- salishsea_cmd/run.py | 80 +++++++++--------- tests/test_run.py | 175 +++++++++++++++------------------------- 4 files changed, 165 insertions(+), 222 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 64b99ed..bedc4c1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: # Out-of-the-box hooks from the pre-commit org - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -16,6 +16,6 @@ repos: - id: check-added-large-files # Code formatting with black - repo: https://github.com/psf/black - rev: 23.3.0 + rev: 23.10.1 hooks: - id: black diff --git a/envs/requirements.txt b/envs/requirements.txt index adfb5c6..26126f6 100644 --- a/envs/requirements.txt +++ b/envs/requirements.txt @@ -8,108 +8,108 @@ # (salishsea-cmd)$ python3 -m pip list --format=freeze >> envs/requirements.txt alabaster==0.7.13 -anyio==3.6.2 -arrow==1.2.3 -attrs==22.2.0 -autopage==0.5.1 -Babel==2.12.1 -backports.functools-lru-cache==1.6.4 -black==23.3.0 -brotlipy==0.7.0 +anyio==4.0.0 +arrow==1.3.0 +attrs==23.1.0 +autopage==0.5.2 +Babel==2.13.1 +backports.functools-lru-cache==1.6.5 +black==23.10.1 +Brotli==1.1.0 certifi==2023.7.22 -cffi==1.15.1 +cffi==1.16.0 cfgv==3.3.1 -charset-normalizer==3.1.0 -click==8.1.3 +charset-normalizer==3.3.1 +click==8.1.7 cliff==4.2.0 cmd2==2.4.3 colorama==0.4.6 -coverage==7.2.3 -cryptography==41.0.4 -distlib==0.3.6 +coverage==7.3.2 +cryptography==41.0.5 +distlib==0.3.7 docutils==0.17.1 editables==0.3 -exceptiongroup==1.1.1 -f90nml==1.4.3 -filelock==3.12.0 -gitdb==4.0.10 -GitPython==3.1.37 +exceptiongroup==1.1.3 +f90nml==1.4.4 +filelock==3.12.4 +gitdb==4.0.11 +GitPython==3.1.40 h11==0.14.0 h2==4.1.0 hatch==1.7.0 -hatchling==1.14.0 +hatchling==1.18.0 hpack==4.0.0 -httpcore==0.17.0 -httpx==0.24.0 +httpcore==0.18.0 +httpx==0.25.0 hyperframe==6.0.1 hyperlink==21.0.0 -identify==2.5.22 +identify==2.5.30 idna==3.4 imagesize==1.4.1 -importlib-metadata==6.5.0 +importlib-metadata==6.8.0 iniconfig==2.0.0 -jaraco.classes==3.2.3 +jaraco.classes==3.3.0 jeepney==0.8.0 Jinja2==3.1.2 -keyring==23.13.1 -markdown-it-py==2.2.0 -MarkupSafe==2.1.2 +keyring==24.2.0 +markdown-it-py==3.0.0 +MarkupSafe==2.1.3 mdurl==0.1.0 -more-itertools==9.1.0 +more-itertools==10.1.0 mypy-extensions==1.0.0 -nodeenv==1.7.0 -packaging==23.1 -pathspec==0.11.1 +nodeenv==1.8.0 +packaging==23.2 +pathspec==0.11.2 pbr==5.11.1 pexpect==4.8.0 -pip==23.3 -platformdirs==3.2.0 -pluggy==1.0.0 -pre-commit==3.3.3 -prettytable==3.7.0 +pip==23.3.1 +platformdirs==3.11.0 +pluggy==1.3.0 +pre-commit==3.5.0 +prettytable==3.9.0 ptyprocess==0.7.0 pycparser==2.21 -Pygments==2.15.1 -pyOpenSSL==23.2.0 +Pygments==2.16.1 pyperclip==1.8.2 PySocks==1.7.1 -pytest==7.3.1 -pytest-cov==4.0.0 -pytest-randomly==3.12.0 +pytest==7.4.3 +pytest-cov==4.1.0 +pytest-randomly==3.15.0 python-dateutil==2.8.2 python-hglib==2.6.2 -pytz==2023.3 -PyYAML==6.0 +pytz==2023.3.post1 +PyYAML==6.0.1 requests==2.31.0 -rich==13.3.4 +rich==13.6.0 SecretStorage==3.3.3 -setuptools==67.6.1 -shellingham==1.5.1 +setuptools==68.2.2 +shellingham==1.5.4 six==1.16.0 -smmap==3.0.5 +smmap==5.0.0 sniffio==1.3.0 snowballstemmer==2.2.0 Sphinx==5.3.0 -sphinx-notfound-page==0.8.3 -sphinx-rtd-theme==1.2.0 -sphinxcontrib-applehelp==1.0.4 -sphinxcontrib-devhelp==1.0.2 -sphinxcontrib-htmlhelp==2.0.1 +sphinx-notfound-page==1.0.0 +sphinx-rtd-theme==1.3.0 +sphinxcontrib-applehelp==1.0.7 +sphinxcontrib-devhelp==1.0.5 +sphinxcontrib-htmlhelp==2.0.4 sphinxcontrib-jquery==4.1 sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.3 -sphinxcontrib-serializinghtml==1.1.5 -stevedore==5.0.0 +sphinxcontrib-qthelp==1.0.6 +sphinxcontrib-serializinghtml==1.1.9 +stevedore==5.1.0 toml==0.10.2 tomli==2.0.1 tomli_w==1.0.0 -tomlkit==0.11.7 -trove-classifiers==2023.4.18 -typing_extensions==4.5.0 +tomlkit==0.12.1 +trove-classifiers==2023.10.18 +types-python-dateutil==2.8.19.14 +typing_extensions==4.8.0 ukkonen==1.0.1 -urllib3==1.26.18 +urllib3==2.0.7 userpath==1.7.0 -virtualenv==20.22.0 -wcwidth==0.2.6 -wheel==0.40.0 -zipp==3.15.0 +virtualenv==20.24.6 +wcwidth==0.2.8 +wheel==0.41.2 +zipp==3.17.0 diff --git a/salishsea_cmd/run.py b/salishsea_cmd/run.py index 650c502..bd1f9b6 100644 --- a/salishsea_cmd/run.py +++ b/salishsea_cmd/run.py @@ -233,12 +233,12 @@ def run( Use this option to override the default cores/node that are specified in the code for each HPC cluster. - :param str cores_per_node: CPU architecture to use in PBS or SBATCH directives. - Use this to override the default CPU architecture on - HPC clusters that have more than one type of CPU; - e.g. sockeye (cascade is default, skylake is alternative) - or cedar (skylake is default, broadwell is alternative). - This option must be used in conjunction with --core-per-node. + :param str cpu_arch: CPU architecture to use in PBS or SBATCH directives. + Use this to override the default CPU architecture on + HPC clusters that have more than one type of CPU; + e.g. sockeye (cascade is default, skylake is alternative) + or cedar (skylake is default, broadwell is alternative). + This option must be used in conjunction with --core-per-node. :param boolean deflate: Include "salishsea deflate" command in the bash script. @@ -280,7 +280,7 @@ def run( "seawolf2": "qsub", # orcinus.westgrid.ca login node "seawolf3": "qsub", # orcinus.westgrid.ca login node "sigma": "qsub -q mpi", # optimum.eoas.ubc.ca login node - "sockeye": "qsub", + "sockeye": "sbatch", }.get(SYSTEM, "qsub") results_dir = nemo_cmd.resolved_path(results_dir) run_segments, first_seg_no = _calc_run_segments(desc_file, results_dir) @@ -634,11 +634,12 @@ def _build_batch_script( email = get_run_desc_value(run_desc, ("email",), fatal=False) except KeyError: email = f"{os.getenv('USER')}@eoas.ubc.ca" - if SYSTEM in {"beluga", "cedar", "graham"}: + if SYSTEM in {"beluga", "cedar", "graham", "sockeye"}: procs_per_node = { "beluga": 40 if not cores_per_node else int(cores_per_node), "cedar": 48 if not cores_per_node else int(cores_per_node), "graham": 32 if not cores_per_node else int(cores_per_node), + "sockeye": 40 if not cores_per_node else int(cores_per_node), }[SYSTEM] script = "\n".join( ( @@ -652,7 +653,6 @@ def _build_batch_script( "delta": 20 if not cores_per_node else int(cores_per_node), "omega": 20 if not cores_per_node else int(cores_per_node), "sigma": 20 if not cores_per_node else int(cores_per_node), - "sockeye": 40 if not cores_per_node else int(cores_per_node), "orcinus": 12 if not cores_per_node else int(cores_per_node), "salish": 0, # solish only has 1 node; 0 gets things right "seawolf1": 12 if not cores_per_node else int(cores_per_node), @@ -696,7 +696,7 @@ def _sbatch_directives( Slurm Workload Manager for job scheduling. The string that is returned is intended for inclusion in a bash script - that will submitted be to the cluster queue manager via the + that will be submitted to the cluster queue manager via the :command:`sbatch` command. :param dict run_desc: Run description dictionary. @@ -727,7 +727,9 @@ def _sbatch_directives( """ run_id = get_run_desc_value(run_desc, ("run_id",)) nodes = math.ceil(n_processors / procs_per_node) - mem = {"beluga": "92G", "cedar": "0", "graham": "0"}.get(SYSTEM, mem) + mem = {"beluga": "92G", "cedar": "0", "graham": "0", "sockeye": "186gb"}.get( + SYSTEM, mem + ) if deflate: run_id = f"{result_type}_{run_id}_deflate" try: @@ -738,7 +740,7 @@ def _sbatch_directives( ).time() td = datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second) walltime = _td2hms(td) - if SYSTEM == "cedar": + if SYSTEM in {"cedar", "sockeye"} and cpu_arch: sbatch_directives = ( f"#SBATCH --job-name={run_id}\n" f"#SBATCH --constraint={cpu_arch}\n" ) @@ -756,7 +758,14 @@ def _sbatch_directives( account = get_run_desc_value(run_desc, ("account",), fatal=False) sbatch_directives += f"#SBATCH --account={account}\n" except KeyError: - account = "rrg-allen" if SYSTEM in {"graham"} else "def-allen" + accounts = { + "graham": "rrg-allen", + "sockeye": "st-sallen1-1", + } + try: + account = accounts[SYSTEM] + except KeyError: + account = "def-allen" sbatch_directives += f"#SBATCH --account={account}\n" log.info( f"No account found in run description YAML file, " @@ -832,14 +841,7 @@ def _pbs_directives( procs_directive = f"#PBS -l procs={n_processors}" else: nodes = math.ceil(n_processors / procs_per_node) - if SYSTEM == "sockeye": - arch = "cascade" if not cpu_arch else cpu_arch - procs_directive = ( - f"#PBS -l select={nodes}:ncpus={procs_per_node}:" - f"mpiprocs={procs_per_node}:mem=186gb:cpu_arch={arch}" - ) - else: - procs_directive = f"#PBS -l nodes={nodes}:ppn={procs_per_node}" + procs_directive = f"#PBS -l nodes={nodes}:ppn={procs_per_node}" if deflate: run_id = f"{result_type}_{run_id}_deflate" try: @@ -860,32 +862,24 @@ def _pbs_directives( #PBS -M {email} """ ) - if SYSTEM == "sockeye": + if SYSTEM == "orcinus" or SYSTEM.startswith("seawolf"): + pbs_directives += "#PBS -l partition=QDR\n" + if SYSTEM == "salish": pbs_directives += textwrap.dedent( f"""\ - #PBS -A st-sallen1-1 {procs_directive} + # total memory for job + #PBS -l mem=64gb """ ) else: - if SYSTEM == "orcinus" or SYSTEM.startswith("seawolf"): - pbs_directives += "#PBS -l partition=QDR\n" - if SYSTEM == "salish": - pbs_directives += textwrap.dedent( - f"""\ - {procs_directive} - # total memory for job - #PBS -l mem=64gb - """ - ) - else: - pbs_directives += textwrap.dedent( - f"""\ - {procs_directive} - # memory per processor - #PBS -l pmem={pmem} - """ - ) + pbs_directives += textwrap.dedent( + f"""\ + {procs_directive} + # memory per processor + #PBS -l pmem={pmem} + """ + ) if stderr_stdout: stdout = f"stdout_deflate_{result_type}" if deflate else "stdout" stderr = f"stderr_deflate_{result_type}" if deflate else "stderr" @@ -931,7 +925,7 @@ def _definitions(run_desc, run_desc_file, run_dir, results_dir, deflate): "seawolf1": Path("${PBS_O_HOME}", ".local", "bin", "salishsea"), "seawolf2": Path("${PBS_O_HOME}", ".local", "bin", "salishsea"), "seawolf3": Path("${PBS_O_HOME}", ".local", "bin", "salishsea"), - "sockeye": Path("${PBS_O_HOME}", ".local", "bin", "salishsea"), + "sockeye": Path("${HOME}", ".local", "bin", "salishsea"), }.get(SYSTEM, Path("${HOME}", ".local", "bin", "salishsea")) defns = ( f'RUN_ID="{get_run_desc_value(run_desc, ("run_id",))}"\n' @@ -1031,8 +1025,6 @@ def _modules(): module load gcc/5.5.0 module load openmpi/4.1.1-cuda11-3 module load netcdf-fortran/4.5.3-hdf4-support - module load python/3.8.10 - module load py-setuptools/50.3.2 """ ), }.get(SYSTEM, "") diff --git a/tests/test_run.py b/tests/test_run.py index 441e851..abed1f1 100644 --- a/tests/test_run.py +++ b/tests/test_run.py @@ -147,8 +147,8 @@ class TestRun: (True, 4, "salish", "qsub", "43.master"), (False, 0, "sigma", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "sigma", "qsub -q mpi", "43.admin.default.domain"), - (False, 0, "sockeye", "qsub", "43.pbsha"), - (True, 4, "sockeye", "qsub", "43.pbsha"), + (False, 0, "sockeye", "sbatch", "Submitted batch job 43"), + (True, 4, "sockeye", "sbatch", "Submitted batch job 43"), (False, 0, "omega", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "omega", "qsub -q mpi", "43.admin.default.domain"), (False, 0, "orcinus", "qsub", "43.orca2.ibb"), @@ -224,8 +224,8 @@ def test_run_submit( (True, 4, "salish", "qsub", "43.master"), (False, 0, "sigma", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "sigma", "qsub -q mpi", "43.admin.default.domain"), - (False, 0, "sockeye", "qsub", "43.pbsha"), - (True, 4, "sockeye", "qsub", "43.pbsha"), + (False, 0, "sockeye", "sbatch", "Submitted batch job 43"), + (True, 4, "sockeye", "sbatch", "Submitted batch job 43"), (False, 0, "omega", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "omega", "qsub -q mpi", "43.admin.default.domain"), (False, 0, "orcinus", "qsub", "43.orca2.ibb"), @@ -390,8 +390,8 @@ def test_run_no_submit_w_separate_deflate( (True, 4, "salish", "qsub", "43.master"), (False, 0, "sigma", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "sigma", "qsub -q mpi", "43.admin.default.domain"), - (False, 0, "sockeye", "qsub", "43.pbsha"), - (True, 4, "sockeye", "qsub", "43.pbsha"), + (False, 0, "sockeye", "sbatch", "Submitted batch job 43"), + (True, 4, "sockeye", "sbatch", "Submitted batch job 43"), (False, 0, "omega", "qsub -q mpi", "43.admin.default.domain"), (True, 4, "omega", "qsub -q mpi", "43.admin.default.domain"), (False, 0, "orcinus", "qsub", "43.orca2.ibb"), @@ -770,9 +770,9 @@ def test_segmented_run_restart_dirs( True, 4, "sockeye", - "qsub", - ("43.pbsha.ib.sockeye", "44.pbsha.ib.sockeye"), - "43.pbsha.ib.sockeye", + "sbatch", + ("Submitted batch job 43", "Submitted batch job 44"), + "Submitted batch job 43", ), ( False, @@ -2601,46 +2601,53 @@ def test_sockeye(self, cores_per_node, cpu_arch, deflate): cpu_arch=cpu_arch, ) procs = 40 if not cores_per_node else cores_per_node - arch = "cascade" if not cpu_arch else cpu_arch expected = textwrap.dedent( f"""\ #!/bin/bash - #PBS -N foo - #PBS -S /bin/bash - #PBS -l walltime=1:02:03 - # email when the job [b]egins and [e]nds, or is [a]borted - #PBS -m bea - #PBS -M me@example.com - #PBS -A st-sallen1-1 - #PBS -l select=2:ncpus={procs}:mpiprocs={procs}:mem=186gb:cpu_arch={arch} + #SBATCH --job-name=foo + """ + ) + if cpu_arch: + expected += textwrap.dedent( + f"""\ + #SBATCH --constraint={cpu_arch} + """ + ) + expected += textwrap.dedent( + f"""\ + #SBATCH --nodes=2 + #SBATCH --ntasks-per-node={procs} + #SBATCH --mem=186gb + #SBATCH --time=1:02:03 + #SBATCH --mail-user=me@example.com + #SBATCH --mail-type=ALL + #SBATCH --account=st-sallen1-1 # stdout and stderr file paths/names - #PBS -o results_dir/stdout - #PBS -e results_dir/stderr + #SBATCH --output=results_dir/stdout + #SBATCH --error=results_dir/stderr RUN_ID="foo" RUN_DESC="tmp_run_dir/SalishSea.yaml" WORK_DIR="tmp_run_dir" RESULTS_DIR="results_dir" - COMBINE="${{PBS_O_HOME}}/.local/bin/salishsea combine" + COMBINE="${{HOME}}/.local/bin/salishsea combine" """ ) if deflate: expected += textwrap.dedent( """\ - DEFLATE="${PBS_O_HOME}/.local/bin/salishsea deflate" + DEFLATE="${HOME}/.local/bin/salishsea deflate" """ ) expected += textwrap.dedent( """\ - GATHER="${PBS_O_HOME}/.local/bin/salishsea gather" + GATHER="${HOME}/.local/bin/salishsea gather" module load gcc/5.5.0 module load openmpi/4.1.1-cuda11-3 module load netcdf-fortran/4.5.3-hdf4-support - module load python/3.8.10 - module load py-setuptools/50.3.2 mkdir -p ${RESULTS_DIR} cd ${WORK_DIR} @@ -2808,12 +2815,41 @@ def test_graham_sbatch_directives(self, m_logger): assert slurm_directives == expected assert m_logger.info.called + def test_sockeye_sbatch_directives(self, m_logger): + desc_file = StringIO("run_id: foo\n" "walltime: 01:02:03\n") + run_desc = yaml.safe_load(desc_file) + with patch("salishsea_cmd.run.SYSTEM", "sockeye"): + slurm_directives = salishsea_cmd.run._sbatch_directives( + run_desc, + n_processors=43, + procs_per_node=40, + cpu_arch="", + email="me@example.com", + results_dir=Path("foo"), + ) + expected = ( + "#SBATCH --job-name=foo\n" + "#SBATCH --nodes=2\n" + "#SBATCH --ntasks-per-node=40\n" + "#SBATCH --mem=186gb\n" + "#SBATCH --time=1:02:03\n" + "#SBATCH --mail-user=me@example.com\n" + "#SBATCH --mail-type=ALL\n" + "#SBATCH --account=st-sallen1-1\n" + "# stdout and stderr file paths/names\n" + "#SBATCH --output=foo/stdout\n" + "#SBATCH --error=foo/stderr\n" + ) + assert slurm_directives == expected + assert m_logger.info.called + @pytest.mark.parametrize( "system, procs_per_node", ( ("beluga", 40), ("cedar", 48), ("graham", 32), + ("sockeye", 40), ), ) def test_account_directive_from_yaml(self, m_logger, system, procs_per_node): @@ -2870,24 +2906,6 @@ class TestPbsDirectives: "", "#PBS -l nodes=3:ppn=20\n# memory per processor\n#PBS -l pmem=2000mb", ), - ( - "sockeye", - 32, - "skylake", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=32:mpiprocs=32:mem=186gb:cpu_arch=skylake", - ), - ( - "sockeye", - 40, - "cascade", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=40:mpiprocs=40:mem=186gb:cpu_arch=cascade", - ), - ( - "sockeye", - 40, - "", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=40:mpiprocs=40:mem=186gb:cpu_arch=cascade", - ), ), ) def test_pbs_directives_run( @@ -2956,24 +2974,6 @@ def test_pbs_directives_run( "", "#PBS -l nodes=3:ppn=20\n# memory per processor\n#PBS -l pmem=2000mb", ), - ( - "sockeye", - 32, - "skylake", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=32:mpiprocs=32:mem=186gb:cpu_arch=skylake", - ), - ( - "sockeye", - 40, - "cascade", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=40:mpiprocs=40:mem=186gb:cpu_arch=cascade", - ), - ( - "sockeye", - 40, - "", - "#PBS -A st-sallen1-1\n#PBS -l select=2:ncpus=40:mpiprocs=40:mem=186gb:cpu_arch=cascade", - ), ), ) def test_pbs_directives_run_no_stderr_stdout( @@ -3074,53 +3074,6 @@ def test_walltime(self, walltime, expected_walltime): expected = f"walltime={expected_walltime}" assert expected in pbs_directives - def test_sockeye_account_directive(self): - run_desc = yaml.safe_load( - StringIO( - textwrap.dedent( - """\ - run_id: foo - walltime: 01:02:03 - """ - ) - ) - ) - with patch("salishsea_cmd.run.SYSTEM", "sockeye"): - pbs_directives = salishsea_cmd.run._pbs_directives( - run_desc, 43, email="me@example.com", results_dir=Path("foo") - ) - assert "#PBS -A st-sallen1-1\n" in pbs_directives - - @pytest.mark.parametrize( - "system", - ( - "delta", - "orcinus", - "salish", - "seawolf1", - "seawolf2", - "seawolf3", - "sigma", - "omega", - ), - ) - def test_not_sockeye_no_account_directive_from_yaml(self, system): - run_desc = yaml.safe_load( - StringIO( - textwrap.dedent( - """\ - run_id: foo - walltime: 01:02:03 - """ - ) - ) - ) - with patch("salishsea_cmd.run.SYSTEM", system): - pbs_directives = salishsea_cmd.run._pbs_directives( - run_desc, 43, email="me@example.com", results_dir=Path("foo") - ) - assert "#PBS -A" not in pbs_directives - class TestDefinitions: """Unit tests for _definitions function.""" @@ -3150,8 +3103,8 @@ class TestDefinitions: ("seawolf3", "${PBS_O_HOME}/.local", False), ("sigma", "${PBS_O_HOME}", True), ("sigma", "${PBS_O_HOME}", False), - ("sockeye", "${PBS_O_HOME}/.local", True), - ("sockeye", "${PBS_O_HOME}/.local", False), + ("sockeye", "${HOME}/.local", True), + ("sockeye", "${HOME}/.local", False), ], ) def test_definitions(self, system, home, deflate): @@ -3233,8 +3186,6 @@ def test_sockeye(self): module load gcc/5.5.0 module load openmpi/4.1.1-cuda11-3 module load netcdf-fortran/4.5.3-hdf4-support - module load python/3.8.10 - module load py-setuptools/50.3.2 """ ) assert modules == expected From c33fcdfd3de432eeb85fafc2bc2e3014f469b674 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:05:44 -0800 Subject: [PATCH 06/13] Bump cryptography from 41.0.5 to 41.0.6 in /envs (#53) Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.5 to 41.0.6. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/41.0.5...41.0.6) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- envs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/requirements.txt b/envs/requirements.txt index 26126f6..2e2080b 100644 --- a/envs/requirements.txt +++ b/envs/requirements.txt @@ -25,7 +25,7 @@ cliff==4.2.0 cmd2==2.4.3 colorama==0.4.6 coverage==7.3.2 -cryptography==41.0.5 +cryptography==41.0.6 distlib==0.3.7 docutils==0.17.1 editables==0.3 From ae2b5568528c8af0014ae4a9789af85dea7da21d Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 09:25:46 -0800 Subject: [PATCH 07/13] Update pkgs & versions used in recent dev env --- envs/requirements.txt | 53 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/envs/requirements.txt b/envs/requirements.txt index 2e2080b..10ca0df 100644 --- a/envs/requirements.txt +++ b/envs/requirements.txt @@ -5,33 +5,32 @@ # to create an isolated development environment. # # Create/update this file with: -# (salishsea-cmd)$ python3 -m pip list --format=freeze >> envs/requirements.txt +# (salishsea-cmd)$ python -m pip list --format=freeze >> envs/requirements.txt alabaster==0.7.13 -anyio==4.0.0 +anyio==4.1.0 arrow==1.3.0 attrs==23.1.0 autopage==0.5.2 Babel==2.13.1 -backports.functools-lru-cache==1.6.5 black==23.10.1 Brotli==1.1.0 -certifi==2023.7.22 +certifi==2023.11.17 cffi==1.16.0 cfgv==3.3.1 -charset-normalizer==3.3.1 +charset-normalizer==3.3.2 click==8.1.7 -cliff==4.2.0 +cliff==4.4.0 cmd2==2.4.3 colorama==0.4.6 coverage==7.3.2 -cryptography==41.0.6 +cryptography==41.0.7 distlib==0.3.7 -docutils==0.17.1 +docutils==0.20.1 editables==0.3 -exceptiongroup==1.1.3 +exceptiongroup==1.2.0 f90nml==1.4.4 -filelock==3.12.4 +filelock==3.13.1 gitdb==4.0.11 GitPython==3.1.40 h11==0.14.0 @@ -39,19 +38,19 @@ h2==4.1.0 hatch==1.7.0 hatchling==1.18.0 hpack==4.0.0 -httpcore==0.18.0 -httpx==0.25.0 +httpcore==1.0.2 +httpx==0.25.2 hyperframe==6.0.1 hyperlink==21.0.0 -identify==2.5.30 -idna==3.4 +identify==2.5.32 +idna==3.6 imagesize==1.4.1 importlib-metadata==6.8.0 iniconfig==2.0.0 jaraco.classes==3.3.0 jeepney==0.8.0 Jinja2==3.1.2 -keyring==24.2.0 +keyring==24.3.0 markdown-it-py==3.0.0 MarkupSafe==2.1.3 mdurl==0.1.0 @@ -60,16 +59,16 @@ mypy-extensions==1.0.0 nodeenv==1.8.0 packaging==23.2 pathspec==0.11.2 -pbr==5.11.1 +pbr==6.0.0 pexpect==4.8.0 pip==23.3.1 -platformdirs==3.11.0 +platformdirs==4.0.0 pluggy==1.3.0 pre-commit==3.5.0 prettytable==3.9.0 ptyprocess==0.7.0 pycparser==2.21 -Pygments==2.16.1 +Pygments==2.17.2 pyperclip==1.8.2 PySocks==1.7.1 pytest==7.4.3 @@ -80,7 +79,7 @@ python-hglib==2.6.2 pytz==2023.3.post1 PyYAML==6.0.1 requests==2.31.0 -rich==13.6.0 +rich==13.7.0 SecretStorage==3.3.3 setuptools==68.2.2 shellingham==1.5.4 @@ -88,9 +87,9 @@ six==1.16.0 smmap==5.0.0 sniffio==1.3.0 snowballstemmer==2.2.0 -Sphinx==5.3.0 +Sphinx==7.2.6 sphinx-notfound-page==1.0.0 -sphinx-rtd-theme==1.3.0 +sphinx-rtd-theme==2.0.0 sphinxcontrib-applehelp==1.0.7 sphinxcontrib-devhelp==1.0.5 sphinxcontrib-htmlhelp==2.0.4 @@ -102,14 +101,14 @@ stevedore==5.1.0 toml==0.10.2 tomli==2.0.1 tomli_w==1.0.0 -tomlkit==0.12.1 -trove-classifiers==2023.10.18 +tomlkit==0.12.3 +trove-classifiers==2023.11.29 types-python-dateutil==2.8.19.14 typing_extensions==4.8.0 ukkonen==1.0.1 -urllib3==2.0.7 +urllib3==2.1.0 userpath==1.7.0 -virtualenv==20.24.6 -wcwidth==0.2.8 -wheel==0.41.2 +virtualenv==20.24.7 +wcwidth==0.2.12 +wheel==0.42.0 zipp==3.17.0 From 046f5405fcfd25711489babbfeaaddcac8ff6044 Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 09:27:06 -0800 Subject: [PATCH 08/13] pre-commit autoupdate --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bedc4c1..fd06ea5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,6 +16,6 @@ repos: - id: check-added-large-files # Code formatting with black - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 23.11.0 hooks: - id: black From 045eaa79c80a0badb4570297755a418654718b16 Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 10:23:25 -0800 Subject: [PATCH 09/13] Change dev, hpc & rtd envs to Python 3.12 --- envs/environment-dev.yaml | 6 +++--- envs/environment-hpc.yaml | 6 +++--- envs/environment-rtd.yaml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/envs/environment-dev.yaml b/envs/environment-dev.yaml index 2ddff30..c91a36e 100644 --- a/envs/environment-dev.yaml +++ b/envs/environment-dev.yaml @@ -5,8 +5,8 @@ # # $ conda env create -f SalishSeaCmd/envs/environment-dev.yaml # $ conda activate salishsea-cmd -# (salishsea-cmd)$ python3 -m pip install --editable NEMO-Cmd/ -# (salishsea-cmd)$ python3 -m pip install --editable SalishSeaCmd/ +# (salishsea-cmd)$ python -m pip install --editable NEMO-Cmd/ +# (salishsea-cmd)$ python -m pip install --editable SalishSeaCmd/ # # The environment includes all the tools used to develop, # test, and document the SalishSeaCmd package. @@ -27,7 +27,7 @@ dependencies: - f90nml - gitpython - pip - - python=3.11 + - python=3.12 - pyyaml # For coding style, repo QA, and pkg management diff --git a/envs/environment-hpc.yaml b/envs/environment-hpc.yaml index 7f6c51f..65eb946 100644 --- a/envs/environment-hpc.yaml +++ b/envs/environment-hpc.yaml @@ -4,8 +4,8 @@ # # $ conda env create -f SalishSeaCmd/envs/environment-hpc.yaml # $ conda activate salishsea-cmd -# (salishsea-cmd)$ python3 -m pip install --user --editable NEMO-Cmd/ -# (salishsea-cmd)$ python3 -m pip install --user --editable SalishSeaCmd/ +# (salishsea-cmd)$ python -m pip install --user --editable NEMO-Cmd/ +# (salishsea-cmd)$ python -m pip install --user --editable SalishSeaCmd/ name: salishsea-cmd @@ -19,7 +19,7 @@ dependencies: - f90nml - gitpython - pip - - python=3.11 + - python=3.12 - pyyaml - pip: diff --git a/envs/environment-rtd.yaml b/envs/environment-rtd.yaml index 1dcb8b3..9bf12d7 100644 --- a/envs/environment-rtd.yaml +++ b/envs/environment-rtd.yaml @@ -12,7 +12,7 @@ channels: dependencies: - pip - - python=3.11 + - python=3.12 # readthedocs packages - mock From 46a819c749c3f5f08f548b4f745e5e7c4c93972e Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 10:25:55 -0800 Subject: [PATCH 10/13] Drop TROVE classifiers They are now just outdated maintenance overhead. --- pyproject.toml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d913240..24c7af6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,20 +37,6 @@ keywords = [ "automation", "oceanography", "ocean modelling", "UBC-MOAD", "Salish Sea", "SalishSeaCast", ] -classifiers = [ - "Development Status :: 5 - Production/Stable", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Operating System :: POSIX :: Linux", - "Operating System :: Unix", - "Environment :: Console", - "Intended Audience :: Science/Research", - "Intended Audience :: Education", - "Intended Audience :: Developers", -] dependencies = [ # see envs/environment-dev.yaml for conda environment dev installation # see envs/requirements.txt for versions most recently used in development From 0a621327a910d1be992d800111b542829aa95e9f Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 10:30:14 -0800 Subject: [PATCH 11/13] Change sphinx-linkcheck workflow to Python 3.12 The Python version used in the 'sphinx-linkcheck.yaml' GitHub actions workflow has been updated from '3.11' to '3.12'. This change aligns with the recent migration to Python 3.12 for development. --- .github/workflows/sphinx-linkcheck.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx-linkcheck.yaml b/.github/workflows/sphinx-linkcheck.yaml index 7c8f673..cae7dad 100644 --- a/.github/workflows/sphinx-linkcheck.yaml +++ b/.github/workflows/sphinx-linkcheck.yaml @@ -15,7 +15,7 @@ jobs: matrix: # Need to specify Python version here because we use test env which gets its # Python version via matrix - python-version: [ '3.11' ] + python-version: [ '3.12' ] uses: UBC-MOAD/gha-workflows/.github/workflows/sphinx-linkcheck.yaml@main with: python-version: ${{ matrix.python-version }} From 04dd9d0a2fdd39220c84e79ebfa86822b782e6b9 Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 10:37:09 -0800 Subject: [PATCH 12/13] Change to Python 3.12 for development --- README.rst | 4 ++-- docs/development.rst | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 96c7da4..fd17634 100644 --- a/README.rst +++ b/README.rst @@ -5,8 +5,8 @@ SalishSeaCast NEMO Command Processor .. image:: https://img.shields.io/badge/license-Apache%202-cb2533.svg :target: https://www.apache.org/licenses/LICENSE-2.0 :alt: Licensed under the Apache License, Version 2.0 -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11-blue?logo=python&label=Python&logoColor=gold - :target: https://docs.python.org/3.11/ +.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold + :target: https://docs.python.org/3.12/ :alt: Python Version .. image:: https://img.shields.io/badge/version%20control-git-blue.svg?logo=github :target: https://github.com/SalishSeaCast/SalishSeaCmd diff --git a/docs/development.rst b/docs/development.rst index b49177c..f5b408d 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -25,8 +25,8 @@ .. image:: https://img.shields.io/badge/license-Apache%202-cb2533.svg :target: https://www.apache.org/licenses/LICENSE-2.0 :alt: Licensed under the Apache License, Version 2.0 -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11-blue?logo=python&label=Python&logoColor=gold - :target: https://docs.python.org/3.11/ +.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold + :target: https://docs.python.org/3.12/ :alt: Python Version .. image:: https://img.shields.io/badge/version%20control-git-blue.svg?logo=github :target: https://github.com/SalishSeaCast/SalishSeaCmd @@ -65,11 +65,11 @@ Python Versions =============== -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11-blue?logo=python&label=Python&logoColor=gold - :target: https://docs.python.org/3.11/ +.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold + :target: https://docs.python.org/3.12/ :alt: Python Version -The :kbd:`SalishSeaCmd` package is developed using `Python`_ 3.11. +The :kbd:`SalishSeaCmd` package is developed using `Python`_ 3.12. The minimum supported Python version is 3.10. The :ref:`SalishSeaCmdContinuousIntegration` workflow on GitHub ensures that the package is tested for all versions of Python>=3.10. @@ -349,7 +349,7 @@ The output looks something like:: (line 497) ok https://github.com/SalishSeaCast/SalishSeaCmd/issues (line 491) ok https://github.com/SalishSeaCast/SalishSeaCmd/issues (line 21) ok https://img.shields.io/badge/license-Apache%202-cb2533.svg - (line 21) ok https://img.shields.io/badge/Python-3.10%20%7C%203.11-blue?logo=python&label=Python&logoColor=gold + (line 21) ok https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold (line 21) ok https://img.shields.io/badge/version%20control-git-blue.svg?logo=github (line 21) ok https://img.shields.io/badge/code%20style-black-000000.svg (line 21) ok https://codecov.io/gh/SalishSeaCast/SalishSeaCmd/branch/main/graph/badge.svg From 93b904b86c2a7ffb3306ed20289c3cf15586fe31 Mon Sep 17 00:00:00 2001 From: Doug Latornell Date: Wed, 29 Nov 2023 10:45:49 -0800 Subject: [PATCH 13/13] Drop support for Python 3.10 --- .github/workflows/pytest-with-coverage.yaml | 2 +- README.rst | 2 +- docs/breaking_changes.rst | 12 ++++++++++++ docs/development.rst | 10 +++++----- pyproject.toml | 2 +- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pytest-with-coverage.yaml b/.github/workflows/pytest-with-coverage.yaml index 0c3fe23..3c6d362 100644 --- a/.github/workflows/pytest-with-coverage.yaml +++ b/.github/workflows/pytest-with-coverage.yaml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ '3.10', '3.11', '3.12' ] + python-version: [ '3.11', '3.12' ] uses: UBC-MOAD/gha-workflows/.github/workflows/pytest-with-coverage.yaml@main with: python-version: ${{ matrix.python-version }} diff --git a/README.rst b/README.rst index fd17634..d36051a 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ SalishSeaCast NEMO Command Processor .. image:: https://img.shields.io/badge/license-Apache%202-cb2533.svg :target: https://www.apache.org/licenses/LICENSE-2.0 :alt: Licensed under the Apache License, Version 2.0 -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold +.. image:: https://img.shields.io/badge/Python-3.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold :target: https://docs.python.org/3.12/ :alt: Python Version .. image:: https://img.shields.io/badge/version%20control-git-blue.svg?logo=github diff --git a/docs/breaking_changes.rst b/docs/breaking_changes.rst index 5c84600..60d38f4 100644 --- a/docs/breaking_changes.rst +++ b/docs/breaking_changes.rst @@ -22,6 +22,18 @@ ``SalishSeaCmd`` Changes That Break Backward Compatibility ************************************************************* +.. _BreakingChangesVersion23.1: + +Version 23.1 +============ + +The following change that was introduced in version 23.1 of the ``SalishSeaCmd`` +package is incompatible with earlier versions: + +* Drop support for Python 3.10. + Minimum supported Python version is now 3.11. + + .. _BreakingChangesVersion22.3: Version 22.3 diff --git a/docs/development.rst b/docs/development.rst index f5b408d..161b550 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -25,7 +25,7 @@ .. image:: https://img.shields.io/badge/license-Apache%202-cb2533.svg :target: https://www.apache.org/licenses/LICENSE-2.0 :alt: Licensed under the Apache License, Version 2.0 -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold +.. image:: https://img.shields.io/badge/Python-3.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold :target: https://docs.python.org/3.12/ :alt: Python Version .. image:: https://img.shields.io/badge/version%20control-git-blue.svg?logo=github @@ -65,14 +65,14 @@ Python Versions =============== -.. image:: https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold +.. image:: https://img.shields.io/badge/Python-3.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold :target: https://docs.python.org/3.12/ :alt: Python Version The :kbd:`SalishSeaCmd` package is developed using `Python`_ 3.12. -The minimum supported Python version is 3.10. +The minimum supported Python version is 3.11. The :ref:`SalishSeaCmdContinuousIntegration` workflow on GitHub ensures that the package -is tested for all versions of Python>=3.10. +is tested for all versions of Python>=3.11. An old version of the package running under Python 3.5 is depoloyed on the Westgrid :kbd:`orcinus` HPC platform. That version is tagged in the repository as ``orcinus-python-3.5``. @@ -349,7 +349,7 @@ The output looks something like:: (line 497) ok https://github.com/SalishSeaCast/SalishSeaCmd/issues (line 491) ok https://github.com/SalishSeaCast/SalishSeaCmd/issues (line 21) ok https://img.shields.io/badge/license-Apache%202-cb2533.svg - (line 21) ok https://img.shields.io/badge/Python-3.10%20%7C%203.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold + (line 21) ok https://img.shields.io/badge/Python-3.11%20%7C%203.12-blue?logo=python&label=Python&logoColor=gold (line 21) ok https://img.shields.io/badge/version%20control-git-blue.svg?logo=github (line 21) ok https://img.shields.io/badge/code%20style-black-000000.svg (line 21) ok https://codecov.io/gh/SalishSeaCast/SalishSeaCmd/branch/main/graph/badge.svg diff --git a/pyproject.toml b/pyproject.toml index 24c7af6..eb63835 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ name = "SalishSeaCmd" dynamic = [ "version" ] description = "SalishSeaCast NEMO Command Processor" readme = "README.rst" -requires-python = ">=3.10" +requires-python = ">=3.11" license = { file = "LICENSE" } authors = [ { name = "Doug Latornell", email = "dlatornell@eoas.ubc.ca" },