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 cdd577b17..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: artifacts-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.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..b0bfd71d5 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,285 @@ +on: + push: + paths: + - ".github/workflows/**" + - "packages/basemap/**" + - "packages/basemap_data/**" + - "packages/basemap_data_hires/**" + pull_request: + paths: + - ".github/workflows/**" + - "packages/basemap/**" + - "packages/basemap_data/**" + - "packages/basemap_data_hires/**" + workflow_dispatch: + +jobs: + build_data: + name: Build data + strategy: + matrix: + package: [basemap_data, basemap_data_hires] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Build data sdist and wheel + run: | + cd packages/${{ matrix.package }} + python -m pip install build wheel + python -m build + + - name: Upload data sdist and wheel + uses: actions/upload-artifact@v4 + with: + path: | + packages/${{ matrix.package }}/dist/*.tar.gz + packages/${{ matrix.package }}/dist/*.whl + name: dist-${{ matrix.package }} + + build_sdist: + name: Build sdist + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Build basemap sdist + run: | + cd packages/basemap + python -m pip install build + python -m build --sdist + + - name: Upload basemap sdist + uses: actions/upload-artifact@v4 + with: + path: packages/basemap/dist/*.tar.gz + name: dist-basemap-sdist + + build_wheels: + name: Build wheels + needs: [build_data, build_sdist] + strategy: + matrix: + os: [ubuntu-22.04, windows-2022, macos-13, macos-14] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Download basemap sdist + uses: actions/download-artifact@v4 + with: + name: dist-basemap-sdist + path: ./sdist/ + + - name: Extract basemap sdist (Linux/macOS) + if: runner.os != 'Windows' + shell: bash + run: | + # Create extraction directory in the workspace + mkdir -p ./sdist_extract + + # Extract with tar using wildcard + tar -xvf ./sdist/*.tar.gz -C ./sdist_extract + + # Get the extracted directory name + EXTRACTED_DIR="$(ls -d ./sdist_extract/*/ | head -1)" + + # Verify contents + ls -la "${EXTRACTED_DIR}" + + # Set the environment variable + echo "SDIST_DIR=$(pwd)/${EXTRACTED_DIR}" >> $GITHUB_ENV + + - name: Extract basemap sdist (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + # Create extraction directory in the workspace + New-Item -ItemType Directory -Force -Path "sdist_extract" + + # Extract with tar using the specific file path (no wildcard) + $tarball = Get-ChildItem -Path "sdist" -Filter "*.tar.gz" | Select-Object -First 1 + tar -xvf $tarball.FullName -C "sdist_extract" + + # Get the extracted directory name + $extractedDir = (Get-ChildItem -Path "sdist_extract" -Directory | Select-Object -First 1).FullName + + # Verify contents + Get-ChildItem "$extractedDir" + + # Set the environment variable + echo "SDIST_DIR=$extractedDir" | Out-File -FilePath $env:GITHUB_ENV -Append + + - name: Build basemap wheels from sdist + uses: pypa/cibuildwheel@v2.22.0 + env: + CIBW_ARCHS: "native" + CIBW_BUILD: "cp39* cp310* cp311* cp312* cp313*" + CIBW_BUILD_VERBOSITY: 1 + CIBW_SKIP: "*-musllinux_*" + CIBW_BEFORE_ALL: "python {project}/.github/workflows/run_before_all.py" + CIBW_TEST_EXTRAS: "test" + CIBW_TEST_COMMAND: "python -m pytest {project}/packages/basemap" + CIBW_ENVIRONMENT: >- + GEOS_VERSION="3.6.5" + GEOS_DIR="$(pwd)/extern" + GEOS_NJOBS=4 + PIP_PREFER_BINARY=1 + PYTHONUNBUFFERED=1 + LD_LIBRARY_PATH="${GEOS_DIR}/lib" + # LD_LIBRARY_PATH in environment is needed by + # auditwheel (Linux) and delocate (MacOS). + with: + package-dir: ${{ env.SDIST_DIR }} + output-dir: "dist" + # Set `package-dir` to a folder with the extracted sdist; + # otherwise, `cibuildwheel` uses `python -m pip wheel` or + # `python -m build --wheel` with the repository package + # folder and we cannot guarantee that wheels can be built + # from the sdist. + + - name: Upload basemap wheels + uses: actions/upload-artifact@v4 + with: + path: dist/*.whl + name: dist-basemap-wheels-${{ matrix.os }} + + check: + name: Check packages + needs: [build_data, build_sdist, build_wheels] + runs-on: ubuntu-22.04 + steps: + - name: Download basemap and data packages + uses: actions/download-artifact@v4 + with: + path: dist + pattern: "dist-*" + merge-multiple: true + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Check packages with twine + run: | + python -m pip install twine + python -m twine check dist/*.tar.gz + python -m twine check dist/*.whl + + docs: + name: Build docs + needs: [check] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Download data packages + uses: actions/download-artifact@v4 + with: + path: ./data_packages/ + pattern: "dist-basemap_data*" + merge-multiple: true + + - name: Download basemap wheels for Linux + uses: actions/download-artifact@v4 + with: + path: ./wheels/ + pattern: "dist-basemap-wheels-ubuntu-*" + merge-multiple: true + + - name: Install basemap and data packages + run: | + # Get Python version. + IMPL=cp$(python -c "import sys; print('{0}{1}'.format(*sys.version_info[:2]))") + + # Install basemap wheel matching current Python version. + WHEEL=$(find ./wheels -name "*-${IMPL}-${IMPL}*.whl" | head -1) + if [ -n "${WHEEL}" ]; then + python -m pip install "${WHEEL}" + else + echo "No matching wheel found for ${IMPL}-${IMPL}" + exit 1 + fi + + # Install basemap data packages. + python -m pip install ./data_packages/*.whl + + - name: Install docs requirements + run: | + cd packages/basemap + python -m pip install -r dep/requirements-doc.txt + + - name: Run sphinx + run: | + cd packages/basemap + python -m sphinx doc/source public + + - name: Upload docs artifacts + uses: actions/upload-artifact@v4 + with: + name: docs + path: packages/basemap/public + + - name: Upload github-pages artifact + uses: actions/upload-pages-artifact@v3 + with: + name: github-pages + path: packages/basemap/public + + pages: + name: Deploy docs + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + needs: [docs] + runs-on: ubuntu-22.04 + 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: + name: Upload packages + needs: [build_data, build_sdist, build_wheels, check] + runs-on: ubuntu-22.04 + environment: PyPI + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + steps: + - name: Download basemap and data packages + uses: actions/download-artifact@v4 + with: + path: dist + pattern: "dist-*" + merge-multiple: true + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_TOKEN }} + repository-url: ${{ secrets.PYPI_REPOSITORY_URL }} + skip-existing: true diff --git a/.github/workflows/run_before_all.py b/.github/workflows/run_before_all.py new file mode 100644 index 000000000..575a26763 --- /dev/null +++ b/.github/workflows/run_before_all.py @@ -0,0 +1,37 @@ +#! /usr/bin/env python +"""Helper script to be run by `cibuildwheel` as `before_all` step.""" + +import os +import sys + +HERE = os.path.abspath(__file__) +ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE))) +sys.path.insert(0, os.path.join(ROOT, "packages", "basemap")) +import utils # noqa: E402 # pylint: disable=imports + + +def main(): + """Build the GEOS library based on parsed environment variables.""" + + geos_version = os.environ.get("GEOS_VERSION", None) + if geos_version is None: + raise ValueError("Undefined environment variable GEOS_VERSION") + + geos_dir = os.environ.get("GEOS_DIR", None) + if geos_dir is None: + raise ValueError("Undefined environment variable GEOS_DIR") + + geos_njobs = int(os.environ.get("GEOS_NJOBS", 1)) + + # pylint: disable=consider-using-f-string + print("Running before_all script with the following settings:") + print("GEOS_DIR: {0}".format(geos_dir)) + print("GEOS_VERSION: {0}".format(geos_version)) + print("GEOS_NJOBS: {0}".format(geos_njobs)) + + utils.GeosLibrary(geos_version).build(geos_dir, njobs=geos_njobs) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9bdc4fa9..c20fa473c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,81 @@ https://keepachangelog.com/en/1.0.0/ https://semver.org/spec/v2.0.0.html +## [Unreleased] + +### Added +- Python 3.13 support (PR [#619], solves issue [#608]). +- NumPy 2.0 support (PR [#614] by @cvanelteren, solves issue [#604]). +- Automated MacOS wheels for x86_64 and arm64 (PR [#620] by + @cvanelteren, solves issue [#608]). +- Support in `Basemap.wmsimage` to redirect `WebMapService` constructor + parameters when available (PR [#603] by @Kurea, solves issue [#602]). + +### Changed +- **BREAKING CHANGE**: Set Python minimum supported version to 3.9. +- **BREAKING CHANGE**: Migrate `basemap` libraries to use implicit + namespace packages (PR [#576] by @ksunden). +- **BREAKING CHANGE**: Move requirements files to its own `dep` folder. +- Migrate workflows to use `cibuildwheel` (PRs [#614], [#618], [#622] + and [#623] by @cvanelteren and PR [#621], solves GitHub artifact + actions v1 sunset). +- Update library dependencies: + - Upgrade upper limit for `basemap_data` to 3.0. + - Upgrade lower limit for `packaging` to 20.5. + - Upgrade upper limit for `packaging` to 26.0. + - Upgrade lower limit for `numpy` to 2.0. + - Upgrade upper limit for `numpy` to 2.4. + - Upgrade lower limit for `matplotlib` to 3.4. + - Upgrade upper limit for `matplotlib` to 3.11. + - Upgrade lower limit for `pyproj` to 3.0. + - Upgrade upper limit for `pyproj` to 3.8. + - Upgrade lower limit for `pyshp` to 2.0. +- Update optional library dependencies: + - Upgrade upper limit for `OWSLib` to 0.35. +- Update build dependencies: + - Upgrade lower limit for `setuptools` to 67.0. + - Upgrade upper limit for `setuptools` to 81.0. + - Upgrade lower limit for `wheel` to 0.40. + - Upgrade upper limit for `wheel` to 0.46. + - Upgrade lower limit for `cython` to 3.0. + - Upgrade upper limit for `cython` to 3.2. +- Update doc dependencies: + - Upgrade upper limit for `sphinx` to 8.0. + - Upgrade lower limit for `furo` to 2023.9.10. + - Upgrade upper limit for `furo` to 2024.8.7. + - Upgrade lower limit for `scipy` to 1.6. + - Upgrade upper limit for `scipy` to 1.16. + - Upgrade upper limit for `netCDF4` to 1.8.0. +- Update lint dependencies: + - Remove dependency on `unittest2`. + - Upgrade lower limit for `flake8` to 3.9. + - Upgrade upper limit for `flake8` to 7.3. + - Include dependency on `flake8-pyproject`. + - Upgrade lower limit for `astroid` to 3.0. + - Upgrade upper limit for `astroid` to 3.4. + - Upgrade lower limit for `pylint` to 3.0. + - Upgrade upper limit for `pylint` to 3.4. +- Update test dependencies: + - Remove dependency on `unittest2`. + - Upgrade lower limit for `pytest` to 7.0. + - Upgrade upper limit for `pytest` to 8.5. + - Upgrade lower limit for `pytest-cov` to 3.0. + - Upgrade upper limit for `pytest-cov` to 6.3. + - Downgrade lower limit for `coverage` to 5.0. + - Upgrade upper limit for `coverage` to 7.10. + +### Fixed +- Fix Cython extension to use `noexcept` (PR [#615] by @cvanelteren). +- Fix incorrect return order described in `Basemap.shiftdata` docstring + (PR [#624] by @Cdiaz1234, solves issue [#599]). + +### Removed +- Deprecated use of `setup_requires` in `setup.py` file. +- Deprecated `bdist_wheel.universal` option when building wheels. +- Configuration of `sdist` format as zip (replaced by default tar.gz). +- Remove `pillow` as optional dependency, since it is now a transitive + dependency through `matplotlib >= 3.3`. + ## [1.4.1] - 2024-02-15 ### Changed @@ -56,7 +131,7 @@ https://semver.org/spec/v2.0.0.html - Downgrade upper limit for `pyproj` to 2.2.0 for Python 2.7. - Set dependency on `packaging` as replacement for `distutils`. - Update build dependencies: - - Upgrade upper limit for `Cython` to 3.1. + - Upgrade upper limit for `cython` to 3.1. - Update doc dependencies and require at least Python 3.8 for them: - Upgrade upper limit for `sphinx` to 7.2. - Upgrade upper limit for `furo` to 2023.9.11. @@ -1096,6 +1171,34 @@ https://semver.org/spec/v2.0.0.html - Fix glitches in drawing of parallels and meridians. +[#624]: +https://github.com/matplotlib/basemap/pull/624 +[#623]: +https://github.com/matplotlib/basemap/pull/623 +[#622]: +https://github.com/matplotlib/basemap/pull/622 +[#621]: +https://github.com/matplotlib/basemap/pull/621 +[#620]: +https://github.com/matplotlib/basemap/pull/620 +[#619]: +https://github.com/matplotlib/basemap/pull/619 +[#618]: +https://github.com/matplotlib/basemap/pull/618 +[#615]: +https://github.com/matplotlib/basemap/pull/615 +[#614]: +https://github.com/matplotlib/basemap/pull/614 +[#608]: +https://github.com/matplotlib/basemap/issues/608 +[#604]: +https://github.com/matplotlib/basemap/issues/604 +[#603]: +https://github.com/matplotlib/basemap/pull/603 +[#602]: +https://github.com/matplotlib/basemap/issues/602 +[#599]: +https://github.com/matplotlib/basemap/issues/599 [#598]: https://github.com/matplotlib/basemap/pull/598 [#595]: @@ -1124,6 +1227,8 @@ https://github.com/matplotlib/basemap/pull/580 https://github.com/matplotlib/basemap/issues/579 [#577]: https://github.com/matplotlib/basemap/issues/577 +[#576]: +https://github.com/matplotlib/basemap/pull/576 [#574]: https://github.com/matplotlib/basemap/issues/574 [#573]: @@ -1296,6 +1401,10 @@ https://github.com/matplotlib/basemap/compare/v1.0.3rel...v1.0.4rel [1.0.3]: https://github.com/matplotlib/basemap/tree/v1.0.3rel +[CVE-2024-28219]: +https://nvd.nist.gov/vuln/detail/CVE-2024-28219 +[CVE-2023-50447]: +https://nvd.nist.gov/vuln/detail/CVE-2023-50447 [CVE-2023-27476]: https://nvd.nist.gov/vuln/detail/CVE-2023-27476 [CVE-2022-45198]: diff --git a/LICENSE b/LICENSE index 120eb7e3f..68cbd3d24 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2011-2014 Jeffrey Whitaker -Copyright (c) 2015-2024 The Matplotlib development team +Copyright (c) 2015-2025 The Matplotlib development team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/packages/basemap/.pylintrc b/packages/basemap/.pylintrc index cba37d0fb..fdae75d64 100644 --- a/packages/basemap/.pylintrc +++ b/packages/basemap/.pylintrc @@ -1,198 +1,133 @@ [MASTER] -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-whitelist=numpy, - _geoslib - -# Add files or directories to the blacklist. They should be base names, not -# paths. +# Analyse import fallback blocks. This can be used to support both +# Python 2 and 3 compatible code, which means that the block might have +# code that exists only in one or another interpreter, leading to false +# positives when analysed. +analyse-fallback-blocks=no + +# Clear in-memory caches upon conclusion of linting. Useful if running +# pylint in a server-like mode. +clear-cache-post-run=yes + +# A comma-separated list of package or module names from where +# C extensions may be loaded. Extensions are loading into the +# active Python interpreter and may run arbitrary code. +extension-pkg-whitelist= + numpy, + _geoslib + +# Files or directories to be skipped (base names, not paths). ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= +# Files or directories matching the regular expression patterns are +# skipped. The regex matches against base names, not paths. The +# default value ignores Emacs file locks. +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# and will not be imported (useful for modules/projects where namespaces +# are manipulated during runtime and thus existing member attributes +# cannot be deduced by static analysis). It supports qualified module +# names, as well as Unix pattern matching. +ignored-modules= + _geoslib # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). -init-hook="import sys; sys.path.insert(0, 'src'); sys.setrecursionlimit(8 * sys.getrecursionlimit())" +init-hook="import sys; sys.path.insert(0, 'src')" -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use. +# Use multiple processes to speed up Pylint. Specifying 0 will +# auto-detect the number of processors available to use, and will +# cap the count on Windows to avoid hangs. jobs=1 -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. +# Control the amount of potential inferred values when inferring a +# single object. This can help the performance when dealing with +# large functions or complex, nested conditions. limit-inference-results=100 -# List of plugins (as comma separated values of python module names) to load, -# usually to register additional checkers. +# List of plugins (as comma separated values of python module names) +# to load, usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes -# Specify a configuration file. -#rcfile= - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. +# When enabled, pylint would attempt to guess common misconfiguration +# and emit user-friendly hints instead of false-positive error messages. suggestion-mode=yes -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. +# Allow loading of arbitrary C extensions. Extensions are imported into +# the active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable= - # Allow freedom with imports. - import-outside-toplevel, - # Allow freedom with globals. - global-statement, - global-variable-not-assigned, - global-variable-undefined, - undefined-all-variable, - # Allow freedom with inheritance. - useless-object-inheritance, - super-with-arguments, - # Allow assigning to returned None. - assignment-from-no-return, - assignment-from-none, - # Allow freedom with error raises. - raise-missing-from, - # Allow freedom with using lambda functions. - unnecessary-lambda-assignment, - # Allow freedom with old ways of doing things. - use-dict-literal, - consider-using-f-string, - # Allow freedom with multiline indentation. - useless-option-value, - bad-continuation - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a score less than or equal to 10. You -# have access to the variables 'error', 'warning', 'refactor', and 'convention' -# which contain the number of messages in each category, as well as 'statement' -# which is the total number of statements analyzed. This score is used by the -# global evaluation report (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=6 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case -# Regular expression matching correct argument names. Overrides argument- -# naming-style. +# Regular expression matching correct argument names. +# Overrides argument-naming-style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. +# Regular expression matching correct attribute names. +# Overrides attr-naming-style. #attr-rgx= -# Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - bar, - baz, - toto, - tutu, - tata +# Bad variable names which should always be refused. +bad-names= + foo, + bar, + baz, + toto, + tutu, + tata # Naming style matching correct class attribute names. class-attribute-naming-style=any -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. +# Regular expression matching correct class attribute names. +# Overrides class-attribute-naming-style. #class-attribute-rgx= # Naming style matching correct class names. class-naming-style=PascalCase -# Regular expression matching correct class names. Overrides class-naming- -# style. +# Regular expression matching correct class names. +# Overrides class-naming-style. #class-rgx= # Naming style matching correct constant names. const-naming-style=any -# Regular expression matching correct constant names. Overrides const-naming- -# style. +# Regular expression matching correct constant names. +# Overrides const-naming-style. #const-rgx= -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. +# Minimum line length for functions/classes that require docstrings, +# shorter ones are exempt. docstring-min-length=-1 # Naming style matching correct function names. function-naming-style=snake_case -# Regular expression matching correct function names. Overrides function- -# naming-style. +# Regular expression matching correct function names. +# Overrides function-naming-style. #function-rgx= -# Good variable names which should always be accepted, separated by a comma. -good-names=i, j, k, m, n, - t, x, y, z, xy, - nx, dx, x1, x2, - ny, dy, y1, y2, - fd, ax, h, - _ +# Good variable names which should always be accepted. +good-names= + i, j, k, m, n, + t, x, y, z, xy, + nx, dx, x1, x2, + ny, dy, y1, y2, + fd, ax, h, + _ # Include a hint for the correct naming format with invalid-name. include-naming-hint=no @@ -200,58 +135,133 @@ include-naming-hint=no # Naming style matching correct inline iteration names. inlinevar-naming-style=snake_case -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. +# Regular expression matching correct inline iteration names. +# Overrides inlinevar-naming-style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case -# Regular expression matching correct method names. Overrides method-naming- -# style. +# Regular expression matching correct method names. +# Overrides method-naming-style. #method-rgx= # Naming style matching correct module names. #module-naming-style=snake_case -# Regular expression matching correct module names. Overrides module-naming- -# style. +# Regular expression matching correct module names. +# Overrides module-naming-style. module-rgx=^(test_)?((?P_{0,2}[a-z][a-z0-9_]{1,29}_{0,2})|(?P_?[A-Z][a-zA-Z0-9]{1,29}_{0,2}))$ -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. +# Colon-delimited sets of names that determine each other's naming style +# when the name regexes allow several styles. name-group= -# Regular expression which should only match function or class names that do -# not require a docstring. +# Regular expression which should only match function or class names +# that do not require a docstring. no-docstring-rgx=^_ -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty +# List of decorators that produce properties, e.g. abc.abstractproperty. +# Add to this list to register other decorators that produce valid +# properties. These decorators are taken in consideration only for +# invalid-name. +property-classes= + abc.abstractproperty # Naming style matching correct variable names. variable-naming-style=snake_case -# Regular expression matching correct variable names. Overrides variable- -# naming-style. +# Regular expression matching correct variable names. +# Overrides variable-naming-style. #variable-rgx= +[CLASSES] + +# Warn about protected attribute access inside special methods. +check-protected-access-in-special-methods=yes + +# Method names used to declare (i.e. assign) instance attributes. +defining-attr-methods= + __init__, + __new__, + setUp, + asyncSetUp, + __post_init__ + +# Member names to be excluded from the protected access warning. +exclude-protected= + _asdict, + _fields, + _replace, + _source, + _make, + os._exit + +# List of valid names for first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Maximum number of arguments for function / method (R0913). +max-args=6 + +# Maximum number of attributes for a class (R0902). +max-attributes=12 + +# Maximum number of boolean expressions in an if statement (R0916). +max-bool-expr=6 + +# Maximum number of branch for function / method body (R0912). +max-branches=24 + +# Maximum number of locals for function / method body (R0914). +max-locals=24 + +# Maximum number of parents for a class (R0901). +max-parents=18 + +# Maximum number of positional arguments for function / method (R0917). +max-positional-arguments=6 + +# Maximum number of public methods for a class (R0904). +max-public-methods=90 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body (R0915). +max-statements=90 + +# Minimum number of public methods for a class (R0903). +min-public-methods=1 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions= + builtins.BaseException, + builtins.Exception + + [FORMAT] -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +# Expected format of line ending, e.g. empty (any), LF or CRLF. expected-line-ending-format=LF # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ -# Number of spaces of indent required inside a hanging or continued line. +# Number of spaces of indent needed inside a hanging or continued line. indent-after-paren=4 -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). +# String used as indentation unit. This is usually " " (4 spaces) +# or "\t" (1 tab). indent-string=" " # Maximum number of characters on a single line. @@ -260,47 +270,185 @@ max-line-length=99 # Maximum number of lines in a module. max-module-lines=999 -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. +# Allow the body of a class to be on the same line as the declaration +# if body contains single statement. single-line-class-stmt=no -# Allow the body of an if to be on the same line as the test if there is no -# else. +# Allow the body of an if to be on the same line as the test if there +# is no else. single-line-if-stmt=no +[IMPORTS] + +# List of modules that can be imported at any level, not just the top +# level one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external +# dependencies to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all +# (i.e. internal and external) dependencies to the given file +# (report RP0402 must not be disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal +# dependencies to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party +# library. +known-third-party= + enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + [LOGGING] -# Format style used to check logging format string. `old` means using % -# formatting, `new` is for `{}` formatting, and `fstr` is for f-strings. -logging-format-style=new +# The type of string formatting that logging methods do. `old` means +# using % formatting, `new` is for `{}` formatting. +logging-format-style=old -# Logging modules to check that the string format arguments are in logging -# function parameter format. +# Logging modules to check that the string format arguments are in +# logging function parameter format. logging-modules=logging +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to +# show all. Valid levels: HIGH, CONTROL_FLOW (pylint >= 2.13.0), +# INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). +# You can either give multiple identifiers separated by comma (,) or +# put this option multiple times (only on the command line, not in the +# configuration file where it should appear only once). You can also +# use "--disable=all" to disable everything first and then re-enable +# specific checks. For example, if you want to run only the similarities +# checker, you can use "--disable=all --enable=similarities". If you +# want to run only the classes checker, but have no Warning level +# messages displayed, use "--disable=all --enable=classes --disable=W". +disable= + # Allow freedom with imports. + import-outside-toplevel, + # Allow freedom with globals. + global-statement, + global-variable-not-assigned, + global-variable-undefined, + undefined-all-variable, + # Allow freedom with inheritance. + useless-object-inheritance, + super-with-arguments, + # Allow assigning to returned None. + assignment-from-no-return, + assignment-from-none, + # Allow freedom with error raises. + raise-missing-from, + # Allow freedom with using lambda functions. + unnecessary-lambda-assignment, + # Allow freedom with multiline indentation. + useless-option-value, + bad-continuation, + # Allow freedom with old ways of doing things. + consider-using-f-string, + use-dict-literal, + use-yield-from, + # Ignore warnings unknown by old PyLint versions. + bad-option-value, + unrecognized-option, + unknown-option-value + +# Enable the message, report, category or checker with the given id(s). +# You can either give multiple identifier separated by comma (,) or put +# this option multiple time (only on the command line, not in the +# configuration file where it should appear only once). See also the +# "--disable" option for examples. +enable=c-extension-no-member + + [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO +notes= + FIXME, + XXX, + TODO + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body. +max-nested-blocks=6 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is +# called then it will be considered as an explicit return statement +# and no message will be printed. +never-returning-functions= + sys.exit, + argparse.parse_error + + +[REPORTS] + +# Python expression which should return a score less than or equal to +# 10. You have access to the variables 'fatal', 'error', 'warning', +# 'refactor', 'convention', and 'info' which contain the number of +# messages in each category, as well as 'statement' which is the total +# number of statements analyzed. This score is used by the global +# evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format +# string used to format the message information. See doc for all +# details. +msg-template= + +# Set the output format. Available formats are: text, parseable, +# colorized, json2 (improved json format), json (old json format) +# and msvs (visual studio). You can also give a reporter class, +# e.g. mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes [SIMILARITIES] -# Ignore comments when computing similarities. +# Comments are removed from the similarity computation. ignore-comments=yes -# Ignore docstrings when computing similarities. +# Docstrings are removed from the similarity computation. ignore-docstrings=yes -# Ignore imports when computing similarities. -ignore-imports=no +# Imports are removed from the similarity computation. +ignore-imports=yes + +# Signatures are removed from the similarity computation. +ignore-signatures=yes # Minimum lines number of a similarity. -min-similarity-lines=16 +min-similarity-lines=30 [SPELLING] @@ -308,25 +456,31 @@ min-similarity-lines=16 # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 -# Spelling dictionary name. Available dictionaries: none. To make it work, -# install the python-enchant package. +# Spelling dictionary name. No available dictionaries: You need to +# install both the python package and the system dependency for +# enchant to work. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= -# A path to a file that contains the private dictionary; one word per line. +# Path to a file containing the private dictionary; one word per line. spelling-private-dict-file= -# Tells whether to store unknown words to the private dictionary (see the -# --spelling-private-dict-file option) instead of raising a message. +# Tells whether to store unknown words to the private dictionary (see +# the --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [STRING] -# This flag controls whether the implicit-str-concat-in-sequence should -# generate a warning on implicit string concatenation in sequences defined over +# This flag controls whether inconsistent-quotes generates a warning +# when the character used as a quote delimiter is used inconsistently +# within a module. +check-quote-consistency=yes + +# This flag controls whether the implicit-str-concat should generate a +# warning on implicit string concatenation in sequences defined over # several lines. check-str-concat-over-line-jumps=no @@ -334,57 +488,51 @@ check-str-concat-over-line-jumps=no [TYPECHECK] # List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members=numpy, - pyproj, - netCDF4, - mpl_toolkits.basemap.Basemap - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. +# contextlib.contextmanager. Add to this list to register +# other decorators that produce valid context managers. +contextmanager-decorators= + contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint +# inference system, and so shouldn't trigger E1101 when accessed. +# Python regular expressions are accepted. +generated-members= + netCDF4, + numpy, + pyproj, + mpl_toolkits.basemap.Basemap + +# Tells whether to warn about missing members when the owner of the +# attribute is inferred to be None. ignore-none=yes -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. +# This flag controls whether pylint should warn about no-member and +# similar checks whenever an opaque object is returned when inferring. +# The inference can return multiple potential results while evaluating a +# Python object, but some branches might not be evaluated, which results +# in partial inference. In that case, it might be useful to still emit +# no-member and other checks for the rest of the inferred objects. ignore-on-opaque-inference=yes -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values, - thread._local, - _thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=_geoslib - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. +# List of class names for which member attributes should not be checked +# (useful for classes with dynamically set attributes). This supports +# the use of qualified names. +ignored-classes= + optparse.Values, + thread._local, + _thread._local, + argparse.Namespace + +# Show a hint with possible names when a member name was not found. +# The aspect of finding the hint is based on edit distance. missing-member-hint=yes -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. +# The minimum edit distance a name should have in order to be +# considered a similar match for a missing member name. missing-member-hint-distance=1 -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. +# The total number of similar names that should be taken in +# consideration when showing a hint for a missing member. missing-member-max-choices=1 # List of decorators that change the signature of a decorated function. @@ -393,137 +541,33 @@ signature-mutators= [VARIABLES] -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. +# List of additional names supposed to be defined in builtins. Remember +# that you should avoid defining new builtins when possible. additional-builtins= -# Tells whether unused global variables should be treated as a violation. +# Set whether unused global variables should be treated as a violation. allow-global-unused-variables=yes -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb +# List of strings which can identify a callback function by name. +# A callback name must start or end with one of those strings. +callbacks= + cb_, + _cb -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). +# A regular expression matching the name of dummy variables +# (i.e. expected to not be used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ -# Argument names that match this expression will be ignored. Default to name -# with leading underscore. +# Argument names that match this expression will be ignored. ignored-argument-names=_.*|^ignored_|^unused_ # Tells whether we should check for unused import in __init__ files. init-import=no -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=past.builtins, - future.builtins, - builtins, - io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp, - __post_init__ - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[DESIGN] - -# Maximum number of arguments for function / method (see R0913). -max-args=6 - -# Maximum number of attributes for a class (see R0902). -max-attributes=12 - -# Maximum number of boolean expressions in an if statement (see R0916). -max-bool-expr=6 - -# Maximum number of branch for function / method body (see R0912). -max-branches=24 - -# Maximum number of locals for function / method body (see R0914). -max-locals=24 - -# Maximum number of parents for a class (see R0901). -max-parents=18 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=90 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body (see R0915). -max-statements=90 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=1 - - -[IMPORTS] - -# List of modules that can be imported at any level, not just the top level -# one. -allow-any-import-level= - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse, - tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - -# Couples of modules and preferred modules, separated by a comma. -preferred-modules= - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "builtins.BaseException, builtins.Exception". -overgeneral-exceptions=builtins.BaseException, - builtins.Exception +# List of qualified module names which can have objects that can +# redefine builtins. +redefining-builtins-modules= + past.builtins, + future.builtins, + builtins, + io diff --git a/packages/basemap/LICENSE b/packages/basemap/LICENSE index 120eb7e3f..68cbd3d24 100644 --- a/packages/basemap/LICENSE +++ b/packages/basemap/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2011-2014 Jeffrey Whitaker -Copyright (c) 2015-2024 The Matplotlib development team +Copyright (c) 2015-2025 The Matplotlib development team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/packages/basemap/MANIFEST.in b/packages/basemap/MANIFEST.in index 93b419369..cc9ee7bbe 100644 --- a/packages/basemap/MANIFEST.in +++ b/packages/basemap/MANIFEST.in @@ -1,9 +1,12 @@ -include requirements*.txt +include .pylintrc +include pyproject.toml +include dep/requirements*.txt +recursive-exclude **/__pycache__ * +global-exclude *.py[cod] +global-exclude *.dll +global-exclude *.so + recursive-include doc * recursive-exclude doc/build * recursive-include test * recursive-include utils *.py -recursive-exclude **/__pycache__ * -recursive-exclude **/.DS_Store * -exclude **/*.pyc -exclude **/.gitkeep diff --git a/packages/basemap/dep/requirements-doc.txt b/packages/basemap/dep/requirements-doc.txt new file mode 100644 index 000000000..e89d7e235 --- /dev/null +++ b/packages/basemap/dep/requirements-doc.txt @@ -0,0 +1,6 @@ +sphinx >= 7.0, < 8.0 +furo >= 2023.9.10, < 2024.8.7 + +scipy >= 1.6, < 1.16 +cftime >= 1.4.0, < 1.7.0 +netCDF4 >= 1.5.6, < 1.8.0 diff --git a/packages/basemap/dep/requirements-lint.txt b/packages/basemap/dep/requirements-lint.txt new file mode 100644 index 000000000..016f91380 --- /dev/null +++ b/packages/basemap/dep/requirements-lint.txt @@ -0,0 +1,5 @@ +flake8 >= 3.9, < 7.3 +flake8-pyproject >= 1.0, < 1.3 + +astroid >= 3.0, < 3.4 +pylint >= 3.0, < 3.4 diff --git a/packages/basemap/dep/requirements-owslib.txt b/packages/basemap/dep/requirements-owslib.txt new file mode 100644 index 000000000..83755495b --- /dev/null +++ b/packages/basemap/dep/requirements-owslib.txt @@ -0,0 +1 @@ +OWSLib >= 0.28.1, < 0.35 diff --git a/packages/basemap/dep/requirements-test.txt b/packages/basemap/dep/requirements-test.txt new file mode 100644 index 000000000..b7f9a483b --- /dev/null +++ b/packages/basemap/dep/requirements-test.txt @@ -0,0 +1,4 @@ +pytest >= 7.0, < 8.5 + +pytest-cov >= 3.0, < 6.3 +coverage[toml] >= 5.0, < 7.10 diff --git a/packages/basemap/dep/requirements.txt b/packages/basemap/dep/requirements.txt new file mode 100644 index 000000000..f6a88fc10 --- /dev/null +++ b/packages/basemap/dep/requirements.txt @@ -0,0 +1,8 @@ +basemap_data >= 1.3.2, < 3.0 +packaging >= 20.5, < 26.0 + +numpy >= 2.0, < 2.4 +matplotlib >= 3.4, < 3.11 + +pyproj >= 3.0, < 3.8 +pyshp >= 2.0, < 2.4 diff --git a/packages/basemap/doc/source/conf.py b/packages/basemap/doc/source/conf.py index 460d15c92..1437df386 100644 --- a/packages/basemap/doc/source/conf.py +++ b/packages/basemap/doc/source/conf.py @@ -22,7 +22,7 @@ # -- Project information ----------------------------------------------- project = myself.__name__.rsplit(".", 1)[-1] -copyright = "2011-2014 Jeffrey Whitaker; 2015-2024 The Matplotlib development team" +copyright = "2011-2014 Jeffrey Whitaker; 2015-2025 The Matplotlib development team" author = "Jeffrey Whitaker" # The short X.Y version @@ -73,7 +73,11 @@ # You can specify multiple suffix as a list of string: # # source_suffix = [".rst", ".md"] -source_suffix = ".rst" +source_suffix = { + ".rst": "restructuredtext", + ".txt": "restructuredtext", + ".md": "markdown", +} # The master toctree document. master_doc = "index" diff --git a/packages/basemap/pyproject.toml b/packages/basemap/pyproject.toml index 6a50e2c78..390e03843 100644 --- a/packages/basemap/pyproject.toml +++ b/packages/basemap/pyproject.toml @@ -1,15 +1,42 @@ [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 >= 67.0, < 81.0", + "wheel >= 0.40, < 0.46", + "cython >= 3.0, < 3.2", + "numpy == 2.1.0; python_version == '3.13'", + "numpy == 2.0.0; python_version <= '3.12'", ] build-backend = "setuptools.build_meta" + +[tool.flake8] +ignore = [ + "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.ini_options] +filterwarnings = [ + "error", +] + +[tool.coverage.paths] +source = [ + "src", + "*/site-packages", +] + +[tool.coverage.report] +exclude_also = [ + "pragma: no cover", + "def __repr__", + "def __str__", + "raise NotImplementedError", + "if __name__ == .__main__.:", +] diff --git a/packages/basemap/requirements-doc.txt b/packages/basemap/requirements-doc.txt deleted file mode 100644 index 385d1e158..000000000 --- a/packages/basemap/requirements-doc.txt +++ /dev/null @@ -1,6 +0,0 @@ -sphinx >= 5.3, < 7.2; python_version >= "3.8" -furo >= 2022.4.7, < 2023.9.11; python_version >= "3.8" - -scipy >= 1.2, < 1.12; python_version >= "3.5" -cftime >= 1.4.0, < 1.7.0; python_version >= "3.6" -netCDF4 >= 1.5.6, < 1.7.0; python_version >= "3.6" diff --git a/packages/basemap/requirements-lint.txt b/packages/basemap/requirements-lint.txt deleted file mode 100644 index 2b2a187c4..000000000 --- a/packages/basemap/requirements-lint.txt +++ /dev/null @@ -1,17 +0,0 @@ -unittest2; python_version <= "3.9" - -flake8 >= 2.6, < 3.0; python_version == "2.6" -flake8 >= 2.6, < 4.0; python_version == "2.7" -flake8 >= 2.6, < 3.0; python_version == "3.2" -flake8 >= 2.6, < 3.0; python_version == "3.3" -flake8 >= 2.6, < 3.9; python_version == "3.4" -flake8 >= 2.6, < 6.2; python_version >= "3.5" - -astroid >= 1.6, < 2.0; python_version == "2.7" -astroid >= 2.4, < 2.5; python_version == "3.5" -astroid >= 2.5, < 2.7; python_version == "3.6" -astroid >= 2.8, < 3.1; python_version >= "3.7" -pylint >= 1.9, < 2.0; python_version == "2.7" -pylint >= 2.6, < 2.7; python_version == "3.5" -pylint >= 2.7, < 2.10; python_version == "3.6" -pylint >= 2.11, < 3.1; python_version >= "3.7" diff --git a/packages/basemap/requirements-owslib.txt b/packages/basemap/requirements-owslib.txt deleted file mode 100644 index 5c4f0439d..000000000 --- a/packages/basemap/requirements-owslib.txt +++ /dev/null @@ -1,8 +0,0 @@ -ordereddict; python_version == "2.6" -OWSLib >= 0.8.0, < 0.15.0; python_version == "2.6" -OWSLib >= 0.8.0, < 0.19.0; python_version == "2.7" -OWSLib >= 0.8.0, < 0.11.0; python_version == "3.2" -OWSLib >= 0.8.0, < 0.11.0; python_version == "3.3" -OWSLib >= 0.8.0, < 0.18.0; python_version == "3.4" -OWSLib >= 0.8.0, < 0.20.0; python_version == "3.5" -OWSLib >= 0.28.1, < 0.30.0; python_version >= "3.6" diff --git a/packages/basemap/requirements-pillow.txt b/packages/basemap/requirements-pillow.txt deleted file mode 100644 index 647257799..000000000 --- a/packages/basemap/requirements-pillow.txt +++ /dev/null @@ -1,8 +0,0 @@ -pillow >= 3.4.0, < 4.0.0; python_version == "2.6" -pillow >= 6.2.2, < 7.0.0; python_version == "2.7" -pillow >= 3.4.0, < 4.0.0; python_version == "3.2" -pillow >= 4.3.0, < 5.0.0; python_version == "3.3" -pillow >= 5.4.0, < 6.0.0; python_version == "3.4" -pillow >= 7.1.0, < 8.0.0; python_version == "3.5" -pillow >= 8.3.2, < 9.0.0; python_version == "3.6" -pillow >= 9.4.0, < 10.2.0; python_version >= "3.7" diff --git a/packages/basemap/requirements-setup.txt b/packages/basemap/requirements-setup.txt deleted file mode 100644 index 6f39a1a05..000000000 --- a/packages/basemap/requirements-setup.txt +++ /dev/null @@ -1,2 +0,0 @@ -cython >= 0.29, < 3.1; python_version >= "3.3" or python_version < "3.0" -cython >= 0.26, < 0.27; python_version == "3.2" diff --git a/packages/basemap/requirements-test.txt b/packages/basemap/requirements-test.txt deleted file mode 100644 index 7491b2686..000000000 --- a/packages/basemap/requirements-test.txt +++ /dev/null @@ -1,23 +0,0 @@ -unittest2; python_version <= "3.9" - -pytest >= 3.2.0, < 3.3; python_version == "2.6" -pytest >= 4.6.9, < 5.0; python_version == "2.7" -pytest >= 2.9.0, < 3.0; python_version == "3.2" -pytest >= 3.2.0, < 3.3; python_version == "3.3" -pytest >= 4.6.9, < 5.0; python_version == "3.4" -pytest >= 6.1.2, < 6.2; python_version == "3.5" -pytest >= 6.2.5, < 7.5; python_version >= "3.6" - -coverage >= 4.5, < 5.0; python_version == "2.6" -coverage >= 5.5, < 6.0; python_version == "2.7" -coverage >= 3.7, < 4.0; python_version == "3.2" -coverage >= 4.5, < 5.0; python_version == "3.3" -coverage >= 4.5, < 5.0; python_version == "3.4" -coverage >= 5.5, < 6.0; python_version == "3.5" -coverage >= 5.5, < 7.4; python_version >= "3.6" -pytest-cov >= 2.5, < 2.6; python_version == "2.6" -pytest-cov >= 2.9, < 3.0; python_version == "2.7" -pytest-cov >= 2.5, < 2.6; python_version == "3.2" -pytest-cov >= 2.5, < 2.6; python_version == "3.3" -pytest-cov >= 2.5, < 2.9; python_version == "3.4" -pytest-cov >= 2.9, < 4.2; python_version >= "3.5" diff --git a/packages/basemap/requirements.txt b/packages/basemap/requirements.txt deleted file mode 100644 index 3c028489e..000000000 --- a/packages/basemap/requirements.txt +++ /dev/null @@ -1,38 +0,0 @@ -basemap_data >= 1.3.2, < 1.4 - -numpy >= 1.11, < 1.12; python_version == "2.6" -numpy >= 1.16, < 1.17; python_version == "2.7" -numpy >= 1.11, < 1.12; python_version == "3.2" -numpy >= 1.11, < 1.12; python_version == "3.3" -numpy >= 1.15, < 1.17; python_version == "3.4" -numpy >= 1.16, < 1.19; python_version == "3.5" -numpy >= 1.19, < 1.20; python_version == "3.6" -numpy >= 1.21, < 1.22; python_version == "3.7" -numpy >= 1.21, < 1.27; python_version >= "3.8" - -cycler < 0.11; python_version == "3.2" -pyparsing >= 1.5, < 2.4.1; python_version == "2.6" -pyparsing >= 1.5, < 2.3.1; python_version == "3.2" -matplotlib >= 1.5, < 2.0; python_version == "2.6" -matplotlib >= 1.5, < 3.0; python_version == "2.7" -matplotlib >= 1.5, < 2.0; python_version == "3.2" -matplotlib >= 1.5, < 2.0; python_version == "3.3" -matplotlib >= 1.5, < 3.0; python_version == "3.4" -matplotlib >= 1.5, < 3.9; python_version >= "3.5" - -pyproj >= 1.9.3, < 2.1.0; python_version == "2.6" -pyproj >= 1.9.3, < 2.2.0; python_version == "2.7" -pyproj >= 1.9.3, < 1.9.6; python_version == "3.2" -pyproj >= 1.9.3, < 2.1.0; python_version == "3.3" -pyproj >= 1.9.3, < 2.1.0; python_version == "3.4" -pyproj >= 1.9.3, < 3.7.0; python_version >= "3.5" - -pyshp >= 1.2, < 2.0; python_version == "2.6" -pyshp >= 1.2, < 2.4; python_version >= "2.7" - -packaging >= 16.0, < 17.0; python_version == "2.6" -packaging >= 16.0, < 21.0; python_version == "2.7" -packaging >= 16.0, < 17.0; python_version == "3.2" -packaging >= 16.0, < 17.0; python_version == "3.3" -packaging >= 16.0, < 21.0; python_version == "3.4" -packaging >= 16.0, < 24.0; python_version >= "3.5" 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..b20393c86 100644 --- a/packages/basemap/setup.py +++ b/packages/basemap/setup.py @@ -10,16 +10,10 @@ import glob import warnings from setuptools import setup -from setuptools import find_packages +from setuptools import find_namespace_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.""" @@ -162,44 +156,19 @@ def run(self): 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": @@ -208,13 +177,17 @@ def run(self): "Víctor Molina García", "maintainer_email": "molinav@users.noreply.github.com", + "license": + "MIT", + "license_files": [ + "LICENSE", + "LICENSE.geos", + ], "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", @@ -224,49 +197,42 @@ def run(self): "maps", "plots", ], - "namespace_packages": [ - "mpl_toolkits", - ], "package_dir": {"": "src"}, "packages": - find_packages(where="src"), + find_namespace_packages(where="src"), "ext_modules": ext_modules, "data_files": data_files, "python_requires": ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", - "<3.13", + ">=3.9", + "<3.14", ]), - "setup_requires": - setup_requires, "install_requires": - install_requires, + get_content("dep/requirements.txt", splitlines=True), "extras_require": { "doc": - get_content("requirements-doc.txt", splitlines=True), + get_content("dep/requirements-doc.txt", splitlines=True), "lint": - get_content("requirements-lint.txt", splitlines=True), + get_content("dep/requirements-lint.txt", splitlines=True), "test": - get_content("requirements-test.txt", splitlines=True), + get_content("dep/requirements-test.txt", splitlines=True), "owslib": - get_content("requirements-owslib.txt", splitlines=True), - "pillow": - get_content("requirements-pillow.txt", splitlines=True), + get_content("dep/requirements-owslib.txt", splitlines=True), }, "cmdclass": { "sdist": basemap_sdist, }, "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": + "Homepage": "https://github.com/matplotlib/basemap", + "Documentation": + "https://matplotlib.org/basemap", + "Repository": + "https://github.com/matplotlib/basemap.git", + "Issues": + "https://github.com/matplotlib/basemap/issues", }, }) diff --git a/packages/basemap/src/_geoslib.pyx b/packages/basemap/src/_geoslib.pyx index 1e2ced532..127e8c8cf 100644 --- a/packages/basemap/src/_geoslib.pyx +++ b/packages/basemap/src/_geoslib.pyx @@ -2,7 +2,7 @@ import sys import numpy cimport numpy as cnp -__version__ = "1.4.1" +__version__ = "2.0.0.dev0" # Need some Python C-API functions for strings. @@ -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/src/mpl_toolkits/__init__.py b/packages/basemap/src/mpl_toolkits/__init__.py deleted file mode 100644 index b5cd40f18..000000000 --- a/packages/basemap/src/mpl_toolkits/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import (absolute_import, division, print_function) - -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - pass # must not have setuptools diff --git a/packages/basemap/src/mpl_toolkits/basemap/__init__.py b/packages/basemap/src/mpl_toolkits/basemap/__init__.py index 651a2dd5a..82a8258d6 100644 --- a/packages/basemap/src/mpl_toolkits/basemap/__init__.py +++ b/packages/basemap/src/mpl_toolkits/basemap/__init__.py @@ -48,7 +48,7 @@ from . proj import Proj -__version__ = "1.4.1" +__version__ = "2.0.0.dev0" # basemap data files now installed in lib/matplotlib/toolkits/basemap/data # check to see if environment variable BASEMAPDATA set to a directory, @@ -4413,6 +4413,7 @@ def wmsimage(self,server,\ verbose if True, print WMS server info (default False). \**kwargs extra keyword arguments passed on to + OWSLib.wms.WebMapService and OWSLib.wms.WebMapService.getmap. ============== ==================================================== @@ -4452,7 +4453,11 @@ def wmsimage(self,server,\ if ypixels is None: ypixels = int(self.aspect*xpixels) if verbose: print(server) - wms = WebMapService(server) + wms_keys = ["version", "xml", "username", "password", + "parse_remote_metadata", "timeout", "headers", "auth"] + wms_options = {k: kwargs[k] for k in wms_keys if k in kwargs} + kwargs = {k: kwargs[k] for k in kwargs if k not in wms_keys} + wms = WebMapService(server, **wms_options) if verbose: print('id: %s, version: %s' % (wms.identification.type,wms.identification.version)) @@ -4836,10 +4841,11 @@ def shiftdata(self,lonsin,datain=None,lon_0=None,fix_wrap_around=True): [lon_0-180, lon_0+180] range. ================ ====================================================== - if datain given, returns ``dataout,lonsout`` (data and longitudes shifted to fit in interval - [lon_0-180,lon_0+180]), otherwise just returns longitudes. If - transformed longitudes lie outside map projection region, data is - masked and longitudes are set to 1.e30. + If datain is given, returns ``lonsout, dataout`` (longitudes and data + shifted to fit in the interval [lon_0-180, lon_0+180]); otherwise, + returns just the shifted longitudes. If transformed longitudes lie + outside the map projection region, data is masked and longitudes are + set to 1.e30. """ if lon_0 is None and 'lon_0' not in self.projparams: raise ValueError('lon_0 keyword must be provided') diff --git a/packages/basemap/test/__init__.py b/packages/basemap/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/basemap/test/mpl_toolkits/__init__.py b/packages/basemap/test/mpl_toolkits/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/basemap/test/mpl_toolkits/basemap/test_Basemap.py b/packages/basemap/test/mpl_toolkits/basemap/test_Basemap.py index 6a94d291f..f18b2c29e 100644 --- a/packages/basemap/test/mpl_toolkits/basemap/test_Basemap.py +++ b/packages/basemap/test/mpl_toolkits/basemap/test_Basemap.py @@ -4,10 +4,7 @@ import shutil import tempfile import datetime as dt -try: - import unittest2 as unittest -except ImportError: - import unittest +import unittest import numpy as np import matplotlib as mpl diff --git a/packages/basemap/test/mpl_toolkits/basemap/test_cm.py b/packages/basemap/test/mpl_toolkits/basemap/test_cm.py index 77df7d3bf..66d8ef665 100644 --- a/packages/basemap/test/mpl_toolkits/basemap/test_cm.py +++ b/packages/basemap/test/mpl_toolkits/basemap/test_cm.py @@ -1,10 +1,6 @@ """Import test for :mod:`mpl_toolkits.basemap.cm`.""" -try: - import unittest2 as unittest -except ImportError: - import unittest - +import unittest from mpl_toolkits.basemap import cm diff --git a/packages/basemap/test/mpl_toolkits/basemap/test_diagnostic.py b/packages/basemap/test/mpl_toolkits/basemap/test_diagnostic.py index b5bacce3a..f5ac65564 100644 --- a/packages/basemap/test/mpl_toolkits/basemap/test_diagnostic.py +++ b/packages/basemap/test/mpl_toolkits/basemap/test_diagnostic.py @@ -1,11 +1,7 @@ """Import test for :mod:`mpl_toolkits.basemap.diagnostic`.""" +import unittest from collections import namedtuple -try: - import unittest2 as unittest -except ImportError: - import unittest - from mpl_toolkits.basemap import diagnostic diff --git a/packages/basemap/test/mpl_toolkits/basemap/test_proj.py b/packages/basemap/test/mpl_toolkits/basemap/test_proj.py index dfdcd69ba..4385c8f6f 100644 --- a/packages/basemap/test/mpl_toolkits/basemap/test_proj.py +++ b/packages/basemap/test/mpl_toolkits/basemap/test_proj.py @@ -1,10 +1,6 @@ """Import test for :mod:`mpl_toolkits.basemap.proj`.""" -try: - import unittest2 as unittest -except ImportError: - import unittest - +import unittest from mpl_toolkits.basemap.proj import Proj diff --git a/packages/basemap/test/mpl_toolkits/test_basemap.py b/packages/basemap/test/mpl_toolkits/test_basemap.py index 80a31cb2e..9aab0ef48 100644 --- a/packages/basemap/test/mpl_toolkits/test_basemap.py +++ b/packages/basemap/test/mpl_toolkits/test_basemap.py @@ -1,10 +1,6 @@ """Import test for the :mod:`mpl_toolkits.basemap` package.""" -try: - import unittest2 as unittest -except ImportError: - import unittest - +import unittest from mpl_toolkits import basemap @@ -18,8 +14,8 @@ def test_version_attribute(self): basemap_version = basemap.__version__ num = r"(?:0|[1-9]\d*)" - build = r"(?:dev|a[1-4]|b[1-3]|rc[1-2])" - semver = r"^({0}\.{0}\.{0})(?:[+-]?({1}))?$".format(num, build) + build = r"(?:dev[0]?|a[1-4]|b[1-3]|rc[1-2])" + semver = r"^({0}\.{0}\.{0})(?:[+-\.]?({1}))?$".format(num, build) self.assertRegex(basemap_version, semver) diff --git a/packages/basemap/utils/GeosLibrary.py b/packages/basemap/utils/GeosLibrary.py index 4db6b88e9..0462d6775 100644 --- a/packages/basemap/utils/GeosLibrary.py +++ b/packages/basemap/utils/GeosLibrary.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- # -# Copyright (c) 2021-2024 Víctor Molina García +# Copyright (c) 2021-2025 Víctor Molina García # # GeosLibrary.py is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published @@ -62,7 +62,7 @@ def __init__(self, version, root=None): def __del__(self): """Clean up after :class:`GeosLibrary` destruction.""" - if self.temp: + if getattr(self, "temp", None) and getattr(self, "root", None): try: shutil.rmtree(self.root) except OSError: 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 index 2d8e4e620..64e2eddeb 100644 --- a/packages/basemap_data/setup.py +++ b/packages/basemap_data/setup.py @@ -7,7 +7,7 @@ import os import itertools from setuptools import setup -from setuptools import find_packages +from setuptools import find_namespace_packages def get_content(name, splitlines=False): @@ -73,17 +73,13 @@ def get_content(name, splitlines=False): "name": "basemap_data", "version": - "1.3.2", - "license": - "GNU Lesser General Public License v3 or later (LGPLv3+)", + "2.0.0.dev0", "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": @@ -92,13 +88,19 @@ def get_content(name, splitlines=False): "Víctor Molina García", "maintainer_email": "molinav@users.noreply.github.com", + "license": + "GNU Lesser General Public License v3 or later (LGPLv3+)", + "license_files": [ + "COPYING", + "COPYING.LESSER", + "LICENSE.epsg", + "LICENSE.mit", + ], "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", @@ -108,30 +110,27 @@ def get_content(name, splitlines=False): "maps", "plots", ], - "namespace_packages": [ - "mpl_toolkits.basemap_data", - ], "package_dir": {"": "src"}, "packages": - find_packages(where="src"), + find_namespace_packages(where="src"), "package_data": { "mpl_toolkits.basemap_data": data_files, }, "python_requires": ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", + ">=3.9", "<4", ]), "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": + "Homepage": "https://github.com/matplotlib/basemap", + "Documentation": + "https://matplotlib.org/basemap", + "Repository": + "https://github.com/matplotlib/basemap.git", + "Issues": + "https://github.com/matplotlib/basemap/issues", }, }) diff --git a/packages/basemap_data/src/__init__.py b/packages/basemap_data/src/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/basemap_data/src/mpl_toolkits/__init__.py b/packages/basemap_data/src/mpl_toolkits/__init__.py deleted file mode 100644 index 02de4115d..000000000 --- a/packages/basemap_data/src/mpl_toolkits/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - pass # must not have setuptools diff --git a/packages/basemap_data/src/mpl_toolkits/basemap_data/__init__.py b/packages/basemap_data/src/mpl_toolkits/basemap_data/__init__.py deleted file mode 100644 index 02de4115d..000000000 --- a/packages/basemap_data/src/mpl_toolkits/basemap_data/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - pass # must not have setuptools 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 index 7dbe83cf6..4b4c22c4d 100644 --- a/packages/basemap_data_hires/setup.py +++ b/packages/basemap_data_hires/setup.py @@ -7,7 +7,7 @@ import os import itertools from setuptools import setup -from setuptools import find_packages +from setuptools import find_namespace_packages def get_content(name, splitlines=False): @@ -51,17 +51,13 @@ def get_content(name, splitlines=False): "name": "basemap_data_hires", "version": - "1.3.2", - "license": - "GNU Lesser General Public License v3 or later (LGPLv3+)", + "2.0.0.dev0", "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": @@ -70,13 +66,17 @@ def get_content(name, splitlines=False): "Víctor Molina García", "maintainer_email": "molinav@users.noreply.github.com", + "license": + "GNU Lesser General Public License v3 or later (LGPLv3+)", + "license_files": [ + "COPYING", + "COPYING.LESSER", + ], "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", @@ -86,30 +86,27 @@ def get_content(name, splitlines=False): "maps", "plots", ], - "namespace_packages": [ - "mpl_toolkits.basemap_data", - ], "package_dir": {"": "src"}, "packages": - find_packages(where="src"), + find_namespace_packages(where="src"), "package_data": { "mpl_toolkits.basemap_data": data_files, }, "python_requires": ", ".join([ - ">=2.6", - "!=3.0.*", - "!=3.1.*", + ">=3.9", "<4", ]), "project_urls": { - "Bug Tracker": - "https://github.com/matplotlib/basemap/issues", - "Documentation": - "https://matplotlib.org/basemap/", - "Source": + "Homepage": "https://github.com/matplotlib/basemap", + "Documentation": + "https://matplotlib.org/basemap", + "Repository": + "https://github.com/matplotlib/basemap.git", + "Issues": + "https://github.com/matplotlib/basemap/issues", }, }) diff --git a/packages/basemap_data_hires/src/__init__.py b/packages/basemap_data_hires/src/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/basemap_data_hires/src/mpl_toolkits/__init__.py b/packages/basemap_data_hires/src/mpl_toolkits/__init__.py deleted file mode 100644 index 02de4115d..000000000 --- a/packages/basemap_data_hires/src/mpl_toolkits/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - pass # must not have setuptools diff --git a/packages/basemap_data_hires/src/mpl_toolkits/basemap_data/__init__.py b/packages/basemap_data_hires/src/mpl_toolkits/basemap_data/__init__.py deleted file mode 100644 index 02de4115d..000000000 --- a/packages/basemap_data_hires/src/mpl_toolkits/basemap_data/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - pass # must not have setuptools