pywis-pubsub
Overview
pywis-pubsub provides Publish-Subscribe capabilities in support of WIS2 message notification, processing and data download.
Installation
The easiest way to install pywis-pubsub is via the Python pip utility:
# default install
pip3 install pywis-pubsub
# install with storage spport for S3
pip3 install pywis-pubsub[backend-s3]
Requirements
- Python 3
- virtualenv
Dependencies
Dependencies are listed in pyproject.toml. Dependencies are automatically installed during pywis-pubsub installation.
Windows installations
Note that you will need Cython and Shapely Windows wheels for windows for your architecture prior to installing pywis-pubsub.
Installing pywis-pubsub
# setup virtualenv
python3 -m venv --system-site-packages pywis-pubsub
cd pywis-pubsub
source bin/activate
# clone codebase and install
git clone https://github.com/World-Meteorological-Organization/pywis-pubsub.git
cd pywis-pubsub
pip3 install .
Running
First check pywis-pubsub was correctly installed
pywis-pubsub --version
Create configuration
cp pywis-pubsub-config.yml local.yml
vim local.yml # update accordingly to configure subscribe options
Subscribing
# sync WIS2 notification and monitoring event schemas
pywis-pubsub bundle sync
# connect, and simply echo messages
pywis-pubsub subscribe --config local.yml
# subscribe, and download data from message
pywis-pubsub subscribe --config local.yml --download
# subscribe, and filter messages by geometry
pywis-pubsub subscribe --config local.yml --bbox=-142,42,-52,84
# subscribe, and filter messages by geometry, adjust debugging verbosity
pywis-pubsub subscribe --config local.yml --bbox=-142,42,-52,84 --verbosity=DEBUG
WIS2 Notification Message (WNM) workflow
Validating a message and verifying data
# validate a message
pywis-pubsub wnm ets validate /path/to/message1.json
# verify data from a message
pywis-pubsub wnm ets verify /path/to/message1.json
# validate WNM against abstract test suite (file on disk)
pywis-pubsub wnm ets validate /path/to/file.json
# validate WNM against abstract test suite (URL)
pywis-pubsub wnm ets validate https://example.org/path/to/file.json
# validate WNM against abstract test suite (URL), but turn JSON Schema validation off
pywis-pubsub wnm ets validate https://example.org/path/to/file.json --no-fail-on-schema-validation
# key performance indicators
# set environment variable for GDC URL
export PYWIS_PUBSUB_GDC_URL=https://api.weather.gc.ca/collections/wis2-discovery-metadata
# all WNM key performance indicators at once
pywis-pubsub wnm kpi validate https://example.org/path/to/file.json --verbosity DEBUG
# all WNM key performance indicators at once, but turn ETS validation off
pywis-pubsub wnm kpi validate https://example.org/path/to/file.json --no-fail-on-ets --verbosity DEBUG
# all WNM key performance indicators at once, in summary
pywis-pubsub wnm kpi validate https://example.org/path/to/file.json --verbosity DEBUG --summary
# selected WNM key performance indicator
pywis-pubsub wnm kpi validate --kpi metadata_id /path/to/file.json -v INFO
Publishing
cp pub-config-example.yml pub-local.yml
vim pub-local.yml # update accordingly to configure publishing options
# example publishing a WIS2 notification message with attributes:
# data-url=http://www.meteo.xx/stationXYZ-20221111085500.bufr4
# lon,lat,elevation=33.8,11.8,112
# wigos_station_identifier=0-20000-12345
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345
# publish a message with a WCMP2 metadata id
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345 --metadata-id "x-urn:wmo:md:test-foo:htebmal2001"
# publish a message with a datetime (instant)
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345 --metadata-id "x-urn:wmo:md:test-foo:htebmal2001" --datetime 2024-01-08T22:56:23Z
# publish a message with a start and end datetime (extent)
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345 --metadata-id "x-urn:wmo:md:test-foo:htebmal2001" --datetime 2024-01-08T20:56:23Z/2024-01-08T22:56:43Z
# publish a message as a data update
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345 --metadata-id "x-urn:wmo:md:test-foo:htebmal2001" --operation update
# publish a message as a data deletion
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml -u https://example.org/stationXYZ-20221111085500.bufr4 -g 33.8,-11.8,8.112 -w 0-20000-12345 --metadata-id "x-urn:wmo:md:test-foo:htebmal2001" --operation delete
# publish a message from file on disk
pywis-pubsub wnm publish --topic origin/a/wis2/centre-id/data/core/weather --config pub-local.yml --wnm my_message.json
Using the API
Python examples:
Validating a WNM
from pywis_pubsub.wnm.ets import WNMTestSuite
try:
ts = WNMTestSuite(wnm_dict)
_ = ts.run_tests(fail_on_schema_validation=True)
except Exception as err:
print(f'Error: {err}')
Subscribing to a WIS2 Global Broker
from pywis_pubsub.mqtt import MQTTPubSubClient
options = {
'storage': {
'type': 'fs',
'basedir': '/tmp'
},
'bbox': [-90, -180, 90, 180]
}
topics = [
'topic1',
'topic2'
]
m = MQTTPubSubClient('mqtt://localhost:1883', options)
# example with credentials
# m = MQTTPubSubClient('mqtt://username:password@localhost:1883', options)
m.sub(topics)
Publishing a WIS2 Notification Message
from datetime import datetime, timezone
from pywis_pubsub.mqtt import MQTTPubSubClient
from pywis_pubsub.wnm.publish import create_message
from pywis_pubsub.wnm.ets import WNMTestSuite, WNMKeyPerformanceIndicators
url_info = get_url_info('http://www.meteo.xx/stationXYZ-20221111085500.bufr4')
message = create_message(
topic='foo/bar',
content_type='application/bufr',
url_info=url_info,
identifier='stationXYZ-20221111085500',
datetime_=datetime.now(timezone.utc),
geometry=[33.8, -11.8, 123],
metadata_id='x-urn:wmo:md:test-foo:htebmal2001',
wigos_station_identifier='0-20000-12345',
operation='update'
)
m = MQTTPubSubClient('mqtt://localhost:1883')
m.pub(topic, json.dumps(message))
Running KPIs
>>> ts = WNMTestSuite(message)
>>> ts.run_tests() # raises ValueError error stack on exception
>>> ts.raise_for_status() # raises pywis_pubsub.errors.TestSuiteError on exception with list of errors captured in .errors property
>>> # test KPI
>>> import json
>>> from pywis_pubsub.kpi import WNMKeyPerformanceIndicators
>>> with open('/path/to/file.json') as fh:
... data = json.load(fh) >>> kpis = WNMKeyPerformanceIndicators(data)
>>> results = kpis.evaluate()
>>> results['summary']
WIS2 Monitoring Events (WME) workflow
Validating a message
# validate WMEM against abstract test suite (file on disk)
pywis-pubsub wmem ets validate /path/to/file.json
# validate WMEM against abstract test suite (URL)
pywis-pubsub wmem ets validate https://example.org/path/to/file.json
# validate WNM against abstract test suite (URL), but turn JSON Schema validation off
pywis-pubsub wmem ets validate https://example.org/path/to/file.json --no-fail-on-schema-validation
Publishing
# publish a message from file on disk
pywis-pubsub wmem publish --topic monitor/a/wis2/centre-id --config pub-local.yml --wmem my_message.json
Using the API
from pywis_pubsub.wmem.ets import WMEMTestSuite
try:
ts = WMEMTestSuite(wmem_dict)
_ = ts.run_tests(fail_on_schema_validation=True)
except Exception as err:
print(f'Error: {err}')
Development
Running Tests
pip3 install ".[tests]"
python3 tests/run_tests.py
Releasing
# create release (x.y.z is the release version)
vi pyproject.toml # update [project]/version
git commit -am 'update release version x.y.z'
git push origin main
git tag -a x.y.z -m 'tagging release version x.y.z'
git push --tags
# upload to PyPI
rm -fr build dist *.egg-info
python3 -m build
twine upload dist/*
# publish release on GitHub (https://github.com/World-Meteorological-Organization/pywis-pubsub/releases/new)
# bump version back to dev
vi pyproject.toml # update [project]/version
git push origin main
Code Conventions
Bugs and Issues
All bugs, enhancements and issues are managed on GitHub.
Contact
Metadata
Release files for pywis-pubsub 0.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pywis_pubsub-0.13.0.tar.gz | 30.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pywis_pubsub-0.13.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.0 kB
Release files / pywis_pubsub-0.13.0.tar.gz
| Download URL | pywis_pubsub-0.13.0.tar.gz |
|---|---|
| Size | 30.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cccc5630c01d648ddc65aa7e9e4ff2cae38aa75955bcfab7668903405c0c6420
|
|
BLAKE2b-256 checksum How to use checksums |
354f412e6fd0b0c47c97fa21ac43cf4551924d4feeaeddc62d07c8e1d93ef0a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / pywis_pubsub-0.13.0-py3-none-any.whl
| Download URL | pywis_pubsub-0.13.0-py3-none-any.whl |
|---|---|
| Size | 43.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9a66fc7997e29eebad07b0650935ee30840434636f75f9b1e69d2f1b0e85348a
|
|
BLAKE2b-256 checksum How to use checksums |
fa69f3d70afa2606e416d46f4e3c36790f7bfd928189e854868ff2fcf066b9c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|