Migration Notes¶
0.8 系 typed contract completion¶
変更の要点¶
query_stored/query_realtimeの typed record は、schema 非 reserved フィールドを全件保持するように統一array:objectはすべて専用 item dataclass 化し、公開型からtuple[dict[str, Any], ...]を排除- 公開 record フィールドの配列型を
tuple[...]に統一(可変 list を非公開化) - records ドキュメントの型名を canonical naming(
<RecordType><FieldNamePascal>Item)へ統一
破壊的変更(主な例)¶
*Info系の旧サブ型名を廃止- 例:
WinOddsInfo->O1WinOddsItem - 例:
TrioVotingInfo->H6TrifectaVotesItem - 例:
HorseWeightInfo->WHHorseWeightInfosItem - 一部レコードでフィールド名を実装名へ統一
O5:trifecta_*->trio_*O6:trio_*->trifecta_*H1:*_votes_per_combination->*_votes,*_refund_total_votes->*_refund_votesH6:trio_*->trifecta_*WF:multi_win_sales_votes->total_tickets_sold,payout_info_list->payout_infoYS:featured_races->graded_race_guideUM:bloodline_info->pedigree_3gen
互換性¶
- 後方互換の別名吸収は提供しない。旧型名・旧フィールド名を参照しているコードは更新が必要。
0.7 系アーキテクチャ再設計¶
変更の要点¶
- 公開 API の中心を
JVLinkClientからClient(Facade)へ移行 - query 系 API を typed/raw の 2 系統に整理
query_stored/query_realtime(typed)query_stored_raw/query_realtime_raw(wire)- 戻り値を
StoredResult/RealtimeResult+RecordEnvelopeに統一 format_details()を廃止value_objects/mixinsを削除
互換性¶
JVLinkClientは削除Clientへ移行
_internal パッケージ移設¶
変更の要点¶
domain,protocol,transport,runtime,constants,formatting,utils,codesをpyjvlink._internal/へ移設pyjvlink.recordsからRecordDecoder/create_record_from_dataの re-export を削除。decoder API はpyjvlink.codecsに集約pyjvlink.records/<record_type>.py個別ファイルを削除。レコード型はpyjvlink.recordsからのみ import 可能pyjvlink.formattingとpyjvlink.codesは公開 façade を維持(実装本体は_internalへ移設)
公開モジュール¶
| モジュール | 内容 |
|---|---|
pyjvlink |
Client, JVServerConfig, JVDataSpec, exceptions |
pyjvlink.api |
Client, StoredResult, RealtimeResult |
pyjvlink.records |
全レコード型 + UnknownRecord |
pyjvlink.codecs |
RecordDecoder, create_record_from_data, decode_record_envelopes |
pyjvlink.codes |
JRACodeTables |
pyjvlink.formatting |
format_record, format_records |
pyjvlink.types |
JVDataSpec, JVServerConfig |
pyjvlink.errors |
例外階層 |
互換性¶
後方互換性なし。pyjvlink._internal 配下のモジュールに互換性の保証はありません。
移行例¶
旧:
meta, records = await client.query_stored(...)
async for record in records:
print(record["type"], record["data"])
新:
result = await client.query_stored(...)
async for envelope in result.records:
print(envelope.type, envelope.record)
未対応レコード¶
typed decoder で未対応のレコード種別は UnknownRecord で返ります。必要に応じて raw query を利用してください。