diff --git a/.github/workflows/basemap-data-hires.yml b/.github/workflows/basemap-data-hires.yml deleted file mode 100644 index a33ddb149..000000000 --- a/.github/workflows/basemap-data-hires.yml +++ /dev/null @@ -1,137 +0,0 @@ -name: basemap-data-hires - -env: - PKGDIR: "packages/basemap_data_hires" - PIP_DEFAULT_TIMEOUT: 10 - PIP_DISABLE_PIP_VERSION_CHECK: 1 - PIP_PREFER_BINARY: 1 - PIP_RETRIES: 0 - PYTHONUNBUFFERED: "1" - PYTHONWARNINGS: "ignore:DEPRECATION" - -on: - push: - paths: - - ".github/workflows/basemap-data-hires.yml" - - "packages/basemap_data_hires/**" - pull_request: - paths: - - ".github/workflows/basemap-data-hires.yml" - - "packages/basemap_data_hires/**" - workflow_dispatch: - -jobs: - - checkout: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v4 - - - name: Upload checkout - uses: actions/upload-artifact@v4 - with: - name: checkout - path: . - - build: - strategy: - matrix: - python-version: - ["2.7"] - max-parallel: 1 - needs: checkout - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Build sdist and wheel - run: | - cd ${{ env.PKGDIR }} - python setup.py sdist - pip wheel -w dist --no-deps dist/*.zip - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - test: - strategy: - matrix: - python-version: - ["2.6", "2.7", "3.2", "3.3", "3.4", "3.5", "3.6", "3.7", "3.8", - "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: build - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - - name: Install package - run: | - pip install ${{ env.PKGDIR }}/dist/*.whl - - - name: Test package - run: | - python -c "from mpl_toolkits import basemap_data; print(basemap_data)" - - upload: - strategy: - matrix: - python-version: - ["2.7"] - max-parallel: 1 - if: startsWith(github.event.ref, 'refs/tags/v') - needs: test - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - environment: PyPI - steps: - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - - name: Install upload requirements - run: | - pip install twine - - - name: Check distributables - run: | - python -m twine check \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*.whl - - - name: Upload distributables - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: "${{ secrets.PYPI_TOKEN }}" - TWINE_REPOSITORY_URL: "${{ secrets.PYPI_REPOSITORY_URL }}" - run: | - python -m twine upload --skip-existing \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*.whl diff --git a/.github/workflows/basemap-data.yml b/.github/workflows/basemap-data.yml deleted file mode 100644 index 629213f31..000000000 --- a/.github/workflows/basemap-data.yml +++ /dev/null @@ -1,137 +0,0 @@ -name: basemap-data - -env: - PKGDIR: "packages/basemap_data" - PIP_DEFAULT_TIMEOUT: 10 - PIP_DISABLE_PIP_VERSION_CHECK: 1 - PIP_PREFER_BINARY: 1 - PIP_RETRIES: 0 - PYTHONUNBUFFERED: "1" - PYTHONWARNINGS: "ignore:DEPRECATION" - -on: - push: - paths: - - ".github/workflows/basemap-data.yml" - - "packages/basemap_data/**" - pull_request: - paths: - - ".github/workflows/basemap-data.yml" - - "packages/basemap_data/**" - workflow_dispatch: - -jobs: - - checkout: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v4 - - - name: Upload checkout - uses: actions/upload-artifact@v4 - with: - name: checkout - path: . - - build: - strategy: - matrix: - python-version: - ["2.7"] - max-parallel: 1 - needs: checkout - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Build sdist and wheel - run: | - cd ${{ env.PKGDIR }} - python setup.py sdist - pip wheel -w dist --no-deps dist/*.zip - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - test: - strategy: - matrix: - python-version: - ["2.6", "2.7", "3.2", "3.3", "3.4", "3.5", "3.6", "3.7", "3.8", - "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: build - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - - name: Install package - run: | - pip install ${{ env.PKGDIR }}/dist/*.whl - - - name: Test package - run: | - python -c "from mpl_toolkits import basemap_data; print(basemap_data)" - - upload: - strategy: - matrix: - python-version: - ["2.7"] - max-parallel: 1 - if: startsWith(github.event.ref, 'refs/tags/v') - needs: test - runs-on: ubuntu-latest - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - environment: PyPI - steps: - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build - path: ${{ env.PKGDIR }}/dist - - - name: Install upload requirements - run: | - pip install twine - - - name: Check distributables - run: | - python -m twine check \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*.whl - - - name: Upload distributables - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: "${{ secrets.PYPI_TOKEN }}" - TWINE_REPOSITORY_URL: "${{ secrets.PYPI_REPOSITORY_URL }}" - run: | - python -m twine upload --skip-existing \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*.whl diff --git a/.github/workflows/basemap-for-manylinux.yml b/.github/workflows/basemap-for-manylinux.yml deleted file mode 100644 index 617568c9a..000000000 --- a/.github/workflows/basemap-for-manylinux.yml +++ /dev/null @@ -1,449 +0,0 @@ -name: basemap-for-manylinux - -env: - PKGDIR: "packages/basemap" - PIP_DEFAULT_TIMEOUT: 10 - PIP_DISABLE_PIP_VERSION_CHECK: 1 - PIP_PREFER_BINARY: 1 - PIP_RETRIES: 0 - PYTHONUNBUFFERED: "1" - PYTHONWARNINGS: "ignore:DEPRECATION" - -on: - push: - paths: - - ".github/workflows/basemap-for-manylinux.yml" - - "packages/basemap/**" - pull_request: - paths: - - ".github/workflows/basemap-for-manylinux.yml" - - "packages/basemap/**" - workflow_dispatch: - -jobs: - - checkout: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v1 - - - name: Upload checkout - uses: actions/upload-artifact@v1 - with: - name: checkout - path: . - - lint: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: checkout - container: "pylegacy/python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v1 - with: - name: checkout - path: . - - - name: Install lint requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements-lint.txt - - - name: Install library requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements.txt - - - name: Run Flake8 - run: | - cd ${{ env.PKGDIR }} - if [ -x "$(command -v flake8)" ]; then - flake8 src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test; - fi - - - name: Run PyLint - run: | - cd ${{ env.PKGDIR }} - if [ -x "$(command -v pylint)" ]; then - pylint src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test; - fi - - build-geos: - strategy: - matrix: - arch: - ["x64", "x86"] - max-parallel: 2 - fail-fast: false - needs: lint - runs-on: ubuntu-latest - container: "pylegacy/${{ matrix.arch }}-python:3.8-debian-4" - steps: - - - name: Download checkout - uses: actions/download-artifact@v1 - with: - name: checkout - path: . - - - name: Install CMake 3.6.2 - run: | - apt-get update - apt-get install -y libidn11 - pkgvers=3.6.2 - pkgname=cmake - pkgcode=cmake-${pkgvers} - case "${{ matrix.arch }}" in - x86) pkgfile=${pkgcode}-Linux-i386.tar.gz;; - *) pkgfile=${pkgcode}-Linux-x86_64.tar.gz;; - esac - wget https://github.com/Kitware/CMake/releases/download/v${pkgvers}/${pkgfile} -P /tmp - tar -xf /tmp/${pkgfile} --strip-components=1 -C /usr - rm -rf /tmp/${pkgfile} - - - name: Install GCC toolchain - run: | - apt-get update - apt-get install -y gcc g++ make - - - name: Build GEOS from source - run: | - cd ${{ env.PKGDIR }} - python -c "import utils; utils.GeosLibrary('3.6.5').build('extern', njobs=16)" - - - name: Upload GEOS artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-geos-${{ matrix.arch }} - path: ${{ env.PKGDIR }}/extern - - build: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: build-geos - runs-on: ubuntu-latest - container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-4" - steps: - - - name: Download checkout - uses: actions/download-artifact@v1 - with: - name: checkout - path: . - - - name: Download GEOS artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-geos-${{ matrix.arch }} - path: ${{ env.PKGDIR }}/extern - - - name: Install GCC toolchain - run: | - apt-get update - apt-get install -y gcc g++ make - - - name: Build old numpy from source - run: | - case "${{ matrix.arch }}" in - x64) arch="x86_64" ;; - x86) arch="i686" ;; - esac - case "${{ matrix.python-version }}" in - 2.6|3.[23]) pkgvers=1.11.3; tag=manylinux1 ;; - 2.7|3.[456789]) pkgvers=1.16.6; tag=manylinux1 ;; - 3.10) pkgvers=1.21.4; tag=manylinux1 ;; - 3.11) pkgvers=1.23.3; tag=manylinux_2_17 ;; - *) pkgvers=1.26.1; tag=manylinux_2_28 ;; - esac - case "${{ matrix.python-version }}" in - 3.11|3.12) - # Dirty solution to get NumPy headers for Python 3.11 and 3.12. - kwds="--plat=${tag}_${arch}" - pip download --no-deps ${kwds} "numpy==${pkgvers}" - oldpkgfile=$(ls *.whl | head -n1) - newpkgfile=$(echo "${oldpkgfile}" | sed "s/${tag}/linux/") - mv "${oldpkgfile}" "${newpkgfile}" - pip install "${newpkgfile}" - rm "${newpkgfile}" - ;; - *) - pip install "numpy == ${pkgvers}" - ;; - esac - - - name: Build wheel - run: | - sitepkgdir=$(pip show numpy 2>/dev/null | grep Location: | cut -d' ' -f2) - export GEOS_DIR="${GITHUB_WORKSPACE}/${{ env.PKGDIR }}/extern" - export NUMPY_INCLUDE_PATH=${sitepkgdir}/numpy/core/include - case "${{ matrix.python-version }}" in - 3.11|3.12) - kwds="--no-build-isolation" - pip install setuptools wheel "cython >= 0.29, < 3.1" - ;; - esac - cd ${{ env.PKGDIR }} - python setup.py sdist - pip wheel -w dist --no-deps ${kwds} dist/*.zip - - - name: Upload build artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - repair: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: build - runs-on: ubuntu-latest - container: "pylegacy/${{ matrix.arch }}-python:3.8-debian-10" - steps: - - - name: Download GEOS artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-geos-${{ matrix.arch }} - path: ${{ env.PKGDIR }}/extern - - - name: Download build artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - - name: Install auditwheel - run: | - apt-get update - apt-get install -y unzip - pip install patchelf - pip install "auditwheel < 4.0" - - - name: Repair wheel - run: | - cd ${{ env.PKGDIR }} - export LD_LIBRARY_PATH="$(readlink -f extern/lib)" - auditwheel repair -w dist dist/*.whl - - - name: Upload build artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - test: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - exclude: - # Missing precompiled binaries for `numpy`, `matplotlib`, - # `pyproj`, `pillow` and `lxml`. - - arch: "x86" - python-version: "3.12" - max-parallel: 3 - fail-fast: false - needs: repair - runs-on: ubuntu-latest - container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v1 - with: - name: checkout - path: . - - - name: Download build artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - - name: Install numpy from source - run: | - apt-get update - apt-get install -y gcc g++ make - pip install "numpy < 1.24" - if: matrix.arch == 'x86' && (matrix.python-version >= '3.8' || matrix.python-version >= '3.10') - - - name: Install test requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements-test.txt - - - name: Install package (full) - run: | - whlpath=$(ls ${{ env.PKGDIR }}/dist/*-manylinux1*.whl | head -n1) - pip install "${whlpath}[owslib,pillow]" - - - name: Test package - run: | - cd ${{ env.PKGDIR }} - export COVERAGE_FILE=.coverage.${{ matrix.python-version }} - python -m pytest \ - --cov="mpl_toolkits.basemap" --cov-report=term \ - --ignore=dist --ignore=build - - - name: Upload test artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-test - path: ${{ env.PKGDIR }}/.coverage.${{ matrix.python-version }} - - coverage: - needs: test - runs-on: ubuntu-latest - container: "pylegacy/python:3.8-debian-10" - steps: - - - name: Checkout - uses: actions/checkout@v1 - - - name: Download test artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-test - path: ${{ env.PKGDIR }} - - - name: Install test requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements-test.txt - - - name: Compute combined coverage - run: | - cd ${{ env.PKGDIR }} - coverage combine - coverage html - coverage report - - - name: Upload coverage artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-coverage - path: ${{ env.PKGDIR }}/htmlcov - - docs: - needs: test - runs-on: ubuntu-latest - container: "pylegacy/python:3.8-debian-10" - steps: - - - name: Download checkout - uses: actions/download-artifact@v1 - with: - name: checkout - path: . - - - name: Install doc requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements-doc.txt - - - name: Download build artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-build-x64-3.8 - path: ${{ env.PKGDIR }}/dist - - - name: Install package - run: | - cd ${{ env.PKGDIR }} - pip install dist/*-manylinux1*.whl - - - name: Run sphinx - run: | - cd ${{ env.PKGDIR }} - python -m sphinx doc/source public - - - name: Upload docs artifacts - uses: actions/upload-artifact@v1 - with: - name: artifacts-docs - path: ${{ env.PKGDIR }}/public - - - name: Upload github-pages artifact - uses: actions/upload-pages-artifact@v3 - with: - name: github-pages - path: ${{ env.PKGDIR }}/public - - pages: - if: startsWith(github.event.ref, 'refs/tags/v') - needs: docs - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - permissions: - pages: write - id-token: write - steps: - - name: Deploy github-pages - uses: actions/deploy-pages@v3 - id: deployment - - upload: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 1 - if: startsWith(github.event.ref, 'refs/tags/v') - needs: test - runs-on: ubuntu-latest - container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-10" - environment: PyPI - steps: - - - name: Download build artifacts - uses: actions/download-artifact@v1 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - - name: Install upload requirements - run: | - pip install twine - - - name: Check distributables - run: | - python -m twine check \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*-manylinux1*.whl - - - name: Upload distributables - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: "${{ secrets.PYPI_TOKEN }}" - TWINE_REPOSITORY_URL: "${{ secrets.PYPI_REPOSITORY_URL }}" - run: | - python -m twine upload --skip-existing \ - ${{ env.PKGDIR }}/dist/*.zip \ - ${{ env.PKGDIR }}/dist/*-manylinux1*.whl diff --git a/.github/workflows/basemap-for-windows.yml b/.github/workflows/basemap-for-windows.yml deleted file mode 100644 index 92eb337fc..000000000 --- a/.github/workflows/basemap-for-windows.yml +++ /dev/null @@ -1,326 +0,0 @@ -name: basemap-for-windows - -env: - PKGDIR: "packages/basemap" - PIP_DEFAULT_TIMEOUT: 10 - PIP_DISABLE_PIP_VERSION_CHECK: 1 - PIP_PREFER_BINARY: 1 - PIP_RETRIES: 0 - PYTHONUNBUFFERED: "1" - PYTHONWARNINGS: "ignore:DEPRECATION" - -on: - push: - paths: - - ".github/workflows/basemap-for-windows.yml" - - "!packages/basemap/doc/**" - - "packages/basemap/**" - pull_request: - paths: - - ".github/workflows/basemap-for-windows.yml" - - "!packages/basemap/doc/**" - - "packages/basemap/**" - workflow_dispatch: - -jobs: - - checkout: - runs-on: windows-2019 - steps: - - - name: Checkout - uses: actions/checkout@v4 - - - name: Upload checkout - uses: actions/upload-artifact@v4 - with: - name: checkout - path: . - - lint: - runs-on: windows-2019 - strategy: - matrix: - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: checkout - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Set Python - uses: pylegacy/actions/setup-pyenv-win@v2 - with: - architecture: ${{ matrix.arch }} - python-version: ${{ matrix.python-version }} - - - name: Set Python base packages - run: | - python -m pip install --upgrade pip setuptools wheel - - - name: Install lint requirements - run: | - cd ${{ env.PKGDIR }} - python -m pip install -r requirements-lint.txt - - - name: Install library requirements - run: | - cd ${{ env.PKGDIR }} - python -m pip install -r requirements.txt - - - name: Run Flake8 - run: | - cd ${{ env.PKGDIR }} - if (Get-Command flake8 -errorAction SilentlyContinue) - { - flake8 src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test; - } - - - name: Run PyLint - run: | - cd ${{ env.PKGDIR }} - if (Get-Command pylint -errorAction SilentlyContinue) - { - pylint src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test; - } - - build-geos: - strategy: - matrix: - arch: - ["x64", "x86"] - msvc-toolset: - ["9.0", "14.0"] - include: - - msvc-toolset: "9.0" - python-version: "2.7" - - msvc-toolset: "14.0" - python-version: "3.5" - max-parallel: 4 - fail-fast: false - needs: lint - runs-on: windows-2019 - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Set MSVC toolset - uses: pylegacy/actions/setup-msvc@v2 - with: - arch: ${{ matrix.arch }} - toolset: ${{ matrix.msvc-toolset }} - - - name: Set CMake - uses: jwlawson/actions-setup-cmake@v2.0 - with: - cmake-version: "3.24.2" - - - name: Set Python - uses: pylegacy/actions/setup-pyenv-win@v2 - with: - architecture: ${{ matrix.arch }} - python-version: ${{ matrix.python-version }} - - - name: Build GEOS from source - run: | - cd ${{ env.PKGDIR }} - python -c "import utils; utils.GeosLibrary('3.6.5').build('extern', toolset='${{ matrix.msvc-toolset }}', njobs=16)" - - - name: Upload GEOS artifacts - uses: actions/upload-artifact@v4 - with: - name: artifacts-geos-${{ matrix.arch }}-msvc${{ matrix.msvc-toolset }} - path: ${{ env.PKGDIR }}/extern - - build: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 3 - fail-fast: false - needs: build-geos - runs-on: windows-2019 - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Set Python - uses: pylegacy/actions/setup-pyenv-win@v2 - with: - architecture: ${{ matrix.arch }} - python-version: ${{ matrix.python-version }} - - - name: Set Python base packages - run: | - python -m pip install --upgrade pip setuptools wheel - - - name: Build old numpy from source - run: | - Switch -regex ("${{ matrix.python-version }}") { - "^2\.6|3\.[123]$" { Set-Variable -Name "pkgvers" -Value "1.11.3" } - "^2\.7|3\.[456789]$" { Set-Variable -Name "pkgvers" -Value "1.16.6" } - "^3\.10$" { Set-Variable -Name "pkgvers" -Value "1.21.4" } - "^3\.11$" { Set-Variable -Name "pkgvers" -Value "1.23.3" } - default { Set-Variable -Name "pkgvers" -Value "1.26.1" } - } - $env:SETUPTOOLS_USE_DISTUTILS = "stdlib" - python -m pip install "numpy == ${pkgvers}" - - - name: Set MSVC toolset version - run: | - if ("${{ matrix.python-version }}" -eq "2.7") { - echo "msvc-toolset=9.0" >> $env:GITHUB_ENV - } else { - echo "msvc-toolset=14.0" >> $env:GITHUB_ENV - } - - - name: Set MSVC toolset - uses: pylegacy/actions/setup-msvc@v2 - with: - arch: ${{ matrix.arch }} - toolset: ${{ env.msvc-toolset }} - - - name: Download GEOS artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-geos-${{ matrix.arch }}-msvc${{ env.msvc-toolset }} - path: ${{ env.PKGDIR }}/extern - - - name: Build sdist and wheel - run: | - cd ${{ env.PKGDIR }} - $env:GEOS_DIR = "$env:GITHUB_WORKSPACE/${{ env.PKGDIR }}/extern" - python -m pip install -r requirements-setup.txt - python setup.py sdist - python -m pip wheel -w dist --no-deps (Get-Item dist/*.zip) - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - test: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - exclude: - # Missing precompiled binaries for `numpy` and `matplotlib`. - - arch: "x86" - python-version: "3.12" - max-parallel: 3 - fail-fast: false - needs: build - runs-on: windows-2019 - steps: - - - name: Download checkout - uses: actions/download-artifact@v4 - with: - name: checkout - path: . - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - - name: Set Python - uses: pylegacy/actions/setup-pyenv-win@v2 - with: - architecture: ${{ matrix.arch }} - python-version: ${{ matrix.python-version }} - - - name: Set Python base packages - run: | - python -m pip install --upgrade pip setuptools wheel - - - name: Install test requirements - run: | - cd ${{ env.PKGDIR }} - pip install -r requirements-test.txt - - - name: Install package (full) - run: | - $whlpath = "$(Get-Item ${{ env.PKGDIR }}/dist/*-win*.whl)" - python -m pip install "${whlpath}[owslib,pillow]" - - - name: Test package - run: | - cd ${{ env.PKGDIR }} - $env:COVERAGE_FILE = ".coverage.${{ matrix.arch }}.${{ matrix.python-version }}" - python -m pytest ` - --cov="mpl_toolkits.basemap" --cov-report=term ` - --ignore=dist --ignore=build - - - name: Upload test artifacts - uses: actions/upload-artifact@v4 - with: - name: artifacts-test-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/.coverage.${{ matrix.arch }}.${{ matrix.python-version }} - - upload: - strategy: - matrix: - arch: - ["x64", "x86"] - python-version: - ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] - max-parallel: 1 - if: startsWith(github.event.ref, 'refs/tags/v') - needs: test - runs-on: windows-2019 - environment: PyPI - steps: - - - name: Set Python - uses: pylegacy/actions/setup-pyenv-win@v2 - with: - architecture: ${{ matrix.arch }} - python-version: ${{ matrix.python-version }} - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }} - path: ${{ env.PKGDIR }}/dist - - - name: Install upload requirements - run: | - python -m pip install twine - - - name: Check distributables - run: | - python -m twine check ` - ${{ env.PKGDIR }}/dist/*.zip ` - ${{ env.PKGDIR }}/dist/*.whl - - - name: Upload distributables - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: "${{ secrets.PYPI_TOKEN }}" - TWINE_REPOSITORY_URL: "${{ secrets.PYPI_REPOSITORY_URL }}" - run: | - python -m twine upload --skip-existing ` - ${{ env.PKGDIR }}/dist/*.whl diff --git a/.github/workflows/build-data.yml b/.github/workflows/build-data.yml new file mode 100644 index 000000000..3f24c176c --- /dev/null +++ b/.github/workflows/build-data.yml @@ -0,0 +1,86 @@ +name: Build Data Packages + +env: + PYTHONUNBUFFERED: "1" + PYTHONWARNINGS: "ignore:DEPRECATION" + +on: + push: + paths: + - "packages/basemap_data/**" + - "packages/basemap_data_hires/**" + pull_request: + paths: + - "packages/basemap_data/**" + - "packages/basemap_data_hires/**" + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + package: [basemap_data, basemap_data_hires] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.9" + + - name: Build package + run: | + cd packages/${{ matrix.package }} + pip install build + python -m build + + - uses: actions/upload-artifact@v4 + with: + name: dist-${{ matrix.package }} + path: packages/${{ matrix.package }}/dist/* + + upload_testpypi: + needs: [build] + runs-on: ubuntu-20.04 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + strategy: + matrix: + package: [basemap_data, basemap_data_hires] + environment: + name: TestPyPI + url: https://test.pypi.org/p/${{ matrix.package }} + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + name: dist-${{ matrix.package }} + path: dist + + - name: Upload to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + + upload_pypi: + needs: [build, upload_testpypi] + runs-on: ubuntu-latest + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + strategy: + matrix: + package: [basemap_data, basemap_data_hires] + environment: + name: PyPI + url: https://pypi.org/p/${{ matrix.package }} + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + name: dist-${{ matrix.package }} + path: dist + + - name: Upload to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..522923c9a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,131 @@ +name: Build and Test + +env: + PKGDIR: "packages/basemap" + CIBW_BUILD_VERBOSITY: 1 + PYTHONUNBUFFERED: "1" + PYTHONWARNINGS: "ignore:DEPRECATION" + GEO_VERSION: "3.6.5" + +on: + push: + paths: + - ".github/workflows/**" + - "packages/basemap/**" + pull_request: + paths: + - ".github/workflows/**" + - "packages/basemap/**" + workflow_dispatch: + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-2019, macos-11] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.9" + + - name: Setup CMake + uses: jwlawson/actions-setup-cmake@v1.13 + with: + cmake-version: "3.16.x" + + - name: Setup C++ toolchain (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y build-essential + + - name: Setup Visual Studio Developer Command Prompt + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1 + + - name: Setup C++ toolchain (macOS) + if: runner.os == 'macOS' + run: | + xcode-select --install || true + + - name: Install cibuildwheel + run: python -m pip install cibuildwheel==2.16.2 + + - name: Set GEO src directory + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + echo "GEO_DIR=D:/a/basemap/basemap/geo" >> $GITHUB_ENV + else + echo "GEO_DIR=/project/geo" >> $GITHUB_ENV + fi + + - name: Build wheels + env: + CIBW_BUILD: "cp{39,310,311,312}-{manylinux_x86_64,win_amd64,macosx_x86_64}" + CIBW_SKIP: "*-manylinux_i686 *-musllinux* pp*" + CIBW_BEFORE_BUILD: > + python -c "import utils; utils.GeosLibrary('${{ env.GEO_VERSION }}').build('${{ env.GEO_DIR}}', njobs=16)" + + CIBW_ENVIRONMENT_WINDOWS: | + GEOS_DIR=${{ env.GEO_DIR }} + INCLUDE=${{ env.GEO_DIR }}/include;%%INCLUDE%% + LIB=${{ env.GEO_DIR }}/lib;%%LIB%% + PATH=${{ env.GEO_DIR }}/bin;%%PATH%% + + CIBW_ENVIRONMENT_LINUX: | + GEOS_DIR=${{ env.GEO_DIR }} + CFLAGS="-I${{ env.GEO_DIR }}/include" + LDFLAGS="-L${{ env.GEO_DIR }}/lib" + LD_LIBRARY_PATH="${{ env.GEO_DIR }}/lib:$LD_LIBRARY_PATH" + + CIBW_ENVIRONMENT_MACOS: | + GEOS_DIR=${{ env.GEO_DIR }} + CFLAGS=-I${{ env.GEO_DIR }}/include + LDFLAGS=-L${{ env.GEO_DIR }}/lib + DYLD_LIBRARY_PATH=${{ env.GEO_DIR }}/lib:$DYLD_LIBRARY_PATH + + CIBW_REPAIR_WHEEL_COMMAND_LINUX: >- + mkdir -p {dest_dir}/.libs && + cp ${{ env.GEO_DIR }}/lib/libgeos*.so* {dest_dir}/.libs/ && + auditwheel repair + --lib-sdir .libs + -w {dest_dir} + {wheel} + + CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: >- + mkdir "{dest_dir}\libs" && + copy "%GEO_DIR%\bin\geos*.dll" "{dest_dir}\libs\" && + copy "{wheel}" "{dest_dir}\" && + dir /s /b "{dest_dir}\libs" + + CIBW_REPAIR_WHEEL_COMMAND_MACOS: >- + mkdir -p {dest_dir}/.libs && + cp ${{ env.GEO_DIR }}/lib/libgeos*.dylib {dest_dir}/.libs/ && + delocate-wheel -w {dest_dir} -v {wheel} + + CIBW_TEST_COMMAND_WINDOWS: >- + pip install pytest pytest-cov && + pip install {wheel} && + echo "Project path: {project}" && + python -m pytest "{project}\test" --cov="mpl_toolkits.basemap" --cov-report=term --ignore=dist --ignore=build + + CIBW_TEST_COMMAND: >- + cd {project} && + pip install pytest pytest-cov && + python -m pytest --cov="mpl_toolkits.basemap" --cov-report=term --ignore=dist --ignore=build + + run: | + cd ${{ env.PKGDIR }} + python -m cibuildwheel --output-dir wheelhouse + + - uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }} + path: ${{ env.PKGDIR }}/wheelhouse/*.whl diff --git a/packages/basemap/build.py b/packages/basemap/build.py new file mode 100644 index 000000000..d89af428c --- /dev/null +++ b/packages/basemap/build.py @@ -0,0 +1,9 @@ +def get_requirements(filename): + """Read requirements from file.""" + with open(filename) as f: + return [line.strip() for line in f if line.strip() and not line.startswith('#')] + +def get_package_data(): + return { + "mpl_toolkits.basemap": ["data/*"] + } \ No newline at end of file diff --git a/packages/basemap/pyproject.toml b/packages/basemap/pyproject.toml index 6a50e2c78..d6881fce6 100644 --- a/packages/basemap/pyproject.toml +++ b/packages/basemap/pyproject.toml @@ -1,15 +1,92 @@ [build-system] requires = [ - 'setuptools', - 'wheel', - 'numpy == 1.26.1; python_version >= "3.12"', - 'numpy == 1.23.3; python_version == "3.11"', - 'numpy == 1.21.4; python_version == "3.10"', - 'numpy == 1.21.4; sys_platform == "darwin" and (python_version >= "3.7" and python_version <= "3.9")', - 'numpy == 1.16.6; sys_platform != "darwin" and (python_version >= "3.7" and python_version <= "3.9")', - 'numpy == 1.16.6; python_version == "2.7" or (python_version >= "3.4" and python_version <= "3.6")', - 'numpy == 1.11.3; python_version == "2.6" or (python_version >= "3.2" and python_version <= "3.3")', - 'cython >= 0.29, < 3.1; python_version >= "3.3" or python_version < "3.0"', - 'cython >= 0.26, < 0.27; python_version == "3.2"' + "setuptools>=42", + "wheel", + "numpy==2.0.0; python_version >= '3.9'", + "cython>=0.29.21,<3.1" ] build-backend = "setuptools.build_meta" + +[project] +name = "basemap" +dynamic = ["version", "dependencies", "optional-dependencies"] +description = "Plot data on map projections with matplotlib" +readme = "README.md" +requires-python = ">=3.9" +license = {text = "MIT"} +authors = [ + {name = "Jeff Whitaker", email = "jeffrey.s.whitaker@noaa.gov"} +] +maintainers = [ + {name = "Víctor Molina García", email = "molinav@users.noreply.github.com"} +] +keywords = ["GIS", "maps", "plots"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering :: Visualization", + "Topic :: Software Development :: Libraries :: Python Modules" +] + +[project.urls] +Homepage = "https://matplotlib.org/basemap" +Documentation = "https://matplotlib.org/basemap/" +Repository = "https://github.com/matplotlib/basemap" +"Bug Tracker" = "https://github.com/matplotlib/basemap/issues" + +[tool.setuptools] +packages = ["mpl_toolkits.basemap"] +namespace-packages = ["mpl_toolkits"] +package-dir = {"" = "src"} +license-files = ["LICENSE", "LICENSE.geos"] + +[tool.setuptools.package-data] +"mpl_toolkits.basemap" = ["data/*"] + +[tool.setuptools.exclude-package-data] +"*" = ["*.pyc", "**/__pycache__/*"] + +[tool.setuptools.dynamic] +version = {attr = "mpl_toolkits.basemap.__version__"} +dependencies = {file = "requirements.txt"} + +[tool.setuptools.dynamic.optional-dependencies] +doc = {file = ["requirements-doc.txt"]} +lint = {file = ["requirements-lint.txt"]} +test = {file = ["requirements-test.txt"]} +owslib = {file = ["requirements-owslib.txt"]} +pillow = {file = ["requirements-pillow.txt"]} + +[tool.pytest.ini_options] +filterwarnings = [ + "error", + "ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated:DeprecationWarning:unittest2.compatibility:143", + "ignore:datetime.datetime.utcfromtimestamp() is deprecated:DeprecationWarning:dateutil.tz.tz:37" +] + +[tool.coverage.paths] +source = [ + "src", + "/opt/pyenv/versions/**/site-packages" +] + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "def __str__", + "raise NotImplementedError", + "if __name__ == .__main__.:"] + + + +[tool.flake8] +ignore = ["E301", "E306", "E402", "E501", "E731", "F401", "F403", "W503", "W504"] diff --git a/packages/basemap/setup.cfg b/packages/basemap/setup.cfg deleted file mode 100644 index 58e39b69a..000000000 --- a/packages/basemap/setup.cfg +++ /dev/null @@ -1,42 +0,0 @@ -[metadata] -license_files = - LICENSE - LICENSE.geos - -[sdist] -formats = zip - -[flake8] -ignore = - E301,E306,E402,E501,E731,F401,F403,W503,W504 -# E301: expected-blank-line-missing -# E306: no-blank-line-before-nested-def -# E402: module-import-not-at-top-file -# E501: line-too-long -# E731: used-lambda -# F401: unused-import -# F403: wildcard-import -# W503: line-break-before-binary-operator -# W504: line-break-after-binary-operator - -[tool:pytest] -filterwarnings = - error - # To be removed when replacing `unittest2`. - ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated:DeprecationWarning:unittest2.compatibility:143 - # To be removed with `dateutil` release after 2.8.2. - # See: https://github.com/dateutil/dateutil/issues/1314 - ignore:datetime.datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:dateutil.tz.tz:37 - -[coverage:paths] -source = - src - /opt/pyenv/versions/**/site-packages - -[coverage:report] -exclude_lines = - pragma: no cover - def __repr__ - def __str__ - raise NotImplementedError - if __name__ == .__main__.: diff --git a/packages/basemap/setup.py b/packages/basemap/setup.py index 4c98a8776..c6a70f32f 100644 --- a/packages/basemap/setup.py +++ b/packages/basemap/setup.py @@ -1,272 +1,75 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- # flake8: noqa: E122 -"""basemap -- Plot data on map projections with matplotlib.""" - -import io -import os -import re -import sys -import glob -import warnings -from setuptools import setup -from setuptools import find_packages -from setuptools.command.sdist import sdist -from setuptools.extension import Extension - -try: - import Cython - cython_major_version = int(Cython.__version__.split(".", 1)[0]) -except ImportError: - cython_major_version = 0 - - -def get_content(name, splitlines=False): - """Return the file contents with project root as root folder.""" - - here = os.path.abspath(os.path.dirname(__file__)) - path = os.path.join(here, name) - with io.open(path, "r", encoding="utf-8") as fd: - content = fd.read() - if splitlines: - content = [row for row in content.splitlines() if row] - return content - - -def get_version(pkgname): - """Return package version without importing the file.""" - - here = os.path.abspath(os.path.dirname(__file__)) - path = os.path.join(*[here, "src"] + pkgname.split(".") + ["__init__.py"]) - with io.open(path, "r", encoding="utf-8") as fd: - pattern = r"""\n__version__[ ]*=[ ]*["']([^"]+)["']""" - return re.search(pattern, fd.read()).group(1) +import os, sys, glob, warnings +import numpy as np +from setuptools import setup, Extension def get_geos_install_prefix(): """Return GEOS installation prefix or None if not found.""" - env_candidate = os.environ.get("GEOS_DIR", None) if env_candidate is not None: - candidates = [env_candidate] - else: - candidates = [os.path.expanduser("~/local"), os.path.expanduser("~"), - "/usr/local", "/usr", "/opt/local", "/opt", "/sw"] + return env_candidate + + candidates = [ + os.path.expanduser("~/local"), + os.path.expanduser("~"), + "/usr/local", + "/usr", + "/opt/local", + "/opt", + "/sw", + ] - # Prepare filename pattern to find the GEOS library. extensions = {"win32": "dll", "cygwin": "dll", "darwin": "dylib"} libext = extensions.get(sys.platform, "so*") - libname = "*geos_c*.{0}".format(libext) + libname = f"*geos_c*.{libext}" libdirs = ["bin", "lib", "lib/x86_64-linux-gnu", "lib64"] for prefix in candidates: - libfiles = [] for libdir in libdirs: - libfiles.extend(glob.glob(os.path.join(prefix, libdir, libname))) - hfile = os.path.join(prefix, "include", "geos_c.h") - if os.path.isfile(hfile) and libfiles: - return prefix - - # At this point, the GEOS library was not found, so we throw a warning if - # the user is trying to build the library. - build_cmds = ("bdist_wheel", "build", "install") - if any(cmd in sys.argv[1:] for cmd in build_cmds): - warnings.warn(" ".join([ - "Cannot find GEOS library and/or headers in standard locations", - "('{0}'). Please install the corresponding packages using your", - "software management system or set the environment variable", - "GEOS_DIR to point to the location where GEOS is installed", - "(for example, if 'geos_c.h' is in '/usr/local/include'", - "and 'libgeos_c' is in '/usr/local/lib', then you need to", - "set GEOS_DIR to '/usr/local'", - ]).format("', '".join(candidates)), RuntimeWarning) + if glob.glob(os.path.join(prefix, libdir, libname)): + hfile = os.path.join(prefix, "include", "geos_c.h") + if os.path.isfile(hfile): + return prefix return None -class basemap_sdist(sdist): # pylint: disable=invalid-name - """Custom `sdist` so that it will not pack DLLs on Windows if present.""" - - def run(self): - """Custom `run` command.""" - - # Replace DLL data files and add GEOS build script. - orig_data_files = self.distribution.data_files - self.distribution.data_files = [ - (".", glob.glob(os.path.join("utils", "*.py")))] - - # Run the original `run` method and leave `data_files` as it was found. - try: - sdist.run(self) - finally: - self.distribution.data_files = orig_data_files - - -# Initialise include and library dirs. -data_files = [] -include_dirs = [] -library_dirs = [] -runtime_library_dirs = [] - -# Define NumPy include dirs. -numpy_include_path = os.environ.get("NUMPY_INCLUDE_PATH", None) -if numpy_include_path is not None: - include_dirs.append(numpy_include_path) -else: - try: - import numpy - include_dirs.append(numpy.get_include()) - except ImportError as err: - cmds = ("bdist_wheel", "build", "install") - if any(cmd in sys.argv[1:] for cmd in cmds): - warnings.warn("unable to locate NumPy headers", RuntimeWarning) - -# Define GEOS include, library and runtime dirs. -geos_install_prefix = get_geos_install_prefix() -if geos_install_prefix is not None: - include_dirs.append(os.path.join(geos_install_prefix, "include")) - library_dirs.append(os.path.join(geos_install_prefix, "lib")) - library_dirs.append(os.path.join(geos_install_prefix, "lib64")) - runtime_library_dirs = library_dirs - if os.name == "nt" or sys.platform == "cygwin": - # On Windows: - # - DLLs get installed under `bin`. - # - We need to inject later the DLL in the wheel using `data_files`. - # - We do not use `runtime_library_dirs` as workaround for a - # `distutils` bug (http://bugs.python.org/issue2437). - library_dirs.append(os.path.join(geos_install_prefix, "bin")) - runtime_library_dirs = [] - dlls = glob.glob(os.path.join(geos_install_prefix, "*", "*geos_c*.dll")) - if dlls: - data_files.append(("../..", sorted(dlls))) - -# Define `_geoslib` extension module. It cannot be installed in the -# `mpl_toolkits.basemap` namespace or `Basemap` objects will not be pickleable. -ext_modules = [ - Extension(**{ - "name": - "_geoslib", - "sources": [ - "src/_geoslib.pyx", - ], - "libraries": [ - "geos_c", - ], - "include_dirs": - include_dirs, - "library_dirs": - library_dirs, - "runtime_library_dirs": - runtime_library_dirs, - }), -] -for ext in ext_modules: - ext.cython_directives = [ - ("language_level", str(sys.version_info[0])), - ("legacy_implicit_noexcept", True), - ][:1 + int(cython_major_version >= 3)] - -# Define all the different requirements. -setup_requires = get_content("requirements-setup.txt", splitlines=True) -install_requires = get_content("requirements.txt", splitlines=True) -if sys.version_info[:2] == (3, 2): - # Hack for Python 3.2 because pip < 8 cannot handle version markers. - marker1 = '; python_version == "3.2"' - marker2 = '; python_version >= "2.7"' - setup_requires = [ - item.replace(marker1, "").replace(marker2, "") for item in setup_requires - if item.endswith(marker1) or item.endswith(marker2) - or "python_version" not in item] - install_requires = [ - item.replace(marker1, "").replace(marker2, "") for item in install_requires - if item.endswith(marker1) or item.endswith(marker2) - or "python_version" not in item] -else: - marker1 = '; python_version == "3.2"' - setup_requires = [item for item in setup_requires if not item.endswith(marker1)] - install_requires = [item for item in install_requires if not item.endswith(marker1)] - -setup(**{ - "name": - "basemap", - "version": - get_version("mpl_toolkits.basemap"), - "license": - "MIT", - "description": - "Plot data on map projections with matplotlib", - "long_description": - get_content("README.md"), - "long_description_content_type": - "text/markdown", - "url": - "https://matplotlib.org/basemap", - "author": - "Jeff Whitaker", - "author_email": - "jeffrey.s.whitaker@noaa.gov", - "maintainer": - "Víctor Molina García", - "maintainer_email": - "molinav@users.noreply.github.com", - "classifiers": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 3", - "Topic :: Scientific/Engineering :: Visualization", - "Topic :: Software Development :: Libraries :: Python Modules", - ], - "keywords": [ - "GIS", - "maps", - "plots", - ], - "namespace_packages": [ - "mpl_toolkits", - ], - "package_dir": - {"": "src"}, - "packages": - find_packages(where="src"), - "ext_modules": - ext_modules, - "data_files": - data_files, - "python_requires": - ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", - "<3.13", - ]), - "setup_requires": - setup_requires, - "install_requires": - install_requires, - "extras_require": { - "doc": - get_content("requirements-doc.txt", splitlines=True), - "lint": - get_content("requirements-lint.txt", splitlines=True), - "test": - get_content("requirements-test.txt", splitlines=True), - "owslib": - get_content("requirements-owslib.txt", splitlines=True), - "pillow": - get_content("requirements-pillow.txt", splitlines=True), - }, - "cmdclass": { - "sdist": basemap_sdist, - }, - "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": - "https://github.com/matplotlib/basemap", - }, -}) +def get_extension_kwargs(): + include_dirs = [np.get_include()] + library_dirs = [] + runtime_library_dirs = [] + data_files = [] + + # Get GEOS paths + geos_prefix = get_geos_install_prefix() + if geos_prefix: + include_dirs.append(os.path.join(geos_prefix, "include")) + lib_dir = os.path.join(geos_prefix, "lib") + lib64_dir = os.path.join(geos_prefix, "lib64") + library_dirs.extend([lib_dir, lib64_dir]) + runtime_library_dirs = library_dirs.copy() + + if os.name == "nt" or sys.platform == "cygwin": + bin_dir = os.path.join(geos_prefix, "bin") + library_dirs.append(bin_dir) + runtime_library_dirs = [] + dlls = glob.glob(os.path.join(geos_prefix, "*", "*geos_c*.dll")) + if dlls: + data_files.append(("../..", sorted(dlls))) + + return { + "name": "_geoslib", + "sources": ["src/_geoslib.pyx"], + "libraries": ["geos_c"], + "include_dirs": include_dirs, + "library_dirs": library_dirs, + "runtime_library_dirs": runtime_library_dirs, + } + + +setup( + ext_modules=[Extension(**get_extension_kwargs())], + data_files=get_extension_kwargs().get("data_files", []), +) diff --git a/packages/basemap/src/_geoslib.pyx b/packages/basemap/src/_geoslib.pyx index 676ac4d4b..6d1e36914 100644 --- a/packages/basemap/src/_geoslib.pyx +++ b/packages/basemap/src/_geoslib.pyx @@ -112,7 +112,7 @@ cdef extern from "geos_c.h": # Cython 3: Next cdef needs "noexcept" declaration unless # the compiler directive "legacy_implicit_noexcept" is used # ("noexcept" syntax supported since Cython 0.29.31). -cdef void notice_h(const char *fmt, ...): +cdef void notice_h(const char *fmt, ...) noexcept: pass #format = PyBytes_FromString(fmt) #message = PyBytes_FromString(msg) diff --git a/packages/basemap_data/build.py b/packages/basemap_data/build.py new file mode 100644 index 000000000..b3f686095 --- /dev/null +++ b/packages/basemap_data/build.py @@ -0,0 +1,31 @@ +import itertools + + +def get_data_files(): + # Define some helper lists + basenames = [ + "countries", + "countriesmeta", + "gshhs", + "gshhsmeta", + "rivers", + "riversmeta", + "states", + "statesmeta", + ] + resolutions = ["c", "l", "i", "h", "f"] + grids = ["1.25", "2.5", "5", "10"] + + # Define data assets + data_dat_files = [ + f"{basename}_{res}.dat" + for basename, res in itertools.product(basenames, resolutions[:3]) + ] + data_bin_files = [ + f"lsmask_{grid}min_{res}.bin" + for grid, res in itertools.product(grids, resolutions) + ] + data_usc_files = [f"UScounties.{ext}" for ext in ("dbf", "prj", "shp", "shx")] + data_other_files = ["epsg", "bmng.jpg", "etopo1.jpg", "shadedrelief.jpg"] + + return data_dat_files + data_bin_files + data_usc_files + data_other_files diff --git a/packages/basemap_data/pyproject.toml b/packages/basemap_data/pyproject.toml new file mode 100644 index 000000000..6c7c33d55 --- /dev/null +++ b/packages/basemap_data/pyproject.toml @@ -0,0 +1,63 @@ +[build-system] +requires = [ + "setuptools>=42", + "wheel" +] +build-backend = "setuptools.build_meta" + +[project] +name = "basemap_data" +version = "1.3.2" +description = "Data assets for matplotlib basemap" +readme = "README.md" +requires-python = ">=3.9" # Updated to match main package +license = {text = "GNU Lesser General Public License v3 or later (LGPLv3+)"} +authors = [ + {name = "Jeff Whitaker", email = "jeffrey.s.whitaker@noaa.gov"} +] +maintainers = [ + {name = "Víctor Molina García", email = "molinav@users.noreply.github.com"} +] +keywords = ["GIS", "maps", "plots"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering :: Visualization", + "Topic :: Software Development :: Libraries :: Python Modules" +] + +[project.urls] +Homepage = "https://matplotlib.org/basemap" +Documentation = "https://matplotlib.org/basemap/" +Repository = "https://github.com/matplotlib/basemap" +"Bug Tracker" = "https://github.com/matplotlib/basemap/issues" + +[tool.setuptools] +packages = ["mpl_toolkits.basemap_data"] +package-dir = {"" = "src"} +license-files = [ + "COPYING", + "COPYING.LESSER", + "LICENSE.epsg", + "LICENSE.mit" +] + +[tool.setuptools.package-data] +"mpl_toolkits.basemap_data" = [ + # This will be populated from build.py + "data/*" +] + +[tool.setuptools.sdist] +formats = ["zip"] + +[tool.setuptools.bdist-wheel] +universal = true diff --git a/packages/basemap_data/setup.cfg b/packages/basemap_data/setup.cfg deleted file mode 100644 index 46fc44d00..000000000 --- a/packages/basemap_data/setup.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[metadata] -license_files = - COPYING - COPYING.LESSER - LICENSE.epsg - LICENSE.mit - -[sdist] -formats = zip - -[bdist_wheel] -universal = 1 diff --git a/packages/basemap_data/setup.py b/packages/basemap_data/setup.py deleted file mode 100644 index 2d8e4e620..000000000 --- a/packages/basemap_data/setup.py +++ /dev/null @@ -1,137 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- -# flake8: noqa: E122 -"""basemap_data -- Data assets for matplotlib basemap.""" - -import io -import os -import itertools -from setuptools import setup -from setuptools import find_packages - - -def get_content(name, splitlines=False): - """Return the file contents with project root as root folder.""" - - here = os.path.abspath(os.path.dirname(__file__)) - path = os.path.join(here, name) - with io.open(path, "r", encoding="utf-8") as fd: - content = fd.read() - if splitlines: - content = [row for row in content.splitlines() if row] - return content - - -# Define some helper lists. -basenames = [ - "countries", - "countriesmeta", - "gshhs", - "gshhsmeta", - "rivers", - "riversmeta", - "states", - "statesmeta" -] -resolutions = [ - "c", - "l", - "i", - "h", - "f", -] -grids = [ - "1.25", - "2.5", - "5", - "10", -] - -# Define data assets. -data_dat_files = [ - "%s_%s.dat" % (basename, res) - for basename, res in itertools.product(basenames, resolutions[:3]) -] -data_bin_files = [ - "lsmask_%smin_%s.bin" % (grid, res) - for grid, res in itertools.product(grids, resolutions) -] -data_usc_files = [ - "UScounties.%s" % ext - for ext in ("dbf", "prj", "shp", "shx") -] -data_other_files = [ - "epsg", - "bmng.jpg", - "etopo1.jpg", - "shadedrelief.jpg", -] - -data_files = data_dat_files + data_bin_files + data_usc_files + data_other_files - -setup(**{ - "name": - "basemap_data", - "version": - "1.3.2", - "license": - "GNU Lesser General Public License v3 or later (LGPLv3+)", - "description": - "Data assets for matplotlib basemap", - "long_description": - get_content("README.md"), - "long_description_content_type": - "text/markdown", - "url": - "https://matplotlib.org/basemap", - "author": - "Jeff Whitaker", - "author_email": - "jeffrey.s.whitaker@noaa.gov", - "maintainer": - "Víctor Molina García", - "maintainer_email": - "molinav@users.noreply.github.com", - "classifiers": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 3", - "Topic :: Scientific/Engineering :: Visualization", - "Topic :: Software Development :: Libraries :: Python Modules", - ], - "keywords": [ - "GIS", - "maps", - "plots", - ], - "namespace_packages": [ - "mpl_toolkits.basemap_data", - ], - "package_dir": - {"": "src"}, - "packages": - find_packages(where="src"), - "package_data": { - "mpl_toolkits.basemap_data": - data_files, - }, - "python_requires": - ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", - "<4", - ]), - "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": - "https://github.com/matplotlib/basemap", - }, -}) diff --git a/packages/basemap_data_hires/build.py b/packages/basemap_data_hires/build.py new file mode 100644 index 000000000..11b421161 --- /dev/null +++ b/packages/basemap_data_hires/build.py @@ -0,0 +1,22 @@ +import itertools + + +def get_data_files(): + # Define some helper lists + basenames = [ + "countries", + "countriesmeta", + "gshhs", + "gshhsmeta", + "rivers", + "riversmeta", + "states", + "statesmeta", + ] + resolutions = ["c", "l", "i", "h", "f"] + + # Define data assets + return [ + f"{basename}_{res}.dat" + for basename, res in itertools.product(basenames, resolutions[3:]) + ] diff --git a/packages/basemap_data_hires/pyproject.toml b/packages/basemap_data_hires/pyproject.toml new file mode 100644 index 000000000..1caba0318 --- /dev/null +++ b/packages/basemap_data_hires/pyproject.toml @@ -0,0 +1,61 @@ +[build-system] +requires = [ + "setuptools>=42", + "wheel" +] +build-backend = "setuptools.build_meta" + +[project] +name = "basemap_data_hires" +version = "1.3.2" +description = "High-resolution data assets for matplotlib basemap" +readme = "README.md" +requires-python = ">=3.9" # Updated to match main package +license = {text = "GNU Lesser General Public License v3 or later (LGPLv3+)"} +authors = [ + {name = "Jeff Whitaker", email = "jeffrey.s.whitaker@noaa.gov"} +] +maintainers = [ + {name = "Víctor Molina García", email = "molinav@users.noreply.github.com"} +] +keywords = ["GIS", "maps", "plots"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering :: Visualization", + "Topic :: Software Development :: Libraries :: Python Modules" +] + +[project.urls] +Homepage = "https://matplotlib.org/basemap" +Documentation = "https://matplotlib.org/basemap/" +Repository = "https://github.com/matplotlib/basemap" +"Bug Tracker" = "https://github.com/matplotlib/basemap/issues" + +[tool.setuptools] +packages = ["mpl_toolkits.basemap_data"] +package-dir = {"" = "src"} +license-files = [ + "COPYING", + "COPYING.LESSER" +] + +[tool.setuptools.package-data] +"mpl_toolkits.basemap_data" = [ + # This will be populated from build.py + "data/*" +] + +[tool.setuptools.sdist] +formats = ["zip"] + +[tool.setuptools.bdist-wheel] +universal = true diff --git a/packages/basemap_data_hires/setup.cfg b/packages/basemap_data_hires/setup.cfg deleted file mode 100644 index e408a4da9..000000000 --- a/packages/basemap_data_hires/setup.cfg +++ /dev/null @@ -1,10 +0,0 @@ -[metadata] -license_files = - COPYING - COPYING.LESSER - -[sdist] -formats = zip - -[bdist_wheel] -universal = 1 diff --git a/packages/basemap_data_hires/setup.py b/packages/basemap_data_hires/setup.py deleted file mode 100644 index 7dbe83cf6..000000000 --- a/packages/basemap_data_hires/setup.py +++ /dev/null @@ -1,115 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- -# flake8: noqa: E122 -"""basemap_data_hires -- High-resolution data assets for matplotlib basemap.""" - -import io -import os -import itertools -from setuptools import setup -from setuptools import find_packages - - -def get_content(name, splitlines=False): - """Return the file contents with project root as root folder.""" - - here = os.path.abspath(os.path.dirname(__file__)) - path = os.path.join(here, name) - with io.open(path, "r", encoding="utf-8") as fd: - content = fd.read() - if splitlines: - content = [row for row in content.splitlines() if row] - return content - - -# Define some helper lists. -basenames = [ - "countries", - "countriesmeta", - "gshhs", - "gshhsmeta", - "rivers", - "riversmeta", - "states", - "statesmeta" -] -resolutions = [ - "c", - "l", - "i", - "h", - "f", -] - -# Define data assets. -data_files = [ - "%s_%s.dat" % (basename, res) - for basename, res in itertools.product(basenames, resolutions[3:]) -] - -setup(**{ - "name": - "basemap_data_hires", - "version": - "1.3.2", - "license": - "GNU Lesser General Public License v3 or later (LGPLv3+)", - "description": - "High-resolution data assets for matplotlib basemap", - "long_description": - get_content("README.md"), - "long_description_content_type": - "text/markdown", - "url": - "https://matplotlib.org/basemap", - "author": - "Jeff Whitaker", - "author_email": - "jeffrey.s.whitaker@noaa.gov", - "maintainer": - "Víctor Molina García", - "maintainer_email": - "molinav@users.noreply.github.com", - "classifiers": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 3", - "Topic :: Scientific/Engineering :: Visualization", - "Topic :: Software Development :: Libraries :: Python Modules", - ], - "keywords": [ - "GIS", - "maps", - "plots", - ], - "namespace_packages": [ - "mpl_toolkits.basemap_data", - ], - "package_dir": - {"": "src"}, - "packages": - find_packages(where="src"), - "package_data": { - "mpl_toolkits.basemap_data": - data_files, - }, - "python_requires": - ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", - "<4", - ]), - "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": - "https://github.com/matplotlib/basemap", - }, -})