Skip to content

Releases: tribulnation/catalogue

python-v0.3.11

Choose a tag to compare

@github-actions github-actions released this 04 Oct 19:54
f1ea81b

Published to PyPI as tribulnation-catalogue==0.3.11.

Python 0.3.11

Treat CoinMarketCap null quote prices as unavailable without discarding valid prices in the same batch. Keep full decimal precision and real zero prices; skip null current quotes and return None for null historical quotes. Malformed non-null prices still fail. Preserve ValidationError details instead of constructing an empty ApiError from its empty args.

Related: #230; Terminal integration tribulnation/terminal#148. Keep issues open for owner acceptance. Includes the already-released 0.3.10 CoinGecko 100-ID fix through main.

Evidence

Production VM, existing CMC key: HTTP 200, but the previous parser failed on null prices (including Raider Aurum, SOUNI and pSTAKE Finance). BTC/ETH-only requests already worked. This is a parsing bug, not a credential rejection.

Read-only diagnostic process loaded the proposed adapter source in memory, without editing installed files or writing production data. Full current mapping probe: 1,152 requested, 1,104 usable prices returned, including BTC and ETH. The other 48 IDs had no usable quote; they no longer reject the successful rows.

Validation

  • 82 Python tests pass, including dictionary/list quote representations, mixed good/null/zero prices, full precision, historical null, and meaningful malformed-value errors.
  • Full lib Pyright: 0 errors/warnings using explicit repository Python and PYTHONPATH=lib/src.
  • Catalogue validation passes (1,599 assets, 254 platforms).
  • Python 0.3.11 sdist and wheel build pass; whitespace check passes.

A HUMAN merge of release/python triggers the existing PyPI workflow. CONTRIBUTING.md prohibits agent merges/releases. No production dependency or data has changed; Terminal pinning, rollout and hosted freshness validation remain after publication. Missing-asset handling stays visible to Terminal's collection grading. This does not fix separate TwelveData credentials or establish the shared CoinGecko account allowance.

What's Changed

  • Release Python 0.3.11: preserve valid CMC prices alongside null quotes by @marciclabas in #231

Full Changelog: python-v0.3.10...python-v0.3.11

python-v0.3.10

Choose a tag to compare

@github-actions github-actions released this 04 Oct 18:51
cb1cf3a

Published to PyPI as tribulnation-catalogue==0.3.10.

Python 0.3.10

Restore CoinGecko current-price batches to 100 IDs, reversing the batch-size increase in 31d759a. Keep explicit per_page=100 and precision=full. Update the HTTP-transport regression to reject oversized requests and verify that all 251 fixture IDs survive across 100/100/51 batches.

Related: #228; Terminal integration tribulnation/terminal#148. Keep issues open for owner acceptance.

Live evidence

Same production Azure VM, same existing Demo key:

  • 250 requested IDs returned CloudFront 403.
  • The exact same IDs succeeded in batches of 100/100/50.
  • A read-only diagnostic process with the proposed constant fetched the full current 1,216 mapped IDs: 1,215 returned, including BTC and ETH. Only drunk-chicken-centipede was absent. No installed files, production data or schedules were changed.

The exact CloudFront rule is unknown. The tests establish a working bounded request shape, not a universal provider maximum.

Validation

  • Full Python unit suite: 79 passed.
  • Catalogue validation: passed (1,599 assets, 254 platforms).
  • Pyright lib with the explicit repository Python interpreter and PYTHONPATH=lib/src: 0 errors/warnings.
  • Python sdist and wheel build: passed for 0.3.10.
  • git diff --check: passed.

Initial Pyright invocation without the correct interpreter/source path failed import resolution; the correctly configured full check passed.

Operational follow-up

At current mappings and two-hour cadence, 12 normal-ID requests plus 42 currency-reference requests = 54 calls/run, approximately 19,440 calls per 30 days before portfolio traffic/retries. This is a count projection, not confirmation of the account's plan or remaining allowance. Shared quota qualification and currency-request reduction remain separate follow-up work.

This is branch release/python: a HUMAN merge triggers the existing PyPI release workflow. CONTRIBUTING.md prohibits agent merges and releases; no merge or publication has been performed. Terminal remains on the old dependency until the published release is pinned, tested, deployed and fresh observation timestamps are verified end to end.

What's Changed

Full Changelog: python-v0.3.9...python-v0.3.10

python-v0.3.9

Choose a tag to compare

@github-actions github-actions released this 02 Oct 13:50
89fd884

Published to PyPI as tribulnation-catalogue==0.3.9.

0.3.9

  1. New optional protocol field channels (network to its channel identifier to the network at the other end) and Catalogue.network_for_channel; the ibc entry lists the dydx, noble, osmosis and axelar transfer channels of the dYdX -> noble -> osmosis -> axelar route, both directions.
  2. New protocol axelar: key axelar:{command_id}, the command id Axelar approves a call under and the destination gateway states in ContractCallExecuted.

🤖 Generated with Claude Code

What's Changed

Full Changelog: python-v0.3.8...python-v0.3.9

python-v0.3.8

Choose a tag to compare

@github-actions github-actions released this 02 Oct 13:34
bb225e9

Published to PyPI as tribulnation-catalogue==0.3.8.

0.3.8

  1. Protocols may omit correlation when no key can be derived by both sides; format_correlation and parse_correlation raise CorrelationError for them.
  2. New optional protocol fields chains (protocol chain name to network), assets (protocol asset name to asset) and deposits (DepositLookup with DepositFields, including an optional operation time): a public per-address operations API for protocols that assign per-user deposit addresses.
  3. Catalogue.network_for_chain and Catalogue.asset_for_protocol.
  4. New protocol hyperunit.

🤖 Generated with Claude Code

What's Changed

Full Changelog: python-v0.3.7...python-v0.3.8

python-v0.3.7

Choose a tag to compare

@github-actions github-actions released this 29 Sep 16:04
dc63efe

Published to PyPI as tribulnation-catalogue==0.3.7.

tribulnation-catalogue 0.3.7

Fixed

  • Yahoo quotes in other currencies are now converted to USD. YahooPricing never read Yahoo's currency field, so non-US listings came back as local-currency values labelled USD. TSMC (2330.TW) was reported at a TWD 2,475 price and a ~64T market cap. current_stats now multiplies price and market cap by Yahoo's {CCY}USD=X rate (USD per one unit of CCY, e.g. TWDUSD=X ≈ 0.0314). The rates are fetched in one extra batch, and only when a batch has non-USD listings. Affected catalogue assets: taiwan-semiconductor, mediatek, delta-electronics, united-microelectronics (TWD), kokusai-electric (JPY) and lenovo-group (HKD).
  • Yahoo minor-unit currencies (GBp/GBX, ZAc/ZAC, ILA) scale the price by 1/100. Yahoo already reports market cap in the major unit, e.g. VOD.L at 123.9 GBp has a ~28.6B GBP market cap, so market cap is converted without scaling.
  • Yahoo historical_price converts a non-USD close with the same day's close of the {CCY}USD=X series. Bars are now matched by exchange-local date, so FX series line up: their daily bars start at London midnight, which is 23:00 UTC the previous day in summer. The same change fixes historical_price for FX assets such as EURUSD=X, which used to return the next day's close.
  • TwelveData never relabels a currency. Current prices come from /quote, which states the listing currency, instead of /price, which does not. Both cost one credit per symbol. Listings not in the requested quote are omitted, e.g. kokusai-electric's bare Tokyo code 6525. Pairs such as EUR/USD are treated as quoted in their second leg. historical_price applies the same rule to the time series meta.currency. This also stops USD listings from being returned as EUR when quote='eur'.

Behaviour

  • The adapters never return a value in another currency labelled as the quote currency. If a quote has no stated currency or its FX rate is unavailable, the symbol is left out of current_stats or historical_price returns None, and a warning goes to the tribulnation.catalogue logger. A failed FX request omits only the non-USD listings, and USD listings in the same call keep their prices.
  • USD listings are unchanged: they return the provider's exact Decimal values and trigger no extra request. Conversions stay in Decimal.

Compatibility

  • No public API changes. For the six non-USD assets above, consumers that stored these values will see a step change: prices and market caps drop by the FX rate (about ×1/32 for TWD, ×1/157 for JPY and ×1/7.8 for HKD).

Verification

  • New lib/tests/test_market_data_currency.py (14 tests, using Yahoo/TwelveData payloads recorded on 2026-09-29) covers USD passthrough, TWD/JPY/HKD conversion, minor units, a missing or non-USD rate, a failed FX request, a missing currency, historical conversion, and TwelveData non-USD/EUR handling. 12 of the 14 fail on 0.3.6. python -m unittest discover -s lib/tests: 73 tests OK. pyright lib (CI install): 0 errors. python -m build lib: OK. scripts/validate.py: 1528 assets, 254 platforms. Id stability: OK.
  • Live run on 2026-09-29 against all 156 catalogue yahoo ids: all 156 were priced, so no USD listing was lost. 2330.TW 77.80 USD with a 2.017T market cap (TSM ADR 457.50 ≈ 5 shares plus the ADR premium), 2454.TW 154.33 / 246.5B, 2308.TW 57.68 / 149.8B, 2303.TW 4.82 / 60.5B, 6525.T 59.24 / 13.8B, 0992.HK 4.52 / 56.1B. historical_price('2330.TW', 2026-09-24) = 77.86.

Refs #201 and tribulnation/terminal#104.

What's Changed

Full Changelog: python-v0.3.6...python-v0.3.7

python-v0.3.6

Choose a tag to compare

@github-actions github-actions released this 27 Sep 15:31
7c2f7bd

Published to PyPI as tribulnation-catalogue==0.3.6.

tribulnation-catalogue 0.3.6

Changed

  • CoingeckoPricing.current_stats batches /coins/markets requests at 250 ids (was 100) and sends per_page=250, so each batch fits one full page. A full refresh makes about 2.5x fewer CoinGecko calls against the provider's monthly quota.

Compatibility

  • No API changes. Results are unchanged; only the number of requests goes down.

Context

Terminal's prices_latest sampler makes 12 market batches every 30 minutes. Together with portfolio snapshots, that used up a 10,000-call CoinGecko Demo quota. Note that per_page has to change with the batch size: without it, the provider returns 100 rows and drops the rest of the batch. The new regression test checks this against the real SDK query.

What's Changed

Full Changelog: python-v0.3.5...python-v0.3.6

python-v0.3.5

Choose a tag to compare

@github-actions github-actions released this 25 Sep 20:24
e8b3a50

Published to PyPI as tribulnation-catalogue==0.3.5.

tribulnation-catalogue 0.3.5

Added

  • protocols collection: one entry per cross-chain protocol with a typed correlation key template (correlation: {key, fields}) and protocol data (CCTP domains). Entries: cctp, ibc, hlbridge, gofast.
  • Catalogue.protocols, protocol(id), network_for_domain(protocol, domain), domain_for_network(protocol, network).
  • format_correlation(protocol, **fields) and parse_correlation(key), validated against the protocol entry; errors raise CorrelationError (a ValueError).
  • Validation of protocol entries: template placeholders equal the fields, known field types, domain networks exist, stable ids.

Compatibility

  • Additive. 0.3.4 clients ignore protocols/ in the archive; 0.3.5 loads older archives with no protocols.

What's Changed

Full Changelog: python-v0.3.4...python-v0.3.5

python-v0.3.4

Choose a tag to compare

@github-actions github-actions released this 24 Sep 09:46
4aa5183

Published to PyPI as tribulnation-catalogue==0.3.4.

tribulnation-catalogue 0.3.4

Added

  • Catalogue.load() keeps a cached data.zip and refreshes it at most once per max_age (default 1 day) with a conditional request; keeps the last good copy when the site is unavailable. New digest and loaded_at, plus maybe_refresh() / refresh() for long-running processes.
  • Lookups: asset_for(platform, raw_id), perpetual_for(platform, id), debt_for(platform, address), network_for(platform, code), canonical_id(asset_id), asset(asset_id), translation_key, is_evm.
  • Optional Asset.replaced_by aliases, followed by every lookup and validated.
  • Blockchain categories (incl. substrate) and CAIP-2 chain ids — needed to load the currently published data.

Changed

  • Asset tags that duplicated the category were removed.
  • Loads from the live archive skip files the installed schema rejects, with a warning, instead of failing.

What's Changed

Full Changelog: python-v0.3.3...python-v0.3.4

js-v0.2.2

Choose a tag to compare

@github-actions github-actions released this 24 Sep 09:46
41fcc42

Published to npm as @tribulnation/catalogue@0.2.2.

@tribulnation/catalogue 0.2.2

Added

  • Optional replaced_by on assets (id aliases), matching the data and the Python library 0.3.4.

What's Changed

Full Changelog: js-v0.2.1...js-v0.2.2

python-v0.3.3

Choose a tag to compare

@github-actions github-actions released this 22 Sep 09:42
f50dd80

Published to PyPI as tribulnation-catalogue==0.3.3.

Bumps tribulnation-catalogue to 0.3.3.

Changes

  • AssetCategory gains fund, for exchange-traded funds and other pooled vehicles (#155).

Why this needs a release

The catalogue data itself already shipped — the package downloads data.zip at runtime, so the five ETFs that moved stock → fund (SPY, QQQ, SOXL, EWY, DRAM) went live with the deploy on merge.

What is stale is the type. api/schema/assets.py declares category: AssetCategory | None, and pydantic validates that Literal at runtime, so 0.3.2 raises ValidationError on those five assets when parsing API responses. The data/schema.py TypedDicts are not runtime-validated, so users of the data layer see only a type-checker complaint.

Patch rather than minor: the change is a widened literal, matching how rwa was released in aeea8ab.


Generated by Claude Code

What's Changed

Full Changelog: python-v0.3.2...python-v0.3.3