Skip to content
Merged
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
4 changes: 2 additions & 2 deletions .github/workflows/docs_pages.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Install dependencies
run: uv sync --all-extras
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/linting.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Install dependencies
run: uv sync --all-extras
Expand Down
13 changes: 8 additions & 5 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ jobs:
strategy:
fail-fast: true
matrix:
python-version: [ "3.12", "3.13", "3.14" ]
# Mirrors the blocking legs of tests.yaml. Deliberately excludes the
# experimental 3.15 lane — a release gate must not depend on a leg
# that is allowed to fail.
python-version: [ "3.11", "3.12", "3.13", "3.14" ]
name: pytest (Python ${{ matrix.python-version }})
steps:
- name: Checkout
Expand Down Expand Up @@ -56,8 +59,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Install dependencies
run: uv sync --all-extras
Expand All @@ -80,8 +83,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Build
run: uv build
Expand Down
34 changes: 25 additions & 9 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,24 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [ "3.12", "3.13", "3.14" ]
name: pytest (Python ${{ matrix.python-version }})
# Supported range: 3.11 (floor, see requires-python in pyproject.toml)
# through 3.14 (the development version, see .python-version).
python-version: [ "3.11", "3.12", "3.13", "3.14" ]
experimental: [ false ]
include:
# Forward-looking lane for the next release (3.15, due 2026-10-01).
# Non-blocking on purpose: as of 3.15.0a8 this fails during
# *dependency installation*, not during our tests — shapely has no
# 3.15 wheels yet, so uv falls back to a source build that needs
# numpy headers. That is an upstream packaging gap, NOT an
# OSHConnect incompatibility. Expect this leg to go green on its
# own once shapely ships 3.15 wheels; if it fails for any other
# reason, that IS worth investigating.
- python-version: "3.15"
experimental: true
name: pytest (Python ${{ matrix.python-version }}${{ matrix.experimental && ' — experimental, non-blocking' || '' }})
# Only the experimental leg is allowed to fail without failing the run.
continue-on-error: ${{ matrix.experimental }}
steps:
- name: Checkout
uses: actions/checkout@v5
Expand Down Expand Up @@ -85,12 +101,12 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Install package with NO extras
run: |
uv venv --python 3.13
uv venv --python 3.14
uv pip install .

- name: Import smoke test (no extras)
Expand Down Expand Up @@ -138,8 +154,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

- name: Install dependencies
run: uv sync --all-extras
Expand Down Expand Up @@ -186,8 +202,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install Python 3.13
run: uv python install 3.13
- name: Install Python 3.14
run: uv python install 3.14

# Append `.dev<run_number>` to the version in pyproject.toml so each
# dev push gets a fresh PEP 440-compliant pre-release (e.g.
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,11 @@ cython_debug/

.idea/

.python-version
# .python-version is intentionally TRACKED — it pins development to 3.14.
# Without it, uv selects the newest stable interpreter satisfying
# requires-python (>=3.11), so every contributor would silently move to
# 3.15 the day it ships. 3.15 is meant to be a non-blocking preview lane
# in tests.yaml, not the dev environment.

poetry.lock

Expand Down
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.14
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,13 @@ coverage is on, source is scoped to `src/oshconnect`, and obvious dead lines
(`if TYPE_CHECKING:`, `raise NotImplementedError`, etc.) are excluded.

CI (`.github/workflows/tests.yaml`) runs the suite with `--cov` on every push
across Python 3.12 / 3.13 / 3.14 and uploads `coverage.xml` as a workflow
artifact (downloadable from the run page).
across Python 3.11 / 3.12 / 3.13 / 3.14 and uploads `coverage.xml` as a workflow
artifact (downloadable from the run page). A further non-blocking lane runs
against the 3.15 pre-release as an early-warning signal; it is allowed to fail
and does not gate merges.

Development happens on Python 3.14 (pinned in `.python-version`); 3.11 is the
supported floor.

## Documentation Coverage

Expand Down
2 changes: 1 addition & 1 deletion docs/source/architecture/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ For the inverse direction (creating resources server-side), see

- **pydantic** — all resource and schema models. Bumping the minimum requires
confirming pre-built wheels exist for all supported Python versions
(3.12 – 3.14).
(3.11 – 3.14).
- **shapely** — geometry handling for spatial resources.
- **paho-mqtt** — MQTT streaming for CS API Part 3.
- **websockets** / **aiohttp** — WebSocket and async HTTP streaming.
Expand Down
11 changes: 9 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
[project]
name = "oshconnect"
version = "0.5.3a1"
version = "0.5.4a0"
description = "Library for interfacing with OSH, helping guide visualization efforts, and providing a place to store configurations. Implements OGC CS API Part 3 (Pub/Sub) MQTT topic conventions including :data topics and resource event topics."
readme = "README.md"
authors = [
{ name = "Ian Patterson", email = "ian.patterson@georobotix.us" },
]
requires-python = "<4.0,>=3.12"
# Floor is 3.11, not 3.10: `datetime.fromisoformat` only accepts arbitrary
# ISO 8601 fractional-second precision from 3.11 on. 3.10 rejects the
# 5-digit form OSH emits (`…T17:12:58.51182Z`) with "Invalid isoformat
# string", failing tests/test_resource_datamodels.py::test_control_stream_resource.
# Dropping to 3.10 is possible but needs a parsing shim in timemanagement.py —
# don't lower this without adding one. Development happens on 3.14 (see
# .python-version); the full matrix is in .github/workflows/tests.yaml.
requires-python = "<4.0,>=3.11"
# Core stays transport-free: HTTP discovery/CRUD and the pydantic model layer
# only. Streaming transports are opt-in extras ([mqtt], [nats], [streaming])
# so minimal installs stay small — see [project.optional-dependencies].
Expand Down
Loading
Loading