PyFunceble-dev 4.2.18__py3-none-any.whl → 4.2.20__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.
Files changed (39) hide show
  1. PyFunceble/checker/availability/base.py +14 -14
  2. PyFunceble/checker/availability/domain.py +2 -2
  3. PyFunceble/checker/availability/domain_and_ip.py +3 -3
  4. PyFunceble/checker/base.py +26 -26
  5. PyFunceble/checker/params_base.py +1 -1
  6. PyFunceble/checker/reputation/base.py +16 -16
  7. PyFunceble/checker/reputation/domain_and_ip.py +3 -3
  8. PyFunceble/checker/syntax/domain_and_ip.py +1 -1
  9. PyFunceble/cli/continuous_integration/base.py +2 -2
  10. PyFunceble/cli/entry_points/pyfunceble/cli.py +13 -13
  11. PyFunceble/cli/execution_time.py +2 -2
  12. PyFunceble/cli/file_preloader.py +4 -4
  13. PyFunceble/cli/filesystem/printer/file.py +2 -2
  14. PyFunceble/cli/migrators/json2csv/inactive.py +5 -2
  15. PyFunceble/cli/processes/workers/base.py +6 -4
  16. PyFunceble/cli/processes/workers/producer.py +7 -7
  17. PyFunceble/cli/system/integrator.py +26 -2
  18. PyFunceble/cli/system/launcher.py +3 -3
  19. PyFunceble/cli/utils/version.py +5 -3
  20. PyFunceble/config/compare.py +8 -5
  21. PyFunceble/config/loader.py +4 -3
  22. PyFunceble/data/infrastructure/.PyFunceble_production.yaml +53 -8
  23. PyFunceble/dataset/autocontinue/csv.py +2 -2
  24. PyFunceble/dataset/autocontinue/sql.py +2 -2
  25. PyFunceble/dataset/csv_base.py +4 -2
  26. PyFunceble/dataset/inactive/csv.py +3 -3
  27. PyFunceble/dataset/inactive/sql.py +2 -2
  28. PyFunceble/dataset/sql_base.py +2 -2
  29. PyFunceble/dataset/whois/base.py +4 -2
  30. PyFunceble/dataset/whois/sql.py +2 -2
  31. PyFunceble/downloader/base.py +9 -7
  32. PyFunceble/query/{collection.py → platform.py} +205 -21
  33. PyFunceble/storage.py +2 -2
  34. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/METADATA +44 -40
  35. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/RECORD +39 -39
  36. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/WHEEL +1 -1
  37. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/LICENSE +0 -0
  38. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/entry_points.txt +0 -0
  39. {PyFunceble_dev-4.2.18.dist-info → PyFunceble_dev-4.2.20.dist-info}/top_level.txt +0 -0
@@ -11,7 +11,7 @@ The tool to check the availability or syntax of domain, IP or URL.
11
11
  ██║ ██║ ██║ ╚██████╔╝██║ ╚████║╚██████╗███████╗██████╔╝███████╗███████╗
12
12
  ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚══════╝╚═════╝ ╚══════╝╚══════╝
13
13
 
14
- Provides ans interface which let us interact with the Collection API.
14
+ Provides ans interface which let us interact with the platform API.
15
15
 
16
16
  Author:
17
17
  Nissar Chababy, @funilrys, contactTATAfunilrysTODTODcom
@@ -50,7 +50,10 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
+ # pylint: disable=too-many-lines
54
+
53
55
  import json
56
+ import os
54
57
  from typing import Generator, List, Optional, Union
55
58
 
56
59
  import requests
@@ -64,16 +67,17 @@ from PyFunceble.checker.syntax.status import SyntaxCheckerStatus
64
67
  from PyFunceble.helpers.environment_variable import EnvironmentVariableHelper
65
68
 
66
69
 
67
- class CollectionQueryTool:
70
+ class PlatformQueryTool:
68
71
  """
69
- Provides the interface to the collection dataset.
72
+ Provides the interface to interact with the platform.
70
73
 
71
74
  :param token:
72
75
  The token to use to communicate with the API.
73
76
 
74
77
  .. warning::
75
78
  If :code:`None` is given, the class constructor will try to load the
76
- PYFUNCEBLE_COLLECTION_API_TOKEN environment variable.
79
+ :code:`PYFUNCEBLE_COLLECTION_API_TOKEN` or
80
+ :code:`PYFUNCEBLE_PLATFORM_API_TOKEN` environment variable.
77
81
 
78
82
  :param url_base:
79
83
  The base of the URL to communicate with.
@@ -93,11 +97,13 @@ class CollectionQueryTool:
93
97
  "727294758272947115272947112272947116272947116272947104"
94
98
  )
95
99
  STD_PREFERRED_STATUS_ORIGIN: str = "frequent"
100
+ STD_CHECKER_PRIORITY: str = ["none"]
101
+ STD_CHECKER_EXCLUDE: str = ["none"]
96
102
  STD_TIMEOUT: float = 5.0
97
103
 
98
104
  _token: Optional[str] = None
99
105
  """
100
- The token to use while communicating with the collection API.
106
+ The token to use while communicating with the platform API.
101
107
  """
102
108
 
103
109
  _url_base: Optional[str] = None
@@ -110,6 +116,16 @@ class CollectionQueryTool:
110
116
  The preferred data origin
111
117
  """
112
118
 
119
+ _checker_priority: Optional[List[str]] = []
120
+ """
121
+ The checker to prioritize.
122
+ """
123
+
124
+ _checker_exclude: Optional[List[str]] = []
125
+ """
126
+ The checker to exclude.
127
+ """
128
+
113
129
  _is_modern_api: Optional[bool] = None
114
130
  """
115
131
  Whether we are working with the modern or legacy API.
@@ -128,19 +144,35 @@ class CollectionQueryTool:
128
144
  token: Optional[str] = None,
129
145
  preferred_status_origin: Optional[str] = None,
130
146
  timeout: Optional[float] = None,
147
+ checker_priority: Optional[List[str]] = None,
148
+ checker_exclude: Optional[List[str]] = None,
131
149
  ) -> None:
132
150
  if token is not None:
133
151
  self.token = token
134
152
  else:
135
153
  self.token = EnvironmentVariableHelper(
136
154
  "PYFUNCEBLE_COLLECTION_API_TOKEN"
137
- ).get_value(default="")
155
+ ).get_value(default="") or EnvironmentVariableHelper(
156
+ "PYFUNCEBLE_PLATFORM_API_TOKEN"
157
+ ).get_value(
158
+ default=""
159
+ )
138
160
 
139
161
  if preferred_status_origin is not None:
140
162
  self.preferred_status_origin = preferred_status_origin
141
163
  else:
142
164
  self.guess_and_set_preferred_status_origin()
143
165
 
166
+ if checker_priority is not None:
167
+ self.checker_priority = checker_priority
168
+ else:
169
+ self.guess_and_set_checker_priority()
170
+
171
+ if checker_exclude is not None:
172
+ self.checker_exclude = checker_exclude
173
+ else:
174
+ self.guess_and_set_checker_exclude()
175
+
144
176
  if timeout is not None:
145
177
  self.timeout = timeout
146
178
  else:
@@ -148,7 +180,11 @@ class CollectionQueryTool:
148
180
 
149
181
  self._url_base = EnvironmentVariableHelper(
150
182
  "PYFUNCEBLE_COLLECTION_API_URL"
151
- ).get_value(default=None)
183
+ ).get_value(default=None) or EnvironmentVariableHelper(
184
+ "PYFUNCEBLE_PLATFORM_API_URL"
185
+ ).get_value(
186
+ default=None
187
+ )
152
188
 
153
189
  self.session = requests.Session()
154
190
  self.session.headers.update(
@@ -161,7 +197,7 @@ class CollectionQueryTool:
161
197
 
162
198
  def __contains__(self, value: str) -> bool:
163
199
  """
164
- Checks if the given value is in the collection.
200
+ Checks if the given value is in the platform.
165
201
 
166
202
  :param value:
167
203
  The value to check.
@@ -204,7 +240,7 @@ class CollectionQueryTool:
204
240
 
205
241
  self._token = value
206
242
 
207
- def set_token(self, value: str) -> "CollectionQueryTool":
243
+ def set_token(self, value: str) -> "PlatformQueryTool":
208
244
  """
209
245
  Sets the value of the :code:`_token` attribute.
210
246
 
@@ -248,7 +284,7 @@ class CollectionQueryTool:
248
284
 
249
285
  self._url_base = value.rstrip("/")
250
286
 
251
- def set_url_base(self, value: str) -> "CollectionQueryTool":
287
+ def set_url_base(self, value: str) -> "PlatformQueryTool":
252
288
  """
253
289
  Sets the base of the URL to work with.
254
290
 
@@ -285,7 +321,7 @@ class CollectionQueryTool:
285
321
 
286
322
  self._is_modern_api = value
287
323
 
288
- def set_is_modern_api(self, value: bool) -> "CollectionQueryTool":
324
+ def set_is_modern_api(self, value: bool) -> "PlatformQueryTool":
289
325
  """
290
326
  Sets the value of the :code:`_is_modern_api` attribute.
291
327
 
@@ -322,7 +358,7 @@ class CollectionQueryTool:
322
358
 
323
359
  self._timeout = value
324
360
 
325
- def set_timeout(self, value: float) -> "CollectionQueryTool":
361
+ def set_timeout(self, value: float) -> "PlatformQueryTool":
326
362
  """
327
363
  Sets the value of the :code:`_timeout` attribute.
328
364
 
@@ -334,7 +370,7 @@ class CollectionQueryTool:
334
370
 
335
371
  return self
336
372
 
337
- def guess_and_set_is_modern_api(self) -> "CollectionQueryTool":
373
+ def guess_and_set_is_modern_api(self) -> "PlatformQueryTool":
338
374
  """
339
375
  Try to guess if we are working with a legacy version.
340
376
  """
@@ -387,7 +423,7 @@ class CollectionQueryTool:
387
423
 
388
424
  self._preferred_status_origin = value
389
425
 
390
- def set_preferred_status_origin(self, value: str) -> "CollectionQueryTool":
426
+ def set_preferred_status_origin(self, value: str) -> "PlatformQueryTool":
391
427
  """
392
428
  Sets the preferred status origin.
393
429
 
@@ -399,17 +435,17 @@ class CollectionQueryTool:
399
435
 
400
436
  return self
401
437
 
402
- def guess_and_set_preferred_status_origin(self) -> "CollectionQueryTool":
438
+ def guess_and_set_preferred_status_origin(self) -> "PlatformQueryTool":
403
439
  """
404
440
  Try to guess the preferred status origin.
405
441
  """
406
442
 
407
443
  if PyFunceble.facility.ConfigLoader.is_already_loaded():
408
444
  if isinstance(
409
- PyFunceble.storage.CONFIGURATION.collection.preferred_status_origin, str
445
+ PyFunceble.storage.CONFIGURATION.platform.preferred_status_origin, str
410
446
  ):
411
447
  self.preferred_status_origin = (
412
- PyFunceble.storage.CONFIGURATION.collection.preferred_status_origin
448
+ PyFunceble.storage.CONFIGURATION.platform.preferred_status_origin
413
449
  )
414
450
  else:
415
451
  self.preferred_status_origin = self.STD_PREFERRED_STATUS_ORIGIN
@@ -418,7 +454,147 @@ class CollectionQueryTool:
418
454
 
419
455
  return self
420
456
 
421
- def guess_and_set_timeout(self) -> "CollectionQueryTool":
457
+ @property
458
+ def checker_priority(self) -> Optional[List[str]]:
459
+ """
460
+ Provides the value of the :code:`_checker_priority` attribute.
461
+ """
462
+
463
+ return self._checker_priority
464
+
465
+ @checker_priority.setter
466
+ def checker_priority(self, value: List[str]) -> None:
467
+ """
468
+ Sets the checker priority to set - order matters.
469
+
470
+ :param value:
471
+ The value to set.
472
+
473
+ :raise TypeError:
474
+ When the given :code:`value` is not a :py:class:`str`.
475
+
476
+ :raise ValueError:
477
+ When the given :code:`value` is not supported.
478
+ """
479
+
480
+ accepted = []
481
+
482
+ for checker_type in value:
483
+ if not isinstance(checker_type, str):
484
+ raise TypeError(
485
+ f"<checker_type> ({checker_type}) should be {str}, "
486
+ "{type(checker_type)} given."
487
+ )
488
+
489
+ if checker_type.lower() not in self.SUPPORTED_CHECKERS + ["none"]:
490
+ raise ValueError(f"<checker_type> ({checker_type}) is not supported.")
491
+
492
+ accepted.append(checker_type.lower())
493
+
494
+ self._checker_priority = accepted
495
+
496
+ def set_checker_priority(self, value: List[str]) -> "PlatformQueryTool":
497
+ """
498
+ Sets the checker priority.
499
+
500
+ :parma value:
501
+ The value to set.
502
+ """
503
+
504
+ self.checker_priority = value
505
+
506
+ return self
507
+
508
+ def guess_and_set_checker_priority(self) -> "PlatformQueryTool":
509
+ """
510
+ Try to guess the checker priority to use.
511
+ """
512
+
513
+ if "PYFUNCEBLE_PLATFORM_CHECKER_PRIORITY" in os.environ:
514
+ self.checker_priority = os.environ[
515
+ "PYFUNCEBLE_PLATFORM_CHECKER_PRIORITY"
516
+ ].split(",")
517
+ elif PyFunceble.facility.ConfigLoader.is_already_loaded():
518
+ if isinstance(PyFunceble.storage.PLATFORM.checker_priority, list):
519
+ self.checker_priority = PyFunceble.storage.PLATFORM.checker_priority
520
+ else:
521
+ self.checker_priority = self.STD_CHECKER_PRIORITY
522
+ else:
523
+ self.checker_priority = self.STD_CHECKER_PRIORITY
524
+
525
+ return self
526
+
527
+ @property
528
+ def checker_exclude(self) -> Optional[List[str]]:
529
+ """
530
+ Provides the value of the :code:`_checker_exclude` attribute.
531
+ """
532
+
533
+ return self._checker_exclude
534
+
535
+ @checker_exclude.setter
536
+ def checker_exclude(self, value: List[str]) -> None:
537
+ """
538
+ Sets the checker exclude.
539
+
540
+ :param value:
541
+ The value to set.
542
+
543
+ :raise TypeError:
544
+ When the given :code:`value` is not a :py:class:`str`.
545
+
546
+ :raise ValueError:
547
+ When the given :code:`value` is not supported.
548
+ """
549
+
550
+ accepted = []
551
+
552
+ for checker_type in value:
553
+ if not isinstance(checker_type, str):
554
+ raise TypeError(
555
+ f"<checker_type> ({checker_type}) should be {str}, "
556
+ "{type(checker_type)} given."
557
+ )
558
+
559
+ if checker_type.lower() not in self.SUPPORTED_CHECKERS + ["none"]:
560
+ raise ValueError(f"<checker_type> ({checker_type}) is not supported.")
561
+
562
+ accepted.append(checker_type.lower())
563
+
564
+ self._checker_exclude = accepted
565
+
566
+ def set_checker_exclude(self, value: List[str]) -> "PlatformQueryTool":
567
+ """
568
+ Sets the checker to exclude.
569
+
570
+ :parma value:
571
+ The value to set.
572
+ """
573
+
574
+ self.checker_exclude = value
575
+
576
+ return self
577
+
578
+ def guess_and_set_checker_exclude(self) -> "PlatformQueryTool":
579
+ """
580
+ Try to guess the checker to exclude.
581
+ """
582
+
583
+ if "PYFUNCEBLE_PLATFORM_CHECKER_EXCLUDE" in os.environ:
584
+ self.checker_exclude = os.environ[
585
+ "PYFUNCEBLE_PLATFORM_CHECKER_EXCLUDE"
586
+ ].split(",")
587
+ elif PyFunceble.facility.ConfigLoader.is_already_loaded():
588
+ if isinstance(PyFunceble.storage.PLATFORM.checker_exclude, list):
589
+ self.checker_exclude = PyFunceble.storage.PLATFORM.checker_exclude
590
+ else:
591
+ self.checker_exclude = self.STD_CHECKER_EXCLUDE
592
+ else:
593
+ self.checker_exclude = self.STD_CHECKER_EXCLUDE
594
+
595
+ return self
596
+
597
+ def guess_and_set_timeout(self) -> "PlatformQueryTool":
422
598
  """
423
599
  Try to guess the timeout to use.
424
600
  """
@@ -526,6 +702,14 @@ class CollectionQueryTool:
526
702
  "shuffle": True,
527
703
  }
528
704
 
705
+ if "none" in self.checker_priority:
706
+ params["shuffle"] = True
707
+ else:
708
+ params["checker_type_priority"] = ",".join(self.checker_priority)
709
+
710
+ if "none" not in self.checker_exclude:
711
+ params["checker_type_exclude"] = ",".join(self.checker_exclude)
712
+
529
713
  try:
530
714
  response = self.session.get(
531
715
  url,
@@ -622,7 +806,7 @@ class CollectionQueryTool:
622
806
  ],
623
807
  ) -> Optional[dict]:
624
808
  """
625
- Push the given status to the collection.
809
+ Push the given status to the platform.
626
810
 
627
811
  :param checker_status:
628
812
  The status to push.
@@ -680,7 +864,7 @@ class CollectionQueryTool:
680
864
 
681
865
  def guess_all_settings(
682
866
  self,
683
- ) -> "CollectionQueryTool": # pragma: no cover ## Underlying tested
867
+ ) -> "PlatformQueryTool": # pragma: no cover ## Underlying tested
684
868
  """
685
869
  Try to guess all settings.
686
870
  """
@@ -699,7 +883,7 @@ class CollectionQueryTool:
699
883
  self, checker_type: str, data: Union[dict, str]
700
884
  ) -> Optional[dict]:
701
885
  """
702
- Submits the given status to the collection.
886
+ Submits the given status to the platform.
703
887
 
704
888
  :param checker_type:
705
889
  The type of the checker.
PyFunceble/storage.py CHANGED
@@ -61,7 +61,7 @@ from dotenv import load_dotenv
61
61
  from PyFunceble.storage_facility import get_config_directory
62
62
 
63
63
  PROJECT_NAME: str = "PyFunceble"
64
- PROJECT_VERSION: str = "4.2.18.dev (Blue Duckling: Ixora)"
64
+ PROJECT_VERSION: str = "4.2.20.dev (Blue Duckling: Ixora)"
65
65
 
66
66
  DISTRIBUTED_CONFIGURATION_FILENAME: str = ".PyFunceble_production.yaml"
67
67
  DISTRIBUTED_DIR_STRUCTURE_FILENAME: str = "dir_structure_production.json"
@@ -126,7 +126,7 @@ STATUS: Optional[Box] = Box(
126
126
  frozen_box=True,
127
127
  )
128
128
  HTTP_CODES: Optional[Box] = Box({})
129
- COLLECTION: Optional[Box] = Box({})
129
+ PLATFORM: Optional[Box] = Box({})
130
130
  LINKS: Optional[Box] = Box({})
131
131
  PROXY: Optional[Box] = Box({})
132
132
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyFunceble-dev
3
- Version: 4.2.18
3
+ Version: 4.2.20
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
@@ -21,73 +21,77 @@ Classifier: Programming Language :: Python :: 3
21
21
  Classifier: License :: OSI Approved
22
22
  Requires-Python: >=3.8, <4
23
23
  License-File: LICENSE
24
- Requires-Dist: domain2idna ~=1.12.0
25
- Requires-Dist: PyMySQL
26
- Requires-Dist: colorama
27
- Requires-Dist: python-dotenv
28
- Requires-Dist: python-box[all] ~=6.0.0
29
24
  Requires-Dist: PyYAML
30
- Requires-Dist: dnspython[doh] ~=2.6.0
25
+ Requires-Dist: packaging
26
+ Requires-Dist: python-dotenv
31
27
  Requires-Dist: setuptools >=65.5.1
28
+ Requires-Dist: cryptography ~=42.0
29
+ Requires-Dist: colorama
30
+ Requires-Dist: dnspython[doh] ~=2.6.0
31
+ Requires-Dist: python-box[all] ~=6.0.0
32
+ Requires-Dist: domain2idna ~=1.12.0
33
+ Requires-Dist: PyMySQL
32
34
  Requires-Dist: shtab
33
35
  Requires-Dist: SQLAlchemy ~=2.0
34
- Requires-Dist: cryptography ~=42.0
35
- Requires-Dist: inflection
36
- Requires-Dist: packaging
37
36
  Requires-Dist: alembic
37
+ Requires-Dist: inflection
38
38
  Requires-Dist: requests[socks] <3
39
39
  Provides-Extra: dev
40
- Requires-Dist: flake8 ; extra == 'dev'
40
+ Requires-Dist: black ; extra == 'dev'
41
41
  Requires-Dist: isort ; extra == 'dev'
42
42
  Requires-Dist: pylint ; extra == 'dev'
43
- Requires-Dist: black ; extra == 'dev'
43
+ Requires-Dist: flake8 ; extra == 'dev'
44
44
  Provides-Extra: docs
45
+ Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
46
+ Requires-Dist: urllib3 >=2.2.2 ; extra == 'docs'
47
+ Requires-Dist: requests >=2.32.0 ; extra == 'docs'
45
48
  Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'docs'
46
49
  Requires-Dist: sphinx >=3.4.3 ; extra == 'docs'
47
50
  Requires-Dist: Pygments >=2.0 ; extra == 'docs'
48
- Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
49
51
  Provides-Extra: full
52
+ Requires-Dist: isort ; extra == 'full'
53
+ Requires-Dist: domain2idna ~=1.12.0 ; extra == 'full'
50
54
  Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'full'
51
- Requires-Dist: PyMySQL ; extra == 'full'
55
+ Requires-Dist: sphinx >=3.4.3 ; extra == 'full'
56
+ Requires-Dist: setuptools >=65.5.1 ; extra == 'full'
57
+ Requires-Dist: requests[socks] <3 ; extra == 'full'
58
+ Requires-Dist: Pygments >=2.0 ; extra == 'full'
59
+ Requires-Dist: urllib3 >=2.2.2 ; extra == 'full'
60
+ Requires-Dist: requests >=2.32.0 ; extra == 'full'
61
+ Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'full'
62
+ Requires-Dist: alembic ; extra == 'full'
63
+ Requires-Dist: shtab ; extra == 'full'
64
+ Requires-Dist: inflection ; extra == 'full'
65
+ Requires-Dist: tox ; extra == 'full'
52
66
  Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'full'
67
+ Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'full'
68
+ Requires-Dist: PyMySQL ; extra == 'full'
53
69
  Requires-Dist: PyYAML ; extra == 'full'
54
- Requires-Dist: setuptools >=65.5.1 ; extra == 'full'
55
70
  Requires-Dist: packaging ; extra == 'full'
56
- Requires-Dist: alembic ; extra == 'full'
57
- Requires-Dist: black ; extra == 'full'
58
- Requires-Dist: domain2idna ~=1.12.0 ; extra == 'full'
59
- Requires-Dist: flake8 ; extra == 'full'
71
+ Requires-Dist: pylint ; extra == 'full'
60
72
  Requires-Dist: python-dotenv ; extra == 'full'
61
- Requires-Dist: tox ; extra == 'full'
62
- Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'full'
73
+ Requires-Dist: flake8 ; extra == 'full'
63
74
  Requires-Dist: sphinx-rtd-theme ; extra == 'full'
75
+ Requires-Dist: coverage ; extra == 'full'
64
76
  Requires-Dist: cryptography ~=42.0 ; extra == 'full'
65
- Requires-Dist: isort ; extra == 'full'
66
- Requires-Dist: pylint ; extra == 'full'
67
- Requires-Dist: inflection ; extra == 'full'
68
- Requires-Dist: sphinx >=3.4.3 ; extra == 'full'
69
- Requires-Dist: requests[socks] <3 ; extra == 'full'
70
77
  Requires-Dist: colorama ; extra == 'full'
71
- Requires-Dist: coverage ; extra == 'full'
72
- Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'full'
73
- Requires-Dist: Pygments >=2.0 ; extra == 'full'
74
- Requires-Dist: shtab ; extra == 'full'
78
+ Requires-Dist: black ; extra == 'full'
75
79
  Provides-Extra: psql
76
- Requires-Dist: domain2idna ~=1.12.0 ; extra == 'psql'
77
- Requires-Dist: PyMySQL ; extra == 'psql'
78
- Requires-Dist: colorama ; extra == 'psql'
79
- Requires-Dist: python-dotenv ; extra == 'psql'
80
- Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'psql'
81
80
  Requires-Dist: PyYAML ; extra == 'psql'
82
- Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'psql'
81
+ Requires-Dist: packaging ; extra == 'psql'
82
+ Requires-Dist: python-dotenv ; extra == 'psql'
83
+ Requires-Dist: psycopg2 ; extra == 'psql'
83
84
  Requires-Dist: setuptools >=65.5.1 ; extra == 'psql'
85
+ Requires-Dist: cryptography ~=42.0 ; extra == 'psql'
86
+ Requires-Dist: colorama ; extra == 'psql'
87
+ Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'psql'
88
+ Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'psql'
89
+ Requires-Dist: domain2idna ~=1.12.0 ; extra == 'psql'
90
+ Requires-Dist: PyMySQL ; extra == 'psql'
84
91
  Requires-Dist: shtab ; extra == 'psql'
85
92
  Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'psql'
86
- Requires-Dist: cryptography ~=42.0 ; extra == 'psql'
87
- Requires-Dist: inflection ; extra == 'psql'
88
- Requires-Dist: packaging ; extra == 'psql'
89
93
  Requires-Dist: alembic ; extra == 'psql'
90
- Requires-Dist: psycopg2 ; extra == 'psql'
94
+ Requires-Dist: inflection ; extra == 'psql'
91
95
  Requires-Dist: requests[socks] <3 ; extra == 'psql'
92
96
  Provides-Extra: test
93
97
  Requires-Dist: tox ; extra == 'test'