Taxonomic types, projections and async taxonomy services for Polli-Labs.
Project description
Typus
Shared taxonomy & geo‑temporal types for the Polli‑Labs ecological stack
Documentation: https://docs.polli.ai/typus
Typus centralises every domain object that the rest of our platform —
linnaeus, pollinalysis-server, dashboards … — needs: taxon records,
clades, hierarchical classification results, projection helpers and async
database services. Anything that speaks taxonomy imports Typus and stays DRY.
Features
- Wide ancestry view –
expanded_taxaORM exposes each rank (L10 → L70) on a single row for constant‑time lineage queries. - Async services –
PostgresTaxonomyService(ltree) &SQLiteTaxonomyService(fixture) share one interface. - Pydantic v2 models –
Taxon,Clade,HierarchicalClassificationResult, all JSON‑Schema‑exportable. - Taxonomy summaries & pollinator groups –
TaxonSummarytrails plus coarsePollinatorGrouphelpers for UI labels. - Projection utils – lat/lon ↔ unit‑sphere, cyclical‑time features, multi‑scale elevation sinusoids.
- Optional drivers only when you need them – install
polli-typus[postgres]or[sqlite]; core install stays lightweight. - Offline SQLite loader –
typus-load-sqliteCLI builds and caches the offline dataset
Requirements
- Python ≥ 3.10
Installation
Core (no DB drivers)
uv pip install polli-typus # import typus
With Postgres backend
uv pip install "polli-typus[postgres]" # adds asyncpg
With SQLite only (CI, offline, sandboxes)
uv pip install "polli-typus[sqlite]"
Development / tests / lint
uv pip install -e ".[dev,sqlite]" # pytest, pytest-asyncio, ruff, pre-commit, aiosqlite …
Install with plain pip:
pip install -e ".[dev,sqlite]"
Quick start
SQLite (recommended for getting started)
# Download or build the expanded taxonomy dataset locally (~475MB sqlite / ~440MB tsv.gz)
# The loader creates recommended indexes by default for fast name search
typus-load-sqlite --sqlite expanded_taxa.sqlite
from pathlib import Path
from typus.services import SQLiteTaxonomyService
svc = SQLiteTaxonomyService(Path("expanded_taxa.sqlite"))
bee = await svc.get_taxon(630955) # Anthophila
print(bee.scientific_name, bee.rank_level) # Anthophila RankLevel.L32
You can also load on-demand in code (will download if missing):
from pathlib import Path
from typus.services import load_expanded_taxa, SQLiteTaxonomyService
db_path = load_expanded_taxa(Path("expanded_taxa.sqlite")) # create_indexes=True by default
svc = SQLiteTaxonomyService(db_path)
Name search (v0.4.0+)
# Scientific prefix match
taxa = await svc.search_taxa("Apis", scopes={"scientific"}, match="prefix")
# Vernacular (common name) exact
taxa = await svc.search_taxa("honey bee", scopes={"vernacular"}, match="exact")
Taxonomy summaries & pollinator groups (v0.4.2)
from pathlib import Path
from typus import PollinatorGroup
from typus.services import SQLiteTaxonomyService
svc = SQLiteTaxonomyService(Path("expanded_taxa.sqlite"))
# Compact trail for UIs
bee_summary = await svc.taxon_summary(630955) # Anthophila
print(bee_summary.format_trail()) # Animalia → Arthropoda → Insecta → Hymenoptera → Apidae → Anthophila
# Coarse pollinator grouping
groups = await svc.pollinator_groups_for_taxon(47219) # Apis mellifera
assert PollinatorGroup.BEE in groups
Elevation (Postgres only)
import os
from typus import PostgresRasterElevation
dsn = os.getenv("ELEVATION_DSN") or os.getenv("TYPUS_TEST_DSN")
elev = PostgresRasterElevation(dsn, raster_table=os.getenv("ELEVATION_TABLE", "elevation_raster"))
la = await elev.elevation(34.0522, -118.2437)
vals = await elev.elevations([
(34.0522, -118.2437), # LA
(0.0, -30.0), # ocean (likely None)
])
Geo helpers
from typus import latlon_to_unit_sphere
print(latlon_to_unit_sphere(31.5, -110.4)) # → x, y, z on S²
Postgres (optional for production deployments)
from typus import PostgresTaxonomyService
svc = PostgresTaxonomyService("postgresql+asyncpg://user:pw@host/db")
bee = await svc.get_taxon(630955)
Developer guide
-
Lint & tests (one‑liner)
ruff format . && ruff check . && pytest -q
-
Format whole repo
ruff format .
-
JSON Schemas –
python -m typus.export_schemas→typus/schemas/ -
SQLite fixture –
python scripts/gen_fixture_sqlite.py -
Pre‑commit hooks –
pre-commit install
Environment Variables
TYPUS_TEST_DSN: Postgres DSN for tests and perf harness (e.g.,postgresql+asyncpg://user:pw@host/db).POSTGRES_DSN: Alternate Postgres DSN; used ifTYPUS_TEST_DSNis unset.ELEVATION_DSN: Optional DSN override for elevation tests; falls back toTYPUS_TEST_DSN.ELEVATION_TABLE: Elevation raster table name (default:elevation_raster).TYPUS_ELEVATION_TEST: Set1to enable guarded elevation tests.- Perf harness:
TYPUS_PERF_WRITE=1: write report todev/agents/perf_report.md.TYPUS_PERF_VERIFY=1: enable result sanity checks.TYPUS_PERF_EXPLAIN=1: append PG EXPLAIN snippets.
Publishing (maintainers)
See build/typus_publish.md for tag → TestPyPI → PyPI workflow.
License
MIT © 2025 Polli Labs
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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
File details
Details for the file polli_typus-0.4.2-py3-none-any.whl.
File metadata
- Download URL: polli_typus-0.4.2-py3-none-any.whl
- Upload date:
- Size: 64.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82450dc4a6dacac6050748ff7850f53a6bbfd69df6f7696738cb2c0898a60282
|
|
| MD5 |
76f759c13215fec6b7d17b92e142e241
|
|
| BLAKE2b-256 |
a5ab08edebaf73126ffe43e66fe9c8822521dd4db4f26128e6fc8600e2a936cd
|