Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
8058198
Port #1926
webb-ben Feb 2, 2026
1bb3c25
Add CovJSON CSV Formatter
webb-ben Feb 2, 2026
615ba45
Update EDR Content Type
webb-ben Feb 2, 2026
b1ab062
Add original tests back
webb-ben Feb 2, 2026
be45c52
Do not throw error on additional keys
webb-ben Feb 3, 2026
4d47d41
Change x,y columns order to be at the start
webb-ben Feb 12, 2026
096c577
add resolution/default to collection extents.temporal configuration (…
tomkralidis Feb 23, 2026
dabbea7
remove deprecated license and fix test cmdclass in setup.py (#2262)
tomkralidis Feb 23, 2026
4279841
Support SQL connection string (#2251)
webb-ben Feb 24, 2026
b777b16
PubSub: add support for Kafka (#2259) (#2258)
tomkralidis Feb 24, 2026
e4d8ced
Fix `transform_bbox` CRS types (#2265)
C-Loftus Feb 26, 2026
247ebf7
prevent form fields from being submitted on form click/submit (#2263)
tomkralidis Mar 1, 2026
a09fdac
enable skipping of errorneous collections in /collections (#2267)
tomkralidis Mar 2, 2026
ff8465c
OAProc: derive process execution mode OpenAPI prefer option from proc…
tomkralidis Mar 5, 2026
523c4bd
Use the latest Ubuntu Noble base image (#2275)
kalxas Mar 6, 2026
7ff27c1
update release version
kalxas Mar 6, 2026
3764b1a
back to dev
kalxas Mar 6, 2026
49ed4cc
update Security Policy (#2277)
jmckenna Mar 6, 2026
ed2b416
fix openapi generate example in docs (#2276) (#2278)
tomkralidis Mar 6, 2026
8f688a7
OAProc: derive jobControlOptions and outputTransmission from plugin (…
tomkralidis Mar 6, 2026
16736b2
Geoparquet 1.1 spec compliance update (#2271)
C-Loftus Mar 9, 2026
939d373
OAProc: safeguard link rel check (#2282) (#2283)
tomkralidis Mar 10, 2026
47d46d3
update EDR parameter defs (#2279) (#2284)
tomkralidis Mar 10, 2026
090ea9d
Parquet batch configuration and documentation for spec updates (#2281)
C-Loftus Mar 10, 2026
27be632
Remove duplicated word (#2286)
mikemahoney218-usgs Mar 10, 2026
f3d3145
add sanitization to to_json output (#2287)
tomkralidis Mar 16, 2026
ab73661
Safely handle single feature SQL requests (#2288)
webb-ben Mar 16, 2026
591a9ef
emit jobs endpoints only when manager supports async (#2291) (#2292)
tomkralidis Mar 20, 2026
a478147
Pin trivy action version to v0.35.0 (#2293)
francbartoli Mar 24, 2026
03203c8
add path to collection id for map (#2294)
C-Loftus Mar 24, 2026
a80043a
update TinyDB query builder (#2296)
tomkralidis Mar 25, 2026
30f1022
rename base_edr instance functions (#2298) (#2299)
tomkralidis Mar 26, 2026
72abbb1
Fix CRS support on WMS Facade (#2302)
doublebyte1 Mar 26, 2026
b9e81dd
UI: prevent form element names from being passed on user click/search…
tomkralidis Mar 26, 2026
95580f2
WMS Facade updates (#2303)
doublebyte1 Mar 27, 2026
c787148
- fixed bug introduced in previous commit (#2306)
doublebyte1 Mar 28, 2026
f10f9c2
Create test_csw_provider_live.py (#2309)
webb-ben Mar 31, 2026
08031d4
Fix to_json escape (#2310)
webb-ben Mar 31, 2026
1f3a29e
OAProc: ensure binary outputs are not UTF-8 decoded (#2304)
tomkralidis Apr 2, 2026
e24e26d
OAProc: fix non JSON outputs (#2311)
tomkralidis Apr 9, 2026
de09bd3
remove print statements
tomkralidis Apr 9, 2026
4794363
Merge pull request #2312 from geopython/issue-2304
tomkralidis Apr 9, 2026
82088ce
catch EDR instance queries in Starlette
tomkralidis Apr 16, 2026
bf559b6
fix boolean OpenAPI typing in HelloWorld process (#2316)
tomkralidis Apr 16, 2026
1112d2d
Merge pull request #2318 from geopython/issue-2316
tomkralidis Apr 16, 2026
e80347d
Merge pull request #2317 from geopython/starlette-edr-instances
tomkralidis Apr 17, 2026
bf25b86
STAC: secure resource pathing
tomkralidis Apr 20, 2026
3a63f5b
OAProc: secure subscriber URLs in requests
tomkralidis Apr 20, 2026
5e7e62d
Merge pull request #2320 from geopython/stac-proc-fixes
tomkralidis Apr 22, 2026
ea5c2f0
Migrate to services approach for CI (#2322)
webb-ben Apr 23, 2026
e09a6d3
Port #1926
webb-ben Feb 2, 2026
c678320
Add CovJSON CSV Formatter
webb-ben Feb 2, 2026
ff6b466
Update EDR Content Type
webb-ben Feb 2, 2026
9544775
Add original tests back
webb-ben Feb 2, 2026
40ec4cb
Do not throw error on additional keys
webb-ben Feb 3, 2026
3d736bc
Change x,y columns order to be at the start
webb-ben Feb 12, 2026
2bf449e
Fix CI
webb-ben Apr 24, 2026
af7b3ca
Merge branch 'csv-formatter' of https://github.com/webb-ben/pygeoapi …
webb-ben Apr 24, 2026
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
89 changes: 45 additions & 44 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,42 @@ jobs:
env:
POSTGRES_DB: test
POSTGRES_PASSWORD: ${{ secrets.DatabasePassword || 'postgres' }}

mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: test_geo_app
MYSQL_USER: pygeoapi
MYSQL_PASSWORD: mysql
ports:
- 3306:3306
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.0
ports:
- 9200:9200
- 9300:9300
env:
discovery.type: single-node
xpack.security.enabled: "false"
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
opensearch:
image: opensearchproject/opensearch:2.18.0
ports:
- 9209:9200
env:
discovery.type: single-node
DISABLE_SECURITY_PLUGIN: "true"
OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
mongodb:
image: mongo:8.0.4
ports:
- 27017:27017
sensorthings:
image: ghcr.io/cgs-earth/sensorthings-action:0.1.2
volumes:
- /var/run/docker.sock:/var/run/docker.sock

steps:
- name: Pre-pull Docker Images
run: |
docker pull container-registry.oracle.com/database/express:21.3.0-xe &
docker pull appropriate/curl:latest &
docker pull elasticsearch:8.17.0 &
docker pull opensearchproject/opensearch:2.18.0 &
docker pull mongo:8.0.4 &
docker pull postgis/postgis:14-3.2 &
- name: Clear up GitHub runner diskspace
run: |
echo "Space before"
Expand All @@ -60,43 +86,21 @@ jobs:
name: Setup Python ${{ matrix.python-version }}
with:
python-version: ${{ matrix.python-version }}
- name: Install and run Oracle
run: |
docker run \
-d \
--name oracledb \
-e ORACLE_PWD=oracle \
-v ${{ github.workspace }}/tests/data/oracle/init-db:/opt/oracle/scripts/startup \
-p 1521:1521 \
container-registry.oracle.com/database/express:21.3.0-xe
- name: Configure sysctl limits
run: |
sudo swapoff -a
sudo sysctl -w vm.swappiness=1
sudo sysctl -w fs.file-max=262144
sudo sysctl -w vm.max_map_count=262144
- name: "Install and run MySQL 📦"
uses: mirromutth/mysql-action@v1.1
with:
host port: 3306
mysql version: '8.0'
mysql database: test_geo_app
mysql root password: mysql # This is a dummy password here; not actually used in prod
mysql user: pygeoapi
mysql password: mysql

- name: Install and run Elasticsearch 📦
uses: getong/elasticsearch-action@v1.2
with:
elasticsearch version: '8.17.0'
host port: 9200
container port: 9200
host node port: 9300
node port: 9300
discovery type: 'single-node'
- name: Install and run OpenSearch 📦
uses: esmarkowski/opensearch-github-action@v1.0.0
with:
version: 2.18.0
security-disabled: true
port: 9209
- name: Install and run MongoDB
uses: supercharge/mongodb-github-action@1.12.0
with:
mongodb-version: '8.0.4'
- name: Install and run SensorThingsAPI
uses: cgs-earth/sensorthings-action@v0.1.2
- name: Install sqlite and gpkg dependencies
uses: awalsh128/cache-apt-pkgs-action@v1.4.3
with:
Expand All @@ -113,9 +117,6 @@ jobs:
# with:
# packages: gdal-bin libgdal-dev
# version: 3.11.3
- name: Install and run Oracle
run: |
docker run -d --name oracledb -e ORACLE_PWD=oracle -v ${{ github.workspace }}/tests/data/oracle/init-db:/opt/oracle/scripts/startup -p 1521:1521 container-registry.oracle.com/database/express:21.3.0-xe
- name: Install requirements 📦
run: |
pip3 install setuptools
Expand All @@ -131,6 +132,7 @@ jobs:
pip3 install GDAL==`gdal-config --version`
- name: setup test data ⚙️
run: |
python3 tests/load_oracle_data.py
python3 tests/load_es_data.py tests/data/ne_110m_populated_places_simple.geojson geonameid
python3 tests/load_opensearch_data.py tests/data/ne_110m_populated_places_simple.geojson geonameid
python3 tests/load_mongo_data.py tests/data/ne_110m_populated_places_simple.geojson
Expand All @@ -140,7 +142,6 @@ jobs:
psql postgresql://postgres:${{ secrets.DatabasePassword || 'postgres' }}@localhost:5432/test -f tests/data/postgres_manager_full_structure.backup.sql
mysql -h 127.0.0.1 -P 3306 -u root -p'mysql' test_geo_app < tests/data/mysql_data.sql
docker ps
python3 tests/load_oracle_data.py
- name: run API tests ⚙️
run: pytest tests/api --ignore-glob='*_live.py'
- name: run Formatter tests ⚙️
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/vulnerabilities.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Checkout pygeoapi
uses: actions/checkout@master
- name: Scan vulnerabilities with trivy
uses: aquasecurity/trivy-action@master
uses: aquasecurity/trivy-action@v0.35.0
with:
scan-type: fs
exit-code: 1
Expand All @@ -36,7 +36,7 @@ jobs:
run: |
docker buildx build -t ${{ github.repository }}:${{ github.sha }} --platform linux/amd64 --no-cache -f Dockerfile .
- name: Scan locally built Docker image for vulnerabilities with trivy
uses: aquasecurity/trivy-action@master
uses: aquasecurity/trivy-action@v0.35.0
env:
TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db:2
TRIVY_JAVA_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-java-db:1
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#
# =================================================================

FROM ubuntu:noble-20260113
FROM ubuntu:noble

LABEL maintainer="Just van den Broecke <justb4@gmail.com>"

Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ The pygeoapi Project Steering Committee (PSC) will release patches for security

| Version | Supported |
| ------- | ------------------ |
| 0.10.x | :white_check_mark: |
| < 0.10 | :x: |
| 0.2x | :white_check_mark: |
| < 0.20 | :x: |
2 changes: 1 addition & 1 deletion docs/source/administration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ To generate the OpenAPI document as JSON, run:

.. code-block:: bash

pygeoapi openapi generate /path/to/my-pygeoapi-config.yml --format json --output-file /path/to/my-pygeoapi-openapi.yml
pygeoapi openapi generate /path/to/my-pygeoapi-config.yml --format json --output-file /path/to/my-pygeoapi-openapi.json

.. note::
Generate as YAML or JSON? If your OpenAPI YAML definition is slow to render as JSON,
Expand Down
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def __getattr__(cls, name):
# built documents.
#
# The short X.Y version.
version = '0.23.dev0'
version = '0.24.dev0'
# The full version, including alpha/beta/rc tags.
release = version

Expand Down
6 changes: 6 additions & 0 deletions docs/source/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ default.
begin: 2000-10-30T18:24:39Z # start datetime in RFC3339
end: 2007-10-30T08:57:29Z # end datetime in RFC3339
trs: http://www.opengis.net/def/uom/ISO-8601/0/Gregorian # TRS
resolution: P1D # ISO 8601 duration
default: 2000-10-30T18:24:39Z # default time
# additional extents can be added as desired (1..n)
foo:
url: https://example.org/def # required URL of the extent
Expand Down Expand Up @@ -290,6 +292,10 @@ default.
type: process # REQUIRED (collection, process, or stac-collection)
processor:
name: HelloWorld # Python path of process definition
# optional, allow for internal HTTP request execution
# if set to True, enables requests to link local ranges and loopback
# default: False
allow_internal_requests: True


.. seealso::
Expand Down
11 changes: 6 additions & 5 deletions docs/source/plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -306,11 +306,11 @@ The below template provides a minimal example (let's call the file ``mycooledrda

self.covjson = {...}

def get_instances(self):
def instances(self):
return ['foo', 'bar']

def get_instance(self, instance):
return instance in get_instances()
def instance(self, instance):
return instance in instances()

def position(self, **kwargs):
return self.covjson
Expand All @@ -320,8 +320,8 @@ The below template provides a minimal example (let's call the file ``mycooledrda


For brevity, the ``position`` function returns ``self.covjson`` which is a
dictionary of a CoverageJSON representation. ``get_instances`` returns a list
of instances associated with the collection/plugin, and ``get_instance`` returns
dictionary of a CoverageJSON representation. ``instances`` returns a list
of instances associated with the collection/plugin, and ``instance`` returns
a boolean of whether a given instance exists/is valid. EDR query types are subject
to the query functions defined in the plugin. In the example above, the plugin
implements ``position`` and ``trajectory`` queries, which will be advertised as
Expand Down Expand Up @@ -410,6 +410,7 @@ Below is a sample process definition as a Python dictionary:
'it back as output. Intended to demonstrate a simple '
'process with a single literal input.',
'jobControlOptions': ['sync-execute', 'async-execute'], # whether the process can be executed in sync or async mode
'outputTransmission': ['value', 'reference'], # whether the process can return inline data or URL references
'keywords': ['hello world', 'example', 'echo'], # keywords associated with the process
'links': [{ # a list of 1..n # link objects relevant to the process
'type': 'text/html',
Expand Down
2 changes: 1 addition & 1 deletion docs/source/publishing/ogcapi-edr.rst
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ SensorThingsEDR
^^^^^^^^^^^^^^^

The SensorThings API EDR Provider for pygeaopi extends the feature provider to
produce CoverageJSON representations from SensorThings responses repsonses. This provider
produce CoverageJSON representations from SensorThings responses. This provider
relies on using the ObservedProperty Entity to create the `parameter-name` set.

.. code-block:: yaml
Expand Down
39 changes: 37 additions & 2 deletions docs/source/publishing/ogcapi-features.rst
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,7 @@ To publish a GeoParquet file (with a geometry column) the geopandas package is a
- type: feature
name: Parquet
data:
source: ./tests/data/parquet/random.parquet
source: ./tests/data/parquet/naive/random.parquet
id_field: id
time_field: time
x_field:
Expand All @@ -595,11 +595,34 @@ To publish a GeoParquet file (with a geometry column) the geopandas package is a
- minlat
- maxlat

For GeoParquet data, the `x_field` and `y_field` must be specified in the provider definition,
For older versions of parquet data that don't comply to GeoParquet v1.1, the `x_field` and `y_field` must be specified in the provider definition,
and they must be arrays of two column names that contain the x and y coordinates of the
bounding box of each geometry. If the geometries in the data are all points, the `x_field` and `y_field`
can be strings instead of arrays and refer to a single column each.

.. code-block:: yaml

providers:
- type: feature
name: Parquet
id_field: id
data:
source: ./tests/data/parquet/geoparquet1.1/nyc_subset_overture.parquet
batch_size: 10000
batch_readahead: 2


For GeoParquet data which complies to spec version 1.1, all geometry metadata will be automatically
detected.

Note that for any version of parquet, you may optionally specify ``batch_size`` and ``batch_readahead`` in the ``data`` section of the parquet provider config.
``batch_size`` controls how many rows are fetched per batch. Large batch sizes speed up data processing, but add more I/O time like increased latency when fetching data from an object store, and . If not defined it will
default to 20,000 rows.

``batch_readahead`` controls how many batches are buffered in memory. If not specified it will default to 2.
Since OGC API Features payloads are often paginated and fairly small, it generally makes sense to specify a small number to avoid reading too many batches ahead of time, especially when fetching from an object store.


.. _PostgreSQL:

PostgreSQL
Expand Down Expand Up @@ -627,6 +650,18 @@ Must have PostGIS installed.
geom_field: foo_geom
count: true # Optional; Default true; Enable/disable count for improved performance.

This can be represented as a connection dictionary or as a connection string as follows:

.. code-block:: yaml

providers:
- type: feature
name: PostgreSQL
data: postgresql://postgres:postgres@127.0.0.1:3010/test
id_field: osm_id
table: hotosm_bdi_waterways
geom_field: foo_geom

A number of database connection options can be also configured in the provider in order to adjust properly the sqlalchemy engine client.
These are optional and if not specified, the default from the engine will be used. Please see also `SQLAlchemy docs <https://docs.sqlalchemy.org/en/14/core/engines.html#custom-dbapi-connect-arguments-on-connect-routines>`_.

Expand Down
9 changes: 9 additions & 0 deletions docs/source/publishing/ogcapi-maps.rst
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,15 @@ required. An optional style name can be defined via `options.style`.
name: png
mimetype: image/png

.. note::
According to the `Standard <https://docs.ogc.org/is/20-058/20-058.html#_5df53b56-5468-4c9d-acac-6abfddd83ccf>`_, OGC API - Maps
supports a `crs` parameter, expressed as an uri. Currently, this provider supports WGS84 and Web Mercator; for a matter of convenience, they can be expressed in
a number of different ways, other than the uri format.

- `EPSG:4326`
- `EPSG:3857`
- `4326`
- `3857`

Data visualization examples
---------------------------
Expand Down
27 changes: 27 additions & 0 deletions docs/source/pubsub.rst
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ Brokers

The following protocols are supported:

.. note::

Pub/Sub client dependencies will vary based on the selected broker. ``requirements-pubsub.txt`` contains all requirements for supported brokers, as a reference point.


MQTT
^^^^

Expand All @@ -99,6 +104,23 @@ Example directive:
channel: messages/a/data # optional
hidden: false # default

Kafka
^^^^^

Example directive:

.. code-block:: yaml

pubsub:
name: Kafka
broker:
url: tcp://localhost:9092
channel: messages-a-data
# if using authentication:
# sasl_mechanism: PLAIN # default PLAIN
# sasl_security_protocol: SASL_PLAINTEXT # default SASL_PLAINTEXT
hidden: true # default false

HTTP
^^^^

Expand All @@ -113,12 +135,16 @@ Example directive:
channel: messages-a-data # optional
hidden: true # default false

Additional information
----------------------

.. note::

For any Pub/Sub endpoints requiring authentication, encode the ``url`` value as follows:

* ``mqtt://username:password@localhost:1883``
* ``https://username:password@localhost``
* ``tcp://username:password@localhost:9092``

As with any section of the pygeoapi configuration, environment variables may be used as needed, for example
to set username/password information in a URL. If ``pubsub.broker.url`` contains authentication, and
Expand All @@ -131,5 +157,6 @@ Example directive:

If a ``channel`` is not defined, only the relevant OGC API endpoint is used.


.. _`OGC API Publish-Subscribe Workflow - Part 1: Core`: https://docs.ogc.org/DRAFTS/25-030.html
.. _`AsyncAPI`: https://www.asyncapi.com
2 changes: 1 addition & 1 deletion pygeoapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#
# =================================================================

__version__ = '0.23.dev0'
__version__ = '0.24.dev0'

import click
try:
Expand Down
Loading
Loading