# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.1.0] - 2026-04-16 ### Added - `Moon` dataclass representing a natural satellite with `rotation_hours`, `orbital_hours`, `hours_per_sol`, `sols_per_year`, `is_tidally_locked`, `discovery_date`, `contact_date` - 14 moons across 5 planets: Phobos, Deimos (Mars); Io, Europa, Ganymede, Callisto (Jupiter); Titan, Enceladus (Saturn); Miranda, Ariel, Umbriel, Titania, Oberon (Uranus); Triton (Neptune) - `Body.__getitem__` — access moons by index, e.g. `Body.MARS[0]` returns Phobos - Tidally locked moons have `sols_per_year == 1` (one sol = one orbit around parent planet) - `Body.display_name` property for consistent name access across `Body` and `Moon` - `get_epoch_date` extended to handle `Moon` (reads `discovery_date` / `contact_date` directly from the dataclass) - `PlanetaryTime.from_earth` and all internals accept `Body | Moon` - Titan has contact epoch (Huygens probe, 2005-01-14) - `py.typed` marker — package is now PEP 561 compliant - Full pytest test suite for `Moon` and `PlanetaryTime` with moons ### Changed - `PlanetaryTime.body` return type widened to `Body | Moon` - `__str__` and `__repr__` use `display_name` instead of `.value` to support both planets and moons - `pyproject.toml` — added `description`, `license`, `keywords`, `classifiers` - `README.md` — rewritten with full usage examples, body tables, and logging docs - `LICENSE` — MIT license file added - `poetry.lock` added to `.gitignore` (library — consumers pin their own dependencies) ## [1.0.0] - 2026-04-16 ### Added - `Body` enum with all 7 classic Solar System planets (Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune) - `Body.rotation_hours` — sidereal rotation period in Earth hours - `Body.orbital_hours` — orbital period around the Sun in Earth hours - `Body.hours_per_sol` — rotation period rounded to nearest Earth hour - `Body.sols_per_year` — number of sols in one planetary year - `EpochType` enum with two modes: `DISCOVERY` and `CONTACT` - Discovery dates for all 7 bodies (first telescopic observation or transit) - Contact dates for Mercury (MESSENGER 2011), Venus (Venera 7 1970), Mars (Viking 1 1976); remaining bodies have no contact yet - `PlanetaryTime` class representing a moment in time on a specific planetary body - `PlanetaryTime.from_earth(earth_dt, body, epoch_type)` factory method - Properties: `year`, `sol`, `hour`, `minute`, `second`, `body`, `epoch_type` - `__str__` output format: `Year {y}, Sol {s}, HH:MM:SS ({Body} / {epoch} epoch)` - `__repr__` for debugging - Exception hierarchy: `PlanetaryTimeError` (base), `EpochUnavailableError`, `DatetimePrecedesEpochError` - Naive datetimes are treated as UTC - Loguru-based debug/info logging - Full pytest test suite for `Body` and `PlanetaryTime`