PyFunceble-dev 4.3.0a9__py3-none-any.whl → 4.3.0a11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PyFunceble/checker/availability/base.py +0 -1
- PyFunceble/checker/availability/domain.py +0 -1
- PyFunceble/checker/availability/extras/base.py +18 -18
- PyFunceble/checker/availability/extras/etoxic.py +0 -1
- PyFunceble/checker/availability/extras/parked.py +1 -2
- PyFunceble/checker/availability/extras/rules.py +64 -5
- PyFunceble/checker/availability/extras/subject_switch.py +1 -1
- PyFunceble/checker/availability/ip.py +0 -1
- PyFunceble/checker/availability/url.py +0 -1
- PyFunceble/checker/reputation/base.py +0 -1
- PyFunceble/cli/entry_points/pyfunceble/cli.py +19 -0
- PyFunceble/cli/filesystem/printer/base.py +19 -6
- PyFunceble/cli/processes/migrator.py +0 -1
- PyFunceble/cli/processes/workers/base.py +5 -3
- PyFunceble/cli/processes/workers/dir_files_sorter.py +0 -1
- PyFunceble/cli/processes/workers/file_sorter.py +0 -1
- PyFunceble/cli/processes/workers/file_sorter_base.py +0 -1
- PyFunceble/cli/processes/workers/migrator.py +0 -1
- PyFunceble/cli/processes/workers/miner.py +7 -9
- PyFunceble/cli/processes/workers/producer.py +15 -2
- PyFunceble/cli/processes/workers/tester.py +2 -6
- PyFunceble/cli/scripts/iana.py +11 -1
- PyFunceble/cli/scripts/public_suffix.py +14 -1
- PyFunceble/cli/system/launcher.py +10 -1
- PyFunceble/cli/utils/version.py +27 -15
- PyFunceble/config/loader.py +43 -12
- PyFunceble/data/infrastructure/.PyFunceble_production.yaml +14 -0
- PyFunceble/downloader/base.py +13 -3
- PyFunceble/helpers/download.py +147 -20
- PyFunceble/helpers/hash.py +10 -18
- PyFunceble/query/dns/nameserver.py +12 -6
- PyFunceble/query/dns/query_tool.py +3 -1
- PyFunceble/query/http_status_code.py +9 -7
- PyFunceble/query/requests/adapter/base.py +36 -4
- PyFunceble/query/requests/adapter/http.py +2 -3
- PyFunceble/query/requests/adapter/https.py +2 -2
- PyFunceble/query/requests/requester.py +70 -41
- PyFunceble/storage.py +1 -4
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/METADATA +143 -150
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/RECORD +44 -44
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/WHEEL +1 -1
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/LICENSE +0 -0
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/entry_points.txt +0 -0
- {PyFunceble_dev-4.3.0a9.dist-info → PyFunceble_dev-4.3.0a11.dist-info}/top_level.txt +0 -0
@@ -50,12 +50,13 @@ License:
|
|
50
50
|
limitations under the License.
|
51
51
|
"""
|
52
52
|
|
53
|
+
import secrets
|
53
54
|
from typing import Optional
|
54
55
|
|
55
56
|
import requests.adapters
|
57
|
+
import requests.exceptions
|
56
58
|
import requests.models
|
57
59
|
|
58
|
-
import PyFunceble.storage
|
59
60
|
from PyFunceble.checker.syntax.ip import IPSyntaxChecker
|
60
61
|
from PyFunceble.query.dns.query_tool import DNSQueryTool
|
61
62
|
|
@@ -66,10 +67,15 @@ class RequestAdapterBase(requests.adapters.HTTPAdapter):
|
|
66
67
|
adapter.
|
67
68
|
"""
|
68
69
|
|
70
|
+
NOT_RESOLVED_STD_HOSTNAME: str = (
|
71
|
+
f"{secrets.token_hex(12)}.mock-resolver.pyfunceble.com"
|
72
|
+
)
|
73
|
+
|
69
74
|
resolving_cache: dict = {}
|
70
75
|
resolving_use_cache: bool = False
|
71
76
|
timeout: float = 5.0
|
72
77
|
proxy_pattern: dict = {}
|
78
|
+
ssl_context: Optional[dict] = None
|
73
79
|
|
74
80
|
def __init__(self, *args, **kwargs):
|
75
81
|
if "timeout" in kwargs:
|
@@ -93,6 +99,10 @@ class RequestAdapterBase(requests.adapters.HTTPAdapter):
|
|
93
99
|
else:
|
94
100
|
self.proxy_pattern = {}
|
95
101
|
|
102
|
+
if "ssl_context" in kwargs:
|
103
|
+
self.ssl_context = kwargs["ssl_context"]
|
104
|
+
del kwargs["ssl_context"]
|
105
|
+
|
96
106
|
super().__init__(*args, **kwargs)
|
97
107
|
|
98
108
|
@staticmethod
|
@@ -102,9 +112,7 @@ class RequestAdapterBase(requests.adapters.HTTPAdapter):
|
|
102
112
|
given domain.
|
103
113
|
"""
|
104
114
|
|
105
|
-
raise
|
106
|
-
"Could not resolve."
|
107
|
-
)
|
115
|
+
raise requests.exceptions.ConnectionError("Could not resolve.")
|
108
116
|
|
109
117
|
@staticmethod
|
110
118
|
def extract_extension(subject: str) -> Optional[str]:
|
@@ -286,3 +294,27 @@ class RequestAdapterBase(requests.adapters.HTTPAdapter):
|
|
286
294
|
return self.resolve_with_cache(hostname)
|
287
295
|
return self.resolve_without_cache(hostname)
|
288
296
|
return None
|
297
|
+
|
298
|
+
def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):
|
299
|
+
"""
|
300
|
+
Overwrite the upstream :code:`init_poolmanager` method to ensure that we
|
301
|
+
use our own ssl context - when given.
|
302
|
+
"""
|
303
|
+
|
304
|
+
_ = pool_kwargs.pop("ssl_context", None)
|
305
|
+
|
306
|
+
return super().init_poolmanager(
|
307
|
+
connections, maxsize, block, ssl_context=self.ssl_context, **pool_kwargs
|
308
|
+
)
|
309
|
+
|
310
|
+
def proxy_manager_for(self, proxy, **proxy_kwargs):
|
311
|
+
"""
|
312
|
+
Overwrite the upstream :code:`proxy_manager_for` method to ensure that we
|
313
|
+
use our own ssl context - when given.
|
314
|
+
"""
|
315
|
+
|
316
|
+
_ = proxy_kwargs.pop("ssl_context", None)
|
317
|
+
|
318
|
+
return super().proxy_manager_for(
|
319
|
+
proxy, ssl_context=self.ssl_context, **proxy_kwargs
|
320
|
+
)
|
@@ -55,7 +55,6 @@ import urllib.parse
|
|
55
55
|
import requests
|
56
56
|
|
57
57
|
import PyFunceble.facility
|
58
|
-
import PyFunceble.storage
|
59
58
|
from PyFunceble.query.requests.adapter.base import RequestAdapterBase
|
60
59
|
|
61
60
|
|
@@ -117,10 +116,10 @@ class RequestHTTPAdapter(RequestAdapterBase):
|
|
117
116
|
request.headers["Host"] = parsed_url.hostname
|
118
117
|
else:
|
119
118
|
self.poolmanager.connection_pool_kw.pop(
|
120
|
-
"server_hostname",
|
119
|
+
"server_hostname", self.NOT_RESOLVED_STD_HOSTNAME
|
121
120
|
)
|
122
121
|
self.poolmanager.connection_pool_kw.pop(
|
123
|
-
"assert_hostname",
|
122
|
+
"assert_hostname", self.NOT_RESOLVED_STD_HOSTNAME
|
124
123
|
)
|
125
124
|
|
126
125
|
return self.fake_response()
|
@@ -125,10 +125,10 @@ class RequestHTTPSAdapter(RequestAdapterBase):
|
|
125
125
|
request.headers["Host"] = parsed_url.hostname
|
126
126
|
else:
|
127
127
|
self.poolmanager.connection_pool_kw.pop(
|
128
|
-
"server_hostname",
|
128
|
+
"server_hostname", self.NOT_RESOLVED_STD_HOSTNAME
|
129
129
|
)
|
130
130
|
self.poolmanager.connection_pool_kw.pop(
|
131
|
-
"assert_hostname",
|
131
|
+
"assert_hostname", self.NOT_RESOLVED_STD_HOSTNAME
|
132
132
|
)
|
133
133
|
|
134
134
|
self.poolmanager.connection_pool_kw.pop(
|
@@ -58,8 +58,8 @@ from typing import Optional, Union
|
|
58
58
|
import requests
|
59
59
|
import requests.exceptions
|
60
60
|
import urllib3.exceptions
|
61
|
+
from box import Box
|
61
62
|
|
62
|
-
import PyFunceble.facility
|
63
63
|
import PyFunceble.storage
|
64
64
|
from PyFunceble.dataset.user_agent import UserAgentDataset
|
65
65
|
from PyFunceble.query.dns.query_tool import DNSQueryTool
|
@@ -132,6 +132,8 @@ class Requester:
|
|
132
132
|
_max_redirects: int = 60
|
133
133
|
_proxy_pattern: dict = {}
|
134
134
|
|
135
|
+
config: Optional[Box] = None
|
136
|
+
|
135
137
|
session: Optional[requests.Session] = None
|
136
138
|
dns_query_tool: Optional[DNSQueryTool] = None
|
137
139
|
|
@@ -144,7 +146,13 @@ class Requester:
|
|
144
146
|
max_redirects: Optional[int] = None,
|
145
147
|
dns_query_tool: Optional[DNSQueryTool] = None,
|
146
148
|
proxy_pattern: Optional[dict] = None,
|
149
|
+
config: Optional[Box] = None,
|
147
150
|
) -> None:
|
151
|
+
if config is not None:
|
152
|
+
self.config = config
|
153
|
+
else:
|
154
|
+
self.config = Box({}, default_box=True)
|
155
|
+
|
148
156
|
if max_retries is not None:
|
149
157
|
self.max_retries = max_retries
|
150
158
|
else:
|
@@ -207,27 +215,45 @@ class Requester:
|
|
207
215
|
@functools.wraps(func)
|
208
216
|
def wrapper(self, *args, **kwargs):
|
209
217
|
# pylint: disable=no-member
|
210
|
-
PyFunceble.facility.Logger.debug(
|
211
|
-
"Started %r request to %r with %r",
|
212
|
-
verb.upper(),
|
213
|
-
args[0],
|
214
|
-
kwargs,
|
215
|
-
)
|
216
218
|
req = getattr(self.session, verb.lower())(*args, **kwargs)
|
217
|
-
|
218
|
-
PyFunceble.facility.Logger.debug(
|
219
|
-
"Finished %r request to %r with %r",
|
220
|
-
verb.upper(),
|
221
|
-
args[0],
|
222
|
-
kwargs,
|
223
|
-
)
|
224
|
-
|
225
219
|
return req
|
226
220
|
|
227
221
|
return wrapper
|
228
222
|
|
229
223
|
return request_method
|
230
224
|
|
225
|
+
@property
|
226
|
+
def headers(self) -> dict:
|
227
|
+
"""
|
228
|
+
Provides the headers to use.
|
229
|
+
"""
|
230
|
+
|
231
|
+
return self.session.headers
|
232
|
+
|
233
|
+
@headers.setter
|
234
|
+
@recreate_session
|
235
|
+
def headers(self, value: dict) -> None:
|
236
|
+
"""
|
237
|
+
Sets the headers to use.
|
238
|
+
|
239
|
+
:param value:
|
240
|
+
The headers to set.
|
241
|
+
"""
|
242
|
+
|
243
|
+
self.session.headers.update(value)
|
244
|
+
|
245
|
+
def set_config(self, config: Box) -> "Requester":
|
246
|
+
"""
|
247
|
+
Sets the configuration to work with.
|
248
|
+
|
249
|
+
:param config:
|
250
|
+
The configuration to work with.
|
251
|
+
"""
|
252
|
+
|
253
|
+
self.config = config
|
254
|
+
|
255
|
+
return self
|
256
|
+
|
231
257
|
@property
|
232
258
|
def max_retries(self) -> int:
|
233
259
|
"""
|
@@ -276,13 +302,12 @@ class Requester:
|
|
276
302
|
Try to guess the value from the configuration and set it.
|
277
303
|
"""
|
278
304
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
else:
|
305
|
+
try:
|
306
|
+
if isinstance(self.config.max_http_retries, int):
|
307
|
+
self.set_max_retries(self.config.max_http_retries)
|
308
|
+
else:
|
309
|
+
self.set_max_retries(self.STD_MAX_RETRIES)
|
310
|
+
except: # pylint: disable=bare-except
|
286
311
|
self.set_max_retries(self.STD_MAX_RETRIES)
|
287
312
|
|
288
313
|
return self
|
@@ -373,14 +398,13 @@ class Requester:
|
|
373
398
|
Try to guess the value from the configuration and set it.
|
374
399
|
"""
|
375
400
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
self.set_verify_certificate(self.STD_VERIFY_CERTIFICATE)
|
401
|
+
try:
|
402
|
+
if isinstance(self.config.verify_ssl_certificate, bool):
|
403
|
+
self.set_verify_certificate(self.config.verify_ssl_certificate)
|
404
|
+
else:
|
405
|
+
self.set_verify_certificate(self.STD_VERIFY_CERTIFICATE)
|
406
|
+
except: # pylint: disable=bare-except
|
407
|
+
self.set_max_retries(self.STD_MAX_RETRIES)
|
384
408
|
|
385
409
|
return self
|
386
410
|
|
@@ -433,11 +457,12 @@ class Requester:
|
|
433
457
|
Try to guess the value from the configuration and set it.
|
434
458
|
"""
|
435
459
|
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
460
|
+
try:
|
461
|
+
if isinstance(self.config.lookup.timeout, (int, float)):
|
462
|
+
self.set_timeout(self.config.lookup.timeout)
|
463
|
+
else:
|
464
|
+
self.set_timeout(self.STD_TIMEOUT)
|
465
|
+
except: # pylint: disable=bare-except
|
441
466
|
self.set_timeout(self.STD_TIMEOUT)
|
442
467
|
|
443
468
|
return self
|
@@ -485,11 +510,12 @@ class Requester:
|
|
485
510
|
Try to guess the value from the configuration and set it.
|
486
511
|
"""
|
487
512
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
513
|
+
try:
|
514
|
+
if self.config.proxy:
|
515
|
+
self.set_proxy_pattern(self.config.proxy)
|
516
|
+
else:
|
517
|
+
self.set_proxy_pattern({})
|
518
|
+
except: # pylint: disable=bare-except
|
493
519
|
self.set_proxy_pattern({})
|
494
520
|
|
495
521
|
return self
|
@@ -551,7 +577,10 @@ class Requester:
|
|
551
577
|
),
|
552
578
|
)
|
553
579
|
|
554
|
-
|
580
|
+
if PyFunceble.storage.USER_AGENTS:
|
581
|
+
custom_headers = {"User-Agent": UserAgentDataset().get_latest()}
|
582
|
+
else:
|
583
|
+
custom_headers = {}
|
555
584
|
|
556
585
|
session.headers.update(custom_headers)
|
557
586
|
|
PyFunceble/storage.py
CHANGED
@@ -52,7 +52,6 @@ License:
|
|
52
52
|
"""
|
53
53
|
|
54
54
|
import os
|
55
|
-
import secrets
|
56
55
|
from typing import Optional
|
57
56
|
|
58
57
|
from box import Box
|
@@ -61,7 +60,7 @@ from dotenv import load_dotenv
|
|
61
60
|
from PyFunceble.storage_facility import get_config_directory
|
62
61
|
|
63
62
|
PROJECT_NAME: str = "PyFunceble"
|
64
|
-
PROJECT_VERSION: str = "4.3.
|
63
|
+
PROJECT_VERSION: str = "4.3.0a11.dev (Blue Duckling: Tulip)"
|
65
64
|
|
66
65
|
DISTRIBUTED_CONFIGURATION_FILENAME: str = ".PyFunceble_production.yaml"
|
67
66
|
|
@@ -73,8 +72,6 @@ ENV_FILENAME: str = ".pyfunceble-env"
|
|
73
72
|
SHORT_REPO_LINK: str = "https://pyfunceble.github.io"
|
74
73
|
REPO_LINK: str = "https://github.com/funilrys/PyFunceble"
|
75
74
|
|
76
|
-
NOT_RESOLVED_STD_HOSTNAME: str = f"{secrets.token_hex(12)}.mock-resolver.pyfunceble.com"
|
77
|
-
|
78
75
|
IANA: Optional[dict] = {}
|
79
76
|
PUBLIC_SUFFIX: Optional[dict] = {}
|
80
77
|
USER_AGENTS: Optional[dict] = {}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: PyFunceble-dev
|
3
|
-
Version: 4.3.
|
3
|
+
Version: 4.3.0a11
|
4
4
|
Summary: The tool to check the availability or syntax of domain, IP or URL.
|
5
5
|
Home-page: https://github.com/funilrys/PyFunceble
|
6
6
|
Author: funilrys
|
@@ -22,176 +22,169 @@ Classifier: License :: OSI Approved
|
|
22
22
|
Requires-Python: >=3.9, <4
|
23
23
|
Description-Content-Type: text/markdown
|
24
24
|
License-File: LICENSE
|
25
|
-
Requires-Dist:
|
26
|
-
Requires-Dist: dnspython[doh]~=2.6.0
|
27
|
-
Requires-Dist: python-box[all]~=6.0.0
|
25
|
+
Requires-Dist: SQLAlchemy~=2.0
|
28
26
|
Requires-Dist: python-dotenv
|
29
|
-
Requires-Dist:
|
30
|
-
Requires-Dist:
|
27
|
+
Requires-Dist: PyYAML
|
28
|
+
Requires-Dist: dnspython[DOH]~=2.6.0
|
31
29
|
Requires-Dist: colorama
|
32
|
-
Requires-Dist: setuptools>=65.5.1
|
33
|
-
Requires-Dist: shtab
|
34
30
|
Requires-Dist: inflection
|
31
|
+
Requires-Dist: requests[socks]<3
|
35
32
|
Requires-Dist: PyMySQL
|
36
|
-
Requires-Dist:
|
37
|
-
Requires-Dist: SQLAlchemy~=2.0
|
33
|
+
Requires-Dist: domain2idna~=1.12.0
|
38
34
|
Requires-Dist: alembic
|
39
|
-
Requires-Dist:
|
40
|
-
|
41
|
-
Requires-Dist:
|
42
|
-
Requires-Dist:
|
43
|
-
Requires-Dist: packaging; extra == "all"
|
44
|
-
Requires-Dist: mkdocs-section-index~=0.3; extra == "all"
|
45
|
-
Requires-Dist: requests[socks]<3; extra == "all"
|
46
|
-
Requires-Dist: mkdocstrings[python]~=0.26; extra == "all"
|
47
|
-
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "all"
|
48
|
-
Requires-Dist: setuptools>=65.5.1; extra == "all"
|
49
|
-
Requires-Dist: PyMySQL; extra == "all"
|
50
|
-
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "all"
|
51
|
-
Requires-Dist: cryptography>=42.0; extra == "all"
|
52
|
-
Requires-Dist: mkdocs-gen-files~=0.5; extra == "all"
|
53
|
-
Requires-Dist: flake8; extra == "all"
|
54
|
-
Requires-Dist: isort; extra == "all"
|
55
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "all"
|
56
|
-
Requires-Dist: colorama; extra == "all"
|
57
|
-
Requires-Dist: zipp>=3.19.1; extra == "all"
|
58
|
-
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "all"
|
59
|
-
Requires-Dist: shtab; extra == "all"
|
60
|
-
Requires-Dist: psycopg2-binary; extra == "all"
|
61
|
-
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "all"
|
62
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "all"
|
63
|
-
Requires-Dist: pymdown-extensions~=10.9; extra == "all"
|
64
|
-
Requires-Dist: pylint; extra == "all"
|
65
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "all"
|
66
|
-
Requires-Dist: tox; extra == "all"
|
67
|
-
Requires-Dist: black; extra == "all"
|
68
|
-
Requires-Dist: coverage; extra == "all"
|
69
|
-
Requires-Dist: python-dotenv; extra == "all"
|
70
|
-
Requires-Dist: domain2idna~=1.12.0; extra == "all"
|
71
|
-
Requires-Dist: inflection; extra == "all"
|
72
|
-
Requires-Dist: alembic; extra == "all"
|
73
|
-
Requires-Dist: PyYAML; extra == "all"
|
74
|
-
Provides-Extra: dev
|
75
|
-
Requires-Dist: pylint; extra == "dev"
|
76
|
-
Requires-Dist: isort; extra == "dev"
|
77
|
-
Requires-Dist: black; extra == "dev"
|
78
|
-
Requires-Dist: flake8; extra == "dev"
|
35
|
+
Requires-Dist: packaging
|
36
|
+
Requires-Dist: python-box[all]~=6.0.0
|
37
|
+
Requires-Dist: shtab
|
38
|
+
Requires-Dist: setuptools>=65.5.1
|
79
39
|
Provides-Extra: docs
|
80
|
-
Requires-Dist: mkdocs~=1.5; extra == "docs"
|
81
|
-
Requires-Dist: mkdocs-material~=9.5; extra == "docs"
|
82
|
-
Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
|
83
|
-
Requires-Dist: zipp>=3.19.1; extra == "docs"
|
84
|
-
Requires-Dist: mkdocstrings[python]~=0.26; extra == "docs"
|
85
|
-
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
|
86
|
-
Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
|
87
|
-
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
|
88
40
|
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "docs"
|
89
41
|
Requires-Dist: mkdocs-gen-files~=0.5; extra == "docs"
|
42
|
+
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
|
90
43
|
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
|
91
|
-
|
92
|
-
Requires-Dist: mkdocs~=
|
93
|
-
Requires-Dist: mkdocs
|
94
|
-
Requires-Dist:
|
95
|
-
Requires-Dist:
|
96
|
-
Requires-Dist:
|
97
|
-
Requires-Dist: mkdocstrings[python]~=0.26; extra == "
|
98
|
-
|
99
|
-
Requires-Dist:
|
100
|
-
Requires-Dist:
|
101
|
-
Requires-Dist:
|
102
|
-
Requires-Dist:
|
103
|
-
|
104
|
-
Requires-Dist:
|
105
|
-
Requires-Dist:
|
106
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "full"
|
107
|
-
Requires-Dist: colorama; extra == "full"
|
108
|
-
Requires-Dist: zipp>=3.19.1; extra == "full"
|
109
|
-
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
|
110
|
-
Requires-Dist: shtab; extra == "full"
|
111
|
-
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "full"
|
112
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "full"
|
113
|
-
Requires-Dist: pymdown-extensions~=10.9; extra == "full"
|
114
|
-
Requires-Dist: pylint; extra == "full"
|
115
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "full"
|
116
|
-
Requires-Dist: tox; extra == "full"
|
117
|
-
Requires-Dist: black; extra == "full"
|
118
|
-
Requires-Dist: coverage; extra == "full"
|
119
|
-
Requires-Dist: python-dotenv; extra == "full"
|
120
|
-
Requires-Dist: domain2idna~=1.12.0; extra == "full"
|
121
|
-
Requires-Dist: inflection; extra == "full"
|
122
|
-
Requires-Dist: alembic; extra == "full"
|
123
|
-
Requires-Dist: PyYAML; extra == "full"
|
124
|
-
Provides-Extra: postgresql
|
125
|
-
Requires-Dist: packaging; extra == "postgresql"
|
126
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "postgresql"
|
127
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "postgresql"
|
128
|
-
Requires-Dist: python-dotenv; extra == "postgresql"
|
129
|
-
Requires-Dist: requests[socks]<3; extra == "postgresql"
|
130
|
-
Requires-Dist: domain2idna~=1.12.0; extra == "postgresql"
|
131
|
-
Requires-Dist: colorama; extra == "postgresql"
|
132
|
-
Requires-Dist: setuptools>=65.5.1; extra == "postgresql"
|
133
|
-
Requires-Dist: shtab; extra == "postgresql"
|
134
|
-
Requires-Dist: inflection; extra == "postgresql"
|
135
|
-
Requires-Dist: PyMySQL; extra == "postgresql"
|
136
|
-
Requires-Dist: cryptography>=42.0; extra == "postgresql"
|
137
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql"
|
138
|
-
Requires-Dist: psycopg2; extra == "postgresql"
|
139
|
-
Requires-Dist: alembic; extra == "postgresql"
|
140
|
-
Requires-Dist: PyYAML; extra == "postgresql"
|
141
|
-
Provides-Extra: postgresql-binary
|
142
|
-
Requires-Dist: packaging; extra == "postgresql-binary"
|
143
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "postgresql-binary"
|
144
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "postgresql-binary"
|
145
|
-
Requires-Dist: python-dotenv; extra == "postgresql-binary"
|
146
|
-
Requires-Dist: requests[socks]<3; extra == "postgresql-binary"
|
147
|
-
Requires-Dist: domain2idna~=1.12.0; extra == "postgresql-binary"
|
148
|
-
Requires-Dist: colorama; extra == "postgresql-binary"
|
149
|
-
Requires-Dist: setuptools>=65.5.1; extra == "postgresql-binary"
|
150
|
-
Requires-Dist: shtab; extra == "postgresql-binary"
|
151
|
-
Requires-Dist: inflection; extra == "postgresql-binary"
|
152
|
-
Requires-Dist: PyMySQL; extra == "postgresql-binary"
|
153
|
-
Requires-Dist: cryptography>=42.0; extra == "postgresql-binary"
|
154
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql-binary"
|
155
|
-
Requires-Dist: psycopg2-binary; extra == "postgresql-binary"
|
156
|
-
Requires-Dist: alembic; extra == "postgresql-binary"
|
157
|
-
Requires-Dist: PyYAML; extra == "postgresql-binary"
|
44
|
+
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
|
45
|
+
Requires-Dist: mkdocs-material~=9.5; extra == "docs"
|
46
|
+
Requires-Dist: mkdocs~=1.5; extra == "docs"
|
47
|
+
Requires-Dist: zipp>=3.19.1; extra == "docs"
|
48
|
+
Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
|
49
|
+
Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
|
50
|
+
Requires-Dist: mkdocstrings[python]~=0.26; extra == "docs"
|
51
|
+
Provides-Extra: dev
|
52
|
+
Requires-Dist: flake8; extra == "dev"
|
53
|
+
Requires-Dist: black; extra == "dev"
|
54
|
+
Requires-Dist: pylint; extra == "dev"
|
55
|
+
Requires-Dist: isort; extra == "dev"
|
56
|
+
Provides-Extra: test
|
57
|
+
Requires-Dist: coverage; extra == "test"
|
58
|
+
Requires-Dist: tox; extra == "test"
|
158
59
|
Provides-Extra: psql
|
159
|
-
Requires-Dist:
|
160
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "psql"
|
161
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "psql"
|
60
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "psql"
|
162
61
|
Requires-Dist: python-dotenv; extra == "psql"
|
163
|
-
Requires-Dist:
|
164
|
-
Requires-Dist:
|
62
|
+
Requires-Dist: PyYAML; extra == "psql"
|
63
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "psql"
|
165
64
|
Requires-Dist: colorama; extra == "psql"
|
166
|
-
Requires-Dist: setuptools>=65.5.1; extra == "psql"
|
167
|
-
Requires-Dist: shtab; extra == "psql"
|
168
65
|
Requires-Dist: inflection; extra == "psql"
|
169
|
-
Requires-Dist:
|
170
|
-
Requires-Dist: cryptography>=42.0; extra == "psql"
|
171
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "psql"
|
66
|
+
Requires-Dist: requests[socks]<3; extra == "psql"
|
172
67
|
Requires-Dist: psycopg2; extra == "psql"
|
68
|
+
Requires-Dist: PyMySQL; extra == "psql"
|
69
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "psql"
|
173
70
|
Requires-Dist: alembic; extra == "psql"
|
174
|
-
Requires-Dist:
|
71
|
+
Requires-Dist: packaging; extra == "psql"
|
72
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "psql"
|
73
|
+
Requires-Dist: shtab; extra == "psql"
|
74
|
+
Requires-Dist: setuptools>=65.5.1; extra == "psql"
|
175
75
|
Provides-Extra: psql-binary
|
176
|
-
Requires-Dist:
|
177
|
-
Requires-Dist: dnspython[doh]~=2.6.0; extra == "psql-binary"
|
178
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "psql-binary"
|
76
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "psql-binary"
|
179
77
|
Requires-Dist: python-dotenv; extra == "psql-binary"
|
180
|
-
Requires-Dist:
|
181
|
-
Requires-Dist:
|
78
|
+
Requires-Dist: PyYAML; extra == "psql-binary"
|
79
|
+
Requires-Dist: psycopg2-binary; extra == "psql-binary"
|
80
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "psql-binary"
|
182
81
|
Requires-Dist: colorama; extra == "psql-binary"
|
183
|
-
Requires-Dist: setuptools>=65.5.1; extra == "psql-binary"
|
184
|
-
Requires-Dist: shtab; extra == "psql-binary"
|
185
82
|
Requires-Dist: inflection; extra == "psql-binary"
|
83
|
+
Requires-Dist: requests[socks]<3; extra == "psql-binary"
|
186
84
|
Requires-Dist: PyMySQL; extra == "psql-binary"
|
187
|
-
Requires-Dist:
|
188
|
-
Requires-Dist: SQLAlchemy~=2.0; extra == "psql-binary"
|
189
|
-
Requires-Dist: psycopg2-binary; extra == "psql-binary"
|
85
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "psql-binary"
|
190
86
|
Requires-Dist: alembic; extra == "psql-binary"
|
191
|
-
Requires-Dist:
|
192
|
-
|
193
|
-
Requires-Dist:
|
194
|
-
Requires-Dist:
|
87
|
+
Requires-Dist: packaging; extra == "psql-binary"
|
88
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "psql-binary"
|
89
|
+
Requires-Dist: shtab; extra == "psql-binary"
|
90
|
+
Requires-Dist: setuptools>=65.5.1; extra == "psql-binary"
|
91
|
+
Provides-Extra: postgresql
|
92
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql"
|
93
|
+
Requires-Dist: python-dotenv; extra == "postgresql"
|
94
|
+
Requires-Dist: PyYAML; extra == "postgresql"
|
95
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "postgresql"
|
96
|
+
Requires-Dist: colorama; extra == "postgresql"
|
97
|
+
Requires-Dist: inflection; extra == "postgresql"
|
98
|
+
Requires-Dist: requests[socks]<3; extra == "postgresql"
|
99
|
+
Requires-Dist: psycopg2; extra == "postgresql"
|
100
|
+
Requires-Dist: PyMySQL; extra == "postgresql"
|
101
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "postgresql"
|
102
|
+
Requires-Dist: alembic; extra == "postgresql"
|
103
|
+
Requires-Dist: packaging; extra == "postgresql"
|
104
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "postgresql"
|
105
|
+
Requires-Dist: shtab; extra == "postgresql"
|
106
|
+
Requires-Dist: setuptools>=65.5.1; extra == "postgresql"
|
107
|
+
Provides-Extra: postgresql-binary
|
108
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql-binary"
|
109
|
+
Requires-Dist: python-dotenv; extra == "postgresql-binary"
|
110
|
+
Requires-Dist: PyYAML; extra == "postgresql-binary"
|
111
|
+
Requires-Dist: psycopg2-binary; extra == "postgresql-binary"
|
112
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "postgresql-binary"
|
113
|
+
Requires-Dist: colorama; extra == "postgresql-binary"
|
114
|
+
Requires-Dist: inflection; extra == "postgresql-binary"
|
115
|
+
Requires-Dist: requests[socks]<3; extra == "postgresql-binary"
|
116
|
+
Requires-Dist: PyMySQL; extra == "postgresql-binary"
|
117
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "postgresql-binary"
|
118
|
+
Requires-Dist: alembic; extra == "postgresql-binary"
|
119
|
+
Requires-Dist: packaging; extra == "postgresql-binary"
|
120
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "postgresql-binary"
|
121
|
+
Requires-Dist: shtab; extra == "postgresql-binary"
|
122
|
+
Requires-Dist: setuptools>=65.5.1; extra == "postgresql-binary"
|
123
|
+
Provides-Extra: full
|
124
|
+
Requires-Dist: black; extra == "full"
|
125
|
+
Requires-Dist: python-dotenv; extra == "full"
|
126
|
+
Requires-Dist: colorama; extra == "full"
|
127
|
+
Requires-Dist: mkdocs-material~=9.5; extra == "full"
|
128
|
+
Requires-Dist: zipp>=3.19.1; extra == "full"
|
129
|
+
Requires-Dist: alembic; extra == "full"
|
130
|
+
Requires-Dist: packaging; extra == "full"
|
131
|
+
Requires-Dist: setuptools>=65.5.1; extra == "full"
|
132
|
+
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
|
133
|
+
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "full"
|
134
|
+
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "full"
|
135
|
+
Requires-Dist: requests[socks]<3; extra == "full"
|
136
|
+
Requires-Dist: mkdocs~=1.5; extra == "full"
|
137
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "full"
|
138
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "full"
|
139
|
+
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
|
140
|
+
Requires-Dist: mkdocs-gen-files~=0.5; extra == "full"
|
141
|
+
Requires-Dist: PyYAML; extra == "full"
|
142
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "full"
|
143
|
+
Requires-Dist: PyMySQL; extra == "full"
|
144
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "full"
|
145
|
+
Requires-Dist: pymdown-extensions~=10.9; extra == "full"
|
146
|
+
Requires-Dist: coverage; extra == "full"
|
147
|
+
Requires-Dist: flake8; extra == "full"
|
148
|
+
Requires-Dist: mkdocstrings[python]~=0.26; extra == "full"
|
149
|
+
Requires-Dist: inflection; extra == "full"
|
150
|
+
Requires-Dist: pylint; extra == "full"
|
151
|
+
Requires-Dist: tox; extra == "full"
|
152
|
+
Requires-Dist: shtab; extra == "full"
|
153
|
+
Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
|
154
|
+
Requires-Dist: isort; extra == "full"
|
155
|
+
Provides-Extra: all
|
156
|
+
Requires-Dist: black; extra == "all"
|
157
|
+
Requires-Dist: python-dotenv; extra == "all"
|
158
|
+
Requires-Dist: colorama; extra == "all"
|
159
|
+
Requires-Dist: mkdocs-material~=9.5; extra == "all"
|
160
|
+
Requires-Dist: zipp>=3.19.1; extra == "all"
|
161
|
+
Requires-Dist: alembic; extra == "all"
|
162
|
+
Requires-Dist: packaging; extra == "all"
|
163
|
+
Requires-Dist: setuptools>=65.5.1; extra == "all"
|
164
|
+
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "all"
|
165
|
+
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "all"
|
166
|
+
Requires-Dist: psycopg2-binary; extra == "all"
|
167
|
+
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "all"
|
168
|
+
Requires-Dist: requests[socks]<3; extra == "all"
|
169
|
+
Requires-Dist: mkdocs~=1.5; extra == "all"
|
170
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "all"
|
171
|
+
Requires-Dist: SQLAlchemy~=2.0; extra == "all"
|
172
|
+
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "all"
|
173
|
+
Requires-Dist: mkdocs-gen-files~=0.5; extra == "all"
|
174
|
+
Requires-Dist: PyYAML; extra == "all"
|
175
|
+
Requires-Dist: dnspython[DOH]~=2.6.0; extra == "all"
|
176
|
+
Requires-Dist: PyMySQL; extra == "all"
|
177
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "all"
|
178
|
+
Requires-Dist: pymdown-extensions~=10.9; extra == "all"
|
179
|
+
Requires-Dist: coverage; extra == "all"
|
180
|
+
Requires-Dist: flake8; extra == "all"
|
181
|
+
Requires-Dist: mkdocstrings[python]~=0.26; extra == "all"
|
182
|
+
Requires-Dist: inflection; extra == "all"
|
183
|
+
Requires-Dist: pylint; extra == "all"
|
184
|
+
Requires-Dist: tox; extra == "all"
|
185
|
+
Requires-Dist: shtab; extra == "all"
|
186
|
+
Requires-Dist: mkdocs-section-index~=0.3; extra == "all"
|
187
|
+
Requires-Dist: isort; extra == "all"
|
195
188
|
|
196
189
|

|
197
190
|
|