Changelog
=========

v0.1.7 (2026-03-02)
--------------------

- Fix ``search_instruments`` ``fields`` parameter: make it optional so omitting
  it lets the API return all available fields instead of forcing a broken
  projection
- Add ``internal_symbol_full`` field to ``InstrumentSearchItem`` model — the key
  field used by the eToro API for exact symbol matching
- Remove broken ``fields="instrumentId"`` projection from ``InstrumentResolver``
  search calls
- Document that the search endpoint is for ID resolution only; display metadata
  (``displayname``, ``exchangeID``) requires ``get_instruments()``

v0.1.6 (2026-03-01)
--------------------

- Handle WebSocket instrument heartbeat messages that lack bid/ask data
  instead of logging parse errors
- Add ``Makefile`` with ``make check`` to reproduce CI steps locally
  (lint, format, typecheck, test)
- Add public observer demobot notebook example
- Fix redundant cast in discovery client (mypy strict)
- Fix line-too-long lint error in HTTP client error message

v0.1.5 (2026-02-28)
--------------------

- Fix SDK endpoint paths verified against real eToro API and add comprehensive
  integration test suite (41 tests covering all REST sub-clients)
- Make ``InstrumentImage`` ``uri`` and ``color`` fields nullable to match actual
  API responses
- Align ``InstrumentImage`` and ``ClosingPrice`` models with actual API response
  schemas
- Add project badges to README

v0.1.4 (2026-02-27)
--------------------

- Fix ``ValidationError`` on candle volume: allow ``None`` from API responses
  where volume data is unavailable

v0.1.3 (2026-02-27)
--------------------

- Make rate limiter configurable via ``EToroConfig`` fields and environment
  variables (``ETORO_RATE_LIMIT``, ``ETORO_RATE_LIMIT_MAX_REQUESTS``,
  ``ETORO_RATE_LIMIT_WINDOW``)
- Allow disabling rate limiting entirely by setting ``rate_limit=False``
- ``HttpClient`` now builds ``RateLimiterOptions`` from config when no explicit
  ``rate_limiter`` argument is provided

v0.1.2 (2026-02-26)
--------------------

- Fix WebSocket auth deadlock: start receive loop before ``_authenticate()``
- Fix binary frame handling: skip bytes messages, pass text directly without
  ``str()`` wrapping
- Add 15 unit tests for ``WsClient`` (event emitter, auth flow, binary frames,
  disconnect, error paths)
- Migrate ``.claude/commands/`` templates from npm/Node.js to Python tooling

v0.1.1 (2026-02-26)
--------------------

- Add Sphinx documentation site with Furo theme and autodoc API reference
- Add quickstart, architecture, and examples guides
- Add GitHub Actions workflow for automatic docs deploy to GitHub Pages

v0.1.0 (2025)
--------------

Initial release.

- 42+ REST endpoints across 9 sub-clients (market data, trading execution,
  trading info, watchlists, feeds, reactions, discovery, user info, PI data)
- Real-time WebSocket streaming with auto-reconnect and heartbeat
- :class:`~etoropy.EToroTrading` high-level client with event emitter
- :class:`~etoropy.InstrumentResolver` with bundled 5,200+ symbol CSV
- Token-bucket rate limiter and exponential-backoff retry
- Full type hints (mypy strict) and Pydantic v2 models
- Demo and real trading mode support
