Skip to content

Commit e197495

Browse files
committed
fix: correctly typed
1 parent d2ce980 commit e197495

File tree

4 files changed

+134
-104
lines changed

4 files changed

+134
-104
lines changed

googletrans/client.py

+26-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
"""
32
A Translation module.
43
@@ -107,11 +106,7 @@ def _pick_service_url(self) -> str:
107106
return random.choice(self.service_urls)
108107

109108
async def _translate(
110-
self,
111-
text: str,
112-
dest: str,
113-
src: str,
114-
override: typing.Dict[str, typing.Any]
109+
self, text: str, dest: str, src: str, override: typing.Dict[str, typing.Any]
115110
) -> typing.Tuple[typing.List[typing.Any], Response]:
116111
token = "xxxx" # dummy default value here as it is not used by api client
117112
if self.client_type == "webapp":
@@ -144,11 +139,7 @@ async def _translate(
144139
return DUMMY_DATA, r
145140

146141
def build_request(
147-
self,
148-
text: str,
149-
dest: str,
150-
src: str,
151-
override: typing.Dict[str, typing.Any]
142+
self, text: str, dest: str, src: str, override: typing.Dict[str, typing.Any]
152143
) -> httpx.Request:
153144
"""Async helper for making the translation request"""
154145
token = "xxxx" # dummy default value here as it is not used by api client
@@ -169,8 +160,7 @@ def build_request(
169160
return self.client.build_request("GET", url, params=params)
170161

171162
def _parse_extra_data(
172-
self,
173-
data: typing.List[typing.Any]
163+
self, data: typing.List[typing.Any]
174164
) -> typing.Dict[str, typing.Any]:
175165
response_parts_name_mapping = {
176166
0: "translation",
@@ -195,6 +185,20 @@ def _parse_extra_data(
195185

196186
return extra
197187

188+
@typing.overload
189+
async def translate(
190+
self, text: str, dest: str = ..., src: str = ..., **kwargs: typing.Any
191+
) -> Translated: ...
192+
193+
@typing.overload
194+
async def translate(
195+
self,
196+
text: typing.List[str],
197+
dest: str = ...,
198+
src: str = ...,
199+
**kwargs: typing.Any,
200+
) -> typing.List[Translated]: ...
201+
198202
async def translate(
199203
self,
200204
text: typing.Union[str, typing.List[str]],
@@ -309,10 +313,16 @@ async def translate(
309313

310314
return result
311315

316+
@typing.overload
317+
async def detect(self, text: str, **kwargs: typing.Any) -> Detected: ...
318+
319+
@typing.overload
312320
async def detect(
313-
self,
314-
text: typing.Union[str, typing.List[str]],
315-
**kwargs: typing.Any
321+
self, text: typing.List[str], **kwargs: typing.Any
322+
) -> typing.List[Detected]: ...
323+
324+
async def detect(
325+
self, text: typing.Union[str, typing.List[str]], **kwargs: typing.Any
316326
) -> typing.Union[Detected, typing.List[Detected]]:
317327
"""Detect language of the input text
318328

tests/__init__.py

Whitespace-only changes.

tests/test_client.py

+72-59
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1+
from unittest.mock import patch
2+
3+
import pytest
14
from httpcore import TimeoutException
25
from httpcore._exceptions import ConnectError
3-
from httpx import Timeout, Client, ConnectTimeout
4-
from unittest.mock import patch
6+
from httpx import Client, ConnectTimeout, Timeout
57
from pytest import raises
68

79
from googletrans import Translator
810

911

10-
def test_bind_multiple_service_urls():
12+
@pytest.mark.asyncio
13+
async def test_bind_multiple_service_urls():
1114
service_urls = [
1215
"translate.google.com",
1316
"translate.google.co.kr",
@@ -16,87 +19,97 @@ def test_bind_multiple_service_urls():
1619
translator = Translator(service_urls=service_urls)
1720
assert translator.service_urls == service_urls
1821

19-
assert translator.translate("test", dest="ko")
20-
assert translator.detect("Hello")
22+
assert await translator.translate("test", dest="ko")
23+
assert await translator.detect("Hello")
2124

2225

23-
def test_api_service_urls():
26+
@pytest.mark.asyncio
27+
async def test_api_service_urls():
2428
service_urls = ["translate.googleapis.com"]
2529

2630
translator = Translator(service_urls=service_urls)
2731
assert translator.service_urls == service_urls
2832

29-
assert translator.translate("test", dest="ko")
30-
assert translator.detect("Hello")
33+
assert await translator.translate("test", dest="ko")
34+
assert await translator.detect("Hello")
3135

3236

33-
def test_source_language(translator):
34-
result = translator.translate("안녕하세요.")
37+
@pytest.mark.asyncio
38+
async def test_source_language(translator: Translator):
39+
result = await translator.translate("안녕하세요.")
3540
assert result.src == "ko"
3641

3742

38-
def test_pronunciation(translator):
39-
result = translator.translate("안녕하세요.", dest="ja")
43+
@pytest.mark.asyncio
44+
async def test_pronunciation(translator: Translator):
45+
result = await translator.translate("안녕하세요.", dest="ja")
4046
assert result.pronunciation == "Kon'nichiwa."
4147

4248

43-
def test_pronunciation_issue_175(translator):
44-
result = translator.translate("Hello", src="en", dest="ru")
45-
49+
@pytest.mark.asyncio
50+
async def test_pronunciation_issue_175(translator: Translator):
51+
result = await translator.translate("Hello", src="en", dest="ru")
4652
assert result.pronunciation is not None
4753

4854

49-
def test_latin_to_english(translator):
50-
result = translator.translate("veritas lux mea", src="la", dest="en")
55+
@pytest.mark.asyncio
56+
async def test_latin_to_english(translator: Translator):
57+
result = await translator.translate("veritas lux mea", src="la", dest="en")
5158
assert result.text == "truth is my light"
5259

5360

54-
def test_unicode(translator):
55-
result = translator.translate("안녕하세요.", src="ko", dest="ja")
61+
@pytest.mark.asyncio
62+
async def test_unicode(translator: Translator):
63+
result = await translator.translate("안녕하세요.", src="ko", dest="ja")
5664
assert result.text == "こんにちは。"
5765

5866

59-
def test_emoji(translator):
60-
result = translator.translate("😀")
67+
@pytest.mark.asyncio
68+
async def test_emoji(translator: Translator):
69+
result = await translator.translate("😀")
6170
assert result.text == "😀"
6271

6372

64-
def test_language_name(translator):
65-
result = translator.translate("Hello", src="ENGLISH", dest="iRiSh")
73+
@pytest.mark.asyncio
74+
async def test_language_name(translator: Translator):
75+
result = await translator.translate("Hello", src="ENGLISH", dest="iRiSh")
6676
assert result.text == "Dia duit"
6777

6878

69-
def test_language_name_with_space(translator):
70-
result = translator.translate("Hello", src="en", dest="chinese (simplified)")
79+
@pytest.mark.asyncio
80+
async def test_language_name_with_space(translator: Translator):
81+
result = await translator.translate("Hello", src="en", dest="chinese (simplified)")
7182
assert result.dest == "zh-cn"
7283

7384

74-
def test_language_rfc1766(translator):
75-
result = translator.translate("luna", src="it_ch@euro", dest="en")
85+
@pytest.mark.asyncio
86+
async def test_language_rfc1766(translator: Translator):
87+
result = await translator.translate("luna", src="it_ch@euro", dest="en")
7688
assert result.text == "moon"
7789

7890

79-
def test_special_chars(translator):
91+
@pytest.mark.asyncio
92+
async def test_special_chars(translator: Translator):
8093
text = "©×《》"
81-
82-
result = translator.translate(text, src="en", dest="en")
94+
result = await translator.translate(text, src="en", dest="en")
8395
assert result.text == text
8496

8597

86-
def test_translate_list(translator):
98+
@pytest.mark.asyncio
99+
async def test_translate_list(translator: Translator):
87100
args = (["test", "exam", "exam paper"], "ko", "en")
88-
translations = translator.translate(*args)
89-
101+
translations = await translator.translate(*args)
90102
assert translations[0].text == "시험"
91103
assert translations[1].text == "시험"
92104
assert translations[2].text == "시험지"
93105

94106

95-
def test_detect_language(translator):
96-
ko = translator.detect("한국어")
97-
en = translator.detect("English")
98-
rubg = translator.detect("тест")
99-
russ = translator.detect("привет")
107+
@pytest.mark.asyncio
108+
async def test_detect_language(translator: Translator):
109+
ko = await translator.detect("한국어")
110+
en = await translator.detect("English")
111+
rubg = await translator.detect("тест")
112+
russ = await translator.detect("привет")
100113

101114
assert ko.lang == "ko"
102115
assert en.lang == "en"
@@ -105,52 +118,51 @@ def test_detect_language(translator):
105118
#'bg']
106119

107120

108-
def test_detect_list(translator):
121+
@pytest.mark.asyncio
122+
async def test_detect_list(translator: Translator):
109123
items = ["한국어", " English", "тест", "привет"]
110-
111-
result = translator.detect(items)
124+
result = await translator.detect(items)
112125

113126
assert result[0].lang == "ko"
114127
assert result[1].lang == "en"
115128
assert result[2].lang == "mk"
116129
assert result[3].lang == "ru"
117130

118131

119-
def test_src_in_special_cases(translator):
132+
@pytest.mark.asyncio
133+
async def test_src_in_special_cases(translator: Translator):
120134
args = ("tere", "en", "ee")
121-
122-
result = translator.translate(*args)
123-
135+
result = await translator.translate(*args)
124136
assert result.text in ("hello", "hi,")
125137

126138

127-
def test_src_not_in_supported_languages(translator):
139+
@pytest.mark.asyncio
140+
async def test_src_not_in_supported_languages(translator: Translator):
128141
args = ("Hello", "en", "zzz")
129-
130142
with raises(ValueError):
131-
translator.translate(*args)
143+
await translator.translate(*args)
132144

133145

134-
def test_dest_in_special_cases(translator):
146+
@pytest.mark.asyncio
147+
async def test_dest_in_special_cases(translator: Translator):
135148
args = ("hello", "ee", "en")
136-
137-
result = translator.translate(*args)
138-
149+
result = await translator.translate(*args)
139150
assert result.text == "tere"
140151

141152

142-
def test_dest_not_in_supported_languages(translator):
153+
@pytest.mark.asyncio
154+
async def test_dest_not_in_supported_languages(translator: Translator):
143155
args = ("Hello", "zzz", "en")
144-
145156
with raises(ValueError):
146-
translator.translate(*args)
157+
await translator.translate(*args)
147158

148159

149-
def test_timeout():
160+
@pytest.mark.asyncio
161+
async def test_timeout():
150162
# httpx will raise ConnectError in some conditions
151163
with raises((TimeoutException, ConnectError, ConnectTimeout)):
152164
translator = Translator(timeout=Timeout(0.0001))
153-
translator.translate("안녕하세요.")
165+
await translator.translate("안녕하세요.")
154166

155167

156168
class MockResponse:
@@ -159,7 +171,8 @@ def __init__(self, status_code):
159171
self.text = "tkk:'translation'"
160172

161173

174+
@pytest.mark.asyncio
162175
@patch.object(Client, "get", return_value=MockResponse("403"))
163-
def test_403_error(session_mock):
176+
async def test_403_error(session_mock):
164177
translator = Translator()
165-
assert translator.translate("test", dest="ko")
178+
assert await translator.translate("test", dest="ko")

0 commit comments

Comments
 (0)