fixed merge
Browse files- deep_translator/constants.py +18 -8
- deep_translator/google_trans.py +28 -10
- docs/README.rst +7 -7
- docs/history.rst +1 -0
- poetry.lock +167 -153
- pyproject.toml +2 -2
- tests/test_data.py +112 -0
- tests/test_google_trans.py +160 -9
deep_translator/constants.py
CHANGED
@@ -29,9 +29,8 @@ GOOGLE_CODES_TO_LANGUAGES = {
|
|
29 |
'ca': 'catalan',
|
30 |
'ceb': 'cebuano',
|
31 |
'ny': 'chichewa',
|
32 |
-
'zh': 'chinese',
|
33 |
-
'zh-
|
34 |
-
'zh-tw': 'chinese (traditional)',
|
35 |
'co': 'corsican',
|
36 |
'hr': 'croatian',
|
37 |
'cs': 'czech',
|
@@ -66,8 +65,9 @@ GOOGLE_CODES_TO_LANGUAGES = {
|
|
66 |
'kn': 'kannada',
|
67 |
'kk': 'kazakh',
|
68 |
'km': 'khmer',
|
|
|
69 |
'ko': 'korean',
|
70 |
-
'ku': 'kurdish
|
71 |
'ky': 'kyrgyz',
|
72 |
'lo': 'lao',
|
73 |
'la': 'latin',
|
@@ -82,9 +82,10 @@ GOOGLE_CODES_TO_LANGUAGES = {
|
|
82 |
'mi': 'maori',
|
83 |
'mr': 'marathi',
|
84 |
'mn': 'mongolian',
|
85 |
-
'my': 'myanmar
|
86 |
'ne': 'nepali',
|
87 |
'no': 'norwegian',
|
|
|
88 |
'ps': 'pashto',
|
89 |
'fa': 'persian',
|
90 |
'pl': 'polish',
|
@@ -108,11 +109,14 @@ GOOGLE_CODES_TO_LANGUAGES = {
|
|
108 |
'sv': 'swedish',
|
109 |
'tg': 'tajik',
|
110 |
'ta': 'tamil',
|
|
|
111 |
'te': 'telugu',
|
112 |
'th': 'thai',
|
113 |
'tr': 'turkish',
|
|
|
114 |
'uk': 'ukrainian',
|
115 |
'ur': 'urdu',
|
|
|
116 |
'uz': 'uzbek',
|
117 |
'vi': 'vietnamese',
|
118 |
'cy': 'welsh',
|
@@ -120,12 +124,18 @@ GOOGLE_CODES_TO_LANGUAGES = {
|
|
120 |
'yi': 'yiddish',
|
121 |
'yo': 'yoruba',
|
122 |
'zu': 'zulu',
|
123 |
-
'fil': 'Filipino',
|
124 |
-
'he': 'Hebrew'
|
125 |
}
|
126 |
|
127 |
GOOGLE_LANGUAGES_TO_CODES = {v: k for k, v in GOOGLE_CODES_TO_LANGUAGES.items()}
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
PONS_CODES_TO_LANGUAGES = {
|
130 |
'ar': 'arabic',
|
131 |
'bg': 'bulgarian',
|
@@ -247,4 +257,4 @@ QCRI_CODE_TO_LANGUAGE = {
|
|
247 |
|
248 |
QCRI_LANGUAGE_TO_CODE = {
|
249 |
v: k for k, v in QCRI_CODE_TO_LANGUAGE.items()
|
250 |
-
}
|
|
|
29 |
'ca': 'catalan',
|
30 |
'ceb': 'cebuano',
|
31 |
'ny': 'chichewa',
|
32 |
+
'zh-CN': 'chinese (simplified)',
|
33 |
+
'zh-TW': 'chinese (traditional)',
|
|
|
34 |
'co': 'corsican',
|
35 |
'hr': 'croatian',
|
36 |
'cs': 'czech',
|
|
|
65 |
'kn': 'kannada',
|
66 |
'kk': 'kazakh',
|
67 |
'km': 'khmer',
|
68 |
+
'rw': 'kinyarwanda',
|
69 |
'ko': 'korean',
|
70 |
+
'ku': 'kurdish',
|
71 |
'ky': 'kyrgyz',
|
72 |
'lo': 'lao',
|
73 |
'la': 'latin',
|
|
|
82 |
'mi': 'maori',
|
83 |
'mr': 'marathi',
|
84 |
'mn': 'mongolian',
|
85 |
+
'my': 'myanmar',
|
86 |
'ne': 'nepali',
|
87 |
'no': 'norwegian',
|
88 |
+
'or': 'odia',
|
89 |
'ps': 'pashto',
|
90 |
'fa': 'persian',
|
91 |
'pl': 'polish',
|
|
|
109 |
'sv': 'swedish',
|
110 |
'tg': 'tajik',
|
111 |
'ta': 'tamil',
|
112 |
+
'tt': 'tatar',
|
113 |
'te': 'telugu',
|
114 |
'th': 'thai',
|
115 |
'tr': 'turkish',
|
116 |
+
'tk': 'turkmen',
|
117 |
'uk': 'ukrainian',
|
118 |
'ur': 'urdu',
|
119 |
+
'ug': 'uyghur',
|
120 |
'uz': 'uzbek',
|
121 |
'vi': 'vietnamese',
|
122 |
'cy': 'welsh',
|
|
|
124 |
'yi': 'yiddish',
|
125 |
'yo': 'yoruba',
|
126 |
'zu': 'zulu',
|
|
|
|
|
127 |
}
|
128 |
|
129 |
GOOGLE_LANGUAGES_TO_CODES = {v: k for k, v in GOOGLE_CODES_TO_LANGUAGES.items()}
|
130 |
|
131 |
+
# This dictionary maps the primary name of language to its secondary names in list manner (if any)
|
132 |
+
GOOGLE_LANGUAGES_SECONDARY_NAMES = {
|
133 |
+
'myanmar': ['burmese'],
|
134 |
+
'odia': ['oriya'],
|
135 |
+
'kurdish': ['kurmanji']
|
136 |
+
}
|
137 |
+
|
138 |
+
|
139 |
PONS_CODES_TO_LANGUAGES = {
|
140 |
'ar': 'arabic',
|
141 |
'bg': 'bulgarian',
|
|
|
257 |
|
258 |
QCRI_LANGUAGE_TO_CODE = {
|
259 |
v: k for k, v in QCRI_CODE_TO_LANGUAGE.items()
|
260 |
+
}
|
deep_translator/google_trans.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
google translator API
|
3 |
"""
|
4 |
|
5 |
-
from .constants import BASE_URLS, GOOGLE_LANGUAGES_TO_CODES
|
6 |
from .exceptions import TooManyRequests, LanguageNotSupportedException, TranslationNotFound, NotValidPayload, RequestError
|
7 |
from .parent import BaseTranslator
|
8 |
from bs4 import BeautifulSoup
|
@@ -27,8 +27,19 @@ class GoogleTranslator(BaseTranslator):
|
|
27 |
self.__base_url = BASE_URLS.get("GOOGLE_TRANSLATE")
|
28 |
self.proxies = proxies
|
29 |
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
super(GoogleTranslator, self).__init__(base_url=self.__base_url,
|
34 |
source=self._source,
|
@@ -51,6 +62,17 @@ class GoogleTranslator(BaseTranslator):
|
|
51 |
"""
|
52 |
return GoogleTranslator.supported_languages if not as_dict else GoogleTranslator._languages
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
def _map_language_to_code(self, *languages):
|
55 |
"""
|
56 |
map language to its corresponding code (abbreviation) if the language was passed by its full name by the user
|
@@ -63,7 +85,7 @@ class GoogleTranslator(BaseTranslator):
|
|
63 |
elif language in self._languages.keys():
|
64 |
yield self._languages[language]
|
65 |
else:
|
66 |
-
|
67 |
|
68 |
def is_language_supported(self, *languages):
|
69 |
"""
|
@@ -74,7 +96,8 @@ class GoogleTranslator(BaseTranslator):
|
|
74 |
for lang in languages:
|
75 |
if lang != 'auto' and lang not in self._languages.keys():
|
76 |
if lang != 'auto' and lang not in self._languages.values():
|
77 |
-
|
|
|
78 |
return True
|
79 |
|
80 |
def translate(self, text, **kwargs):
|
@@ -168,21 +191,16 @@ class GoogleTranslator(BaseTranslator):
|
|
168 |
"""
|
169 |
if not batch:
|
170 |
raise Exception("Enter your text list that you want to translate")
|
171 |
-
|
172 |
-
print("Please wait.. This may take a couple of seconds because deep_translator sleeps "
|
173 |
-
"for two seconds after each request in order to not spam the google server.")
|
174 |
arr = []
|
175 |
for i, text in enumerate(batch):
|
176 |
|
177 |
translated = self.translate(text, **kwargs)
|
178 |
arr.append(translated)
|
179 |
-
print("sentence number ", i+1, " has been translated successfully")
|
180 |
sleep(2)
|
181 |
|
182 |
return arr
|
183 |
|
184 |
|
185 |
-
|
186 |
if __name__ == '__main__':
|
187 |
translator = GoogleTranslator(source='ru', target='uk')
|
188 |
t = translator.translate("Я разработчик") # => "I am a developer"
|
|
|
2 |
google translator API
|
3 |
"""
|
4 |
|
5 |
+
from .constants import BASE_URLS, GOOGLE_LANGUAGES_TO_CODES, GOOGLE_LANGUAGES_SECONDARY_NAMES
|
6 |
from .exceptions import TooManyRequests, LanguageNotSupportedException, TranslationNotFound, NotValidPayload, RequestError
|
7 |
from .parent import BaseTranslator
|
8 |
from bs4 import BeautifulSoup
|
|
|
27 |
self.__base_url = BASE_URLS.get("GOOGLE_TRANSLATE")
|
28 |
self.proxies = proxies
|
29 |
|
30 |
+
# code snipppet that converts the language into lower-case and skip lower-case conversion for abbreviations
|
31 |
+
# since abbreviations like zh-CN if converted to lower-case will result into error
|
32 |
+
#######################################
|
33 |
+
source_lower = source
|
34 |
+
target_lower = target
|
35 |
+
if not source in self._languages.values():
|
36 |
+
source_lower=source.lower()
|
37 |
+
if not target in self._languages.values():
|
38 |
+
target_lower=target.lower()
|
39 |
+
#######################################
|
40 |
+
|
41 |
+
if self.is_language_supported(source_lower, target_lower):
|
42 |
+
self._source, self._target = self._map_language_to_code(source_lower, target_lower)
|
43 |
|
44 |
super(GoogleTranslator, self).__init__(base_url=self.__base_url,
|
45 |
source=self._source,
|
|
|
62 |
"""
|
63 |
return GoogleTranslator.supported_languages if not as_dict else GoogleTranslator._languages
|
64 |
|
65 |
+
def is_secondary(self, lang):
|
66 |
+
"""
|
67 |
+
Function to check if lang is a secondary name of any primary language
|
68 |
+
@param lang: language name
|
69 |
+
@return: primary name of a language if found otherwise False
|
70 |
+
"""
|
71 |
+
for primary_name, secondary_names in GOOGLE_LANGUAGES_SECONDARY_NAMES.items():
|
72 |
+
if lang in secondary_names:
|
73 |
+
return primary_name
|
74 |
+
return False
|
75 |
+
|
76 |
def _map_language_to_code(self, *languages):
|
77 |
"""
|
78 |
map language to its corresponding code (abbreviation) if the language was passed by its full name by the user
|
|
|
85 |
elif language in self._languages.keys():
|
86 |
yield self._languages[language]
|
87 |
else:
|
88 |
+
yield self._languages[self.is_secondary(language)]
|
89 |
|
90 |
def is_language_supported(self, *languages):
|
91 |
"""
|
|
|
96 |
for lang in languages:
|
97 |
if lang != 'auto' and lang not in self._languages.keys():
|
98 |
if lang != 'auto' and lang not in self._languages.values():
|
99 |
+
if not self.is_secondary(lang):
|
100 |
+
raise LanguageNotSupportedException(lang)
|
101 |
return True
|
102 |
|
103 |
def translate(self, text, **kwargs):
|
|
|
191 |
"""
|
192 |
if not batch:
|
193 |
raise Exception("Enter your text list that you want to translate")
|
|
|
|
|
|
|
194 |
arr = []
|
195 |
for i, text in enumerate(batch):
|
196 |
|
197 |
translated = self.translate(text, **kwargs)
|
198 |
arr.append(translated)
|
|
|
199 |
sleep(2)
|
200 |
|
201 |
return arr
|
202 |
|
203 |
|
|
|
204 |
if __name__ == '__main__':
|
205 |
translator = GoogleTranslator(source='ru', target='uk')
|
206 |
t = translator.translate("Я разработчик") # => "I am a developer"
|
docs/README.rst
CHANGED
@@ -135,14 +135,14 @@ Quick Start
|
|
135 |
|
136 |
.. code-block:: python
|
137 |
|
138 |
-
from
|
139 |
translated = GoogleTranslator(source='auto', target='de').translate("keep it up, you are awesome") # output -> Weiter so, du bist großartig
|
140 |
|
141 |
or using proxies:
|
142 |
|
143 |
.. code-block:: python
|
144 |
|
145 |
-
from
|
146 |
|
147 |
proxies_example = {
|
148 |
"https": "34.195.196.27:8080",
|
@@ -155,7 +155,7 @@ or even directly from terminal:
|
|
155 |
|
156 |
.. code-block:: console
|
157 |
|
158 |
-
$ deep-translator
|
159 |
|
160 |
|
161 |
=====
|
@@ -175,7 +175,7 @@ Imports
|
|
175 |
|
176 |
.. code-block:: python
|
177 |
|
178 |
-
from
|
179 |
MicrosoftTranslator,
|
180 |
PonsTranslator,
|
181 |
LingueeTranslator,
|
@@ -536,7 +536,7 @@ can be used with all supported translators.
|
|
536 |
|
537 |
.. code-block:: python
|
538 |
|
539 |
-
from
|
540 |
|
541 |
# define your proxy configs:
|
542 |
proxies_example = {
|
@@ -567,13 +567,13 @@ To translate a string or line of text:
|
|
567 |
|
568 |
.. code-block:: console
|
569 |
|
570 |
-
$
|
571 |
|
572 |
Alternate short option names, along with using language abbreviations:
|
573 |
|
574 |
.. code-block:: console
|
575 |
|
576 |
-
$
|
577 |
|
578 |
|
579 |
Finally, to retrieve a list of available languages for a given translator:
|
|
|
135 |
|
136 |
.. code-block:: python
|
137 |
|
138 |
+
from deep_translator import GoogleTranslator
|
139 |
translated = GoogleTranslator(source='auto', target='de').translate("keep it up, you are awesome") # output -> Weiter so, du bist großartig
|
140 |
|
141 |
or using proxies:
|
142 |
|
143 |
.. code-block:: python
|
144 |
|
145 |
+
from deep_translator import GoogleTranslator
|
146 |
|
147 |
proxies_example = {
|
148 |
"https": "34.195.196.27:8080",
|
|
|
155 |
|
156 |
.. code-block:: console
|
157 |
|
158 |
+
$ deep-translator translate -src "en" -tgt "de" -txt "keep it up, you are awesome"
|
159 |
|
160 |
|
161 |
=====
|
|
|
175 |
|
176 |
.. code-block:: python
|
177 |
|
178 |
+
from deep_translator import (GoogleTranslator,
|
179 |
MicrosoftTranslator,
|
180 |
PonsTranslator,
|
181 |
LingueeTranslator,
|
|
|
536 |
|
537 |
.. code-block:: python
|
538 |
|
539 |
+
from deep_translator import GoogleTranslator
|
540 |
|
541 |
# define your proxy configs:
|
542 |
proxies_example = {
|
|
|
567 |
|
568 |
.. code-block:: console
|
569 |
|
570 |
+
$ deep_translator google --source "english" --target "german" --text "happy coding"
|
571 |
|
572 |
Alternate short option names, along with using language abbreviations:
|
573 |
|
574 |
.. code-block:: console
|
575 |
|
576 |
+
$ deep_translator google -src "en" -tgt "de" -txt "happy coding"
|
577 |
|
578 |
|
579 |
Finally, to retrieve a list of available languages for a given translator:
|
docs/history.rst
CHANGED
@@ -2,6 +2,7 @@
|
|
2 |
Important History
|
3 |
==================
|
4 |
|
|
|
5 |
- 1.5.3 bug fix to resolve translation issues with russian-ukranian languages
|
6 |
- 1.5.0 improved cli functionality with streamlined commands and numerous bugfixes.
|
7 |
- 1.4.4 added support for papago, added opt params, fixed deepl free api
|
|
|
2 |
Important History
|
3 |
==================
|
4 |
|
5 |
+
- 1.5.4 @kuspia: restructured google trans url to resolve language conflicts. Supercedes fix in 1.5.3
|
6 |
- 1.5.3 bug fix to resolve translation issues with russian-ukranian languages
|
7 |
- 1.5.0 improved cli functionality with streamlined commands and numerous bugfixes.
|
8 |
- 1.4.4 added support for papago, added opt params, fixed deepl free api
|
poetry.lock
CHANGED
@@ -41,14 +41,14 @@ pytz = ">=2015.7"
|
|
41 |
|
42 |
[[package]]
|
43 |
name = "beautifulsoup4"
|
44 |
-
version = "4.
|
45 |
description = "Screen-scraping library"
|
46 |
category = "main"
|
47 |
optional = false
|
48 |
-
python-versions = "
|
49 |
|
50 |
[package.dependencies]
|
51 |
-
soupsieve =
|
52 |
|
53 |
[package.extras]
|
54 |
html5lib = ["html5lib"]
|
@@ -56,7 +56,7 @@ lxml = ["lxml"]
|
|
56 |
|
57 |
[[package]]
|
58 |
name = "bleach"
|
59 |
-
version = "4.
|
60 |
description = "An easy safelist-based HTML-sanitizing tool."
|
61 |
category = "dev"
|
62 |
optional = false
|
@@ -69,7 +69,7 @@ webencodings = "*"
|
|
69 |
|
70 |
[[package]]
|
71 |
name = "certifi"
|
72 |
-
version = "2021.
|
73 |
description = "Python package for providing Mozilla's CA Bundle."
|
74 |
category = "main"
|
75 |
optional = false
|
@@ -77,7 +77,7 @@ python-versions = "*"
|
|
77 |
|
78 |
[[package]]
|
79 |
name = "cffi"
|
80 |
-
version = "1.
|
81 |
description = "Foreign Function Interface for Python calling C code."
|
82 |
category = "dev"
|
83 |
optional = false
|
@@ -88,7 +88,7 @@ pycparser = "*"
|
|
88 |
|
89 |
[[package]]
|
90 |
name = "charset-normalizer"
|
91 |
-
version = "2.0.
|
92 |
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
93 |
category = "main"
|
94 |
optional = false
|
@@ -99,7 +99,7 @@ unicode_backport = ["unicodedata2"]
|
|
99 |
|
100 |
[[package]]
|
101 |
name = "click"
|
102 |
-
version = "8.0.
|
103 |
description = "Composable command line interface toolkit"
|
104 |
category = "main"
|
105 |
optional = false
|
@@ -130,7 +130,7 @@ toml = ["toml"]
|
|
130 |
|
131 |
[[package]]
|
132 |
name = "cryptography"
|
133 |
-
version = "
|
134 |
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
|
135 |
category = "dev"
|
136 |
optional = false
|
@@ -143,9 +143,9 @@ cffi = ">=1.12"
|
|
143 |
docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
|
144 |
docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
|
145 |
pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
|
146 |
-
sdist = ["
|
147 |
ssh = ["bcrypt (>=3.1.5)"]
|
148 |
-
test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
|
149 |
|
150 |
[[package]]
|
151 |
name = "docutils"
|
@@ -157,7 +157,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
157 |
|
158 |
[[package]]
|
159 |
name = "idna"
|
160 |
-
version = "3.
|
161 |
description = "Internationalized Domain Names in Applications (IDNA)"
|
162 |
category = "main"
|
163 |
optional = false
|
@@ -165,7 +165,7 @@ python-versions = ">=3.5"
|
|
165 |
|
166 |
[[package]]
|
167 |
name = "imagesize"
|
168 |
-
version = "1.
|
169 |
description = "Getting image size from png/jpeg/jpeg2000/gif file"
|
170 |
category = "dev"
|
171 |
optional = false
|
@@ -173,7 +173,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|
173 |
|
174 |
[[package]]
|
175 |
name = "importlib-metadata"
|
176 |
-
version = "4.
|
177 |
description = "Read metadata from Python packages"
|
178 |
category = "main"
|
179 |
optional = false
|
@@ -186,7 +186,7 @@ zipp = ">=0.5"
|
|
186 |
[package.extras]
|
187 |
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
188 |
perf = ["ipython"]
|
189 |
-
testing = ["pytest (>=
|
190 |
|
191 |
[[package]]
|
192 |
name = "iniconfig"
|
@@ -210,7 +210,7 @@ trio = ["trio", "async-generator"]
|
|
210 |
|
211 |
[[package]]
|
212 |
name = "jinja2"
|
213 |
-
version = "3.0.
|
214 |
description = "A very fast and expressive template engine."
|
215 |
category = "dev"
|
216 |
optional = false
|
@@ -224,7 +224,7 @@ i18n = ["Babel (>=2.7)"]
|
|
224 |
|
225 |
[[package]]
|
226 |
name = "keyring"
|
227 |
-
version = "23.1
|
228 |
description = "Store and access your passwords safely."
|
229 |
category = "dev"
|
230 |
optional = false
|
@@ -250,14 +250,14 @@ python-versions = ">=3.6"
|
|
250 |
|
251 |
[[package]]
|
252 |
name = "packaging"
|
253 |
-
version = "21.
|
254 |
description = "Core utilities for Python packages"
|
255 |
category = "dev"
|
256 |
optional = false
|
257 |
python-versions = ">=3.6"
|
258 |
|
259 |
[package.dependencies]
|
260 |
-
pyparsing = ">=2.0.2"
|
261 |
|
262 |
[[package]]
|
263 |
name = "pkginfo"
|
@@ -272,29 +272,30 @@ testing = ["nose", "coverage"]
|
|
272 |
|
273 |
[[package]]
|
274 |
name = "pluggy"
|
275 |
-
version = "0.
|
276 |
description = "plugin and hook calling mechanisms for python"
|
277 |
category = "dev"
|
278 |
optional = false
|
279 |
-
python-versions = ">=
|
280 |
|
281 |
[package.dependencies]
|
282 |
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
283 |
|
284 |
[package.extras]
|
285 |
dev = ["pre-commit", "tox"]
|
|
|
286 |
|
287 |
[[package]]
|
288 |
name = "py"
|
289 |
-
version = "1.
|
290 |
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
291 |
category = "dev"
|
292 |
optional = false
|
293 |
-
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
294 |
|
295 |
[[package]]
|
296 |
name = "pycparser"
|
297 |
-
version = "2.
|
298 |
description = "C parser in Python"
|
299 |
category = "dev"
|
300 |
optional = false
|
@@ -310,15 +311,18 @@ python-versions = ">=3.5"
|
|
310 |
|
311 |
[[package]]
|
312 |
name = "pyparsing"
|
313 |
-
version = "
|
314 |
description = "Python parsing module"
|
315 |
category = "dev"
|
316 |
optional = false
|
317 |
-
python-versions = ">=
|
|
|
|
|
|
|
318 |
|
319 |
[[package]]
|
320 |
name = "pytest"
|
321 |
-
version = "6.2.
|
322 |
description = "pytest: simple powerful testing with Python"
|
323 |
category = "dev"
|
324 |
optional = false
|
@@ -331,7 +335,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
|
331 |
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
332 |
iniconfig = "*"
|
333 |
packaging = "*"
|
334 |
-
pluggy = ">=0.12,<
|
335 |
py = ">=1.8.2"
|
336 |
toml = "*"
|
337 |
|
@@ -352,7 +356,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
|
|
352 |
|
353 |
[[package]]
|
354 |
name = "pytz"
|
355 |
-
version = "2021.
|
356 |
description = "World timezone definitions, modern and historical"
|
357 |
category = "dev"
|
358 |
optional = false
|
@@ -368,7 +372,7 @@ python-versions = "*"
|
|
368 |
|
369 |
[[package]]
|
370 |
name = "readme-renderer"
|
371 |
-
version = "
|
372 |
description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse"
|
373 |
category = "dev"
|
374 |
optional = false
|
@@ -378,10 +382,9 @@ python-versions = "*"
|
|
378 |
bleach = ">=2.1.0"
|
379 |
docutils = ">=0.13.1"
|
380 |
Pygments = ">=2.5.1"
|
381 |
-
six = "*"
|
382 |
|
383 |
[package.extras]
|
384 |
-
md = ["cmarkgfm (>=0.5.0,<0.
|
385 |
|
386 |
[[package]]
|
387 |
name = "requests"
|
@@ -445,7 +448,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
|
445 |
|
446 |
[[package]]
|
447 |
name = "snowballstemmer"
|
448 |
-
version = "2.
|
449 |
description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
|
450 |
category = "dev"
|
451 |
optional = false
|
@@ -453,7 +456,7 @@ python-versions = "*"
|
|
453 |
|
454 |
[[package]]
|
455 |
name = "soupsieve"
|
456 |
-
version = "2.
|
457 |
description = "A modern CSS selector implementation for Beautiful Soup."
|
458 |
category = "main"
|
459 |
optional = false
|
@@ -461,7 +464,7 @@ python-versions = ">=3.6"
|
|
461 |
|
462 |
[[package]]
|
463 |
name = "sphinx"
|
464 |
-
version = "4.
|
465 |
description = "Python documentation generator"
|
466 |
category = "dev"
|
467 |
optional = false
|
@@ -571,7 +574,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
|
571 |
|
572 |
[[package]]
|
573 |
name = "tqdm"
|
574 |
-
version = "4.62.
|
575 |
description = "Fast, Extensible Progress Meter"
|
576 |
category = "dev"
|
577 |
optional = false
|
@@ -587,7 +590,7 @@ telegram = ["requests"]
|
|
587 |
|
588 |
[[package]]
|
589 |
name = "twine"
|
590 |
-
version = "3.
|
591 |
description = "Collection of utilities for publishing packages on PyPI"
|
592 |
category = "dev"
|
593 |
optional = false
|
@@ -606,15 +609,15 @@ tqdm = ">=4.14"
|
|
606 |
|
607 |
[[package]]
|
608 |
name = "typing-extensions"
|
609 |
-
version = "
|
610 |
-
description = "Backported and Experimental Type Hints for Python 3.
|
611 |
category = "main"
|
612 |
optional = false
|
613 |
-
python-versions = "
|
614 |
|
615 |
[[package]]
|
616 |
name = "urllib3"
|
617 |
-
version = "1.26.
|
618 |
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
619 |
category = "main"
|
620 |
optional = false
|
@@ -635,7 +638,7 @@ python-versions = "*"
|
|
635 |
|
636 |
[[package]]
|
637 |
name = "zipp"
|
638 |
-
version = "3.
|
639 |
description = "Backport of pathlib-compatible object wrapper for zip files"
|
640 |
category = "main"
|
641 |
optional = false
|
@@ -668,72 +671,76 @@ babel = [
|
|
668 |
{file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
|
669 |
]
|
670 |
beautifulsoup4 = [
|
671 |
-
{file = "beautifulsoup4-4.
|
672 |
-
{file = "beautifulsoup4-4.
|
673 |
-
{file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"},
|
674 |
]
|
675 |
bleach = [
|
676 |
-
{file = "bleach-4.
|
677 |
-
{file = "bleach-4.
|
678 |
]
|
679 |
certifi = [
|
680 |
-
{file = "certifi-2021.
|
681 |
-
{file = "certifi-2021.
|
682 |
]
|
683 |
cffi = [
|
684 |
-
{file = "cffi-1.
|
685 |
-
{file = "cffi-1.
|
686 |
-
{file = "cffi-1.
|
687 |
-
{file = "cffi-1.
|
688 |
-
{file = "cffi-1.
|
689 |
-
{file = "cffi-1.
|
690 |
-
{file = "cffi-1.
|
691 |
-
{file = "cffi-1.
|
692 |
-
{file = "cffi-1.
|
693 |
-
{file = "cffi-1.
|
694 |
-
{file = "cffi-1.
|
695 |
-
{file = "cffi-1.
|
696 |
-
{file = "cffi-1.
|
697 |
-
{file = "cffi-1.
|
698 |
-
{file = "cffi-1.
|
699 |
-
{file = "cffi-1.
|
700 |
-
{file = "cffi-1.
|
701 |
-
{file = "cffi-1.
|
702 |
-
{file = "cffi-1.
|
703 |
-
{file = "cffi-1.
|
704 |
-
{file = "cffi-1.
|
705 |
-
{file = "cffi-1.
|
706 |
-
{file = "cffi-1.
|
707 |
-
{file = "cffi-1.
|
708 |
-
{file = "cffi-1.
|
709 |
-
{file = "cffi-1.
|
710 |
-
{file = "cffi-1.
|
711 |
-
{file = "cffi-1.
|
712 |
-
{file = "cffi-1.
|
713 |
-
{file = "cffi-1.
|
714 |
-
{file = "cffi-1.
|
715 |
-
{file = "cffi-1.
|
716 |
-
{file = "cffi-1.
|
717 |
-
{file = "cffi-1.
|
718 |
-
{file = "cffi-1.
|
719 |
-
{file = "cffi-1.
|
720 |
-
{file = "cffi-1.
|
721 |
-
{file = "cffi-1.
|
722 |
-
{file = "cffi-1.
|
723 |
-
{file = "cffi-1.
|
724 |
-
{file = "cffi-1.
|
725 |
-
{file = "cffi-1.
|
726 |
-
{file = "cffi-1.
|
727 |
-
{file = "cffi-1.
|
728 |
-
{file = "cffi-1.
|
|
|
|
|
|
|
|
|
|
|
729 |
]
|
730 |
charset-normalizer = [
|
731 |
-
{file = "charset-normalizer-2.0.
|
732 |
-
{file = "charset_normalizer-2.0.
|
733 |
]
|
734 |
click = [
|
735 |
-
{file = "click-8.0.
|
736 |
-
{file = "click-8.0.
|
737 |
]
|
738 |
colorama = [
|
739 |
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
@@ -794,34 +801,42 @@ coverage = [
|
|
794 |
{file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
|
795 |
]
|
796 |
cryptography = [
|
797 |
-
{file = "cryptography-
|
798 |
-
{file = "cryptography-
|
799 |
-
{file = "cryptography-
|
800 |
-
{file = "cryptography-
|
801 |
-
{file = "cryptography-
|
802 |
-
{file = "cryptography-
|
803 |
-
{file = "cryptography-
|
804 |
-
{file = "cryptography-
|
805 |
-
{file = "cryptography-
|
806 |
-
{file = "cryptography-
|
807 |
-
{file = "cryptography-
|
808 |
-
{file = "cryptography-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
809 |
]
|
810 |
docutils = [
|
811 |
{file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
|
812 |
{file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
|
813 |
]
|
814 |
idna = [
|
815 |
-
{file = "idna-3.
|
816 |
-
{file = "idna-3.
|
817 |
]
|
818 |
imagesize = [
|
819 |
-
{file = "imagesize-1.
|
820 |
-
{file = "imagesize-1.
|
821 |
]
|
822 |
importlib-metadata = [
|
823 |
-
{file = "importlib_metadata-4.
|
824 |
-
{file = "importlib_metadata-4.
|
825 |
]
|
826 |
iniconfig = [
|
827 |
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
@@ -832,12 +847,12 @@ jeepney = [
|
|
832 |
{file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"},
|
833 |
]
|
834 |
jinja2 = [
|
835 |
-
{file = "Jinja2-3.0.
|
836 |
-
{file = "Jinja2-3.0.
|
837 |
]
|
838 |
keyring = [
|
839 |
-
{file = "keyring-23.1
|
840 |
-
{file = "keyring-23.1.
|
841 |
]
|
842 |
markupsafe = [
|
843 |
{file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
|
@@ -876,52 +891,52 @@ markupsafe = [
|
|
876 |
{file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
|
877 |
]
|
878 |
packaging = [
|
879 |
-
{file = "packaging-21.
|
880 |
-
{file = "packaging-21.
|
881 |
]
|
882 |
pkginfo = [
|
883 |
{file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"},
|
884 |
{file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"},
|
885 |
]
|
886 |
pluggy = [
|
887 |
-
{file = "pluggy-0.
|
888 |
-
{file = "pluggy-0.
|
889 |
]
|
890 |
py = [
|
891 |
-
{file = "py-1.
|
892 |
-
{file = "py-1.
|
893 |
]
|
894 |
pycparser = [
|
895 |
-
{file = "pycparser-2.
|
896 |
-
{file = "pycparser-2.
|
897 |
]
|
898 |
pygments = [
|
899 |
{file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
|
900 |
{file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
|
901 |
]
|
902 |
pyparsing = [
|
903 |
-
{file = "pyparsing-
|
904 |
-
{file = "pyparsing-
|
905 |
]
|
906 |
pytest = [
|
907 |
-
{file = "pytest-6.2.
|
908 |
-
{file = "pytest-6.2.
|
909 |
]
|
910 |
pytest-runner = [
|
911 |
{file = "pytest-runner-5.3.1.tar.gz", hash = "sha256:0fce5b8dc68760f353979d99fdd6b3ad46330b6b1837e2077a89ebcf204aac91"},
|
912 |
{file = "pytest_runner-5.3.1-py3-none-any.whl", hash = "sha256:85f93af814438ee322b4ea08fe3f5c2ad53b253577f3bd84b2ad451fee450ac5"},
|
913 |
]
|
914 |
pytz = [
|
915 |
-
{file = "pytz-2021.
|
916 |
-
{file = "pytz-2021.
|
917 |
]
|
918 |
pywin32-ctypes = [
|
919 |
{file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
|
920 |
{file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
|
921 |
]
|
922 |
readme-renderer = [
|
923 |
-
{file = "readme_renderer-
|
924 |
-
{file = "readme_renderer-
|
925 |
]
|
926 |
requests = [
|
927 |
{file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
|
@@ -944,16 +959,16 @@ six = [
|
|
944 |
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
945 |
]
|
946 |
snowballstemmer = [
|
947 |
-
{file = "snowballstemmer-2.
|
948 |
-
{file = "snowballstemmer-2.
|
949 |
]
|
950 |
soupsieve = [
|
951 |
-
{file = "soupsieve-2.
|
952 |
-
{file = "soupsieve-2.
|
953 |
]
|
954 |
sphinx = [
|
955 |
-
{file = "Sphinx-4.
|
956 |
-
{file = "Sphinx-4.
|
957 |
]
|
958 |
sphinxcontrib-applehelp = [
|
959 |
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
|
@@ -984,27 +999,26 @@ toml = [
|
|
984 |
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
985 |
]
|
986 |
tqdm = [
|
987 |
-
{file = "tqdm-4.62.
|
988 |
-
{file = "tqdm-4.62.
|
989 |
]
|
990 |
twine = [
|
991 |
-
{file = "twine-3.
|
992 |
-
{file = "twine-3.
|
993 |
]
|
994 |
typing-extensions = [
|
995 |
-
{file = "typing_extensions-
|
996 |
-
{file = "typing_extensions-
|
997 |
-
{file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
|
998 |
]
|
999 |
urllib3 = [
|
1000 |
-
{file = "urllib3-1.26.
|
1001 |
-
{file = "urllib3-1.26.
|
1002 |
]
|
1003 |
webencodings = [
|
1004 |
{file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
|
1005 |
{file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
|
1006 |
]
|
1007 |
zipp = [
|
1008 |
-
{file = "zipp-3.
|
1009 |
-
{file = "zipp-3.
|
1010 |
]
|
|
|
41 |
|
42 |
[[package]]
|
43 |
name = "beautifulsoup4"
|
44 |
+
version = "4.10.0"
|
45 |
description = "Screen-scraping library"
|
46 |
category = "main"
|
47 |
optional = false
|
48 |
+
python-versions = ">3.0.0"
|
49 |
|
50 |
[package.dependencies]
|
51 |
+
soupsieve = ">1.2"
|
52 |
|
53 |
[package.extras]
|
54 |
html5lib = ["html5lib"]
|
|
|
56 |
|
57 |
[[package]]
|
58 |
name = "bleach"
|
59 |
+
version = "4.1.0"
|
60 |
description = "An easy safelist-based HTML-sanitizing tool."
|
61 |
category = "dev"
|
62 |
optional = false
|
|
|
69 |
|
70 |
[[package]]
|
71 |
name = "certifi"
|
72 |
+
version = "2021.10.8"
|
73 |
description = "Python package for providing Mozilla's CA Bundle."
|
74 |
category = "main"
|
75 |
optional = false
|
|
|
77 |
|
78 |
[[package]]
|
79 |
name = "cffi"
|
80 |
+
version = "1.15.0"
|
81 |
description = "Foreign Function Interface for Python calling C code."
|
82 |
category = "dev"
|
83 |
optional = false
|
|
|
88 |
|
89 |
[[package]]
|
90 |
name = "charset-normalizer"
|
91 |
+
version = "2.0.7"
|
92 |
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
93 |
category = "main"
|
94 |
optional = false
|
|
|
99 |
|
100 |
[[package]]
|
101 |
name = "click"
|
102 |
+
version = "8.0.3"
|
103 |
description = "Composable command line interface toolkit"
|
104 |
category = "main"
|
105 |
optional = false
|
|
|
130 |
|
131 |
[[package]]
|
132 |
name = "cryptography"
|
133 |
+
version = "35.0.0"
|
134 |
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
|
135 |
category = "dev"
|
136 |
optional = false
|
|
|
143 |
docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
|
144 |
docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
|
145 |
pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
|
146 |
+
sdist = ["setuptools_rust (>=0.11.4)"]
|
147 |
ssh = ["bcrypt (>=3.1.5)"]
|
148 |
+
test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
|
149 |
|
150 |
[[package]]
|
151 |
name = "docutils"
|
|
|
157 |
|
158 |
[[package]]
|
159 |
name = "idna"
|
160 |
+
version = "3.3"
|
161 |
description = "Internationalized Domain Names in Applications (IDNA)"
|
162 |
category = "main"
|
163 |
optional = false
|
|
|
165 |
|
166 |
[[package]]
|
167 |
name = "imagesize"
|
168 |
+
version = "1.3.0"
|
169 |
description = "Getting image size from png/jpeg/jpeg2000/gif file"
|
170 |
category = "dev"
|
171 |
optional = false
|
|
|
173 |
|
174 |
[[package]]
|
175 |
name = "importlib-metadata"
|
176 |
+
version = "4.8.2"
|
177 |
description = "Read metadata from Python packages"
|
178 |
category = "main"
|
179 |
optional = false
|
|
|
186 |
[package.extras]
|
187 |
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
188 |
perf = ["ipython"]
|
189 |
+
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
|
190 |
|
191 |
[[package]]
|
192 |
name = "iniconfig"
|
|
|
210 |
|
211 |
[[package]]
|
212 |
name = "jinja2"
|
213 |
+
version = "3.0.3"
|
214 |
description = "A very fast and expressive template engine."
|
215 |
category = "dev"
|
216 |
optional = false
|
|
|
224 |
|
225 |
[[package]]
|
226 |
name = "keyring"
|
227 |
+
version = "23.2.1"
|
228 |
description = "Store and access your passwords safely."
|
229 |
category = "dev"
|
230 |
optional = false
|
|
|
250 |
|
251 |
[[package]]
|
252 |
name = "packaging"
|
253 |
+
version = "21.3"
|
254 |
description = "Core utilities for Python packages"
|
255 |
category = "dev"
|
256 |
optional = false
|
257 |
python-versions = ">=3.6"
|
258 |
|
259 |
[package.dependencies]
|
260 |
+
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
261 |
|
262 |
[[package]]
|
263 |
name = "pkginfo"
|
|
|
272 |
|
273 |
[[package]]
|
274 |
name = "pluggy"
|
275 |
+
version = "1.0.0"
|
276 |
description = "plugin and hook calling mechanisms for python"
|
277 |
category = "dev"
|
278 |
optional = false
|
279 |
+
python-versions = ">=3.6"
|
280 |
|
281 |
[package.dependencies]
|
282 |
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
283 |
|
284 |
[package.extras]
|
285 |
dev = ["pre-commit", "tox"]
|
286 |
+
testing = ["pytest", "pytest-benchmark"]
|
287 |
|
288 |
[[package]]
|
289 |
name = "py"
|
290 |
+
version = "1.11.0"
|
291 |
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
292 |
category = "dev"
|
293 |
optional = false
|
294 |
+
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
295 |
|
296 |
[[package]]
|
297 |
name = "pycparser"
|
298 |
+
version = "2.21"
|
299 |
description = "C parser in Python"
|
300 |
category = "dev"
|
301 |
optional = false
|
|
|
311 |
|
312 |
[[package]]
|
313 |
name = "pyparsing"
|
314 |
+
version = "3.0.6"
|
315 |
description = "Python parsing module"
|
316 |
category = "dev"
|
317 |
optional = false
|
318 |
+
python-versions = ">=3.6"
|
319 |
+
|
320 |
+
[package.extras]
|
321 |
+
diagrams = ["jinja2", "railroad-diagrams"]
|
322 |
|
323 |
[[package]]
|
324 |
name = "pytest"
|
325 |
+
version = "6.2.5"
|
326 |
description = "pytest: simple powerful testing with Python"
|
327 |
category = "dev"
|
328 |
optional = false
|
|
|
335 |
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
336 |
iniconfig = "*"
|
337 |
packaging = "*"
|
338 |
+
pluggy = ">=0.12,<2.0"
|
339 |
py = ">=1.8.2"
|
340 |
toml = "*"
|
341 |
|
|
|
356 |
|
357 |
[[package]]
|
358 |
name = "pytz"
|
359 |
+
version = "2021.3"
|
360 |
description = "World timezone definitions, modern and historical"
|
361 |
category = "dev"
|
362 |
optional = false
|
|
|
372 |
|
373 |
[[package]]
|
374 |
name = "readme-renderer"
|
375 |
+
version = "30.0"
|
376 |
description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse"
|
377 |
category = "dev"
|
378 |
optional = false
|
|
|
382 |
bleach = ">=2.1.0"
|
383 |
docutils = ">=0.13.1"
|
384 |
Pygments = ">=2.5.1"
|
|
|
385 |
|
386 |
[package.extras]
|
387 |
+
md = ["cmarkgfm (>=0.5.0,<0.7.0)"]
|
388 |
|
389 |
[[package]]
|
390 |
name = "requests"
|
|
|
448 |
|
449 |
[[package]]
|
450 |
name = "snowballstemmer"
|
451 |
+
version = "2.2.0"
|
452 |
description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
|
453 |
category = "dev"
|
454 |
optional = false
|
|
|
456 |
|
457 |
[[package]]
|
458 |
name = "soupsieve"
|
459 |
+
version = "2.3.1"
|
460 |
description = "A modern CSS selector implementation for Beautiful Soup."
|
461 |
category = "main"
|
462 |
optional = false
|
|
|
464 |
|
465 |
[[package]]
|
466 |
name = "sphinx"
|
467 |
+
version = "4.3.0"
|
468 |
description = "Python documentation generator"
|
469 |
category = "dev"
|
470 |
optional = false
|
|
|
574 |
|
575 |
[[package]]
|
576 |
name = "tqdm"
|
577 |
+
version = "4.62.3"
|
578 |
description = "Fast, Extensible Progress Meter"
|
579 |
category = "dev"
|
580 |
optional = false
|
|
|
590 |
|
591 |
[[package]]
|
592 |
name = "twine"
|
593 |
+
version = "3.6.0"
|
594 |
description = "Collection of utilities for publishing packages on PyPI"
|
595 |
category = "dev"
|
596 |
optional = false
|
|
|
609 |
|
610 |
[[package]]
|
611 |
name = "typing-extensions"
|
612 |
+
version = "4.0.0"
|
613 |
+
description = "Backported and Experimental Type Hints for Python 3.6+"
|
614 |
category = "main"
|
615 |
optional = false
|
616 |
+
python-versions = ">=3.6"
|
617 |
|
618 |
[[package]]
|
619 |
name = "urllib3"
|
620 |
+
version = "1.26.7"
|
621 |
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
622 |
category = "main"
|
623 |
optional = false
|
|
|
638 |
|
639 |
[[package]]
|
640 |
name = "zipp"
|
641 |
+
version = "3.6.0"
|
642 |
description = "Backport of pathlib-compatible object wrapper for zip files"
|
643 |
category = "main"
|
644 |
optional = false
|
|
|
671 |
{file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
|
672 |
]
|
673 |
beautifulsoup4 = [
|
674 |
+
{file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"},
|
675 |
+
{file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
|
|
|
676 |
]
|
677 |
bleach = [
|
678 |
+
{file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"},
|
679 |
+
{file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"},
|
680 |
]
|
681 |
certifi = [
|
682 |
+
{file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
|
683 |
+
{file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
|
684 |
]
|
685 |
cffi = [
|
686 |
+
{file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
|
687 |
+
{file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
|
688 |
+
{file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
|
689 |
+
{file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
|
690 |
+
{file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
|
691 |
+
{file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
|
692 |
+
{file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
|
693 |
+
{file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
|
694 |
+
{file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
|
695 |
+
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
|
696 |
+
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
|
697 |
+
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
|
698 |
+
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
|
699 |
+
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
|
700 |
+
{file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
|
701 |
+
{file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
|
702 |
+
{file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
|
703 |
+
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
|
704 |
+
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
|
705 |
+
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
|
706 |
+
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
|
707 |
+
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
|
708 |
+
{file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
|
709 |
+
{file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
|
710 |
+
{file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
|
711 |
+
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
|
712 |
+
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
|
713 |
+
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
|
714 |
+
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
|
715 |
+
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
|
716 |
+
{file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
|
717 |
+
{file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
|
718 |
+
{file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
|
719 |
+
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
|
720 |
+
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
|
721 |
+
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
|
722 |
+
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
|
723 |
+
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
|
724 |
+
{file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
|
725 |
+
{file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
|
726 |
+
{file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
|
727 |
+
{file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
|
728 |
+
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
|
729 |
+
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
|
730 |
+
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
|
731 |
+
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
|
732 |
+
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
|
733 |
+
{file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
|
734 |
+
{file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
|
735 |
+
{file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
|
736 |
]
|
737 |
charset-normalizer = [
|
738 |
+
{file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"},
|
739 |
+
{file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"},
|
740 |
]
|
741 |
click = [
|
742 |
+
{file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
|
743 |
+
{file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
|
744 |
]
|
745 |
colorama = [
|
746 |
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
|
|
801 |
{file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
|
802 |
]
|
803 |
cryptography = [
|
804 |
+
{file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"},
|
805 |
+
{file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"},
|
806 |
+
{file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"},
|
807 |
+
{file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"},
|
808 |
+
{file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"},
|
809 |
+
{file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"},
|
810 |
+
{file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"},
|
811 |
+
{file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"},
|
812 |
+
{file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"},
|
813 |
+
{file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"},
|
814 |
+
{file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"},
|
815 |
+
{file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"},
|
816 |
+
{file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"},
|
817 |
+
{file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"},
|
818 |
+
{file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"},
|
819 |
+
{file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"},
|
820 |
+
{file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"},
|
821 |
+
{file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"},
|
822 |
+
{file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"},
|
823 |
+
{file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"},
|
824 |
]
|
825 |
docutils = [
|
826 |
{file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
|
827 |
{file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
|
828 |
]
|
829 |
idna = [
|
830 |
+
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
831 |
+
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
832 |
]
|
833 |
imagesize = [
|
834 |
+
{file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"},
|
835 |
+
{file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
|
836 |
]
|
837 |
importlib-metadata = [
|
838 |
+
{file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"},
|
839 |
+
{file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"},
|
840 |
]
|
841 |
iniconfig = [
|
842 |
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
|
|
847 |
{file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"},
|
848 |
]
|
849 |
jinja2 = [
|
850 |
+
{file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
|
851 |
+
{file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
|
852 |
]
|
853 |
keyring = [
|
854 |
+
{file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"},
|
855 |
+
{file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"},
|
856 |
]
|
857 |
markupsafe = [
|
858 |
{file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
|
|
|
891 |
{file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
|
892 |
]
|
893 |
packaging = [
|
894 |
+
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
895 |
+
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
896 |
]
|
897 |
pkginfo = [
|
898 |
{file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"},
|
899 |
{file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"},
|
900 |
]
|
901 |
pluggy = [
|
902 |
+
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
903 |
+
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
904 |
]
|
905 |
py = [
|
906 |
+
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
907 |
+
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
908 |
]
|
909 |
pycparser = [
|
910 |
+
{file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
|
911 |
+
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
|
912 |
]
|
913 |
pygments = [
|
914 |
{file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
|
915 |
{file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
|
916 |
]
|
917 |
pyparsing = [
|
918 |
+
{file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
|
919 |
+
{file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
|
920 |
]
|
921 |
pytest = [
|
922 |
+
{file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
|
923 |
+
{file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
|
924 |
]
|
925 |
pytest-runner = [
|
926 |
{file = "pytest-runner-5.3.1.tar.gz", hash = "sha256:0fce5b8dc68760f353979d99fdd6b3ad46330b6b1837e2077a89ebcf204aac91"},
|
927 |
{file = "pytest_runner-5.3.1-py3-none-any.whl", hash = "sha256:85f93af814438ee322b4ea08fe3f5c2ad53b253577f3bd84b2ad451fee450ac5"},
|
928 |
]
|
929 |
pytz = [
|
930 |
+
{file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
|
931 |
+
{file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
|
932 |
]
|
933 |
pywin32-ctypes = [
|
934 |
{file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
|
935 |
{file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
|
936 |
]
|
937 |
readme-renderer = [
|
938 |
+
{file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"},
|
939 |
+
{file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"},
|
940 |
]
|
941 |
requests = [
|
942 |
{file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
|
|
|
959 |
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
960 |
]
|
961 |
snowballstemmer = [
|
962 |
+
{file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
|
963 |
+
{file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
|
964 |
]
|
965 |
soupsieve = [
|
966 |
+
{file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"},
|
967 |
+
{file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"},
|
968 |
]
|
969 |
sphinx = [
|
970 |
+
{file = "Sphinx-4.3.0-py3-none-any.whl", hash = "sha256:7e2b30da5f39170efcd95c6270f07669d623c276521fee27ad6c380f49d2bf5b"},
|
971 |
+
{file = "Sphinx-4.3.0.tar.gz", hash = "sha256:6d051ab6e0d06cba786c4656b0fe67ba259fe058410f49e95bee6e49c4052cbf"},
|
972 |
]
|
973 |
sphinxcontrib-applehelp = [
|
974 |
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
|
|
|
999 |
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
1000 |
]
|
1001 |
tqdm = [
|
1002 |
+
{file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"},
|
1003 |
+
{file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"},
|
1004 |
]
|
1005 |
twine = [
|
1006 |
+
{file = "twine-3.6.0-py3-none-any.whl", hash = "sha256:916070f8ecbd1985ebed5dbb02b9bda9a092882a96d7069d542d4fc0bb5c673c"},
|
1007 |
+
{file = "twine-3.6.0.tar.gz", hash = "sha256:4caad5ef4722e127b3749052fcbffaaf71719b19d4fd4973b29c469957adeba2"},
|
1008 |
]
|
1009 |
typing-extensions = [
|
1010 |
+
{file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"},
|
1011 |
+
{file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"},
|
|
|
1012 |
]
|
1013 |
urllib3 = [
|
1014 |
+
{file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
|
1015 |
+
{file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
|
1016 |
]
|
1017 |
webencodings = [
|
1018 |
{file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
|
1019 |
{file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
|
1020 |
]
|
1021 |
zipp = [
|
1022 |
+
{file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
|
1023 |
+
{file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
|
1024 |
]
|
pyproject.toml
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
[tool.poetry]
|
2 |
name = "deep-translator"
|
3 |
-
version = "1.5.
|
4 |
-
description = ""
|
5 |
license = "MIT"
|
6 |
authors = ["Nidhal Baccouri <[email protected]>"]
|
7 |
maintainers = ["Chris Trenthem <[email protected]>"]
|
|
|
1 |
[tool.poetry]
|
2 |
name = "deep-translator"
|
3 |
+
version = "1.5.4"
|
4 |
+
description = "A flexible free and unlimited python tool to translate between different languages in a simple way using multiple translators"
|
5 |
license = "MIT"
|
6 |
authors = ["Nidhal Baccouri <[email protected]>"]
|
7 |
maintainers = ["Chris Trenthem <[email protected]>"]
|
tests/test_data.py
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
test_text_standard = 'Hello world.'
|
2 |
+
|
3 |
+
TRANSLATED_RESULTS = {
|
4 |
+
"afrikaans": "Hello Wêreld.",
|
5 |
+
"albanian": "Përshendetje Botë.",
|
6 |
+
"amharic": "ሰላም ልዑል.",
|
7 |
+
"arabic": "مرحبا بالعالم.",
|
8 |
+
"armenian": "Բարեւ աշխարհ.",
|
9 |
+
"azerbaijani": "Salam dünya.",
|
10 |
+
"basque": "Kaixo Mundua.",
|
11 |
+
"belarusian": "Прывітанне Сусвет.",
|
12 |
+
"bengali": "ওহে বিশ্ব.",
|
13 |
+
"bosnian": "Zdravo svijete.",
|
14 |
+
"bulgarian": "Здравей свят.",
|
15 |
+
"catalan": "Hola món.",
|
16 |
+
"cebuano": "Kumusta kalibutan.",
|
17 |
+
"chichewa": "Moni Dziko Lapansi.",
|
18 |
+
"chinese (simplified)": "你好,世界。",
|
19 |
+
"chinese (traditional)": "你好,世界。",
|
20 |
+
"corsican": "Bonghjornu mondu.",
|
21 |
+
"croatian": "Pozdrav svijete.",
|
22 |
+
"czech": "Ahoj světe.",
|
23 |
+
"danish": "Hej Verden.",
|
24 |
+
"dutch": "Hallo Wereld.",
|
25 |
+
"esperanto": "Saluton mondo.",
|
26 |
+
"estonian": "Tere, Maailm.",
|
27 |
+
"filipino": "Kamusta mundo",
|
28 |
+
"finnish": "Hei maailma.",
|
29 |
+
"french": "Bonjour le monde.",
|
30 |
+
"frisian": "Hallo wrâld.",
|
31 |
+
"galician": "Ola mundo.",
|
32 |
+
"georgian": "Გამარჯობა მსოფლიო.",
|
33 |
+
"german": "Hallo Welt.",
|
34 |
+
"greek": "Γειά σου Κόσμε.",
|
35 |
+
"gujarati": "હેલો વર્લ્ડ.",
|
36 |
+
"haitian creole": "Bonjou mond.",
|
37 |
+
"hausa": "Sannu Duniya.",
|
38 |
+
"hawaiian": "Aloha honua.",
|
39 |
+
"hebrew": "שלום עולם.",
|
40 |
+
"hindi": "नमस्ते दुनिया।",
|
41 |
+
"hmong": "Nyob zoo ntiaj teb.",
|
42 |
+
"hungarian": "Helló Világ.",
|
43 |
+
"icelandic": "Halló heimur.",
|
44 |
+
"igbo": "Ndewo Ụwa.",
|
45 |
+
"indonesian": "Halo Dunia.",
|
46 |
+
"irish": "Dia duit ar domhan.",
|
47 |
+
"italian": "Ciao mondo.",
|
48 |
+
"japanese": "こんにちは世界。",
|
49 |
+
"javanese": "Halo jagad.",
|
50 |
+
"kannada": "ಹಲೋ ವಿಶ್ವ.",
|
51 |
+
"kazakh": "Сәлем Әлем.",
|
52 |
+
"khmer": "សួស្តីពិភពលោក។",
|
53 |
+
"kinyarwanda": "Mwaramutse isi.",
|
54 |
+
"korean": "안녕하세요 세계입니다.",
|
55 |
+
"kurdish": "Hello cîhanê.",
|
56 |
+
"kyrgyz": "Салам дүйнө.",
|
57 |
+
"lao": "ສະບາຍດີຊາວໂລກ.",
|
58 |
+
"latin": "Salve mundi.",
|
59 |
+
"latvian": "Sveika pasaule.",
|
60 |
+
"lithuanian": "Labas pasauli.",
|
61 |
+
"luxembourgish": "Moien Welt.",
|
62 |
+
"macedonian": "Здраво свету.",
|
63 |
+
"malagasy": "Hello World.",
|
64 |
+
"malay": "Hai dunia.",
|
65 |
+
"malayalam": "ഹലോ വേൾഡ്.",
|
66 |
+
"maltese": "Hello dinja.",
|
67 |
+
"maori": "Kia ora te ao.",
|
68 |
+
"marathi": "नमस्कार जग.",
|
69 |
+
"mongolian": "Сайн уу ертөнц.",
|
70 |
+
"myanmar": "မင်္ဂလာပါကမ္ဘာလောက။",
|
71 |
+
"nepali": "नमस्कार संसार।",
|
72 |
+
"norwegian": "Hei Verden.",
|
73 |
+
"odia": "ନମସ୍କାର ବିଶ୍ୱବାସି।",
|
74 |
+
"pashto": "سلام نړی.",
|
75 |
+
"persian": "سلام دنیا.",
|
76 |
+
"polish": "Witaj świecie.",
|
77 |
+
"portuguese": "Olá Mundo.",
|
78 |
+
"punjabi": "ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਦੁਨਿਆ.",
|
79 |
+
"romanian": "Salut Lume.",
|
80 |
+
"russian": "Привет, мир.",
|
81 |
+
"samoan": "Talofa lalolagi.",
|
82 |
+
"scots gaelic": "Hàlo a Shaoghail.",
|
83 |
+
"serbian": "Здраво Свете.",
|
84 |
+
"sesotho": "Lefatše Lumela.",
|
85 |
+
"shona": "Mhoro nyika.",
|
86 |
+
"sindhi": "هيلو دنيا.",
|
87 |
+
"sinhala": "හෙලෝ වර්ල්ඩ්.",
|
88 |
+
"slovak": "Ahoj svet.",
|
89 |
+
"slovenian": "Pozdravljen, svet.",
|
90 |
+
"somali": "Salaamu calaykum.",
|
91 |
+
"spanish": "Hola Mundo.",
|
92 |
+
"sundanese": "Halo Dunya.",
|
93 |
+
"swahili": "Salamu, Dunia.",
|
94 |
+
"swedish": "Hej världen.",
|
95 |
+
"tajik": "Салом Ҷаҳон.",
|
96 |
+
"tamil": "வணக்கம் உலகம்.",
|
97 |
+
"tatar": "Сәлам, Дөнья.",
|
98 |
+
"telugu": "హలో వరల్డ్.",
|
99 |
+
"thai": "สวัสดีชาวโลก.",
|
100 |
+
"turkish": "Selam Dünya.",
|
101 |
+
"turkmen": "Salam dünýä.",
|
102 |
+
"ukrainian": "Привіт Світ.",
|
103 |
+
"urdu": "سلام دنیا۔",
|
104 |
+
"uyghur": "ياخشىمۇسىز دۇنيا.",
|
105 |
+
"uzbek": "Salom Dunyo.",
|
106 |
+
"vietnamese": "Chào thế giới.",
|
107 |
+
"welsh": "Helo Byd.",
|
108 |
+
"xhosa": "Molo Lizwe.",
|
109 |
+
"yiddish": "העלא וועלט.",
|
110 |
+
"yoruba": "Mo ki O Ile Aiye.",
|
111 |
+
"zulu": "Sawubona Mhlaba."
|
112 |
+
}
|
tests/test_google_trans.py
CHANGED
@@ -4,23 +4,182 @@
|
|
4 |
|
5 |
import pytest
|
6 |
from deep_translator import exceptions, GoogleTranslator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
|
9 |
@pytest.fixture
|
10 |
def google_translator():
|
11 |
"""Sample pytest fixture.
|
12 |
-
|
13 |
See more at: http://doc.pytest.org/en/latest/fixture.html
|
14 |
"""
|
15 |
return GoogleTranslator(target='en')
|
16 |
|
17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
def test_content(google_translator):
|
19 |
"""Sample pytest test function with the pytest fixture as an argument."""
|
20 |
# from bs4 import BeautifulSoup
|
21 |
# assert 'GitHub' in BeautifulSoup(response.content).title.string
|
22 |
assert google_translator.translate(text='좋은') == "good"
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
def test_inputs():
|
26 |
with pytest.raises(exceptions.LanguageNotSupportedException):
|
@@ -29,13 +188,6 @@ def test_inputs():
|
|
29 |
with pytest.raises(exceptions.LanguageNotSupportedException):
|
30 |
GoogleTranslator(source="auto", target="nothing")
|
31 |
|
32 |
-
# test abbreviations and languages
|
33 |
-
g1 = GoogleTranslator("en", "fr")
|
34 |
-
g2 = GoogleTranslator("english", "french")
|
35 |
-
assert g1._source == g2._source
|
36 |
-
assert g1._target == g2._target
|
37 |
-
|
38 |
-
|
39 |
def test_payload(google_translator):
|
40 |
|
41 |
with pytest.raises(exceptions.NotValidPayload):
|
@@ -59,6 +211,5 @@ def test_payload(google_translator):
|
|
59 |
#for _ in range(1):
|
60 |
#assert google_translator.translate(text='좋은') == "good"
|
61 |
|
62 |
-
|
63 |
def test_one_character_words():
|
64 |
assert GoogleTranslator(source='es', target='en').translate('o') == 'or'
|
|
|
4 |
|
5 |
import pytest
|
6 |
from deep_translator import exceptions, GoogleTranslator
|
7 |
+
from deep_translator.constants import GOOGLE_CODES_TO_LANGUAGES
|
8 |
+
#from test_data import test_text_standard, TRANSLATED_RESULTS
|
9 |
+
import random
|
10 |
+
|
11 |
+
test_text_standard = 'Hello world.'
|
12 |
+
|
13 |
+
TRANSLATED_RESULTS = {
|
14 |
+
"afrikaans": "Hello Wêreld.",
|
15 |
+
"albanian": "Përshendetje Botë.",
|
16 |
+
"amharic": "ሰላም ልዑል.",
|
17 |
+
"arabic": "مرحبا بالعالم.",
|
18 |
+
"armenian": "Բարեւ աշխարհ.",
|
19 |
+
"azerbaijani": "Salam dünya.",
|
20 |
+
"basque": "Kaixo Mundua.",
|
21 |
+
"belarusian": "Прывітанне Сусвет.",
|
22 |
+
"bengali": "ওহে বিশ্ব.",
|
23 |
+
"bosnian": "Zdravo svijete.",
|
24 |
+
"bulgarian": "Здравей свят.",
|
25 |
+
"catalan": "Hola món.",
|
26 |
+
"cebuano": "Kumusta kalibutan.",
|
27 |
+
"chichewa": "Moni Dziko Lapansi.",
|
28 |
+
"chinese (simplified)": "你好,世界。",
|
29 |
+
"chinese (traditional)": "你好,世界。",
|
30 |
+
"corsican": "Bonghjornu mondu.",
|
31 |
+
"croatian": "Pozdrav svijete.",
|
32 |
+
"czech": "Ahoj světe.",
|
33 |
+
"danish": "Hej Verden.",
|
34 |
+
"dutch": "Hallo Wereld.",
|
35 |
+
"esperanto": "Saluton mondo.",
|
36 |
+
"estonian": "Tere, Maailm.",
|
37 |
+
"filipino": "Kamusta mundo",
|
38 |
+
"finnish": "Hei maailma.",
|
39 |
+
"french": "Bonjour le monde.",
|
40 |
+
"frisian": "Hallo wrâld.",
|
41 |
+
"galician": "Ola mundo.",
|
42 |
+
"georgian": "Გამარჯობა მსოფლიო.",
|
43 |
+
"german": "Hallo Welt.",
|
44 |
+
"greek": "Γειά σου Κόσμε.",
|
45 |
+
"gujarati": "હેલો વર્લ્ડ.",
|
46 |
+
"haitian creole": "Bonjou mond.",
|
47 |
+
"hausa": "Sannu Duniya.",
|
48 |
+
"hawaiian": "Aloha honua.",
|
49 |
+
"hebrew": "שלום עולם.",
|
50 |
+
"hindi": "नमस्ते दुनिया।",
|
51 |
+
"hmong": "Nyob zoo ntiaj teb.",
|
52 |
+
"hungarian": "Helló Világ.",
|
53 |
+
"icelandic": "Halló heimur.",
|
54 |
+
"igbo": "Ndewo Ụwa.",
|
55 |
+
"indonesian": "Halo Dunia.",
|
56 |
+
"irish": "Dia duit ar domhan.",
|
57 |
+
"italian": "Ciao mondo.",
|
58 |
+
"japanese": "こんにちは世界。",
|
59 |
+
"javanese": "Halo jagad.",
|
60 |
+
"kannada": "ಹಲೋ ವಿಶ್ವ.",
|
61 |
+
"kazakh": "Сәлем Әлем.",
|
62 |
+
"khmer": "សួស្តីពិភពលោក។",
|
63 |
+
"kinyarwanda": "Mwaramutse isi.",
|
64 |
+
"korean": "안녕하세요 세계입니다.",
|
65 |
+
"kurdish": "Hello cîhanê.",
|
66 |
+
"kyrgyz": "Салам дүйнө.",
|
67 |
+
"lao": "ສະບາຍດີຊາວໂລກ.",
|
68 |
+
"latin": "Salve mundi.",
|
69 |
+
"latvian": "Sveika pasaule.",
|
70 |
+
"lithuanian": "Labas pasauli.",
|
71 |
+
"luxembourgish": "Moien Welt.",
|
72 |
+
"macedonian": "Здраво свету.",
|
73 |
+
"malagasy": "Hello World.",
|
74 |
+
"malay": "Hai dunia.",
|
75 |
+
"malayalam": "ഹലോ വേൾഡ്.",
|
76 |
+
"maltese": "Hello dinja.",
|
77 |
+
"maori": "Kia ora te ao.",
|
78 |
+
"marathi": "नमस्कार जग.",
|
79 |
+
"mongolian": "Сайн уу ертөнц.",
|
80 |
+
"myanmar": "မင်္ဂလာပါကမ္ဘာလောက။",
|
81 |
+
"nepali": "नमस्कार संसार।",
|
82 |
+
"norwegian": "Hei Verden.",
|
83 |
+
"odia": "ନମସ୍କାର ବିଶ୍ୱବାସି।",
|
84 |
+
"pashto": "سلام نړی.",
|
85 |
+
"persian": "سلام دنیا.",
|
86 |
+
"polish": "Witaj świecie.",
|
87 |
+
"portuguese": "Olá Mundo.",
|
88 |
+
"punjabi": "ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਦੁਨਿਆ.",
|
89 |
+
"romanian": "Salut Lume.",
|
90 |
+
"russian": "Привет, мир.",
|
91 |
+
"samoan": "Talofa lalolagi.",
|
92 |
+
"scots gaelic": "Hàlo a Shaoghail.",
|
93 |
+
"serbian": "Здраво Свете.",
|
94 |
+
"sesotho": "Lefatše Lumela.",
|
95 |
+
"shona": "Mhoro nyika.",
|
96 |
+
"sindhi": "هيلو دنيا.",
|
97 |
+
"sinhala": "හෙලෝ වර්ල්ඩ්.",
|
98 |
+
"slovak": "Ahoj svet.",
|
99 |
+
"slovenian": "Pozdravljen, svet.",
|
100 |
+
"somali": "Salaamu calaykum.",
|
101 |
+
"spanish": "Hola Mundo.",
|
102 |
+
"sundanese": "Halo Dunya.",
|
103 |
+
"swahili": "Salamu, Dunia.",
|
104 |
+
"swedish": "Hej världen.",
|
105 |
+
"tajik": "Салом Ҷаҳон.",
|
106 |
+
"tamil": "வணக்கம் உலகம்.",
|
107 |
+
"tatar": "Сәлам, Дөнья.",
|
108 |
+
"telugu": "హలో వరల్డ్.",
|
109 |
+
"thai": "สวัสดีชาวโลก.",
|
110 |
+
"turkish": "Selam Dünya.",
|
111 |
+
"turkmen": "Salam dünýä.",
|
112 |
+
"ukrainian": "Привіт Світ.",
|
113 |
+
"urdu": "سلام دنیا۔",
|
114 |
+
"uyghur": "ياخشىمۇسىز دۇنيا.",
|
115 |
+
"uzbek": "Salom Dunyo.",
|
116 |
+
"vietnamese": "Chào thế giới.",
|
117 |
+
"welsh": "Helo Byd.",
|
118 |
+
"xhosa": "Molo Lizwe.",
|
119 |
+
"yiddish": "העלא וועלט.",
|
120 |
+
"yoruba": "Mo ki O Ile Aiye.",
|
121 |
+
"zulu": "Sawubona Mhlaba."
|
122 |
+
}
|
123 |
|
124 |
|
125 |
@pytest.fixture
|
126 |
def google_translator():
|
127 |
"""Sample pytest fixture.
|
|
|
128 |
See more at: http://doc.pytest.org/en/latest/fixture.html
|
129 |
"""
|
130 |
return GoogleTranslator(target='en')
|
131 |
|
132 |
|
133 |
+
def case_sensitivity_checks():
|
134 |
+
test_lang = 'Czech'
|
135 |
+
test_text = 'Hi, the sky is dark while the moon is white. Hurrah!! Denver is a city name in Colorado.'
|
136 |
+
translated_text = 'Ahoj, obloha je tmavá, zatímco měsíc je bílý. Hurá!! Denver je název města v Coloradu.'
|
137 |
+
test_cases = []
|
138 |
+
n = len(test_lang)
|
139 |
+
mx = 1 << n
|
140 |
+
test = test_lang.lower()
|
141 |
+
for i in range(mx):
|
142 |
+
combination = [k for k in test_lang]
|
143 |
+
for j in range(n):
|
144 |
+
if (((i >> j) & 1) == 1):
|
145 |
+
combination[j] = test_lang[j].upper()
|
146 |
+
temp = ""
|
147 |
+
for i in combination:
|
148 |
+
temp += i
|
149 |
+
test_cases.append(temp)
|
150 |
+
random_cases = 5
|
151 |
+
random_test_cases = random.sample(test_cases, random_cases) # randomly choosing any five cases since list is in order of 2^n containing all cases
|
152 |
+
for case in random_test_cases:
|
153 |
+
assert GoogleTranslator(source='en', target=case).translate(test_text) == translated_text
|
154 |
+
|
155 |
+
def multiple_names_lang_checks():
|
156 |
+
assert GoogleTranslator(source='en', target='burMeSe').translate("Hello") == 'မင်္ဂလာပါ'
|
157 |
+
assert GoogleTranslator(source='en', target='Oriya').translate("What's up?") == 'କଣ ଚାଲିଛି?'
|
158 |
+
assert GoogleTranslator(source='en', target='kurManJi').translate("Nice is dice.") == 'Xweş xweş e.'
|
159 |
+
|
160 |
+
def test_random_tranlations_cases_multiple_names():
|
161 |
+
random_sample_size = 5
|
162 |
+
d = dict.fromkeys(list(TRANSLATED_RESULTS.keys()))
|
163 |
+
random_lang_names = random.sample(d.keys(), random_sample_size)
|
164 |
+
random_subset_dict = {k: TRANSLATED_RESULTS[k] for k in random_lang_names}
|
165 |
+
for lang, translation in random_subset_dict.items():
|
166 |
+
assert GoogleTranslator(source='en', target=lang).translate(test_text_standard) == translation
|
167 |
+
|
168 |
+
case_sensitivity_checks()
|
169 |
+
multiple_names_lang_checks()
|
170 |
+
|
171 |
def test_content(google_translator):
|
172 |
"""Sample pytest test function with the pytest fixture as an argument."""
|
173 |
# from bs4 import BeautifulSoup
|
174 |
# assert 'GitHub' in BeautifulSoup(response.content).title.string
|
175 |
assert google_translator.translate(text='좋은') == "good"
|
176 |
|
177 |
+
def test_abbreviations_and_languages_mapping():
|
178 |
+
for abb, lang in GOOGLE_CODES_TO_LANGUAGES.items():
|
179 |
+
if(abb!= 'en'):
|
180 |
+
g1 = GoogleTranslator(abb)
|
181 |
+
g2 = GoogleTranslator(lang)
|
182 |
+
assert g1._source == g2._source
|
183 |
|
184 |
def test_inputs():
|
185 |
with pytest.raises(exceptions.LanguageNotSupportedException):
|
|
|
188 |
with pytest.raises(exceptions.LanguageNotSupportedException):
|
189 |
GoogleTranslator(source="auto", target="nothing")
|
190 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
def test_payload(google_translator):
|
192 |
|
193 |
with pytest.raises(exceptions.NotValidPayload):
|
|
|
211 |
#for _ in range(1):
|
212 |
#assert google_translator.translate(text='좋은') == "good"
|
213 |
|
|
|
214 |
def test_one_character_words():
|
215 |
assert GoogleTranslator(source='es', target='en').translate('o') == 'or'
|