Skip to content

Commit 2a11081

Browse files
committed
Refactor code.
1 parent 4724c9b commit 2a11081

2 files changed

Lines changed: 34 additions & 50 deletions

File tree

pytonapi/base.py

Lines changed: 32 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,15 @@ def __init__(
4747
"""
4848
self.api_key = api_key
4949
self.is_testnet = is_testnet
50+
self.max_retries = max(max_retries, 0)
5051

51-
self._timeout = kwargs['_timeout'] if ('_timeout' in kwargs) else timeout
52-
self._max_retries = kwargs['_max_retries'] if ('_max_retries' in kwargs) else (
53-
max_retries
54-
if max_retries >= 0 else
55-
0
56-
)
57-
self._headers = kwargs['_headers'] if ('_headers' in kwargs) else (
58-
headers
59-
if headers else
60-
({"Authorization": f"Bearer {api_key}"} if api_key else {})
61-
)
62-
self._base_url = kwargs['_base_url'] if ('_base_url' in kwargs) else (
63-
base_url
64-
if base_url else
65-
"https://tonapi.io/" if not is_testnet else "https://testnet.tonapi.io/"
66-
)
67-
self._websocket_url = kwargs['_websocket_url'] if ('_websocket_url' in kwargs) else (
68-
websocket_url
69-
if websocket_url else
70-
"wss://tonapi.io/v2/websocket"
71-
)
72-
73-
self._debug = kwargs['_debug'] if ('_debug' in kwargs) else debug
74-
self._logger = kwargs['_logger'] if ('_logger' in kwargs) else setup_logging(self._debug)
52+
self.headers = headers or {"Authorization": f"Bearer {self.api_key}"}
53+
self.base_url = base_url or "https://tonapi.io/" if not is_testnet else "https://testnet.tonapi.io/"
54+
self.websocket_url = websocket_url or "wss://tonapi.io/v2/websocket"
55+
56+
self.timeout = timeout
57+
self.debug = debug
58+
self.logger = setup_logging(self.debug)
7559

7660
@staticmethod
7761
async def __read_content(response: aiohttp.ClientResponse) -> Dict[str, Any]:
@@ -115,7 +99,7 @@ async def __raise_for_status(self, response: aiohttp.ClientResponse) -> None:
11599
error_text = await self.__read_content(response)
116100
error_class = error_map.get(response.status, TONAPIError)
117101

118-
self._logger.error(f"Error response received: {error_text}")
102+
self.logger.error(f"Error response received: {error_text}")
119103
raise error_class(error_text)
120104

121105
async def _subscribe(
@@ -129,12 +113,12 @@ async def _subscribe(
129113
:param method: The API method to subscribe to.
130114
:param params: Optional parameters for the API method.
131115
"""
132-
url = self._base_url + method
133-
self._logger.debug(f"Subscribing to SSE with URL: {url} and params: {params}")
116+
url = self.base_url + method
117+
self.logger.debug(f"Subscribing to SSE with URL: {url} and params: {params}")
134118

135119
try:
136-
async with aiohttp.ClientSession(headers=self._headers) as session:
137-
async with session.get(url, params=params or {}, timeout=self._timeout) as response:
120+
async with aiohttp.ClientSession(headers=self.headers) as session:
121+
async with session.get(url, params=params or {}, timeout=self.timeout) as response:
138122
await self.__raise_for_status(response)
139123

140124
async for line in response.content:
@@ -146,19 +130,19 @@ async def _subscribe(
146130
try:
147131
key, value = line_string.split(": ", 1)
148132
except ValueError:
149-
self._logger.debug(f"Skipped line due to ValueError: {line_string}")
133+
self.logger.debug(f"Skipped line due to ValueError: {line_string}")
150134
continue
151135

152136
if value == "heartbeat":
153-
self._logger.debug("Received heartbeat")
137+
self.logger.debug("Received heartbeat")
154138
continue
155139
if key == "data":
156-
self._logger.debug(f"Received SSE data: {value}")
140+
self.logger.debug(f"Received SSE data: {value}")
157141
data = json.loads(value)
158142
yield data
159143

160144
except aiohttp.ClientError as e:
161-
self._logger.error(f"Error subscribing to SSE: {e}")
145+
self.logger.error(f"Error subscribing to SSE: {e}")
162146
raise TONAPIError(e)
163147

164148
async def _subscribe_websocket(
@@ -179,37 +163,37 @@ async def _subscribe_websocket(
179163
"method": method,
180164
"params": params,
181165
}
182-
self._logger.debug(f"Subscribing to WebSocket with payload: {payload}")
166+
self.logger.debug(f"Subscribing to WebSocket with payload: {payload}")
183167

184168
try:
185169
async with aiohttp.ClientSession() as session:
186-
async with session.ws_connect(self._websocket_url) as ws:
170+
async with session.ws_connect(self.websocket_url) as ws:
187171
await ws.send_json(payload)
188172

189173
async for msg in ws:
190174
if isinstance(msg, aiohttp.WSMessage):
191175
if msg.type == aiohttp.WSMsgType.TEXT:
192176
message_json = json.loads(msg.data)
193-
self._logger.debug(f"Received WebSocket message: {message_json}")
177+
self.logger.debug(f"Received WebSocket message: {message_json}")
194178
if "params" in message_json:
195179
params = message_json["params"]
196-
self._logger.debug(f"Received WebSocket params: {params}")
180+
self.logger.debug(f"Received WebSocket params: {params}")
197181
yield params
198182
elif "result" in message_json:
199183
result = message_json["result"]
200184
if not result.startswith("success"):
201185
raise TONAPIError(result)
202186
elif msg.type == aiohttp.WSMsgType.CLOSED:
203-
self._logger.warning("WebSocket connection closed")
187+
self.logger.warning("WebSocket connection closed")
204188
break
205189
elif msg.type == aiohttp.WSMsgType.ERROR:
206-
self._logger.error(f"WebSocket error: {ws.exception()}")
190+
self.logger.error(f"WebSocket error: {ws.exception()}")
207191
raise TONAPIError(f"WebSocket error: {ws.exception()}")
208192
else:
209193
raise TONAPIError(f"Unexpected WebSocket message type")
210194

211195
except aiohttp.ClientError as e:
212-
self._logger.error(f"WebSocket connection failed: {e}")
196+
self.logger.error(f"WebSocket connection failed: {e}")
213197
raise TONAPIError(e)
214198
finally:
215199
if not ws.closed:
@@ -233,18 +217,18 @@ async def _request(
233217
:param body: Optional request body data.
234218
:return: The response content as a dictionary.
235219
"""
236-
url = self._base_url + path
237-
headers = {**self._headers, **(headers or {})}
220+
url = self.base_url + path
221+
headers = {**self.headers, **(headers or {})}
238222
if params:
239223
params = {k: str(v).lower() if isinstance(v, bool) else v for k, v in params.items()}
240224

241-
self._logger.debug(f"Request {method}: {url}")
242-
self._logger.debug(f"Headers: {headers}, Params: {params}, Body: {body}")
225+
self.logger.debug(f"Request {method}: {url}")
226+
self.logger.debug(f"Headers: {headers}, Params: {params}, Body: {body}")
243227

244-
timeout = aiohttp.ClientTimeout(total=self._timeout)
228+
timeout = aiohttp.ClientTimeout(total=self.timeout)
245229

246230
async with aiohttp.ClientSession(timeout=timeout) as session:
247-
for attempt in range(self._max_retries + 1):
231+
for attempt in range(self.max_retries + 1):
248232
try:
249233
async with session.request(
250234
method=method,
@@ -256,8 +240,8 @@ async def _request(
256240
await self.__raise_for_status(response)
257241
return await self.__read_content(response)
258242
except aiohttp.ClientResponseError as e:
259-
self._logger.error(f"Request failed (attempt {attempt}): {e}")
260-
if attempt < self._max_retries:
243+
self.logger.error(f"Request failed (attempt {attempt}): {e}")
244+
if attempt < self.max_retries:
261245
await asyncio.sleep(1)
262246
else:
263247
raise TONAPIError(e)

pytonapi/methods/blockchain.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ async def get_account_transactions(
188188
after_lt: Optional[int] = None,
189189
before_lt: Optional[int] = None,
190190
limit: int = 100,
191-
sort_order: Optional[Literal['asc', 'desc']] = 'desc',
191+
sort_order: Optional[Literal["asc", "desc"]] = "desc",
192192
) -> Transactions:
193193
"""
194194
Get account transactions.
@@ -201,7 +201,7 @@ async def get_account_transactions(
201201
:return: :class:`Transactions`
202202
"""
203203
method = f"v2/blockchain/accounts/{account_id}/transactions"
204-
params = {"limit": limit}
204+
params = {"limit": limit, "sort_order": sort_order}
205205
if before_lt is not None:
206206
params["before_lt"] = before_lt
207207
if after_lt is not None:

0 commit comments

Comments
 (0)