From d0afe0d3ecc6aae7b76c40975026797dfb3d861e Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:00:46 -0400 Subject: [PATCH 01/17] Add Python versions 3.12 and 3.13 to CI matrix --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7d7b030..fc576c2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,7 +27,7 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v3 with: From 4eb1ce57df406455ed8dc27068f6c53f6ff248b8 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:03:04 -0400 Subject: [PATCH 02/17] Update Python version from 3.11 to 3.13 --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 92b273e..2d8f9e1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v3 with: - python-version: '3.11' + python-version: '3.13' - name: Install dependencies run: | python -m pip install --upgrade pip From 009565941815d47d654accc50a5bb73b51649155 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:05:48 -0400 Subject: [PATCH 03/17] Update GitHub Actions workflow for PyPI publishing --- .github/workflows/publish.yml | 61 +++++++++++++++++------------------ 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2d8f9e1..efaa53c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,45 +1,42 @@ -name: Upload Python Package - +name: Build and Upload aerobulk-python to PyPI on: + push: + branches: + - "main" + pull_request: + branches: + - "*" release: - types: [created] + types: + - published jobs: - deploy: - if: github.repository == 'xgcm/aerobulk-python' + build-artifacts: runs-on: ubuntu-latest + if: github.repository == 'xgcm/aerobulk-python' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: - submodules: recursive + fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: "3.x" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install numpy setuptools setuptools-scm wheel twine - - name: Build tarball - run: python setup.py sdist - - name: Check dist - run: ls -la dist - - name: Check version - run: python setup.py --version - - name: Check built artifacts + python -m pip install --upgrade setuptools setuptools-scm build twine + - name: Build only + if: github.event_name != 'release' run: | - python -m twine check dist/* - pwd - if [ -f dist/aerobulk-python-0.0.0.tar.gz ]; then - echo "❌ INVALID VERSION NUMBER" - exit 1 - else - echo "✅ Looks good" - fi - - name: Publish a Package to PyPI - uses: pypa/gh-action-pypi-publish@v1.5.0 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} - verbose: true - verify_metadata: true + python -m build + twine check dist/* + - name: Build and publish + if: github.event_name == 'release' + env: + TWINE_USERNAME: "__token__" + TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} + run: | + python -m build + twine check dist/* + twine upload dist/* From 628fbf8f2df76d407133d4ccd8cd6dab0ad9edef Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:07:52 -0400 Subject: [PATCH 04/17] Change micromamba action and enhance caching --- .github/workflows/ci.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fc576c2..39ac41d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,13 +33,15 @@ jobs: with: submodules: recursive - name: Create conda environment - uses: mamba-org/provision-with-micromamba@main + uses: mamba-org/setup-micromamba@v2 with: - cache-downloads: true - micromamba-version: 'latest' + micromamba-version: 'latest' # any version from https://github.com/mamba-org/micromamba-releases environment-file: ci/environment.yml - extra-specs: | + create-args: >- python=${{ matrix.python-version }} + post-cleanup: 'all' + cache-environment: true + cache-downloads: true - name: Install aerobulk-python run: | python -m pip install -e . --no-deps From 9cac9293636205034ef8125da9fb6095963c8e20 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:08:21 -0400 Subject: [PATCH 05/17] Add Dependabot configuration for GitHub Actions --- .github/dependabot.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yaml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..bc63aca --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'monthly' From 61a267f661ab47a8b92ac71fc115dd4b9bdd45d0 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:09:51 -0400 Subject: [PATCH 06/17] Add numpy to Python dependencies installation --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index efaa53c..231e6ef 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -25,7 +25,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade setuptools setuptools-scm build twine + python -m pip install --upgrade setuptools setuptools-scm build twine numpy - name: Build only if: github.event_name != 'release' run: | From 95f078cc4acf27b9d92f295b5bacaffc4ac13b4f Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:12:19 -0400 Subject: [PATCH 07/17] Update TWINE_PASSWORD to use PYPI_API_TOKEN --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 231e6ef..fc5e2b4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -35,7 +35,7 @@ jobs: if: github.event_name == 'release' env: TWINE_USERNAME: "__token__" - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} run: | python -m build twine check dist/* From c7cf7602dd2ba620bdaf9e36e26e98f8e98a1fcb Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:19:01 -0400 Subject: [PATCH 08/17] Create pyproject.toml for project setup --- pyproject.toml | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..95a6044 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,68 @@ +[build-system] +requires = [ + "setuptools >= 61.0", + "setuptools-scm[toml] >= 6.2", + "wheel", + "numpy >= 1.20.0" +] +build-backend = "setuptools.build_meta" + +[project] +name = "aerobulk-python" +description = "General Circulation Model Postprocessing with xarray" +readme = "README.md" +license = {text = "GPLv3"} +authors = [ + {name = "aerobulk-python Developers", email = "julius@ldeo.columbia.edu"} +] +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", +] +requires-python = ">=3.8,<3.12" +dependencies = [ + "numpy", +] +dynamic = ["version"] + +[project.urls] +Homepage = "https://github.com/xgcm/aerobulk-python" +Repository = "https://github.com/xgcm/aerobulk-python" + +[tool.setuptools] +package-dir = {"" = "source"} + +[tool.setuptools.packages.find] +where = ["source"] + +[tool.setuptools_scm] +write_to = "source/aerobulk/_version.py" +write_to_template = '__version__ = "{version}"' +tag_regex = '^(?Pv)?(?P[^\+]+)(?P.*)?$' + +# Tool configurations from setup.cfg +[tool.flake8] +exclude = ["**__init__.py", ".eggs", "doc"] +ignore = [ + # whitespace before ':' - doesn't work well with black + "E203", + "E402", + # line too long - let black worry about that + "E501", + # do not assign a lambda expression, use a def + "E731", + # line break before binary operator + "W503", + "E265", + "F811" +] + +[tool.pytest.ini_options] +testpaths = ["tests"] From 1f588b3f072f243a3060f437afed45a9c162b24c Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:19:25 -0400 Subject: [PATCH 09/17] Delete setup.cfg --- setup.cfg | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 3c3793c..0000000 --- a/setup.cfg +++ /dev/null @@ -1,16 +0,0 @@ -[flake8] -exclude = __init__.py,.eggs,doc -ignore = - # whitespace before ':' - doesn't work well with black - E203 - E402 - # line too long - let black worry about that - E501 - # do not assign a lambda expression, use a def - E731 - # line break before binary operator - W503 - E265 - F811 -[tool:pytest] -testpaths = tests From aea056ef87969393a422f9025a6dcc905b618471 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:19:50 -0400 Subject: [PATCH 10/17] Refactor setup.py for cleaner configuration --- setup.py | 52 ++-------------------------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/setup.py b/setup.py index 6894f37..894cf95 100644 --- a/setup.py +++ b/setup.py @@ -1,33 +1,14 @@ import os - -# We need to import setuptools here in order for it to persist in sys.modules. -# Its presence/absence is used in subclassing setup in numpy/distutils/core.py. -# However, we need to run the distutils version of sdist, so import that first -# so that it is in sys.modules import numpy.distutils.command.sdist # noqa import setuptools # noqa from numpy.distutils.core import Extension, setup from numpy.distutils.fcompiler import get_default_fcompiler -# Trying this from the numpy setup.py - - -here = os.path.dirname(__file__) -with open(os.path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - -install_requires = [ - "numpy", -] - # figure out which compiler we're going to use compiler = get_default_fcompiler() # set some fortran compiler-dependent flags f90flags = [] if compiler == "gnu95": - # f90flags.append('-fno-range-check') - # f90flags.append('-ffree-form') - # These are the flags I used in the manual version (might have some more here) f90flags.append("-fdefault-real-8") f90flags.append("-ffree-line-length-200") elif compiler == "intel" or compiler == "intelem": @@ -37,7 +18,7 @@ # Suppress all compiler warnings (avoid huge CI log files) f90flags.append("-w") -# for this API we will only expose a single extension? +# Extension modules ext_modules = [ Extension( name="mod_aerobulk_wrap_noskin", @@ -59,7 +40,6 @@ "./source/fortran/mod_aerobulk_wrap_noskin.pyf", ], extra_f90_compile_args=f90flags, - # f2py_options=['--quiet'], ), Extension( name="mod_aerobulk_wrap_skin", @@ -85,36 +65,8 @@ ), ] +# Minimal setup call - most configuration is now in pyproject.toml setup( - name="aerobulk-python", - description="General Circulation Model Postprocessing with xarray", - url="https://github.com/xgcm/aerobulk-python", - author="aerobulk-python Developers", - author_email="julius@ldeo.columbia.edu", - license="GPLv3", - classifiers=[ - "Development Status :: 2 - Pre-Alpha", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - ], - install_requires=install_requires, - python_requires=">=3.8, <3.12", - # long_description=long_description, - # long_description_content_type="text/x-rst", - setup_requires="setuptools_scm", - use_scm_version={ - "write_to": "source/aerobulk/_version.py", - "write_to_template": '__version__ = "{version}"', - "tag_regex": r"^(?Pv)?(?P[^\+]+)(?P.*)?$", - }, - package_dir={"": "source"}, - packages=["aerobulk"], ext_package="aerobulk.aerobulk", ext_modules=ext_modules, ) From d7642fbd53e8922230e5b2e3e1d225f4661daa20 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:19:57 +0000 Subject: [PATCH 11/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 894cf95..33eef8c 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ import os + import numpy.distutils.command.sdist # noqa import setuptools # noqa from numpy.distutils.core import Extension, setup From 69ff6418c61b07decee34ed9a43c5d74d9a95832 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:24:28 -0400 Subject: [PATCH 12/17] Update CI workflow to exclude Python 3.12 and 3.13 Removed Python version 3.12 and 3.13 from CI matrix. --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 39ac41d..a381e3a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,7 +27,7 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v3 with: From ad86896b7c888acf55ed531bb1fe18f289ff1da4 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:26:01 -0400 Subject: [PATCH 13/17] Update Python version to 3.11 in workflow --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fc5e2b4..2fea8bd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.x" + python-version: "3.11" - name: Install dependencies run: | python -m pip install --upgrade pip From 9fb6950c167de6f04991a70e54dde56331d89a61 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:30:24 -0400 Subject: [PATCH 14/17] Add pythonpath to pytest configuration --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 95a6044..d5f2131 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,3 +66,4 @@ ignore = [ [tool.pytest.ini_options] testpaths = ["tests"] +pythonpath = ["source"] From 84d76e9faf9e1e6d4fc77340d62cae0d89c5edbf Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:31:30 -0400 Subject: [PATCH 15/17] Remove pythonpath from pytest configuration --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d5f2131..95a6044 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,4 +66,3 @@ ignore = [ [tool.pytest.ini_options] testpaths = ["tests"] -pythonpath = ["source"] From f517824d72f647f504e14796c6de51ff0120c873 Mon Sep 17 00:00:00 2001 From: Julius Busecke <14314623+jbusecke@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:36:36 -0400 Subject: [PATCH 16/17] Update source paths and package name in setup.py --- setup.py | 63 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/setup.py b/setup.py index 33eef8c..dc9b1d0 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ import os - import numpy.distutils.command.sdist # noqa import setuptools # noqa from numpy.distutils.core import Extension, setup @@ -24,42 +23,42 @@ Extension( name="mod_aerobulk_wrap_noskin", sources=[ - "./source/fortran/aerobulk/src/mod_const.f90", - "./source/fortran/aerobulk/src/mod_phymbl.f90", - "./source/fortran/aerobulk/src/mod_skin_coare.f90", - "./source/fortran/aerobulk/src/mod_skin_ecmwf.f90", - "./source/fortran/aerobulk/src/mod_blk_andreas.f90", - "./source/fortran/aerobulk/src/mod_common_coare.f90", - "./source/fortran/aerobulk/src/mod_blk_coare3p0.f90", - "./source/fortran/aerobulk/src/mod_blk_coare3p6.f90", - "./source/fortran/aerobulk/src/mod_blk_ecmwf.f90", - "./source/fortran/aerobulk/src/mod_blk_ncar.f90", - "./source/fortran/aerobulk/src/mod_blk_neutral_10m.f90", - "./source/fortran/aerobulk/src/mod_aerobulk_compute.f90", - "./source/fortran/aerobulk/src/mod_aerobulk.f90", - "./source/fortran/mod_aerobulk_wrap_noskin.f90", - "./source/fortran/mod_aerobulk_wrap_noskin.pyf", + "source/fortran/aerobulk/src/mod_const.f90", + "source/fortran/aerobulk/src/mod_phymbl.f90", + "source/fortran/aerobulk/src/mod_skin_coare.f90", + "source/fortran/aerobulk/src/mod_skin_ecmwf.f90", + "source/fortran/aerobulk/src/mod_blk_andreas.f90", + "source/fortran/aerobulk/src/mod_common_coare.f90", + "source/fortran/aerobulk/src/mod_blk_coare3p0.f90", + "source/fortran/aerobulk/src/mod_blk_coare3p6.f90", + "source/fortran/aerobulk/src/mod_blk_ecmwf.f90", + "source/fortran/aerobulk/src/mod_blk_ncar.f90", + "source/fortran/aerobulk/src/mod_blk_neutral_10m.f90", + "source/fortran/aerobulk/src/mod_aerobulk_compute.f90", + "source/fortran/aerobulk/src/mod_aerobulk.f90", + "source/fortran/mod_aerobulk_wrap_noskin.f90", + "source/fortran/mod_aerobulk_wrap_noskin.pyf", ], extra_f90_compile_args=f90flags, ), Extension( name="mod_aerobulk_wrap_skin", sources=[ - "./source/fortran/aerobulk/src/mod_const.f90", - "./source/fortran/aerobulk/src/mod_phymbl.f90", - "./source/fortran/aerobulk/src/mod_skin_coare.f90", - "./source/fortran/aerobulk/src/mod_skin_ecmwf.f90", - "./source/fortran/aerobulk/src/mod_blk_andreas.f90", - "./source/fortran/aerobulk/src/mod_common_coare.f90", - "./source/fortran/aerobulk/src/mod_blk_coare3p0.f90", - "./source/fortran/aerobulk/src/mod_blk_coare3p6.f90", - "./source/fortran/aerobulk/src/mod_blk_ecmwf.f90", - "./source/fortran/aerobulk/src/mod_blk_ncar.f90", - "./source/fortran/aerobulk/src/mod_blk_neutral_10m.f90", - "./source/fortran/aerobulk/src/mod_aerobulk_compute.f90", - "./source/fortran/aerobulk/src/mod_aerobulk.f90", - "./source/fortran/mod_aerobulk_wrap_skin.f90", - "./source/fortran/mod_aerobulk_wrap_skin.pyf", + "source/fortran/aerobulk/src/mod_const.f90", + "source/fortran/aerobulk/src/mod_phymbl.f90", + "source/fortran/aerobulk/src/mod_skin_coare.f90", + "source/fortran/aerobulk/src/mod_skin_ecmwf.f90", + "source/fortran/aerobulk/src/mod_blk_andreas.f90", + "source/fortran/aerobulk/src/mod_common_coare.f90", + "source/fortran/aerobulk/src/mod_blk_coare3p0.f90", + "source/fortran/aerobulk/src/mod_blk_coare3p6.f90", + "source/fortran/aerobulk/src/mod_blk_ecmwf.f90", + "source/fortran/aerobulk/src/mod_blk_ncar.f90", + "source/fortran/aerobulk/src/mod_blk_neutral_10m.f90", + "source/fortran/aerobulk/src/mod_aerobulk_compute.f90", + "source/fortran/aerobulk/src/mod_aerobulk.f90", + "source/fortran/mod_aerobulk_wrap_skin.f90", + "source/fortran/mod_aerobulk_wrap_skin.pyf", ], extra_f90_compile_args=f90flags, f2py_options=["--quiet"], @@ -68,6 +67,6 @@ # Minimal setup call - most configuration is now in pyproject.toml setup( - ext_package="aerobulk.aerobulk", + ext_package="aerobulk", ext_modules=ext_modules, ) From 12f48da3dbeb4730d68e44d404ad45a801019d84 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:36:42 +0000 Subject: [PATCH 17/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index dc9b1d0..01e5cfc 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ import os + import numpy.distutils.command.sdist # noqa import setuptools # noqa from numpy.distutils.core import Extension, setup