- Add triggers to sync observation FTS table with main observation table
- Add alembic migration for observation FTS table + triggers
- Sanitize input for FTS searches
Updates to Darwin Core metadata to better align with the spec and iNaturalist's Darwin Core implementation:
- Replace legacy Adobe
xapnamespace withxmpforCreateDate,Owner, andUsageTerms - Fix
observation.geoprivacy <-> dwc:informationWithheld - Map
taxon.variety -> to dwc:infraspecificEpithetinstead ofdwc:cultivarEpithet(which is for horticultural cultivar names) - Map
observation.uri -> dwc:occurrenceIDandobservation.uuid -> dwc:otherCatalogueNumbers - Map
observation.quality_grade -> dwc:identificationVerificationStatus - Map
observation.species_guess -> dwc:verbatimIdentification - Map
observation.observed_on_details -> (dwc:year, dwc:month, dwc:day) - Map
observation.annotations -> (dwc:sex, dwc:lifeStage, dwc:reproductiveCondition, dwc:vitality, dwc:dynamicProperties) - Map
observation.outlinks -> dwc:associatedReferences - Map
observation.project_observations -> dwc:projectId(pipe-separated project URLs) - Map
'present' (constant) -> dwc:occurrenceStatus - Use first improving identification for identification metadata
- Prefer
user.nameoveruser.loginfor recorded/identified by fields - Align
dwc:eventDate/dwc:eventTimeformatting to ISO 8601 - Add
inat:-prefixed identification counts and positioning metadata - Replace
place_guessheuristics with place API lookup for accuratedwc:countryCode,dwc:stateProvince, anddwc:county - Expand taxon export with identifiers, parent usage, and epithet fields
- Add option
to_dwc(fetch_missing=True)to fetch additional data from the API if missing
- Fix dependency check in
dwca.load_dwca_tables()
- Add a
fastoption tosqlite.load_table()(default False), to optimize for speed and disable safety settings
- Fix check for alembic config path when installed via wheel
- Add database migrations with Alembic and include in PyPI package
- Add a
migrate()helper for downstream libraries - Add a unified
export()function to write observations to any supported format (based on file extension) - Extend
read()to support GeoJSON, GPX, DwC, and SQLite formats - Improve CSV loading performance
- Rewrite taxonomy aggregation for significantly improved performance
- Optimize DwC-A table loading (delay index creation until after all rows are inserted)
- Raise a more descriptive error when SQLAlchemy is missing
- Strip timezone info from all datetime values before saving to xlsx (for compatibility with openpyxl)
- Fix issues with some observation formats passed to
to_json() - Update
to_geojson()to uselocationtuple if available
- Migrate packaging from Poetry to uv
- Drop Python 3.8 and 3.9 support; add Python 3.12, 3.13, and 3.14
- Add
file_pathandoriginal_filenamecolumns toDbPhotomodel - Flatten annotations using labels instead of numeric IDs
- Fix handling for observations with no photos
- Add full-text search for observation descriptions and comments (
ObservationAutocompleter) - Add
usernamefilter andorder_by_dateoption toget_db_observations() - Add
page,order_by_created, andorder_by_observedparameters toget_db_observations() - Preserve order of observation photos in database
- Add database columns:
Observation.tags,Observation.comments,Observation.identifications,Observation.created_at,Observation.identifications_count,Observation.geoprivacy,Observation.description - Add annotation and observation field value JSON columns
- Add
Taxon.reference_urldatabase column - Add
DbTaxonfields: conservation status, establishment means, Wikipedia description and URL - Flatten observation sounds
- Fix CSV reading to force UTF-8 encoding (fixes Windows compatibility)
- Fix conservation status and establishment means handling
- Use WAL mode when writing to taxonomy database
- Add taxon ancestry and common names to taxonomy aggregation
- Parallelize taxonomy aggregation by iconic taxon / phylum
- Add leaf taxon counts
- Move taxonomy logic to a dedicated
taxonomymodule - Improve performance of taxonomy deduplication
- Make pandas optional (previously a required dependency)
- Add
read()function to load observations from common file formats - Add DwC-to-
Observationconverter - Add taxon common name, iconic taxon ID, subfamily, subgenus, and variety/cultivar to DwC records
- Add
Observation.license_codeand taxon photo URLs to SQLite storage - Handle partial taxon records
- Skip observations without coordinates in GPX export
- Add full-text search (FTS5) database built from iNaturalist taxonomy export
- Add functions to download and load DwC-A taxonomy export into SQLite
- Add taxon count aggregation
- Add option to return DwC as a dict instead of writing to XML
- Add geoprivacy info to DwC records
- Add additional DwC photo, date, and identification fields
- Allow passing taxa (not just observations) to
to_dwc() - Add
to_taxon_dwc()function
- Move GeoJSON converter from
pyinaturalistinto this package - Fix GPX converter
- Use the
geojsonlibrary for GeoJSON feature construction
- Expand Darwin Core (DwC) converter: photo terms, date/time terms, taxon ancestry, photo license URLs, multi-record
SimpleDarwinRecordSet - Add functions to import/process CSV from the iNaturalist export tool
- Add Feather and HDF5 export wrappers
- Initial release with basic conversion tools: CSV, XLSX, Parquet, GPX, DwC outline