From f7ce6d75b6ebd648d32ecc1caa072ed2f8fd2eb2 Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 15:46:01 -0700 Subject: [PATCH 01/12] use reorder-python-imports instead of isort --- .pre-commit-config.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8ebc622..907d9b2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -53,11 +53,11 @@ repos: - id: pyupgrade args: [--py38-plus] -- repo: https://github.com/PyCQA/isort - rev: 5.12.0 +- repo: https://github.com/asottile/reorder-python-imports + rev: v3.12.0 hooks: - - id: isort - files: \.py$ + - id: reorder-python-imports + args: ["--py310-plus"] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 @@ -105,7 +105,7 @@ repos: rev: "4.2" hooks: - id: pyroma - args: ["-d", "--min=9", "."] + args: ["-d", "--min=10", "."] - repo: https://github.com/mgedmin/check-manifest rev: "0.49" From 2fe244bd4ac69cf7dd75b27801b4914e6491b83b Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 15:46:22 -0700 Subject: [PATCH 02/12] clean up pyproject.toml --- pyproject.toml | 188 +++++++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 86 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bc5b447..8981573 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,84 +1,80 @@ -[build-system] -requires = ["setuptools"] -build-backend = "setuptools.build_meta" - [project] -name = "sequence-model" +name = "sequence_model" +requires-python = ">=3.10" description = "Python version of the Steckler Sequence model built with landlab" +keywords = [ + "landlab", + "sequence", + "stratigraphy", +] authors = [ - {email = "mcflugen@gmail.com"}, - {name = "Eric Hutton"} + { email = "mcflugen@gmail.com" }, + { name = "Eric Hutton" }, ] maintainers = [ - {email = "mcflugen@gmail.com"}, - {name = "Eric Hutton"} + { email = "mcflugen@gmail.com" }, + { name = "Eric Hutton" }, ] -keywords = ["sequence", "stratigraphy", "landlab"] -license = {text = "MIT"} classifiers = [ - "Development Status :: 2 - Pre-Alpha", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: MIT License", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] -requires-python = ">=3.10" dependencies = [ - "compaction", - "landlab", - "netcdf4", - "numpy >=1.22", - "pyyaml", - "rich-click", - "scipy", - "tomlkit", - "tqdm", -] -dynamic = ["readme", "version"] + "compaction", + "landlab", + "netcdf4", + "numpy >=1.22", + "pyyaml", + "rich-click", + "scipy", + "tomlkit", + "tqdm", +] +dynamic = [ + "readme", + "version", +] + +[project.license] +text = "MIT" [project.urls] -homepage = "https://github.com/sequence-dev/sequence" +changelog = "https://github.com/sequence-dev/sequence/blob/develop/CHANGES.md" documentation = "https://sequence.readthedocs.io" +homepage = "https://github.com/sequence-dev/sequence" repository = "https://github.com/sequence-dev/sequence" -changelog = "https://github.com/sequence-dev/sequence/blob/develop/CHANGES.md" [project.optional-dependencies] -dev = ["nox"] +dev = [ + "nox", +] [project.scripts] sequence = "sequence.cli:sequence" +[build-system] +requires = [ + "setuptools", +] +build-backend = "setuptools.build_meta" + [tool.setuptools] -packages = ["sequence"] +packages = [ + "sequence", +] -[tool.setuptools.dynamic] -readme = {file = ["README.md", "AUTHORS.md"], content-type="text/markdown"} -version = {attr = "sequence._version.__version__"} +[tool.setuptools.dynamic.version] +attr = "sequence._version.__version__" -[tool.pytest.ini_options] -minversion = "6.0" -testpaths = ["notebooks", "sequence", "tests"] -norecursedirs = [".*", "*.egg*", "build", "dist", "examples"] -addopts = """ - --ignore setup.py - --tb native - --strict - --durations 16 - --doctest-modules - -vvv -""" -doctest_optionflags = [ - "NORMALIZE_WHITESPACE", - "IGNORE_EXCEPTION_DETAIL", - "ALLOW_UNICODE" -] -markers = [ - "slow: marks tests as slow (deselect with '-m \"not slow\"')", - "notebook: marks tests as notebook (deselect with '-m \"not notebook\"')" -] +[tool.setuptools.dynamic.readme] +file = "README.md" +content-type = "text/markdown" [tool.isort] multi_line_output = 3 @@ -90,38 +86,58 @@ line_length = 88 [tool.mypy] ignore_missing_imports = true +[tool.pytest.ini_options] +minversion = "6.0" +testpaths = [ + "notebooks", + "sequence", + "tests", +] +norecursedirs = [ + ".*", + "*.egg*", + "build", + "dist", + "examples", +] +addopts = [ + "--ignore=setup.py", + "--tb=native", + "--strict", + "--durations=16", + "--doctest-modules", + "-vvv", +] +doctest_optionflags = [ + "NORMALIZE_WHITESPACE", + "IGNORE_EXCEPTION_DETAIL", + "ALLOW_UNICODE", +] +markers = [ + "slow: marks tests as slow (deselect with '-m \"not slow\"')", + "notebook: marks tests as notebook (deselect with '-m \"not notebook\"')", +] + [tool.towncrier] directory = "news" package = "sequence" filename = "CHANGES.md" single_file = true -underlines = ["", "", ""] -start_string = "\n" +underlines = [ + "", + "", + "", +] +start_string = """ + +""" template = "news/changelog_template.jinja" issue_format = "[#{issue}](https://github.com/sequence-dev/sequence/issues/{issue})" title_format = "## {version} ({project_date})" - -[[tool.towncrier.type]] -directory = "notebook" -name = "📚 New Tutorial Notebooks" -showcontent = true - -[[tool.towncrier.type]] -directory = "feature" -name = "🍰 New Features" -showcontent = true - -[[tool.towncrier.type]] -directory = "bugfix" -name = "🛠️ Bug Fixes" -showcontent = true - -[[tool.towncrier.type]] -directory = "docs" -name = "📖 Documentation Enhancements" -showcontent = true - -[[tool.towncrier.type]] -directory = "misc" -name = "🔩 Other Changes and Additions" -showcontent = true +type = [ + { directory = "notebook", name = "📚 New Tutorial Notebooks", showcontent = true }, + { directory = "feature", name = "🍰 New Features", showcontent = true }, + { directory = "bugfix", name = "🛠️ Bug Fixes", showcontent = true }, + { directory = "docs", name = "📖 Documentation Enhancements", showcontent = true }, + { directory = "misc", name = "🔩 Other Changes and Additions", showcontent = true }, +] From c9250360828ffd16d8ae89e01d1d1d213035aad8 Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 15:48:08 -0700 Subject: [PATCH 03/12] one import per line; switch to absolute imports --- docs/conf.py | 1 - noxfile.py | 2 +- sequence/__init__.py | 8 ++++---- sequence/bathymetry.py | 5 +++-- sequence/cli.py | 17 +++++++++++------ sequence/fluvial.py | 4 ++-- sequence/input_reader.py | 9 ++++++++- sequence/logging.py | 3 ++- sequence/netcdf.py | 8 ++++++-- sequence/output_writer.py | 8 +++++--- sequence/plot.py | 9 ++++++--- sequence/processes.py | 13 +++++++------ sequence/sea_level.py | 5 +++-- sequence/sediment_flexure.py | 5 +++-- sequence/sequence.py | 11 +++++++---- sequence/sequence_model.py | 32 +++++++++++++++++++------------- sequence/shoreline.py | 5 +++-- sequence/submarine.py | 4 ++-- sequence/subsidence.py | 5 +++-- tests/bathymetry_test.py | 3 ++- tests/compaction_test.py | 3 ++- tests/output_writer_test.py | 3 ++- tests/plot_test.py | 3 ++- tests/sequence_test.py | 3 ++- 24 files changed, 105 insertions(+), 64 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 76f51d3..044811f 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,7 +11,6 @@ # # All configuration values have a default; values that are commented out # serve to show the default. - # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory is # relative to the documentation root, use os.path.abspath to make it diff --git a/noxfile.py b/noxfile.py index b70ffc2..3679c85 100644 --- a/noxfile.py +++ b/noxfile.py @@ -74,7 +74,7 @@ def test_cli(session: nox.Session) -> None: def lint(session: nox.Session) -> None: """Look for lint.""" session.install("pre-commit") - session.run("pre-commit", "run", "--all-files", "--verbose") + session.run("pre-commit", "run", "--all-files") @nox.session diff --git a/sequence/__init__.py b/sequence/__init__.py index bc2c4d2..779f760 100644 --- a/sequence/__init__.py +++ b/sequence/__init__.py @@ -1,8 +1,8 @@ """A sequence-stratigraphic model of a 1D profile written with *Landlab*.""" -from ._grid import SequenceModelGrid -from ._version import __version__ -from .sequence import Sequence -from .sequence_model import SequenceModel +from sequence._grid import SequenceModelGrid +from sequence._version import __version__ +from sequence.sequence import Sequence +from sequence.sequence_model import SequenceModel __all__ = [ "__version__", diff --git a/sequence/bathymetry.py b/sequence/bathymetry.py index 3696b52..6b6a667 100644 --- a/sequence/bathymetry.py +++ b/sequence/bathymetry.py @@ -4,14 +4,15 @@ `SequenceModelGrid`. """ from os import PathLike -from typing import Optional, Union +from typing import Optional +from typing import Union import numpy as np from landlab import Component from numpy.typing import NDArray from scipy import interpolate -from ._grid import SequenceModelGrid +from sequence._grid import SequenceModelGrid class BathymetryReader(Component): diff --git a/sequence/cli.py b/sequence/cli.py index 87b7d78..2d2bc78 100644 --- a/sequence/cli.py +++ b/sequence/cli.py @@ -4,10 +4,14 @@ import os import pathlib import re +from collections.abc import Iterable +from collections.abc import Iterator from contextlib import suppress from io import StringIO from os import PathLike -from typing import Any, Iterable, Iterator, Optional, Union +from typing import Any +from typing import Optional +from typing import Union import numpy as np import rich_click as click @@ -17,11 +21,12 @@ from numpy.typing import ArrayLike from tqdm import tqdm -from .errors import OutputValidationError -from .input_reader import TimeVaryingConfig -from .logging import LoggingHandler -from .plot import plot_file, plot_layers -from .sequence_model import SequenceModel +from sequence.errors import OutputValidationError +from sequence.input_reader import TimeVaryingConfig +from sequence.logging import LoggingHandler +from sequence.plot import plot_file +from sequence.plot import plot_layers +from sequence.sequence_model import SequenceModel click.rich_click.ERRORS_SUGGESTION = ( "Try running the '--help' flag for more information." diff --git a/sequence/fluvial.py b/sequence/fluvial.py index d7b4bb6..139ac9d 100644 --- a/sequence/fluvial.py +++ b/sequence/fluvial.py @@ -6,8 +6,8 @@ import numpy as np from landlab import Component -from ._grid import SequenceModelGrid -from .shoreline import find_shoreline +from sequence._grid import SequenceModelGrid +from sequence.shoreline import find_shoreline class Fluvial(Component): diff --git a/sequence/input_reader.py b/sequence/input_reader.py index 6326c1b..ca9b348 100644 --- a/sequence/input_reader.py +++ b/sequence/input_reader.py @@ -5,8 +5,15 @@ import inspect import pathlib import warnings +from collections.abc import Callable +from collections.abc import Iterable +from collections.abc import Sequence from os import PathLike -from typing import Any, Callable, Iterable, Optional, Sequence, TextIO, Tuple, Union +from typing import Any +from typing import Optional +from typing import TextIO +from typing import Tuple +from typing import Union import numpy as np import tomlkit as toml diff --git a/sequence/logging.py b/sequence/logging.py index 940d83e..3da5d4e 100644 --- a/sequence/logging.py +++ b/sequence/logging.py @@ -2,7 +2,8 @@ import contextlib import logging import sys -from typing import Any, Generator +from collections.abc import Generator +from typing import Any import click diff --git a/sequence/netcdf.py b/sequence/netcdf.py index e230275..3568324 100644 --- a/sequence/netcdf.py +++ b/sequence/netcdf.py @@ -3,14 +3,18 @@ import os import warnings from collections import defaultdict +from collections.abc import Iterable +from collections.abc import Sequence from os import PathLike -from typing import Any, Iterable, Optional, Sequence, Union +from typing import Any +from typing import Optional +from typing import Union import netCDF4 as nc import numpy as np from numpy.typing import NDArray -from ._grid import SequenceModelGrid +from sequence._grid import SequenceModelGrid _NUMPY_TO_NETCDF_TYPE = { "float32": "f4", diff --git a/sequence/output_writer.py b/sequence/output_writer.py index 9d816f9..1cd698f 100644 --- a/sequence/output_writer.py +++ b/sequence/output_writer.py @@ -1,14 +1,16 @@ """Write a `SequenceModelGrid` to a file.""" import errno import os +from collections.abc import Iterable from os import PathLike -from typing import Iterable, Optional, Union +from typing import Optional +from typing import Union import numpy as np from landlab import Component -from ._grid import SequenceModelGrid -from .netcdf import to_netcdf +from sequence._grid import SequenceModelGrid +from sequence.netcdf import to_netcdf class OutputWriter(Component): diff --git a/sequence/plot.py b/sequence/plot.py index 4f78fd0..6976394 100644 --- a/sequence/plot.py +++ b/sequence/plot.py @@ -1,7 +1,9 @@ """Plot the layers of a `SequenceModelGrid`.""" from functools import partial from os import PathLike -from typing import Any, Optional, Union +from typing import Any +from typing import Optional +from typing import Union import matplotlib.pyplot as plt import numpy as np @@ -10,8 +12,9 @@ from numpy.typing import NDArray from scipy.interpolate import interp1d -from ._grid import SequenceModelGrid -from .errors import InvalidRowError, MissingRequiredVariable +from sequence._grid import SequenceModelGrid +from sequence.errors import InvalidRowError +from sequence.errors import MissingRequiredVariable def plot_layers( diff --git a/sequence/processes.py b/sequence/processes.py index 89405df..120c512 100644 --- a/sequence/processes.py +++ b/sequence/processes.py @@ -1,12 +1,13 @@ """All available processes to include in a *Sequence* model.""" from compaction.landlab import Compact -from .fluvial import Fluvial -from .sea_level import SeaLevelTimeSeries, SinusoidalSeaLevel -from .sediment_flexure import SedimentFlexure -from .shoreline import ShorelineFinder -from .submarine import SubmarineDiffuser -from .subsidence import SubsidenceTimeSeries +from sequence.fluvial import Fluvial +from sequence.sea_level import SeaLevelTimeSeries +from sequence.sea_level import SinusoidalSeaLevel +from sequence.sediment_flexure import SedimentFlexure +from sequence.shoreline import ShorelineFinder +from sequence.submarine import SubmarineDiffuser +from sequence.subsidence import SubsidenceTimeSeries __all__ = [ "Compact", diff --git a/sequence/sea_level.py b/sequence/sea_level.py index a71c19d..249f7aa 100644 --- a/sequence/sea_level.py +++ b/sequence/sea_level.py @@ -3,15 +3,16 @@ This module contains *Landlab* components used for adjusting a grid's sea level. """ +from collections.abc import Callable from os import PathLike -from typing import Callable, Union +from typing import Union import numpy as np from landlab import Component from numpy.typing import NDArray from scipy import interpolate -from ._grid import SequenceModelGrid +from sequence._grid import SequenceModelGrid class SeaLevelTimeSeries(Component): diff --git a/sequence/sediment_flexure.py b/sequence/sediment_flexure.py index 853fc58..050fbac 100644 --- a/sequence/sediment_flexure.py +++ b/sequence/sediment_flexure.py @@ -1,13 +1,14 @@ """Subside a `SequenceModelGrid` using flexure.""" import logging -from typing import Optional, Union +from typing import Optional +from typing import Union import numpy as np import tomlkit as toml from landlab.components.flexure import Flexure1D from numpy.typing import NDArray -from ._grid import SequenceModelGrid +from sequence._grid import SequenceModelGrid logger = logging.getLogger("sequence") diff --git a/sequence/sequence.py b/sequence/sequence.py index 5a9bd4b..d2b2912 100644 --- a/sequence/sequence.py +++ b/sequence/sequence.py @@ -1,14 +1,17 @@ """*Sequence*'s main API for constructing sequence-stratigraphic models.""" -from typing import Any, Iterable, Optional +from collections.abc import Iterable +from typing import Any +from typing import Optional import numpy as np from landlab import Component from landlab.layers import EventLayers -from numpy.typing import ArrayLike, NDArray +from numpy.typing import ArrayLike +from numpy.typing import NDArray from tqdm import trange -from ._grid import SequenceModelGrid -from .plot import plot_grid +from sequence._grid import SequenceModelGrid +from sequence.plot import plot_grid class Sequence(Component): diff --git a/sequence/sequence_model.py b/sequence/sequence_model.py index fc23b25..6b8dfd9 100644 --- a/sequence/sequence_model.py +++ b/sequence/sequence_model.py @@ -2,10 +2,14 @@ import logging import os import time -from collections import OrderedDict, defaultdict -from collections.abc import Hashable, Iterable +from collections import defaultdict +from collections import OrderedDict +from collections.abc import Hashable +from collections.abc import Iterable from contextlib import suppress -from typing import Any, Dict, Optional +from typing import Any +from typing import Dict +from typing import Optional import numpy as np import tomlkit @@ -13,16 +17,18 @@ from landlab.bmi.bmi_bridge import TimeStepper from numpy.typing import ArrayLike -from ._grid import SequenceModelGrid -from .bathymetry import BathymetryReader -from .errors import ParameterMismatchError -from .fluvial import Fluvial -from .output_writer import OutputWriter -from .sea_level import SeaLevelTimeSeries, SinusoidalSeaLevel -from .sediment_flexure import SedimentFlexure, WaterFlexure -from .shoreline import ShorelineFinder -from .submarine import SubmarineDiffuser -from .subsidence import SubsidenceTimeSeries +from sequence._grid import SequenceModelGrid +from sequence.bathymetry import BathymetryReader +from sequence.errors import ParameterMismatchError +from sequence.fluvial import Fluvial +from sequence.output_writer import OutputWriter +from sequence.sea_level import SeaLevelTimeSeries +from sequence.sea_level import SinusoidalSeaLevel +from sequence.sediment_flexure import SedimentFlexure +from sequence.sediment_flexure import WaterFlexure +from sequence.shoreline import ShorelineFinder +from sequence.submarine import SubmarineDiffuser +from sequence.subsidence import SubsidenceTimeSeries logger = logging.getLogger("sequence") diff --git a/sequence/shoreline.py b/sequence/shoreline.py index 6bf4725..c257099 100644 --- a/sequence/shoreline.py +++ b/sequence/shoreline.py @@ -11,8 +11,9 @@ from numpy.typing import NDArray from scipy import interpolate -from ._grid import SequenceModelGrid -from .errors import ShelfEdgeError, ShorelineError +from sequence._grid import SequenceModelGrid +from sequence.errors import ShelfEdgeError +from sequence.errors import ShorelineError class ShorelineFinder(Component): diff --git a/sequence/submarine.py b/sequence/submarine.py index fff093f..577d681 100644 --- a/sequence/submarine.py +++ b/sequence/submarine.py @@ -5,8 +5,8 @@ from landlab.components import LinearDiffuser from numpy.typing import NDArray -from ._grid import SequenceModelGrid -from .shoreline import find_shoreline +from sequence._grid import SequenceModelGrid +from sequence.shoreline import find_shoreline class SubmarineDiffuser(LinearDiffuser): diff --git a/sequence/subsidence.py b/sequence/subsidence.py index 0db1c49..99d1958 100644 --- a/sequence/subsidence.py +++ b/sequence/subsidence.py @@ -1,13 +1,14 @@ """Subside a `SequenceModelGrid`.""" import os -from typing import Callable, Union +from collections.abc import Callable +from typing import Union import numpy as np from landlab import Component from numpy.typing import NDArray from scipy import interpolate -from ._grid import SequenceModelGrid +from sequence._grid import SequenceModelGrid class SubsidenceTimeSeries(Component): diff --git a/tests/bathymetry_test.py b/tests/bathymetry_test.py index 74260ac..6050fd4 100644 --- a/tests/bathymetry_test.py +++ b/tests/bathymetry_test.py @@ -3,7 +3,8 @@ import numpy as np import pytest from landlab import RasterModelGrid -from pytest import approx, raises +from pytest import approx +from pytest import raises from sequence.bathymetry import BathymetryReader diff --git a/tests/compaction_test.py b/tests/compaction_test.py index 3ef31d5..a2f6236 100644 --- a/tests/compaction_test.py +++ b/tests/compaction_test.py @@ -1,7 +1,8 @@ from numpy.testing import assert_array_almost_equal from pytest import approx -from sequence import Sequence, SequenceModelGrid +from sequence import Sequence +from sequence import SequenceModelGrid from sequence.processes import Compact diff --git a/tests/output_writer_test.py b/tests/output_writer_test.py index 6869eed..c2b13ce 100644 --- a/tests/output_writer_test.py +++ b/tests/output_writer_test.py @@ -1,6 +1,7 @@ import numpy as np import xarray as xr -from pytest import approx, raises +from pytest import approx +from pytest import raises from sequence import SequenceModelGrid from sequence.output_writer import OutputWriter diff --git a/tests/plot_test.py b/tests/plot_test.py index e4854b2..25be51b 100644 --- a/tests/plot_test.py +++ b/tests/plot_test.py @@ -2,7 +2,8 @@ import pytest from numpy.testing import assert_array_almost_equal -from sequence.plot import _interp_between_layers, _outline_layer +from sequence.plot import _interp_between_layers +from sequence.plot import _outline_layer def test_layer_interpolation_bottom_to_top(): diff --git a/tests/sequence_test.py b/tests/sequence_test.py index 9ecdbe1..fa9de5f 100644 --- a/tests/sequence_test.py +++ b/tests/sequence_test.py @@ -1,7 +1,8 @@ import numpy as np import pytest -from sequence import Sequence, SequenceModelGrid +from sequence import Sequence +from sequence import SequenceModelGrid from sequence.processes import ShorelineFinder From a36d29a5348b252d5d5a88e9d3d892bd3228b55a Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 15:52:36 -0700 Subject: [PATCH 04/12] remove the manifest --- .pre-commit-config.yaml | 6 ------ MANIFEST.in | 11 ----------- 2 files changed, 17 deletions(-) delete mode 100644 MANIFEST.in diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 907d9b2..0d28715 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -106,9 +106,3 @@ repos: hooks: - id: pyroma args: ["-d", "--min=10", "."] - -- repo: https://github.com/mgedmin/check-manifest - rev: "0.49" - hooks: - - id: check-manifest - args: ["--ignore=.nox,build", "--no-build-isolation"] diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index de44a53..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,11 +0,0 @@ -exclude .readthedocs.yaml environment.yml .pre-commit-config.yaml -exclude CONTRIBUTING.md -include AUTHORS.md CHANGES.md LICENSE.md README.md -include CITATION.cff -include noxfile.py -include requirements-testing.in -recursive-exclude data * -recursive-exclude docs * -recursive-exclude news * -recursive-exclude notebooks * -recursive-exclude tests * From 0d0dbb78574f6f07abc2d6025b399dff6679deae Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 22:00:49 -0700 Subject: [PATCH 05/12] import annotation from the future; update annotation for python 3.10 --- docs/conf.py | 2 ++ noxfile.py | 2 ++ sequence/__init__.py | 12 +++------- sequence/_version.py | 2 ++ sequence/bathymetry.py | 8 +++---- sequence/cli.py | 26 ++++++++++----------- sequence/errors.py | 1 + sequence/fluvial.py | 2 ++ sequence/{_grid.py => grid.py} | 6 +++-- sequence/input_reader.py | 27 +++++++++------------- sequence/logging.py | 2 ++ sequence/netcdf.py | 34 +++++++++++++-------------- sequence/output_writer.py | 16 ++++++------- sequence/plot.py | 38 +++++++++++++++---------------- sequence/processes.py | 2 ++ sequence/sea_level.py | 11 +++++---- sequence/sediment_flexure.py | 38 ++++++++++++++++++------------- sequence/sequence.py | 11 +++++---- sequence/sequence_model.py | 16 ++++++------- sequence/shoreline.py | 5 ++-- sequence/submarine.py | 2 ++ sequence/subsidence.py | 5 ++-- setup.py | 2 ++ tests/bathymetry_test.py | 2 ++ tests/cli_test.py | 2 ++ tests/compaction_test.py | 6 +++-- tests/config_files_test.py | 2 ++ tests/flexure_test.py | 4 +++- tests/grid_test.py | 4 +++- tests/input_test.py | 2 ++ tests/netcdf_test.py | 4 +++- tests/output_writer_test.py | 4 +++- tests/plot_test.py | 2 ++ tests/sequence_model_test.py | 2 ++ tests/sequence_test.py | 6 +++-- tests/shoreline_test.py | 2 ++ tests/submarine_diffuser_test.py | 2 ++ tests/subsidence_test.py | 4 +++- tests/time_varying_config_test.py | 2 ++ 39 files changed, 182 insertions(+), 138 deletions(-) rename sequence/{_grid.py => grid.py} (97%) diff --git a/docs/conf.py b/docs/conf.py index 044811f..83d7649 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,6 +16,8 @@ # relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. # +from __future__ import annotations + import os import pathlib diff --git a/noxfile.py b/noxfile.py index 3679c85..ab3a481 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pathlib import shutil diff --git a/sequence/__init__.py b/sequence/__init__.py index 779f760..351b252 100644 --- a/sequence/__init__.py +++ b/sequence/__init__.py @@ -1,12 +1,6 @@ """A sequence-stratigraphic model of a 1D profile written with *Landlab*.""" -from sequence._grid import SequenceModelGrid +from __future__ import annotations + from sequence._version import __version__ -from sequence.sequence import Sequence -from sequence.sequence_model import SequenceModel -__all__ = [ - "__version__", - "Sequence", - "SequenceModel", - "SequenceModelGrid", -] +__all__ = ["__version__"] diff --git a/sequence/_version.py b/sequence/_version.py index 30ddfc9..e76d47a 100644 --- a/sequence/_version.py +++ b/sequence/_version.py @@ -1 +1,3 @@ +from __future__ import annotations + __version__ = "0.5.2.dev0" diff --git a/sequence/bathymetry.py b/sequence/bathymetry.py index 6b6a667..71d2652 100644 --- a/sequence/bathymetry.py +++ b/sequence/bathymetry.py @@ -3,9 +3,9 @@ This module contains *Landlab* components to read bathymetry into a `SequenceModelGrid`. """ +from __future__ import annotations + from os import PathLike -from typing import Optional -from typing import Union import numpy as np from landlab import Component @@ -36,7 +36,7 @@ class BathymetryReader(Component): def __init__( self, grid: SequenceModelGrid, - filepath: Union[str, PathLike[str]], + filepath: str | PathLike[str], kind: str = "linear", ): """Generate a bathymetric profile from a file. @@ -79,7 +79,7 @@ def z(self) -> NDArray[np.floating]: self.grid.nodes_at_bottom_edge ] - def run_one_step(self, dt: Optional[float] = None) -> None: + def run_one_step(self, dt: float | None = None) -> None: """Update the grid's bathymetry. Parameters diff --git a/sequence/cli.py b/sequence/cli.py index 2d2bc78..4940410 100644 --- a/sequence/cli.py +++ b/sequence/cli.py @@ -1,4 +1,6 @@ """The command line interface for *Sequence*.""" +from __future__ import annotations + import inspect import logging import os @@ -10,8 +12,6 @@ from io import StringIO from os import PathLike from typing import Any -from typing import Optional -from typing import Union import numpy as np import rich_click as click @@ -57,7 +57,7 @@ } -def _out(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: +def _out(message: str | None = None, nl: bool = True, **styles: Any) -> None: if message is not None: if "bold" not in styles: styles["bold"] = True @@ -65,7 +65,7 @@ def _out(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: click.echo(message, nl=nl, err=True) -def _err(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: +def _err(message: str | None = None, nl: bool = True, **styles: Any) -> None: if message is not None: if "fg" not in styles: styles["fg"] = "red" @@ -73,17 +73,17 @@ def _err(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: click.echo(message, nl=nl, err=True) -def out(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: +def out(message: str | None = None, nl: bool = True, **styles: Any) -> None: """Print a user info message.""" _out(message, nl=nl, **styles) -def err(message: Optional[str] = None, nl: bool = True, **styles: Any) -> None: +def err(message: str | None = None, nl: bool = True, **styles: Any) -> None: """Print a user error message.""" _err(message, nl=nl, **styles) -def _contents_of_input_file(infile: Union[str, PathLike[str]], set: str) -> str: +def _contents_of_input_file(infile: str | PathLike[str], set: str) -> str: params = _load_model_params( defaults=SequenceModel.DEFAULT_PARAMS, dotted_params=set ) @@ -130,7 +130,7 @@ def as_csv(data: ArrayLike, header: str = "") -> str: return contents[str(infile)] -def _time_from_filename(name: Union[str, PathLike[str]]) -> Optional[int]: +def _time_from_filename(name: str | PathLike[str]) -> int | None: """Parse a time stamp from a file name. Parameters @@ -161,9 +161,7 @@ def _time_from_filename(name: Union[str, PathLike[str]]) -> Optional[int]: return None -def _find_config_files( - pathname: Union[str, PathLike[str]] -) -> tuple[list[int], list[str]]: +def _find_config_files(pathname: str | PathLike[str]) -> tuple[list[int], list[str]]: """Find all of the time-varying config files for a simulation. Parameters @@ -457,8 +455,8 @@ def _dict_to_dots(d: dict) -> list[str]: def _load_model_params( - param_file: Optional[str] = None, - defaults: Optional[dict] = None, + param_file: str | None = None, + defaults: dict | None = None, dotted_params: Iterable[str] = (), ) -> dict[str, Any]: params = defaults or {} @@ -474,7 +472,7 @@ def _load_model_params( return params -def _walk_dict(indict: Union[dict, Any], prev: Optional[list] = None) -> Iterator[Any]: +def _walk_dict(indict: dict | Any, prev: list | None = None) -> Iterator[Any]: prev = prev[:] if prev else [] if isinstance(indict, dict): diff --git a/sequence/errors.py b/sequence/errors.py index c6b6a45..b55c1b7 100644 --- a/sequence/errors.py +++ b/sequence/errors.py @@ -1,4 +1,5 @@ """Errors used by *sequence*.""" +from __future__ import annotations class SequenceError(Exception): diff --git a/sequence/fluvial.py b/sequence/fluvial.py index 139ac9d..6366102 100644 --- a/sequence/fluvial.py +++ b/sequence/fluvial.py @@ -3,6 +3,8 @@ This module contains *Landlab* components that add a sand fraction to a `SequenceModelGrid`. """ +from __future__ import annotations + import numpy as np from landlab import Component diff --git a/sequence/_grid.py b/sequence/grid.py similarity index 97% rename from sequence/_grid.py rename to sequence/grid.py index deb4008..ee870cc 100644 --- a/sequence/_grid.py +++ b/sequence/grid.py @@ -1,4 +1,6 @@ """Define the grid used for creating *Sequence* models.""" +from __future__ import annotations + import os import sys @@ -119,7 +121,7 @@ def get_profile(self, name: str) -> NDArray: # return self.at_node[name].reshape(self.shape)[row] @classmethod - def from_toml(cls, filepath: os.PathLike[str]) -> "SequenceModelGrid": + def from_toml(cls, filepath: os.PathLike[str]) -> SequenceModelGrid: """Load a :class:`~SequenceModelGrid` from a *toml*-formatted file. Parameters @@ -131,7 +133,7 @@ def from_toml(cls, filepath: os.PathLike[str]) -> "SequenceModelGrid": return SequenceModelGrid.from_dict(tomllib.load(fp)["sequence"]["grid"]) @classmethod - def from_dict(cls, params: dict) -> "SequenceModelGrid": + def from_dict(cls, params: dict) -> SequenceModelGrid: """Create a :class:`~SequenceModelGrid` from a `dict`. If possible, this alternate constructor simply passes diff --git a/sequence/input_reader.py b/sequence/input_reader.py index ca9b348..7109d30 100644 --- a/sequence/input_reader.py +++ b/sequence/input_reader.py @@ -2,6 +2,8 @@ This module contains utilities for reading *Sequence* input data. """ +from __future__ import annotations + import inspect import pathlib import warnings @@ -10,10 +12,7 @@ from collections.abc import Sequence from os import PathLike from typing import Any -from typing import Optional from typing import TextIO -from typing import Tuple -from typing import Union import numpy as np import tomlkit as toml @@ -21,8 +20,8 @@ def load_config( - stream: Union[TextIO, str, PathLike[str]], fmt: Optional[str] = None -) -> Union[Iterable[Tuple[float, dict]], dict]: + stream: TextIO | str | PathLike[str], fmt: str | None = None +) -> Iterable[tuple[float, dict]] | dict: """Load model configuration from a file-like object. Parameters @@ -199,9 +198,9 @@ def dump(self, fmt: str = "toml") -> str: @classmethod def from_files( cls, - names: Iterable[Union[str, PathLike[str]]], - times: Optional[Iterable[float]] = None, - ) -> "TimeVaryingConfig": + names: Iterable[str | PathLike[str]], + times: Iterable[float] | None = None, + ) -> TimeVaryingConfig: """Load a configuration from a set of files. Parameters @@ -221,9 +220,7 @@ def from_files( return cls(times, dicts) @classmethod - def from_file( - cls, name: PathLike, fmt: Optional[str] = None - ) -> "TimeVaryingConfig": + def from_file(cls, name: PathLike, fmt: str | None = None) -> TimeVaryingConfig: """Load a configuration from a file. Parameters @@ -365,7 +362,7 @@ def get_supported_formats() -> list[str]: ] -def _flatten_dict(d: dict, sep: Optional[str] = None) -> dict: +def _flatten_dict(d: dict, sep: str | None = None) -> dict: """Flatten a dictionary so that each value has it's own key. Parameters @@ -399,7 +396,7 @@ def _flatten_dict(d: dict, sep: Optional[str] = None) -> dict: return {sep.join(keys): value for keys, value in _walk_dict(d)} -def _add_flattened_item(keys: str, value: Any, base: Optional[dict] = None) -> None: +def _add_flattened_item(keys: str, value: Any, base: dict | None = None) -> None: expanded = {} if base is None else base parent, name = keys[:-1], keys[-1] @@ -420,9 +417,7 @@ def _expand_dict(flat_dict: dict[str, Any]) -> dict[str, Any]: return expanded -def _walk_dict( - indict: dict[str, Any], prev: Optional[Sequence[str]] = None -) -> Iterable: +def _walk_dict(indict: dict[str, Any], prev: Sequence[str] | None = None) -> Iterable: """Walk the elements of a dictionary. Parameters diff --git a/sequence/logging.py b/sequence/logging.py index 3da5d4e..5991a8c 100644 --- a/sequence/logging.py +++ b/sequence/logging.py @@ -1,4 +1,6 @@ """Logger used for printing Sequence log messages.""" +from __future__ import annotations + import contextlib import logging import sys diff --git a/sequence/netcdf.py b/sequence/netcdf.py index 3568324..6a5462e 100644 --- a/sequence/netcdf.py +++ b/sequence/netcdf.py @@ -1,4 +1,6 @@ """Write a `SequenceModelGrid` to a NetCDF file.""" +from __future__ import annotations + import contextlib import os import warnings @@ -7,8 +9,6 @@ from collections.abc import Sequence from os import PathLike from typing import Any -from typing import Optional -from typing import Union import netCDF4 as nc import numpy as np @@ -45,7 +45,7 @@ def _create_grid_dimension( root: Any, grid: SequenceModelGrid, at: str = "node", - ids: Optional[Union[slice, Iterable[int]]] = None, + ids: slice | Iterable[int] | None = None, ) -> Any: """Create grid dimensions for a netcdf file.""" if ids is None: @@ -82,7 +82,7 @@ def _create_grid_coordinates( root: Any, grid: SequenceModelGrid, at: str = "node", - ids: Optional[Union[slice, Iterable[int]]] = None, + ids: slice | Iterable[int] | None = None, ) -> Any: """Create x and y coordinates for a field location.""" _create_grid_dimension(root, grid, at=at, ids=ids) @@ -103,7 +103,7 @@ def _set_grid_coordinates( root: Any, grid: SequenceModelGrid, at: str = "node", - ids: Optional[Union[slice, Iterable[int]]] = None, + ids: slice | Iterable[int] | None = None, ) -> None: """Set the values for the coordinates of a field location.""" if ids is None: @@ -130,7 +130,7 @@ def _create_field( root: Any, grid: SequenceModelGrid, at: str = "node", - names: Optional[Iterable[str]] = None, + names: Iterable[str] | None = None, ) -> None: """Create variables at a field location(s).""" if names is None: @@ -150,8 +150,8 @@ def _set_field( root: Any, grid: SequenceModelGrid, at: str = "node", - ids: Optional[Union[slice, Iterable[int]]] = None, - names: Optional[Union[str, Iterable[str]]] = None, + ids: slice | Iterable[int] | None = None, + names: str | Iterable[str] | None = None, ) -> None: """Set values for variables at a field location(s).""" if isinstance(names, str): @@ -187,7 +187,7 @@ def _set_field( def _create_layers( - root: Any, grid: SequenceModelGrid, names: Optional[Iterable[str]] = None + root: Any, grid: SequenceModelGrid, names: Iterable[str] | None = None ) -> None: """Create variables at grid layers.""" if names is None: @@ -209,8 +209,8 @@ def _create_layers( def _set_layers( root: Any, grid: SequenceModelGrid, - names: Optional[Iterable[str]] = None, - ids: Optional[Union[slice, Iterable[int]]] = None, + names: Iterable[str] | None = None, + ids: slice | Iterable[int] | None = None, ) -> None: """Set values for variables at a grid layers.""" if isinstance(names, str): @@ -237,15 +237,13 @@ def _set_layers( def to_netcdf( grid: SequenceModelGrid, - filepath: Union[str, PathLike[str]], + filepath: str | PathLike[str], mode: str = "w", format: str = "NETCDF4", time: float = 0.0, - at: Optional[Union[str, Sequence[str]]] = None, - ids: Optional[dict[str, NDArray[np.integer]] | int | Iterable[int] | slice] = None, - names: Optional[ - Union[dict[str, Optional[Iterable[str]]], str, Iterable[str]] - ] = None, + at: str | Sequence[str] | None = None, + ids: dict[str, NDArray[np.integer]] | int | Iterable[int] | slice | None = None, + names: None | (dict[str, Iterable[str] | None] | str | Iterable[str]) = None, with_layers: bool = True, ) -> None: """Write a grid and fields to a netCDF file. @@ -312,7 +310,7 @@ def to_netcdf( names_dict["grid"].remove("x_of_shelf_edge") names_dict["row"] = ["x_of_shore", "x_of_shelf_edge"] - ids_dict: dict[str, Union[slice, Iterable[int]]] = defaultdict(lambda: slice(None)) + ids_dict: dict[str, slice | Iterable[int]] = defaultdict(lambda: slice(None)) if not isinstance(ids, dict): for loc in at: ids_dict[loc] = ids diff --git a/sequence/output_writer.py b/sequence/output_writer.py index 1cd698f..49575bb 100644 --- a/sequence/output_writer.py +++ b/sequence/output_writer.py @@ -1,10 +1,10 @@ """Write a `SequenceModelGrid` to a file.""" +from __future__ import annotations + import errno import os from collections.abc import Iterable from os import PathLike -from typing import Optional -from typing import Union import numpy as np from landlab import Component @@ -19,11 +19,11 @@ class OutputWriter(Component): def __init__( self, grid: SequenceModelGrid, - filepath: Union[str, PathLike[str]], + filepath: str | PathLike[str], interval: int = 1, - fields: Optional[Iterable[str]] = None, + fields: Iterable[str] | None = None, clobber: bool = False, - rows: Optional[Iterable[str]] = None, + rows: Iterable[str] | None = None, ): """Create an output-file writer. @@ -61,7 +61,7 @@ def __init__( self._time = 0.0 self._step_count = 0 - def run_one_step(self, dt: Optional[float] = None) -> None: + def run_one_step(self, dt: float | None = None) -> None: """Update the writer by a time step. Parameters @@ -86,12 +86,12 @@ def run_one_step(self, dt: Optional[float] = None) -> None: self._step_count += 1 @property - def filepath(self) -> Union[str, PathLike[str]]: + def filepath(self) -> str | PathLike[str]: """Return the path to the output file.""" return self._filepath @filepath.setter - def filepath(self, new_val: Union[str, PathLike[str]]) -> None: + def filepath(self, new_val: str | PathLike[str]) -> None: if os.path.isfile(new_val) and not self._clobber: raise RuntimeError("file exists") try: diff --git a/sequence/plot.py b/sequence/plot.py index 6976394..b7e824f 100644 --- a/sequence/plot.py +++ b/sequence/plot.py @@ -1,9 +1,9 @@ """Plot the layers of a `SequenceModelGrid`.""" +from __future__ import annotations + from functools import partial from os import PathLike from typing import Any -from typing import Optional -from typing import Union import matplotlib.pyplot as plt import numpy as np @@ -19,15 +19,15 @@ def plot_layers( elevation_at_layer: NDArray[np.floating], - x_of_stack: Optional[NDArray[np.floating]] = None, - x_of_shore_at_layer: Optional[NDArray[np.floating]] = None, - x_of_shelf_edge_at_layer: Optional[NDArray[np.floating]] = None, - color_water: Union[tuple[float, float, float], str] = (0.8, 1.0, 1.0), - color_land: Union[tuple[float, float, float], str] = (0.8, 1.0, 0.8), - color_shoreface: Union[tuple[float, float, float], str] = (0.8, 0.8, 0.0), - color_shelf: Union[tuple[float, float, float], str] = (0.75, 0.5, 0.5), + x_of_stack: NDArray[np.floating] | None = None, + x_of_shore_at_layer: NDArray[np.floating] | None = None, + x_of_shelf_edge_at_layer: NDArray[np.floating] | None = None, + color_water: tuple[float, float, float] | str = (0.8, 1.0, 1.0), + color_land: tuple[float, float, float] | str = (0.8, 1.0, 0.8), + color_shoreface: tuple[float, float, float] | str = (0.8, 0.8, 0.0), + color_shelf: tuple[float, float, float] | str = (0.75, 0.5, 0.5), layer_line_width: float = 0.5, - layer_line_color: Union[tuple[float, float, float], str] = "k", + layer_line_color: tuple[float, float, float] | str = "k", layer_start: int = 0, layer_stop: int = -1, n_layers: int = 5, @@ -174,7 +174,7 @@ def plot_layers( plt.show() -def plot_grid(grid: SequenceModelGrid, row: Optional[int] = None, **kwds: Any) -> None: +def plot_grid(grid: SequenceModelGrid, row: int | None = None, **kwds: Any) -> None: """Plot a :class:`~SequenceModelGrid`. Parameters @@ -222,9 +222,7 @@ def plot_grid(grid: SequenceModelGrid, row: Optional[int] = None, **kwds: Any) - ) -def plot_file( - filename: Union[str, PathLike], row: Optional[int] = None, **kwds: Any -) -> None: +def plot_file(filename: str | PathLike, row: int | None = None, **kwds: Any) -> None: """Plot a `SequenceModelGrid` from a *Sequence* output file. Parameters @@ -290,7 +288,7 @@ def plot_file( ) -def _get_layers_to_plot(start: int, stop: int, num: int = -1) -> Optional[slice]: +def _get_layers_to_plot(start: int, stop: int, num: int = -1) -> slice | None: if num == 0: return None elif num < 0 or num > stop - start + 1: @@ -302,9 +300,9 @@ def _get_layers_to_plot(start: int, stop: int, num: int = -1) -> Optional[slice] def _fill_between_layers( x: NDArray, y: NDArray, - lower: Optional[NDArray[np.integer]] = None, - upper: Optional[NDArray[np.integer]] = None, - fc: Optional[Union[tuple[float, float, float], str]] = None, + lower: NDArray[np.integer] | None = None, + upper: NDArray[np.integer] | None = None, + fc: tuple[float, float, float] | str | None = None, ) -> None: n_layers = len(y) @@ -329,8 +327,8 @@ def _outline_layer( x: NDArray, y_of_bottom_layer: NDArray, y_of_top_layer: NDArray, - bottom_limits: Optional[tuple[Optional[float], Optional[float]]] = None, - top_limits: Optional[tuple[Optional[float], Optional[float]]] = None, + bottom_limits: tuple[float | None, float | None] | None = None, + top_limits: tuple[float | None, float | None] | None = None, ) -> tuple[NDArray, NDArray]: if bottom_limits is None: bottom_limits = (None, None) diff --git a/sequence/processes.py b/sequence/processes.py index 120c512..ac9700b 100644 --- a/sequence/processes.py +++ b/sequence/processes.py @@ -1,4 +1,6 @@ """All available processes to include in a *Sequence* model.""" +from __future__ import annotations + from compaction.landlab import Compact from sequence.fluvial import Fluvial diff --git a/sequence/sea_level.py b/sequence/sea_level.py index 249f7aa..0f38da1 100644 --- a/sequence/sea_level.py +++ b/sequence/sea_level.py @@ -3,9 +3,10 @@ This module contains *Landlab* components used for adjusting a grid's sea level. """ +from __future__ import annotations + from collections.abc import Callable from os import PathLike -from typing import Union import numpy as np from landlab import Component @@ -46,7 +47,7 @@ class SeaLevelTimeSeries(Component): def __init__( self, grid: SequenceModelGrid, - filepath: Union[str, PathLike[str]], + filepath: str | PathLike[str], kind: str = "linear", start: float = 0.0, ): @@ -78,7 +79,7 @@ def __init__( @staticmethod def _sea_level_interpolator( data: NDArray[np.floating], kind: str = "linear" - ) -> Callable[[Union[float, NDArray]], NDArray]: + ) -> Callable[[float | NDArray], NDArray]: return interpolate.interp1d( data[:, 0], data[:, 1], @@ -89,12 +90,12 @@ def _sea_level_interpolator( ) @property - def filepath(self) -> Union[str, PathLike[str]]: + def filepath(self) -> str | PathLike[str]: """Return the path to the sea-level file.""" return self._filepath @filepath.setter - def filepath(self, new_path: Union[str, PathLike[str]]) -> None: + def filepath(self, new_path: str | PathLike[str]) -> None: self._filepath = new_path self._sea_level = SeaLevelTimeSeries._sea_level_interpolator( np.loadtxt(self._filepath, delimiter=","), kind=self._kind diff --git a/sequence/sediment_flexure.py b/sequence/sediment_flexure.py index 050fbac..12f420d 100644 --- a/sequence/sediment_flexure.py +++ b/sequence/sediment_flexure.py @@ -1,7 +1,8 @@ """Subside a `SequenceModelGrid` using flexure.""" +from __future__ import annotations + import logging -from typing import Optional -from typing import Union +from typing import Any import numpy as np import tomlkit as toml @@ -16,7 +17,12 @@ class DynamicFlexure(Flexure1D): """Calculate non-isostatic flexure.""" - def __init__(self, grid, isostasytime: Optional[float] = 7000.0, **kwds: dict): + def __init__( + self, + grid: SequenceModelGrid, + isostasytime: float | None = 7000.0, + **kwds: dict[str, Any], + ): """Inherit from this base class for non-isostatic flexure. Parameters @@ -61,12 +67,12 @@ def validate_isostasy_time(time: float) -> float: return time @property - def isostasy_time(self) -> Optional[float]: + def isostasy_time(self) -> float | None: """Return the isostasy time.""" return self._isostasy_time @staticmethod - def calc_isostasy_fraction(isostasy_time: Optional[float], dt: float) -> float: + def calc_isostasy_fraction(isostasy_time: float | None, dt: float) -> float: """Calculate the fraction of isostatic subsidence. Parameters @@ -121,7 +127,7 @@ class WaterFlexure(DynamicFlexure): def __init__( self, grid: SequenceModelGrid, - isostasytime: Optional[float] = 7000.0, + isostasytime: float | None = 7000.0, **kwds: dict, ): """Calculate flexural subsidence due to changes in water loading. @@ -284,7 +290,7 @@ def __init__( grid: SequenceModelGrid, sand_density: float = 2650, mud_density: float = 2720.0, - isostasytime: Optional[float] = 7000.0, + isostasytime: float | None = 7000.0, water_density: float = 1030.0, **kwds: dict, ): @@ -353,10 +359,10 @@ def __init__( @staticmethod def calc_bulk_density( - grain_density: Union[float, NDArray[np.floating]], - void_density: Union[float, NDArray[np.floating]], - porosity: Union[float, NDArray[np.floating]], - ) -> Union[float, NDArray[np.floating]]: + grain_density: float | NDArray[np.floating], + void_density: float | NDArray[np.floating], + porosity: float | NDArray[np.floating], + ) -> float | NDArray[np.floating]: """Calculate the bulk density of a material with a given porosity. Parameters @@ -412,7 +418,7 @@ def sand_density(self, density: float) -> None: ) @property - def sand_bulk_density(self) -> Union[float, NDArray[np.floating]]: + def sand_bulk_density(self) -> float | NDArray[np.floating]: """Return the bulk density of sand.""" return self._rho_sand @@ -430,7 +436,7 @@ def mud_density(self, density: float) -> None: ) @property - def mud_bulk_density(self) -> Union[float, NDArray[np.floating]]: + def mud_bulk_density(self) -> float | NDArray[np.floating]: """Return the bulk density of mud.""" return self._rho_mud @@ -454,7 +460,7 @@ def _calc_loading( deposit_thickness: NDArray[np.floating], z: NDArray[np.floating], sediment_porosity: float, - sediment_density: Union[float, NDArray[np.floating]], + sediment_density: float | NDArray[np.floating], water_density: float, ) -> NDArray[np.floating]: """Calculate the loading due to a, possibly submerged, sediment deposit. @@ -501,8 +507,8 @@ def _calc_loading( @staticmethod def _calc_density( - sand_fraction: Union[float, NDArray], sand_density: float, mud_density: float - ) -> Union[float, NDArray]: + sand_fraction: float | NDArray, sand_density: float, mud_density: float + ) -> float | NDArray: """Calculate the density of a sand/mud mixture. Parameters diff --git a/sequence/sequence.py b/sequence/sequence.py index d2b2912..36178bb 100644 --- a/sequence/sequence.py +++ b/sequence/sequence.py @@ -1,7 +1,8 @@ """*Sequence*'s main API for constructing sequence-stratigraphic models.""" +from __future__ import annotations + from collections.abc import Iterable from typing import Any -from typing import Optional import numpy as np from landlab import Component @@ -58,7 +59,7 @@ def __init__( self, grid: SequenceModelGrid, time_step: float = 100.0, - components: Optional[Iterable] = None, + components: Iterable | None = None, ): """Create a Sequence model. @@ -108,7 +109,7 @@ def time(self) -> float: """Return the current model time (in years).""" return self._time - def update(self, dt: Optional[float] = None) -> None: + def update(self, dt: float | None = None) -> None: """Update the model of a given time step. Parameters @@ -135,8 +136,8 @@ def update(self, dt: Optional[float] = None) -> None: def run( self, - until: Optional[float] = None, - dt: Optional[float] = None, + until: float | None = None, + dt: float | None = None, progress_bar: bool = True, ) -> None: """Run the model to a given time. diff --git a/sequence/sequence_model.py b/sequence/sequence_model.py index 6b8dfd9..054d27a 100644 --- a/sequence/sequence_model.py +++ b/sequence/sequence_model.py @@ -1,4 +1,6 @@ """Build a `SequenceModelGrid` model from collection of components.""" +from __future__ import annotations + import logging import os import time @@ -8,8 +10,6 @@ from collections.abc import Iterable from contextlib import suppress from typing import Any -from typing import Dict -from typing import Optional import numpy as np import tomlkit @@ -95,9 +95,9 @@ class SequenceModel: def __init__( self, grid: SequenceModelGrid, - clock: Optional[dict] = None, - processes: Optional[dict] = None, - output: Optional[dict] = None, + clock: dict | None = None, + processes: dict | None = None, + output: dict | None = None, ): """Create a model on a `SequenceModelGrid`. @@ -151,7 +151,7 @@ def __init__( self.timer: dict[str, float] = defaultdict(float) @staticmethod - def load_grid(params: dict, bathymetry: Optional[dict] = None) -> SequenceModelGrid: + def load_grid(params: dict, bathymetry: dict | None = None) -> SequenceModelGrid: """Load a `SequenceModelGrid`. Parameters @@ -191,7 +191,7 @@ def load_processes( processes = list(processes) + ["fluvial"] if "shoreline" not in processes: processes = list(processes) + ["shoreline"] - params: Dict[str, dict] = defaultdict(dict) + params: dict[str, dict] = defaultdict(dict) params.update( {process: context.get(process, {}).copy() for process in processes} ) @@ -297,7 +297,7 @@ def set_params(self, params: dict[str, dict]) -> None: for param, value in values.items(): setattr(c, param, value) - def run_one_step(self, dt: Optional[float] = None) -> None: + def run_one_step(self, dt: float | None = None) -> None: """Run each component for one time step.""" dt = dt or self.clock.step self.clock.dt = dt diff --git a/sequence/shoreline.py b/sequence/shoreline.py index c257099..85242d3 100644 --- a/sequence/shoreline.py +++ b/sequence/shoreline.py @@ -3,8 +3,9 @@ This module contains methods for calculating a grid's shoreline and shelf edge. """ +from __future__ import annotations + import bisect -from typing import Optional import numpy as np from landlab import Component @@ -130,7 +131,7 @@ def update(self) -> None: self.grid.at_row["x_of_shore"][:] = x_of_shores self.grid.at_row["x_of_shelf_edge"][:] = x_of_shelf_edges - def run_one_step(self, dt: Optional[float] = None) -> None: + def run_one_step(self, dt: float | None = None) -> None: """Update the component on time step. Parameters diff --git a/sequence/submarine.py b/sequence/submarine.py index 577d681..a130ba0 100644 --- a/sequence/submarine.py +++ b/sequence/submarine.py @@ -1,4 +1,6 @@ """Diffuse sediment along a profile.""" +from __future__ import annotations + from typing import Any import numpy as np diff --git a/sequence/subsidence.py b/sequence/subsidence.py index 99d1958..b92fe89 100644 --- a/sequence/subsidence.py +++ b/sequence/subsidence.py @@ -1,7 +1,8 @@ """Subside a `SequenceModelGrid`.""" +from __future__ import annotations + import os from collections.abc import Callable -from typing import Union import numpy as np from landlab import Component @@ -70,7 +71,7 @@ def subsidence_rate(self) -> NDArray: @staticmethod def _subsidence_interpolator( data: NDArray, kind: str = "linear" - ) -> Callable[[Union[float, NDArray]], NDArray]: + ) -> Callable[[float | NDArray], NDArray]: return interpolate.interp1d( data[:, 0], data[:, 1], diff --git a/setup.py b/setup.py index 6068493..a03590f 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from setuptools import setup setup() diff --git a/tests/bathymetry_test.py b/tests/bathymetry_test.py index 6050fd4..e5549a1 100644 --- a/tests/bathymetry_test.py +++ b/tests/bathymetry_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import numpy as np diff --git a/tests/cli_test.py b/tests/cli_test.py index 27ee358..e5c86ae 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from click.testing import CliRunner diff --git a/tests/compaction_test.py b/tests/compaction_test.py index a2f6236..c8b8424 100644 --- a/tests/compaction_test.py +++ b/tests/compaction_test.py @@ -1,9 +1,11 @@ +from __future__ import annotations + from numpy.testing import assert_array_almost_equal from pytest import approx -from sequence import Sequence -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.processes import Compact +from sequence.sequence import Sequence def test_layers_compact(): diff --git a/tests/config_files_test.py b/tests/config_files_test.py index 470c95f..dd4f2e4 100644 --- a/tests/config_files_test.py +++ b/tests/config_files_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pathlib import pytest diff --git a/tests/flexure_test.py b/tests/flexure_test.py index 9dd3733..cc386c7 100644 --- a/tests/flexure_test.py +++ b/tests/flexure_test.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import numpy as np import pytest from numpy.testing import assert_array_almost_equal -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.sediment_flexure import SedimentFlexure diff --git a/tests/grid_test.py b/tests/grid_test.py index a84b309..c1142b2 100644 --- a/tests/grid_test.py +++ b/tests/grid_test.py @@ -1,6 +1,8 @@ +from __future__ import annotations + import pytest -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid def test_init(): diff --git a/tests/input_test.py b/tests/input_test.py index 9286224..2e398de 100644 --- a/tests/input_test.py +++ b/tests/input_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pathlib import pytest diff --git a/tests/netcdf_test.py b/tests/netcdf_test.py index 12c4e27..4d50fd8 100644 --- a/tests/netcdf_test.py +++ b/tests/netcdf_test.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import numpy as np import pytest import xarray as xr from pytest import approx -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.netcdf import to_netcdf diff --git a/tests/output_writer_test.py b/tests/output_writer_test.py index c2b13ce..754a0f3 100644 --- a/tests/output_writer_test.py +++ b/tests/output_writer_test.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import numpy as np import xarray as xr from pytest import approx from pytest import raises -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.output_writer import OutputWriter diff --git a/tests/plot_test.py b/tests/plot_test.py index 25be51b..4cee811 100644 --- a/tests/plot_test.py +++ b/tests/plot_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest from numpy.testing import assert_array_almost_equal diff --git a/tests/sequence_model_test.py b/tests/sequence_model_test.py index 6655cb3..63da9be 100644 --- a/tests/sequence_model_test.py +++ b/tests/sequence_model_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import shutil diff --git a/tests/sequence_test.py b/tests/sequence_test.py index fa9de5f..1670571 100644 --- a/tests/sequence_test.py +++ b/tests/sequence_test.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import numpy as np import pytest -from sequence import Sequence -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.processes import ShorelineFinder +from sequence.sequence import Sequence @pytest.fixture(scope="function") diff --git a/tests/shoreline_test.py b/tests/shoreline_test.py index 58c18ba..8788471 100644 --- a/tests/shoreline_test.py +++ b/tests/shoreline_test.py @@ -1,4 +1,6 @@ """Test the shoreline.find_shoreline function.""" +from __future__ import annotations + import numpy as np import pytest from pytest import approx diff --git a/tests/submarine_diffuser_test.py b/tests/submarine_diffuser_test.py index c10d85c..25e8f74 100644 --- a/tests/submarine_diffuser_test.py +++ b/tests/submarine_diffuser_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from random import random import pytest diff --git a/tests/subsidence_test.py b/tests/subsidence_test.py index ce89d4d..858bb26 100644 --- a/tests/subsidence_test.py +++ b/tests/subsidence_test.py @@ -1,7 +1,9 @@ +from __future__ import annotations + import pytest from numpy.testing import assert_array_equal -from sequence import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.subsidence import SubsidenceTimeSeries diff --git a/tests/time_varying_config_test.py b/tests/time_varying_config_test.py index 6327166..be48f7c 100644 --- a/tests/time_varying_config_test.py +++ b/tests/time_varying_config_test.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from sequence.input_reader import TimeVaryingConfig From 7c5dc6786332fc37b531df086ecf5842abf2f9eb Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 22:23:36 -0700 Subject: [PATCH 06/12] document **kwds --- sequence/plot.py | 4 ++++ sequence/sediment_flexure.py | 6 ++++++ sequence/submarine.py | 2 ++ 3 files changed, 12 insertions(+) diff --git a/sequence/plot.py b/sequence/plot.py index b7e824f..69297dc 100644 --- a/sequence/plot.py +++ b/sequence/plot.py @@ -183,6 +183,8 @@ def plot_grid(grid: SequenceModelGrid, row: int | None = None, **kwds: Any) -> N The grid to plot. row : int, optional The row of the grid to plot. If not provided, plot the middle row. + **kwds: dict, optional + Additional keyword arguments that are passed along to :func:`~plot_layers`. See Also -------- @@ -231,6 +233,8 @@ def plot_file(filename: str | PathLike, row: int | None = None, **kwds: Any) -> Path to the file to plot. row : int, optional Row to plot. If not provided, plot the middle row. + **kwds: dict, optional + Additional keyword arguments that are passed along to :func:`~plot_layers`. See Also -------- diff --git a/sequence/sediment_flexure.py b/sequence/sediment_flexure.py index 12f420d..13729af 100644 --- a/sequence/sediment_flexure.py +++ b/sequence/sediment_flexure.py @@ -31,6 +31,8 @@ def __init__( A *Landlab* grid. isostasytime : float, optional The e-folding time for a deflection to reach equilibrium. + **kwds : dict, optional + Additional keyword arguments that are passed to :class:`~Flexure1D`. """ if isostasytime is None or np.isclose(isostasytime, 0.0): self._isostasy_time = None @@ -140,6 +142,8 @@ def __init__( The e-folding time for a deflection to reach equilibrium. water_density : float, optional Density of water. + **kwds : dict, optional + Additional keyword arguments that are passed to :class:`~Flexure1D`. """ if "lithosphere__increment_of_overlying_pressure" not in grid.at_node: grid.add_zeros("lithosphere__increment_of_overlying_pressure", at="node") @@ -308,6 +312,8 @@ def __init__( Density of water. isostasytime : float, optional Response time of the lithosphere to loading. + **kwds : dict, optional + Additional keyword arguments that are passed to :class:`~Flexure1D`. """ self._water_density = SedimentFlexure.validate_density(water_density) self._sand_density = SedimentFlexure.validate_density(sand_density) diff --git a/sequence/submarine.py b/sequence/submarine.py index a130ba0..7b0363f 100644 --- a/sequence/submarine.py +++ b/sequence/submarine.py @@ -86,6 +86,8 @@ def __init__( Length of drainage basin upstream of model. Creates increase in diffusivity downstream by (basin_width + x) / basin_width from increase river flow (m). + **kwds: dict, optional + Additional keyword arguments that are passed along to :class:`~LinearDiffuser`. """ self._plain_slope = float(plain_slope) self._wave_base = float(wave_base) From ba6d7f2582e080fa8d3503b73af0760443a5a6fe Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 22:25:31 -0700 Subject: [PATCH 07/12] use pydocstyle from ruff --- .pre-commit-config.yaml | 13 +++++-------- pyproject.toml | 11 +++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0d28715..d47fb28 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -57,7 +57,7 @@ repos: rev: v3.12.0 hooks: - id: reorder-python-imports - args: ["--py310-plus"] + args: [--py310-plus, --add-import, "from __future__ import annotations"] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 @@ -79,15 +79,12 @@ repos: ) - id: name-tests-test -- repo: https://github.com/PyCQA/pydocstyle - rev: 6.3.0 +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.8 hooks: - - id: pydocstyle + - id: ruff files: sequence/.*\.py$ - args: - - --convention=numpy - - --add-select=D417 - additional_dependencies: [".[toml]"] + args: [--fix] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.7.0 diff --git a/pyproject.toml b/pyproject.toml index 8981573..c97f5a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -118,6 +118,17 @@ markers = [ "notebook: marks tests as notebook (deselect with '-m \"not notebook\"')", ] +[tool.ruff.lint] +select = [ + "D", +] +extend-select = [ + "D417", +] + +[tool.ruff.lint.pydocstyle] +convention = "numpy" + [tool.towncrier] directory = "news" package = "sequence" From f7fef2966328d503f4736465b30828635a977cdc Mon Sep 17 00:00:00 2001 From: mcflugen Date: Tue, 19 Dec 2023 22:42:52 -0700 Subject: [PATCH 08/12] import from sequence.grid, not sequence._grid --- sequence/bathymetry.py | 2 +- sequence/fluvial.py | 2 +- sequence/netcdf.py | 2 +- sequence/output_writer.py | 2 +- sequence/plot.py | 2 +- sequence/sea_level.py | 2 +- sequence/sediment_flexure.py | 2 +- sequence/sequence.py | 2 +- sequence/sequence_model.py | 2 +- sequence/shoreline.py | 2 +- sequence/submarine.py | 2 +- sequence/subsidence.py | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/sequence/bathymetry.py b/sequence/bathymetry.py index 71d2652..3f84cdb 100644 --- a/sequence/bathymetry.py +++ b/sequence/bathymetry.py @@ -12,7 +12,7 @@ from numpy.typing import NDArray from scipy import interpolate -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid class BathymetryReader(Component): diff --git a/sequence/fluvial.py b/sequence/fluvial.py index 6366102..8430ff3 100644 --- a/sequence/fluvial.py +++ b/sequence/fluvial.py @@ -8,7 +8,7 @@ import numpy as np from landlab import Component -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.shoreline import find_shoreline diff --git a/sequence/netcdf.py b/sequence/netcdf.py index 6a5462e..dcf61a9 100644 --- a/sequence/netcdf.py +++ b/sequence/netcdf.py @@ -14,7 +14,7 @@ import numpy as np from numpy.typing import NDArray -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid _NUMPY_TO_NETCDF_TYPE = { "float32": "f4", diff --git a/sequence/output_writer.py b/sequence/output_writer.py index 49575bb..14bf3d2 100644 --- a/sequence/output_writer.py +++ b/sequence/output_writer.py @@ -9,7 +9,7 @@ import numpy as np from landlab import Component -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.netcdf import to_netcdf diff --git a/sequence/plot.py b/sequence/plot.py index 69297dc..c79a2fe 100644 --- a/sequence/plot.py +++ b/sequence/plot.py @@ -12,7 +12,7 @@ from numpy.typing import NDArray from scipy.interpolate import interp1d -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.errors import InvalidRowError from sequence.errors import MissingRequiredVariable diff --git a/sequence/sea_level.py b/sequence/sea_level.py index 0f38da1..27a4d9b 100644 --- a/sequence/sea_level.py +++ b/sequence/sea_level.py @@ -13,7 +13,7 @@ from numpy.typing import NDArray from scipy import interpolate -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid class SeaLevelTimeSeries(Component): diff --git a/sequence/sediment_flexure.py b/sequence/sediment_flexure.py index 13729af..2a4d6a4 100644 --- a/sequence/sediment_flexure.py +++ b/sequence/sediment_flexure.py @@ -9,7 +9,7 @@ from landlab.components.flexure import Flexure1D from numpy.typing import NDArray -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid logger = logging.getLogger("sequence") diff --git a/sequence/sequence.py b/sequence/sequence.py index 36178bb..87edccf 100644 --- a/sequence/sequence.py +++ b/sequence/sequence.py @@ -11,7 +11,7 @@ from numpy.typing import NDArray from tqdm import trange -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.plot import plot_grid diff --git a/sequence/sequence_model.py b/sequence/sequence_model.py index 054d27a..6f4a9c7 100644 --- a/sequence/sequence_model.py +++ b/sequence/sequence_model.py @@ -17,7 +17,7 @@ from landlab.bmi.bmi_bridge import TimeStepper from numpy.typing import ArrayLike -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.bathymetry import BathymetryReader from sequence.errors import ParameterMismatchError from sequence.fluvial import Fluvial diff --git a/sequence/shoreline.py b/sequence/shoreline.py index 85242d3..ca88b06 100644 --- a/sequence/shoreline.py +++ b/sequence/shoreline.py @@ -12,7 +12,7 @@ from numpy.typing import NDArray from scipy import interpolate -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.errors import ShelfEdgeError from sequence.errors import ShorelineError diff --git a/sequence/submarine.py b/sequence/submarine.py index 7b0363f..30c0198 100644 --- a/sequence/submarine.py +++ b/sequence/submarine.py @@ -7,7 +7,7 @@ from landlab.components import LinearDiffuser from numpy.typing import NDArray -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid from sequence.shoreline import find_shoreline diff --git a/sequence/subsidence.py b/sequence/subsidence.py index b92fe89..d72f0d9 100644 --- a/sequence/subsidence.py +++ b/sequence/subsidence.py @@ -9,7 +9,7 @@ from numpy.typing import NDArray from scipy import interpolate -from sequence._grid import SequenceModelGrid +from sequence.grid import SequenceModelGrid class SubsidenceTimeSeries(Component): From 0ae8067669444b0fc27afaf4cfdae2a0885f0cc8 Mon Sep 17 00:00:00 2001 From: mcflugen Date: Wed, 20 Dec 2023 09:49:52 -0700 Subject: [PATCH 09/12] reorder imports --- docs/tutorials/notebooks/example.ipynb | 4 +++- sequence/plot.py | 2 +- sequence/sequence_model.py | 2 +- sequence/shoreline.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/notebooks/example.ipynb b/docs/tutorials/notebooks/example.ipynb index 960b7cf..2cdd2ce 100644 --- a/docs/tutorials/notebooks/example.ipynb +++ b/docs/tutorials/notebooks/example.ipynb @@ -31,7 +31,9 @@ "source": [ "import tqdm\n", "\n", - "from sequence import Sequence, SequenceModelGrid, processes" + "from sequence import processes\n", + "from sequence.grid import SequenceModelGrid\n", + "from sequence.sequence import Sequence" ] }, { diff --git a/sequence/plot.py b/sequence/plot.py index c79a2fe..cc231b1 100644 --- a/sequence/plot.py +++ b/sequence/plot.py @@ -12,9 +12,9 @@ from numpy.typing import NDArray from scipy.interpolate import interp1d -from sequence.grid import SequenceModelGrid from sequence.errors import InvalidRowError from sequence.errors import MissingRequiredVariable +from sequence.grid import SequenceModelGrid def plot_layers( diff --git a/sequence/sequence_model.py b/sequence/sequence_model.py index 6f4a9c7..8d019ea 100644 --- a/sequence/sequence_model.py +++ b/sequence/sequence_model.py @@ -17,10 +17,10 @@ from landlab.bmi.bmi_bridge import TimeStepper from numpy.typing import ArrayLike -from sequence.grid import SequenceModelGrid from sequence.bathymetry import BathymetryReader from sequence.errors import ParameterMismatchError from sequence.fluvial import Fluvial +from sequence.grid import SequenceModelGrid from sequence.output_writer import OutputWriter from sequence.sea_level import SeaLevelTimeSeries from sequence.sea_level import SinusoidalSeaLevel diff --git a/sequence/shoreline.py b/sequence/shoreline.py index ca88b06..41789aa 100644 --- a/sequence/shoreline.py +++ b/sequence/shoreline.py @@ -12,9 +12,9 @@ from numpy.typing import NDArray from scipy import interpolate -from sequence.grid import SequenceModelGrid from sequence.errors import ShelfEdgeError from sequence.errors import ShorelineError +from sequence.grid import SequenceModelGrid class ShorelineFinder(Component): From 35089e34a3333eeba1beef10edbd7a7aefcc8a24 Mon Sep 17 00:00:00 2001 From: mcflugen Date: Wed, 20 Dec 2023 09:52:04 -0700 Subject: [PATCH 10/12] fix import in doctests --- sequence/grid.py | 4 ++-- sequence/submarine.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sequence/grid.py b/sequence/grid.py index ee870cc..371e2bf 100644 --- a/sequence/grid.py +++ b/sequence/grid.py @@ -34,7 +34,7 @@ def __init__( Examples -------- - >>> from sequence import SequenceModelGrid + >>> from sequence.grid import SequenceModelGrid >>> grid = SequenceModelGrid(5, spacing=10.0) >>> grid.y_of_row array([ 0., 1., 2.]) @@ -151,7 +151,7 @@ def from_dict(cls, params: dict) -> SequenceModelGrid: Examples -------- - >>> from sequence import SequenceModelGrid + >>> from sequence.grid import SequenceModelGrid >>> params = {"shape": 5, "spacing": 10.0} >>> grid = SequenceModelGrid.from_dict(params) >>> grid.y_of_row diff --git a/sequence/submarine.py b/sequence/submarine.py index 30c0198..5d0a316 100644 --- a/sequence/submarine.py +++ b/sequence/submarine.py @@ -212,7 +212,7 @@ def calc_diffusion_coef( sea level and three below, two of which are in deep water (below the default 60 m wave base). - >>> from sequence import SequenceModelGrid + >>> from sequence.grid import SequenceModelGrid >>> import numpy as np >>> grid = SequenceModelGrid((1, 6), spacing=(1.0, 200.0)) From db07ffb95465bf3574c9cc5d9268620a145d9a6b Mon Sep 17 00:00:00 2001 From: mcflugen Date: Wed, 20 Dec 2023 10:03:58 -0700 Subject: [PATCH 11/12] build the docs with Python 3.11 --- .github/workflows/docs.yml | 2 +- .github/workflows/notebooks.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7e0b860..58a120a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,7 +26,7 @@ jobs: micromamba-version: latest environment-name: testing create-args: >- - python=3.12 + python=3.11 mamba pandoc nox diff --git a/.github/workflows/notebooks.yml b/.github/workflows/notebooks.yml index 91db032..81ac9b9 100644 --- a/.github/workflows/notebooks.yml +++ b/.github/workflows/notebooks.yml @@ -23,7 +23,7 @@ jobs: - uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: "3.12" + python-version: "3.11" channels: conda-forge channel-priority: true From 11a772ab0cd20210b746dd3fdfc51d8b8fd28407 Mon Sep 17 00:00:00 2001 From: mcflugen Date: Wed, 20 Dec 2023 11:20:54 -0700 Subject: [PATCH 12/12] add news fragment --- news/82.misc | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 news/82.misc diff --git a/news/82.misc b/news/82.misc new file mode 100644 index 0000000..9ca11be --- /dev/null +++ b/news/82.misc @@ -0,0 +1,2 @@ + +Updated *Sequence* annotations to python 3.10+.