Skip to content

Releases: ronaldvdmeer/python-eveonline

v0.4.0

29 Mar 19:30
a91b21e

Choose a tag to compare

What's new

New endpoint

  • async_get_killmails() — fetch a character's recent killmails (requires esi-killmails.read_killmails.v1 scope)

Automatic pagination

  • async_get_wallet_journal(), async_get_contacts(), and async_get_killmails() now automatically fetch all pages and return a single combined list
  • No API changes required — callers always receive the complete dataset

TTL/Expires caching

  • The client now respects the ESI Expires header: if a cached response has not yet expired, the HTTP request is skipped entirely and the cached data is returned immediately
  • Combined with existing ETag/304 caching, this gives two layers of cache protection

Integration tests

  • Integration test suite expanded to 27 tests covering all major endpoints
  • New tests: test_corporation_public_live, test_killmails_live, test_etag_caching_round_trip_live, test_etag_cache_populated_after_request_live, test_expires_header_sets_ttl_in_cache_live

Documentation

  • Endpoint count corrected to 23
  • Authentication scope table completed (all scopes listed)
  • New pagination and request caching reference sections in docs/endpoints.md and docs/quickstart.md

Stats

  • 172 tests, 98.04% coverage
  • pylint 10.00/10, ruff clean, mypy clean

v0.3.0

29 Mar 14:24
91e8d91

Choose a tag to compare

What's new

ETag/conditional-request caching

  • All ESI GET endpoints now send If-None-Match on repeated calls within the same client instance
  • HTTP 304 returns cached data without parsing a response body, reducing bandwidth and ESI rate-limit pressure
  • Public and authenticated endpoints use separate cache keys
  • New clear_etag_cache() public method to reset the in-memory cache

Bug fixes

  • response.release() is now called correctly (synchronous in aiohttp ≥3.9) before returning on 304
  • Response body is now drained before raising EveOnlineNotFoundError (404) and EveOnlineRateLimitError (420/429), preventing connection pool exhaustion under repeated errors

Stats

  • 159 tests, 98.21% coverage
  • pylint 10.00/10, ruff clean, mypy clean

v0.2.2

27 Mar 19:00

Choose a tag to compare

Bug Fixes

  • Export EveOnlineNotFoundError from package root - previously only accessible via eveonline.exceptions
  • Handle non-numeric Retry-After header - HTTP date values no longer crash with ValueError

Improvements

  • Remove redundant .replace("Z", "+00:00") - Python >=3.11 handles Z suffix natively
  • Use _parse_datetime consistently for all optional datetime fields
  • Change DEFAULT_SCOPES from mutable list to immutable tuple
  • Add from __future__ import annotations to all modules
  • Add slots=True to all 15 frozen dataclasses for reduced memory usage
  • Single-source version via importlib.metadata (no more hardcoded version string)
  • Add Attributes: sections to all model docstrings (Google style)
  • Document EveOnlineRateLimitError.retry_after parameter

Tests

Expanded from 91 to 115 tests (99.35% coverage):

  • Non-numeric and missing Retry-After header handling
  • HTTP 400 generic error
  • _parse_datetime edge cases (None, Z suffix, +00:00 offset, invalid input)
  • HTTP 404 on authenticated endpoint
  • EveOnlineNotFoundError top-level export verification
  • Parametrized __slots__ verification for all 15 models

v0.2.1

27 Mar 13:24

Choose a tag to compare

Initial public release of python-eveonline — an async Python client for the Eve Online ESI API.

Features

  • Async client built on aiohttp
  • Full support for Tranquility server status (public endpoint)
  • Authenticated endpoints for character data: online status, location, ship, wallet, skills, skill queue, mail labels, industry jobs, market orders, jump fatigue
  • Batch ID-to-name resolution via universe/names endpoint
  • Abstract auth class for flexible token management (e.g. Home Assistant OAuth2)
  • Typed dataclass models for all API responses
  • Comprehensive exception hierarchy (auth, connection, rate limit, not found)
  • Fully type-hinted with py.typed marker