Skip to main content

Taxonomic types, projections and async taxonomy services for Polli-Labs.

Project description

TwitterBanner_SkyHyperpole2_1991

Typus

CI

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, canonical classification results, projection helpers and async database services. Anything that speaks taxonomy imports Typus and stays DRY.


Features

  • Wide ancestry viewexpanded_taxa ORM exposes each rank (L10 → L70) on a single row for constant‑time lineage queries.
  • Async servicesPostgresTaxonomyService (ltree) & SQLiteTaxonomyService (fixture) share one interface.
  • Pydantic v2 modelsTaxon, Clade, ClassificationResult, and one-release deprecated classification aliases, all JSON-Schema-exportable.
  • Taxonomy summaries & pollinator groupsTaxonSummary trails plus coarse PollinatorGroup helpers 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], [sqlite], or [loader]; core install stays lightweight.
  • Offline SQLite loadertypus-load-sqlite CLI 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]"

With SQLite loader tooling (TSV/HTTP ingest)

uv pip install "polli-typus[loader]"

Development / tests / lint

uv pip install -e ".[dev,sqlite,loader]"   # pytest, ruff, ty, pre-commit, loader deps …

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

Contributor setup and the canonical gate live in docs/contributing.md.

  • Bootstrap the repo-local dev environment

    ./dev/scripts/bootstrap-dev.sh
    
  • Run the canonical local quality gate

    make check-all
    
  • Format whole repo

    make format
    
  • Build docs

    make docs
    
  • JSON Schemasmake schemastypus/schemas/

  • Type checkingmake typecheck

  • Contributor guidedocs/contributing.md

  • SQLite fixtureuv run python scripts/gen_fixture_sqlite.py

  • Pre‑commit hooksmake dev-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 if TYPUS_TEST_DSN is unset.
  • Optional test/ops normalization maps legacy /ibrida-v0-r1 DSNs to /ibrida-v0.
  • ELEVATION_DSN: Optional DSN override for elevation tests; falls back to TYPUS_TEST_DSN.
  • ELEVATION_TABLE: Elevation raster table name (default: elevation_raster).
  • TYPUS_ELEVATION_TEST: Set 1 to enable guarded elevation tests.
  • Perf harness:
    • TYPUS_PERF_WRITE=1: write report to dev/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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

polli_typus-0.6.0.tar.gz (64.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

polli_typus-0.6.0-py3-none-any.whl (80.2 kB view details)

Uploaded Python 3

File details

Details for the file polli_typus-0.6.0.tar.gz.

File metadata

  • Download URL: polli_typus-0.6.0.tar.gz
  • Upload date:
  • Size: 64.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for polli_typus-0.6.0.tar.gz
Algorithm Hash digest
SHA256 1f97cfce8579dbe2ad48b09b1380032561ebec946da13111210b217efedf54d5
MD5 45a0a845f51090a62933465ed55c0f4f
BLAKE2b-256 b236436bf5b3b0aa07c82ac68c238079c035aa81a43ec64a5245fb98201e7fb1

See more details on using hashes here.

File details

Details for the file polli_typus-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: polli_typus-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 80.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for polli_typus-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9e961a928df879cbb1b426371c9b0c71fbeb9c921b8d8a46f28b6bc245fd0f26
MD5 36f7fe67a8cdf242fce5a2651f469a6c
BLAKE2b-256 280dd2585c1fde9cdd129985cda67245125216d1fd08f1f23f8c702ea5bb137a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page