Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions datamaxi/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,3 +179,26 @@ def _handle_exception(self, response):
error_data,
)
raise ServerError(status_code, response.text)


class Resource(object):
"""Base for endpoint/resource clients — *composes* an `API` transport
rather than subclassing it.

Every resource holds a shared `API` (one `requests.Session` /
connection pool) instead of each opening its own. A resource either
receives an already-built ``api`` (the normal path — `Datamaxi`
constructs one and threads it through the whole tree via ``**kwargs``)
or builds its own from ``api_key``/``**kwargs`` for direct, standalone
instantiation. The thin `request_endpoint`/`query` forwarders keep the
call sites in the resource methods unchanged (`self.request_endpoint(...)`).
"""

def __init__(self, api_key=None, api=None, **kwargs):
self._api = api if api is not None else API(api_key, **kwargs)

def request_endpoint(self, op_id, **params):
return self._api.request_endpoint(op_id, **params)

def query(self, url_path, payload=None):
return self._api.query(url_path, payload=payload)
22 changes: 14 additions & 8 deletions datamaxi/datamaxi/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import Any
from datamaxi.api import API
from datamaxi.lib.constants import BASE_URL
from datamaxi.datamaxi.cex import Cex
from datamaxi.datamaxi.funding_rate import FundingRate
Expand Down Expand Up @@ -42,17 +43,22 @@ def __init__(self, api_key=None, **kwargs: Any):
if "base_url" not in kwargs:
kwargs["base_url"] = BASE_URL

self.cex = Cex(api_key, **kwargs)
self.funding_rate = FundingRate(api_key, **kwargs)
self.forex = Forex(api_key, **kwargs)
self.premium = Premium(api_key, **kwargs)
# One shared transport — a single `requests.Session` / connection
# pool threaded through every sub-client instead of each opening
# its own. Sub-clients receive it via `api=` and forward it down.
api = API(api_key, **kwargs)

self.cex = Cex(api=api)
self.funding_rate = FundingRate(api=api)
self.forex = Forex(api=api)
self.premium = Premium(api=api)
# Futures-only surfaces. Top-level on the client so callers
# reach them via `client.liquidation.heatmap(...)` /
# `client.open_interest.summary(...)` — matches the
# `/api/v1/{liquidation,open-interest}/*` REST grouping and
# mirrors the equivalent typed wrappers in the Rust SDK
# (`datamaxi::generated::{Liquidation, OpenInterest}`).
self.liquidation = Liquidation(api_key, **kwargs)
self.open_interest = OpenInterest(api_key, **kwargs)
self.margin_borrow = MarginBorrow(api_key, **kwargs)
self.index_price = IndexPrice(api_key, **kwargs)
self.liquidation = Liquidation(api=api)
self.open_interest = OpenInterest(api=api)
self.margin_borrow = MarginBorrow(api=api)
self.index_price = IndexPrice(api=api)
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from typing import Any
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.datamaxi.cex_candle import CexCandle
from datamaxi.datamaxi.cex_ticker import CexTicker
from datamaxi.datamaxi.cex_fee import CexFee
Expand All @@ -9,7 +9,7 @@
from datamaxi.datamaxi.cex_symbol import CexSymbol


class Cex(API):
class Cex(Resource):
"""Client to fetch CEX data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_announcement.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, Dict, Optional, Tuple, Callable
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.constants import ASC, DESC, SortOrder


class CexAnnouncement(API):
class CexAnnouncement(Resource):
"""Client to fetch announcement data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_candle.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from typing import Any, List, Dict, Union, Optional
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter
from datamaxi.lib.utils import check_required_parameters
from datamaxi.datamaxi.utils import convert_data_to_data_frame
from datamaxi.lib.constants import SPOT, FUTURES, INTERVAL_1D, USD, Market, Interval


class CexCandle(API):
class CexCandle(Resource):
"""Client to fetch CEX candle data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_fee.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, List, Dict
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter


class CexFee(API):
class CexFee(Resource):
"""Client to fetch CEX trading fee data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_symbol.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import Any, Dict, Optional
from datamaxi.api import API
from datamaxi.api import Resource


class CexSymbol(API):
class CexSymbol(Resource):
"""Client to fetch per-base / per-symbol CEX metadata + aggregates."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_ticker.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from typing import Any, List, Dict, Union
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameters
from datamaxi.lib.constants import SPOT, FUTURES, Market


class CexTicker(API):
class CexTicker(Resource):
"""Client to fetch ticker data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_token.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import Any, Dict, Optional, Tuple, Callable
from datamaxi.api import API
from datamaxi.api import Resource


class CexToken(API):
class CexToken(Resource):
"""Client to fetch token update data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/cex_wallet_status.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from typing import Any, List, Dict, Union
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameters
from datamaxi.lib.utils import check_required_parameter


class CexWalletStatus(API):
class CexWalletStatus(Resource):
"""Client to fetch transfer status data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/forex.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import Any, List, Dict, Union
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter


class Forex(API):
class Forex(Resource):
"""Client to fetch forex data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/funding_rate.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from typing import Any, Callable, Tuple, List, Dict, Union
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter
from datamaxi.lib.utils import check_required_parameters
from datamaxi.datamaxi.utils import convert_data_to_data_frame
from datamaxi.lib.constants import ASC, DESC, SortOrder


class FundingRate(API):
class FundingRate(Resource):
"""Client to fetch funding rate data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/index_price.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import Any, Dict, Optional
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter
from datamaxi.lib.constants import Interval


class IndexPrice(API):
class IndexPrice(Resource):
"""Client to fetch historical index price data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/liquidation.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, Dict, Optional
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.constants import Interval


class Liquidation(API):
class Liquidation(Resource):
"""Client to fetch CEX futures liquidation data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/margin_borrow.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, Dict
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter


class MarginBorrow(API):
class MarginBorrow(Resource):
"""Client to fetch margin borrow data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/open_interest.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, Dict, Optional
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.constants import Interval, SortOrder


class OpenInterest(API):
class OpenInterest(Resource):
"""Client to fetch CEX futures Open Interest data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/datamaxi/premium.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import Any, List, Union, Optional
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.constants import Market, SortOrder


class Premium(API):
class Premium(Resource):
"""Client to fetch premium data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/naver/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from typing import Any, List, Union
import pandas as pd
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.utils import check_required_parameter
from datamaxi.lib.constants import BASE_URL


class Naver(API):
class Naver(Resource):
"""Client to fetch Naver trend data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
4 changes: 2 additions & 2 deletions datamaxi/telegram/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import Any, Dict, Optional, Tuple, Callable
from datamaxi.api import API
from datamaxi.api import Resource
from datamaxi.lib.constants import BASE_URL, SortOrder


class Telegram(API):
class Telegram(Resource):
"""Client to fetch Telegram data from DataMaxi+ API."""

def __init__(self, api_key=None, **kwargs: Any):
Expand Down
Loading