Skip to content

Commit f132df7

Browse files
authored
Merge pull request #3024 from maoxor/fix/live-inspect-iscoroutinefunction
Fix DeprecationWarning from asyncio.iscoroutinefunction in AsyncWebSocket.listen
2 parents 19d654c + 9467eec commit f132df7

2 files changed

Lines changed: 53 additions & 2 deletions

File tree

‎tests/test_live.py‎

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import asyncio
2+
import json
13
import unittest
4+
import warnings
25
from unittest.mock import Mock
36

4-
from yfinance.live import BaseWebSocket
7+
from yfinance.live import AsyncWebSocket, BaseWebSocket
58

69

710
class TestWebSocket(unittest.TestCase):
@@ -28,3 +31,50 @@ def test_decode_message_invalid(self):
2831
assert "error" in decoded
2932
assert "raw_base64" in decoded
3033
self.assertEqual(base64_message, decoded["raw_base64"])
34+
35+
36+
class _FakeAsyncConnection:
37+
def __init__(self, messages):
38+
self._messages = messages
39+
self.closed = False
40+
41+
async def __aiter__(self):
42+
for message in self._messages:
43+
yield message
44+
raise asyncio.CancelledError
45+
46+
async def close(self):
47+
self.closed = True
48+
49+
50+
class TestAsyncWebSocketListen(unittest.IsolatedAsyncioTestCase):
51+
message = ("CgdCVEMtVVNEFYoMuUcYwLCVgIplIgNVU0QqA0NDQzApOAFFPWrEP0iAgOrxvANVx/25R12csrRHZYD8skR9/"
52+
"7i0R7ABgIDq8bwD2AEE4AGAgOrxvAPoAYCA6vG8A/IBA0JUQ4ECAAAAwPrjckGJAgAA2P5ZT3tC")
53+
54+
async def _listen(self, handler):
55+
ws = AsyncWebSocket(verbose=False)
56+
ws._ws = _FakeAsyncConnection([json.dumps({"message": self.message})])
57+
with warnings.catch_warnings():
58+
# asyncio.iscoroutinefunction is deprecated since Python 3.14.
59+
warnings.simplefilter("error", DeprecationWarning)
60+
await ws.listen(handler)
61+
self.assertTrue(ws._ws.closed)
62+
63+
async def test_listen_awaits_async_handler(self):
64+
received = []
65+
66+
async def handler(message):
67+
received.append(message)
68+
69+
await self._listen(handler)
70+
self.assertEqual(["BTC-USD"], [m["id"] for m in received])
71+
72+
async def test_listen_calls_sync_handler(self):
73+
received = []
74+
75+
def handler(message):
76+
received.append(message)
77+
78+
await self._listen(handler)
79+
self.assertEqual(["BTC-USD"], [m["id"] for m in received])
80+

‎yfinance/live.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
import base64
3+
import inspect
34
import json
45
from typing import List, Optional, Callable, Union
56

@@ -164,7 +165,7 @@ async def listen(self, message_handler=None):
164165

165166
if self._message_handler:
166167
try:
167-
if asyncio.iscoroutinefunction(self._message_handler):
168+
if inspect.iscoroutinefunction(self._message_handler):
168169
await self._message_handler(decoded_message)
169170
else:
170171
self._message_handler(decoded_message)

0 commit comments

Comments
 (0)