Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pybotters v2.0 Roadmap #248

Open
MtkN1 opened this issue Jan 7, 2024 · 0 comments
Open

pybotters v2.0 Roadmap #248

MtkN1 opened this issue Jan 7, 2024 · 0 comments
Assignees
Labels
enhancement New feature or request

Comments

@MtkN1
Copy link
Member

MtkN1 commented Jan 7, 2024

Summary

pybotters v2.0 の仕様案とやることをここで決めます。

pybotters v2.0 は新しいコードベースから再構築して v1.0 から設計や機能を大幅に刷新する予定になっています。

Modules

実装する機能群

  1. HTTP クライアントライブラリに依存しない認証機能
    • HTTP メソッド、URL、本文、ヘッダーを与えられて、署名を行ったそれらを返すような実装にする
      import json
      from urllib.request import Request, urlopen
      
      import pybotters.v2
      
      auth = pybotters.v2.SomeExchangeAuth(key="KEY", secret="SECRET")
      request = auth.sign(
          method="GET", url="https://example.com/api/balance", data=None, headers=None
      )
      
      with urlopen(
          Request(
              method=request.method,
              url=request.url,
              data=request.data,
              headers=request.headers,
          )
      ) as response:
          data = json.load(response)
    • 現状の pybotters みたく aiohttp のリクエストを直接書き換えるような実装にはしない
    • WebSocket メッセージの署名も同様
      from contextlib import closing
      
      import pybotters.v2
      from websocket import create_connection
      
      auth = pybotters.v2.SomeExchangeAuth(key="KEY", secret="SECRET")
      
      with closing(create_connection("wss://example.com/stream")) as conn:
          message = auth.wssign()
          conn.send(message)
          print(conn.recv())
  2. 取引所別のリクエスト/レスポンス Pydantic モデルと、それを使った API クライアント
    • リクエスト/レスポンス Pydantic モデル
      from urllib.request import Request, urlopen
      
      import pybotters.v2
      
      auth = pybotters.v2.SomeExchangeAuth(key="KEY", secret="SECRET")
      
      request_model = pybotters.v2.models.some_exchage.GetOrderRequest(
          id="xxx", symbol="BTCUSDT"
      )
      
      request = auth.sign(
          method=request_model.method,
          url=request_model.url,
          data=request_model.data,
          headers=request_model.headers,
      )
      
      with urlopen(
          Request(
              method=request.method,
              url=request.url,
              data=request.data,
              headers=request.headers,
          )
      ) as response:
          content = response.read()
      
      response_model = pybotters.v2.models.some_exchage.GetOrderResponse.model_validate_json(
          content
      )
      
      print(response_model.id, response_model.symbol, response_model.side)
    • API クライアント
      import pybotters.v2
      
      some_exchange = pybotters.v2.client.SomeExchangeClient("KEY", "SECRET")
      order = some_exchange.get_order(id="xxx", symbol="BTCUSDT")
      # order: pybotters.v2.models.some_exchage.GetOrderResponse
      
      async with pybotters.v2.client.SomeExchangeAsyncClient(
          "KEY", "SECRET"
      ) as some_exchange:
          order = await some_exchange.get_order(id="xxx", symbol="BTCUSDT")
          # order: pybotters.v2.models.some_exchage.GetOrderResponse
      • HTTP クライアントのバックエンドをどうするか問題。 HTTPX ぐらいしかないけど
  3. ccxt Unified API 互換の Pydantic モデルと、それを使った API クライアント
    • 上記の Pydantic モデルと API クライアントを ccxt Unified API 互換で利用できるようにする
      import pybotters.v2
      
      some_exchange = pybotters.v2.unified.SomeExchangeClient("KEY", "SECRET")
      order = some_exchange.fetch_order(id="xxx", symbol="BTC/USDT")
      # order: pybotters.v2.unified_models.some_exchage.FetchOrderResponse
      
      async with pybotters.v2.unified.SomeExchangeAsyncClient(
          "KEY", "SECRET"
      ) as some_exchange:
          order = await some_exchange.fetch_order(id="xxx", symbol="BTC/USDT")
          # order: pybotters.v2.unified_models.some_exchage.FetchOrderResponse
@MtkN1 MtkN1 added the enhancement New feature or request label Jan 7, 2024
@MtkN1 MtkN1 self-assigned this Jan 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant