nidhal baccouri commited on
Commit
7162fd1
·
2 Parent(s): 7c6d7e3 48a15ea

fixed merge

Browse files
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-cn': 'chinese (simplified)',
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 (kurmanji)',
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 (burmese)',
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
- if self.is_language_supported(source, target):
31
- self._source, self._target = self._map_language_to_code(source.lower(), target.lower())
 
 
 
 
 
 
 
 
 
 
 
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
- raise LanguageNotSupportedException(language)
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
- raise LanguageNotSupportedException(lang)
 
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 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,7 +155,7 @@ or even directly from terminal:
155
 
156
  .. code-block:: console
157
 
158
- $ deep-translator -trans "google" -src "en" -tg "de" -txt "keep it up, you are awesome"
159
 
160
 
161
  =====
@@ -175,7 +175,7 @@ Imports
175
 
176
  .. code-block:: python
177
 
178
- from deep-translator import (GoogleTranslator,
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 deep-translator import GoogleTranslator
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
- $ 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:
 
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.9.3"
45
  description = "Screen-scraping library"
46
  category = "main"
47
  optional = false
48
- python-versions = "*"
49
 
50
  [package.dependencies]
51
- soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""}
52
 
53
  [package.extras]
54
  html5lib = ["html5lib"]
@@ -56,7 +56,7 @@ lxml = ["lxml"]
56
 
57
  [[package]]
58
  name = "bleach"
59
- version = "4.0.0"
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.5.30"
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.14.6"
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.4"
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.1"
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 = "3.4.7"
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 = ["setuptools-rust (>=0.11.4)"]
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.2"
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.2.0"
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.6.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 (>=4.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,7 +210,7 @@ trio = ["trio", "async-generator"]
210
 
211
  [[package]]
212
  name = "jinja2"
213
- version = "3.0.1"
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.0"
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.0"
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.13.1"
276
  description = "plugin and hook calling mechanisms for python"
277
  category = "dev"
278
  optional = false
279
- python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
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.10.0"
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.20"
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 = "2.4.7"
314
  description = "Python parsing module"
315
  category = "dev"
316
  optional = false
317
- python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 
 
318
 
319
  [[package]]
320
  name = "pytest"
321
- version = "6.2.4"
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,<1.0.0a1"
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.1"
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 = "29.0"
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.6.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.1.0"
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.2.1"
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.1.2"
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.2"
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.4.2"
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 = "3.10.0.0"
610
- description = "Backported and Experimental Type Hints for Python 3.5+"
611
  category = "main"
612
  optional = false
613
- python-versions = "*"
614
 
615
  [[package]]
616
  name = "urllib3"
617
- version = "1.26.6"
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.5.0"
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.9.3-py2-none-any.whl", hash = "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35"},
672
- {file = "beautifulsoup4-4.9.3-py3-none-any.whl", hash = "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"},
673
- {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"},
674
  ]
675
  bleach = [
676
- {file = "bleach-4.0.0-py2.py3-none-any.whl", hash = "sha256:c1685a132e6a9a38bf93752e5faab33a9517a6c0bb2f37b785e47bf253bdb51d"},
677
- {file = "bleach-4.0.0.tar.gz", hash = "sha256:ffa9221c6ac29399cc50fcc33473366edd0cf8d5e2cbbbb63296dc327fb67cc8"},
678
  ]
679
  certifi = [
680
- {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
681
- {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
682
  ]
683
  cffi = [
684
- {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"},
685
- {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"},
686
- {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"},
687
- {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"},
688
- {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"},
689
- {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"},
690
- {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"},
691
- {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"},
692
- {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"},
693
- {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"},
694
- {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"},
695
- {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"},
696
- {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"},
697
- {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"},
698
- {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"},
699
- {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"},
700
- {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"},
701
- {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"},
702
- {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"},
703
- {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"},
704
- {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"},
705
- {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"},
706
- {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"},
707
- {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"},
708
- {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"},
709
- {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"},
710
- {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"},
711
- {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"},
712
- {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"},
713
- {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"},
714
- {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"},
715
- {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"},
716
- {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"},
717
- {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"},
718
- {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"},
719
- {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"},
720
- {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"},
721
- {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"},
722
- {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"},
723
- {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"},
724
- {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"},
725
- {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"},
726
- {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"},
727
- {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"},
728
- {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
 
 
 
 
 
729
  ]
730
  charset-normalizer = [
731
- {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"},
732
- {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"},
733
  ]
734
  click = [
735
- {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"},
736
- {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"},
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-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"},
798
- {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"},
799
- {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"},
800
- {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"},
801
- {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"},
802
- {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"},
803
- {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"},
804
- {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"},
805
- {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"},
806
- {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"},
807
- {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"},
808
- {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"},
 
 
 
 
 
 
 
 
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.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
816
- {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
817
  ]
818
  imagesize = [
819
- {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"},
820
- {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
821
  ]
822
  importlib-metadata = [
823
- {file = "importlib_metadata-4.6.4-py3-none-any.whl", hash = "sha256:ed5157fef23a4bc4594615a0dd8eba94b2bb36bf2a343fa3d8bb2fa0a62a99d5"},
824
- {file = "importlib_metadata-4.6.4.tar.gz", hash = "sha256:7b30a78db2922d78a6f47fb30683156a14f3c6aa5cc23f77cc8967e9ab2d002f"},
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.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
836
- {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
837
  ]
838
  keyring = [
839
- {file = "keyring-23.1.0-py3-none-any.whl", hash = "sha256:b32397fd7e7063f8dd74a26db910c9862fc2109285fa16e3b5208bcb42a3e579"},
840
- {file = "keyring-23.1.0.tar.gz", hash = "sha256:b7e0156667f5dcc73c1f63a518005cd18a4eb23fe77321194fefcc03748b21a4"},
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.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
880
- {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
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.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
888
- {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
889
  ]
890
  py = [
891
- {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
892
- {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
893
  ]
894
  pycparser = [
895
- {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
896
- {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
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-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
904
- {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
905
  ]
906
  pytest = [
907
- {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
908
- {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
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.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
916
- {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
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-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"},
924
- {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"},
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.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
948
- {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
949
  ]
950
  soupsieve = [
951
- {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"},
952
- {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"},
953
  ]
954
  sphinx = [
955
- {file = "Sphinx-4.1.2-py3-none-any.whl", hash = "sha256:46d52c6cee13fec44744b8c01ed692c18a640f6910a725cbb938bc36e8d64544"},
956
- {file = "Sphinx-4.1.2.tar.gz", hash = "sha256:3092d929cd807926d846018f2ace47ba2f3b671b309c7a89cd3306e80c826b13"},
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.2-py2.py3-none-any.whl", hash = "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588"},
988
- {file = "tqdm-4.62.2.tar.gz", hash = "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5"},
989
  ]
990
  twine = [
991
- {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"},
992
- {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"},
993
  ]
994
  typing-extensions = [
995
- {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
996
- {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
997
- {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
998
  ]
999
  urllib3 = [
1000
- {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"},
1001
- {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"},
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.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"},
1009
- {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"},
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.1"
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'