WOLS - WeMush Open Labeling Standard
The official Python implementation of the WeMush Open Labeling Standard (WOLS) v1.1.0 for specimen tracking in mushroom cultivation.
Features
- Core Module: Create, parse, validate, and serialize specimen labels
- QR Codes: Generate and scan QR codes (PNG, SVG, base64)
- Encryption: AES-256-GCM encryption for sensitive data
- CLI: Command-line interface for all operations
- Type Safe: Full type annotations with PEP 561 support
Installation
Basic Installation (Core Only)
# Using UV (recommended)
uv add wols
# Using pip
pip install wols
With Optional Features
# QR code support
uv add "wols[qr]"
# CLI support
uv add "wols[cli]"
# Encryption support
uv add "wols[crypto]"
# Everything
uv add "wols[all]"
Requirements
- Python 3.12 or later
- No required dependencies for core module
Container Image
The WOLS CLI is also available as a container image:
# Pull the latest image
docker pull ghcr.io/wemush/specimen-labels-py:latest
# Run the CLI
docker run --rm ghcr.io/wemush/specimen-labels-py --version
# Create a specimen
docker run --rm ghcr.io/wemush/specimen-labels-py create \
--species "Pleurotus ostreatus" \
--type SUBSTRATE \
--json
# Validate a specimen (mount local file)
docker run --rm -v $(pwd):/data ghcr.io/wemush/specimen-labels-py \
validate /data/specimen.json
# Generate QR code
docker run --rm -v $(pwd):/data ghcr.io/wemush/specimen-labels-py \
qr /data/specimen.json --output /data/label.png
Quick Examples
Create a Specimen (Library)
from wols import create_specimen, SpecimenType, GrowthStage, to_json
# Create a specimen
specimen = create_specimen(
type=SpecimenType.SUBSTRATE,
species="Pleurotus ostreatus",
strain="Blue Oyster",
stage=GrowthStage.COLONIZATION,
batch="BATCH-2026-001",
)
# Print the ID
print(f"Created: {specimen.id}")
# Output: Created: wemush:clx1abc123def456
# Serialize to JSON-LD
json_str = to_json(specimen, indent=2)
print(json_str)
Create a Specimen (CLI)
wols create \
--species "Pleurotus ostreatus" \
--type SUBSTRATE \
--strain "Blue Oyster" \
--stage COLONIZATION \
--output specimen.json
Generate QR Code (Library)
from wols import create_specimen, SpecimenType
from wols.qr import generate_qr_png
specimen = create_specimen(
type=SpecimenType.SUBSTRATE,
species="Pleurotus ostreatus",
)
# Generate QR code
qr_bytes = generate_qr_png(specimen)
# Save to file
with open("label.png", "wb") as f:
f.write(qr_bytes)
Validate Specimen (Library)
from wols import validate_specimen, parse_specimen
json_str = '{"@context": "...", "@type": "Specimen", ...}'
specimen = parse_specimen(json_str)
result = validate_specimen(specimen)
if result.valid:
print("Valid specimen!")
else:
for error in result.errors:
print(f"{error.path}: {error.message}")
Validate Specimen (CLI)
wols validate specimen.json
Verification
After installation, verify the library works:
# Check version
python -c "import wols; print(wols.__version__)"
# Check CLI (if installed)
wols --version
# Run a quick test
python -c "
from wols import create_specimen, SpecimenType, to_json
s = create_specimen(type=SpecimenType.CULTURE, species='Test')
print('Success:', s.id)
"
Documentation
Development
# Clone the repository
git clone https://github.com/wemush/specimen-labels-py.git
cd specimen-labels-py
# Install with development dependencies
uv sync --all-extras
# Run tests
uv run pytest
# Run linting
uv run ruff check src tests
uv run ruff format --check src tests
# Run type checking
uv run mypy src
Regenerating the Demo GIF
The demo GIF is generated using VHS:
# Install VHS (macOS)
brew install vhs
# Regenerate the demo
cd demo
vhs demo.tape
License
Apache 2.0 License - see LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
wols-1.2.0.tar.gz
(1.0 MB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
wols-1.2.0-py3-none-any.whl
(1.0 MB
view details)
File details
Details for the file wols-1.2.0.tar.gz.
File metadata
- Download URL: wols-1.2.0.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
867c9a9e5a5a1e554f1306b3529461b94cf13eaa4a0bb48e3b6c00a7f301810d
|
|
| MD5 |
bfc1dafbfe536cb3f4ea9246a1bdafdd
|
|
| BLAKE2b-256 |
1b65795de26408b43da3b186301d518b6d2860fa51b5fa3f308d197d2bb62817
|
File details
Details for the file wols-1.2.0-py3-none-any.whl.
File metadata
- Download URL: wols-1.2.0-py3-none-any.whl
- Upload date:
- Size: 1.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3be34a38341aa43b8333c038a3a68d59e5f2219fe952165eb83b673839bce0c
|
|
| MD5 |
917b54fdb9fd9f7f1a5fcd684a6cf45d
|
|
| BLAKE2b-256 |
21a679813a7ee268b24d30c2bfedf85046057a2a0631424aec98f6cc03296ac0
|