Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions .github/workflows/docker-gdal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ jobs:
- "ghcr.io/osgeo/gdal:ubuntu-small-3.11.5" # python 3.12.3
- "ghcr.io/osgeo/gdal:ubuntu-small-3.10.3" # python 3.12.3
- "ghcr.io/osgeo/gdal:ubuntu-small-3.9.3" # python 3.12.3
- "ghcr.io/osgeo/gdal:ubuntu-small-3.8.5" # python 3.10.12
- "ghcr.io/osgeo/gdal:ubuntu-small-3.7.3" # python 3.10.12
- "ghcr.io/osgeo/gdal:ubuntu-small-3.6.4" # python 3.10.6
- "ghcr.io/osgeo/gdal:ubuntu-small-3.8.5" # python 3.11 (installed manually)
- "ghcr.io/osgeo/gdal:ubuntu-small-3.7.3" # python 3.11 (installed manually)
- "ghcr.io/osgeo/gdal:ubuntu-small-3.6.4" # python 3.11 (installed manually)

container:
image: ${{ matrix.container }}
Expand All @@ -38,14 +38,17 @@ jobs:
run: |
apt-get update && apt-get install -y build-essential git python3-dev

# - name: Install Python
# # the GDAL 3.4 and 3.5 images do have Python 3.8 installed, so have to
# # install a more recent Python version manually
# if: matrix.container == 'osgeo/gdal:ubuntu-small-3.5.3' || matrix.container == 'osgeo/gdal:ubuntu-small-3.4.3'
# run: |
# apt-get update && apt-get install -y software-properties-common
# add-apt-repository -y ppa:deadsnakes/ppa
# apt-get update && apt-get install -y python3.9-dev
- name: Install Python
# the GDAL 3.6 - 3.8 images do have Python 3.10 installed, so have to
# install a more recent Python version manually
if: matrix.container == 'ghcr.io/osgeo/gdal:ubuntu-small-3.6.4' || matrix.container == 'ghcr.io/osgeo/gdal:ubuntu-small-3.7.3' || matrix.container == 'ghcr.io/osgeo/gdal:ubuntu-small-3.8.5'
run: |
apt-get update && apt-get install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
# set timezone to avoid tzdata interactive prompt
export DEBIAN_FRONTEND=noninteractive
export TZ=UTC
apt-get update && apt-get install -y python3.11-dev

- uses: actions/checkout@v6

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ jobs:
"macos-15-intel",
"macos-latest",
]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]
python-version: ["3.11", "3.12", "3.13", "3.14", "3.14t"]
include:
- os: "ubuntu-latest"
artifact: pyogrio-wheel-linux-manylinux2014_x86_64
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/tests-conda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,25 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-2022]
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
python: ["3.11", "3.12", "3.13", "3.14"]
env: ["latest"]
include:
# environment with lower versions of optional dependencies
- python: "3.10"
- python: "3.11"
extra: >-
pandas=1.5
geopandas=0.12
# minimal environment without optional dependencies
- os: "ubuntu-latest"
python: "3.10"
python: "3.11"
env: "minimal"
# environment without pyarrow
- os: "ubuntu-latest"
python: "3.13"
env: "no-pyarrow"
# environment with nightly wheels
- os: "ubuntu-latest"
python: "3.11"
python: "3.14"
env: "nightly-deps"

steps:
Expand Down
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
- Fix overwriting a corrupt fileGDB directory (#600).
- Fix attribute data being incorrectly written with KML driver (#650).

### Packaging

- Minimum required Python version is now 3.11 (#xxx).

## 0.12.1 (2025-11-28)

### Bug fixes
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Read the documentation for more information:

## Requirements

- Python >= 3.10
- Python >= 3.11
- GDAL >= 3.6
- Reading to GeoDataFrames requires `geopandas>=0.12` and `shapely>=2`. Additionally,
installing `pyarrow` enables a further speed-up when specifying `use_arrow=True`.
Expand Down
2 changes: 1 addition & 1 deletion docs/source/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Requirements

- Python >= 3.10
- Python >= 3.11
- GDAL >= 3.6
- Reading to GeoDataFrames requires `geopandas>=0.12` and `shapely>=2`. Additionally,
installing `pyarrow` enables a further speed-up when specifying `use_arrow=True`.
Expand Down
12 changes: 8 additions & 4 deletions pyogrio/tests/test_geopandas_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import os
import re
import warnings
from datetime import date, datetime, time, timezone
from datetime import UTC, date, datetime, time
from decimal import Decimal
from io import BytesIO
from pathlib import Path
Expand Down Expand Up @@ -1001,7 +1001,11 @@ def test_write_read_datetime_tz_mixed_offsets(
exp_dates = exp_dates.dt.as_unit("ms")
assert_series_equal(result.dates, exp_dates)
else:
assert is_object_dtype(result.dates.dtype)
if __gdal_version__ < (3, 7, 0):
assert is_string_dtype(result.dates.dtype)
result["dates"] = result["dates"].astype(object)
else:
assert is_object_dtype(result.dates.dtype)
assert_geodataframe_equal(result, df)


Expand Down Expand Up @@ -2659,8 +2663,8 @@ def test_write_read_null(tmp_path, use_arrow):
[Path("test1"), Path("test2"), None],
[date(2020, 1, 1), date(2021, 2, 2), None],
[
datetime(2020, 1, 1, 5, tzinfo=timezone.utc),
datetime(2021, 2, 2, 6, tzinfo=timezone.utc),
datetime(2020, 1, 1, 5, tzinfo=UTC),
datetime(2021, 2, 2, 6, tzinfo=UTC),
None,
],
[b"foo", b"bar", None],
Expand Down
4 changes: 1 addition & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ requires = [
"setuptools",
"Cython>=3.1",
"versioneer[toml]==0.28",
# tomli is used by versioneer
"tomli; python_version < '3.11'",
]
build-backend = "setuptools.build_meta"

Expand All @@ -28,7 +26,7 @@ classifiers = [
"Topic :: Scientific/Engineering :: GIS",
"Programming Language :: Python :: Free Threading :: 2 - Beta",
]
requires-python = ">=3.10"
requires-python = ">=3.11"
dependencies = ["certifi", "numpy", "packaging"]

[project.optional-dependencies]
Expand Down
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@
logger = logging.getLogger(__name__)


MIN_PYTHON_VERSION = (3, 10, 0)
MIN_PYTHON_VERSION = (3, 11, 0)
MIN_GDAL_VERSION = (2, 4, 0)


if sys.version_info < MIN_PYTHON_VERSION:
raise RuntimeError("Python >= 3.10 is required")
raise RuntimeError("Python >= 3.11 is required")


def copy_data_tree(datadir, destdir):
Expand Down
Loading