PyFunceble-dev 4.2.9__py3-none-any.whl → 4.2.11__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.
@@ -1043,7 +1043,13 @@ class AvailabilityCheckerBase(CheckerBase):
1043
1043
  self.collection_query_tool.preferred_status_origin == "latest"
1044
1044
  and data["status"]["availability"]["latest"]
1045
1045
  ):
1046
- self.status.status = data["status"]["availability"]["latest"]["status"]
1046
+ try:
1047
+ # legacy
1048
+ self.status.status = data["status"]["availability"]["latest"][
1049
+ "status"
1050
+ ]
1051
+ except KeyError:
1052
+ self.status.status = data["status"]["availability"]["latest"]
1047
1053
  self.status.status_source = "COLLECTION"
1048
1054
  elif (
1049
1055
  self.collection_query_tool.preferred_status_origin == "recommended"
@@ -69,7 +69,9 @@ from PyFunceble.cli.system.launcher import SystemLauncher
69
69
  from PyFunceble.helpers.regex import RegexHelper
70
70
 
71
71
 
72
- def get_configured_value(entry: str, *, negate=False) -> Any:
72
+ def get_configured_value(
73
+ entry: str, *, negate: bool = False, value_only: bool = False
74
+ ) -> Any:
73
75
  """
74
76
  Provides the currently configured value.
75
77
 
@@ -81,6 +83,9 @@ def get_configured_value(entry: str, *, negate=False) -> Any:
81
83
  :param negate:
82
84
  Allows us to negate the result from the configuration.
83
85
 
86
+ :param value_only:
87
+ Whether we should only return the value or the full message.
88
+
84
89
  :raise ValueError:
85
90
  When the given :code:`entry` is not found.
86
91
  """
@@ -102,10 +107,14 @@ def get_configured_value(entry: str, *, negate=False) -> Any:
102
107
  result = not result
103
108
 
104
109
  return (
105
- f"\n{colorama.Fore.YELLOW}{colorama.Style.BRIGHT}"
106
- f"Configured value: {colorama.Fore.BLUE}"
107
- f"{result!r}"
108
- f"{colorama.Style.RESET_ALL}"
110
+ (
111
+ f"\n{colorama.Fore.YELLOW}{colorama.Style.BRIGHT}"
112
+ f"Configured value: {colorama.Fore.BLUE}"
113
+ f"{result!r}"
114
+ f"{colorama.Style.RESET_ALL}"
115
+ )
116
+ if not value_only
117
+ else result
109
118
  )
110
119
 
111
120
 
@@ -122,6 +131,12 @@ def add_arguments_to_parser(
122
131
  if "dest" in opt_args:
123
132
  opt_args["dest"] = opt_args["dest"].replace(".", "__")
124
133
 
134
+ for index, value in enumerate(pos_args):
135
+ if value.startswith("-") and "." not in value:
136
+ continue
137
+
138
+ pos_args[index] = value.replace(".", "__")
139
+
125
140
  parser.add_argument(*pos_args, **opt_args)
126
141
 
127
142
 
@@ -1184,6 +1199,42 @@ def get_default_group_data() -> List[Tuple[List[str], dict]]:
1184
1199
  ]
1185
1200
 
1186
1201
 
1202
+ def platform_parser(
1203
+ parser: Union[argparse.ArgumentParser, argparse._SubParsersAction]
1204
+ ) -> None:
1205
+ """
1206
+ Adds the platform group to the given parser.
1207
+ """
1208
+
1209
+ platform = parser.add_parser(
1210
+ "platform",
1211
+ add_help=False,
1212
+ epilog=PyFunceble.cli.storage.STD_EPILOG,
1213
+ )
1214
+
1215
+ args = [
1216
+ (
1217
+ ["cli_testing.testing_mode.platform_contribution"],
1218
+ {
1219
+ "default": get_configured_value(
1220
+ "cli_testing.testing_mode.platform_contribution", value_only=True
1221
+ ),
1222
+ "action": "store_%s"
1223
+ % str(
1224
+ not get_configured_value(
1225
+ "cli_testing.testing_mode.platform_contribution",
1226
+ value_only=True,
1227
+ )
1228
+ ).lower(),
1229
+ "help": argparse.SUPPRESS,
1230
+ },
1231
+ )
1232
+ ]
1233
+
1234
+ add_arguments_to_parser(platform, args)
1235
+ add_arguments_to_parser(platform, get_default_group_data())
1236
+
1237
+
1187
1238
  def ask_authorization_to_merge_config(missing_key: Optional[str] = None) -> bool:
1188
1239
  """
1189
1240
  Asks the end-user for the authorization to merge the upstream
@@ -1292,6 +1343,8 @@ def tool() -> None:
1292
1343
 
1293
1344
  # pylint: disable=possibly-unused-variable
1294
1345
 
1346
+ command_sub = parser.add_subparsers(dest="command", help=argparse.SUPPRESS)
1347
+
1295
1348
  shtab.add_argument_to(
1296
1349
  parser,
1297
1350
  option_string=["--show-completion"],
@@ -1321,6 +1374,8 @@ def tool() -> None:
1321
1374
  get_ci_group_data,
1322
1375
  ]
1323
1376
 
1377
+ parse_funcs = [platform_parser]
1378
+
1324
1379
  for func in funcs:
1325
1380
  parser_name = func.__name__.replace("get_", "").replace("_data", "")
1326
1381
 
@@ -1348,10 +1403,21 @@ def tool() -> None:
1348
1403
  )
1349
1404
  sys.exit(1)
1350
1405
 
1406
+ for func in parse_funcs:
1407
+ func(command_sub)
1408
+
1351
1409
  add_arguments_to_parser(parser, get_default_group_data())
1352
1410
 
1353
1411
  args = parser.parse_args()
1354
1412
 
1355
- if any(getattr(args, x) for x in ["domains", "urls", "files", "url_files"]):
1413
+ if any(
1414
+ getattr(args, x)
1415
+ for x in [
1416
+ "domains",
1417
+ "urls",
1418
+ "files",
1419
+ "url_files",
1420
+ ]
1421
+ ) or bool(args.command):
1356
1422
  SystemIntegrator(args).start()
1357
1423
  SystemLauncher(args).start()
@@ -318,8 +318,10 @@ class WorkerBase(multiprocessing.Process):
318
318
 
319
319
  try:
320
320
  worker_name, destination_worker, consumed = self.input_queue.get()
321
- except EOFError:
322
- PyFunceble.facility.Logger.info("Got EOFError. Stopping worker.")
321
+ except (EOFError, KeyboardInterrupt):
322
+ PyFunceble.facility.Logger.info(
323
+ "Got EOFError/KeyboardInterrupt. Stopping worker."
324
+ )
323
325
  self.global_exit_event.set()
324
326
  break
325
327
 
@@ -370,7 +372,14 @@ class WorkerBase(multiprocessing.Process):
370
372
  self.share_waiting_message(apply_breakoff=wait_for_stop)
371
373
  continue
372
374
 
373
- result = self.target(consumed)
375
+ try:
376
+ result = self.target(consumed)
377
+ except (EOFError, KeyboardInterrupt):
378
+ PyFunceble.facility.Logger.info(
379
+ "Got EOFError/KeyboardInterrupt. Stopping worker."
380
+ )
381
+ self.global_exit_event.set()
382
+ break
374
383
 
375
384
  if result is not None:
376
385
  self.add_to_output_queue(result)
@@ -399,6 +399,11 @@ class ProducerWorker(WorkerBase):
399
399
  )
400
400
  return None
401
401
 
402
+ if test_dataset["type"] == "platform-contribution":
403
+ self.collection_query_tool.deliver_contract(
404
+ test_dataset["contract"], test_result
405
+ )
406
+
402
407
  if (
403
408
  PyFunceble.storage.CONFIGURATION.collection.push
404
409
  and test_result.status_source != "COLLECTION"
@@ -119,6 +119,7 @@ from PyFunceble.dataset.inactive.base import InactiveDatasetBase
119
119
  from PyFunceble.helpers.directory import DirectoryHelper
120
120
  from PyFunceble.helpers.download import DownloadHelper
121
121
  from PyFunceble.helpers.file import FileHelper
122
+ from PyFunceble.query.collection import CollectionQueryTool
122
123
 
123
124
 
124
125
  class SystemLauncher(SystemBase):
@@ -222,7 +223,7 @@ class SystemLauncher(SystemBase):
222
223
  )
223
224
  self.producer_process_manager = ChancyProducerProcessesManager(
224
225
  self.manager,
225
- max_worker=1,
226
+ max_worker=PyFunceble.storage.CONFIGURATION.cli_testing.max_workers,
226
227
  continuous_integration=self.continuous_integration,
227
228
  input_queue=self.tester_process_manager.output_queue[0],
228
229
  daemon=True,
@@ -406,6 +407,21 @@ class SystemLauncher(SystemBase):
406
407
  "Added to the protocol:\n%r", to_append
407
408
  )
408
409
 
410
+ # pylint: disable=line-too-long
411
+ if (
412
+ PyFunceble.storage.CONFIGURATION.cli_testing.testing_mode.platform_contribution
413
+ ):
414
+ self.testing_protocol.append(
415
+ {
416
+ "type": "platform-contribution",
417
+ "subject_type": "any",
418
+ "destination": None,
419
+ "checker_type": None,
420
+ "output_dir": None,
421
+ "session_id": None,
422
+ }
423
+ )
424
+
409
425
  def ci_stop_in_the_middle_if_time_exceeded(self) -> "SystemLauncher":
410
426
  """
411
427
  Stops our processes as soon as the time is exceeded.
@@ -648,7 +664,37 @@ class SystemLauncher(SystemBase):
648
664
  )
649
665
  elif protocol["type"] == "file":
650
666
  handle_file(protocol)
667
+ elif protocol["type"] == "platform-contribution":
668
+ query_tool = CollectionQueryTool()
669
+
670
+ while True:
671
+ for next_contract in next(
672
+ query_tool.pull_contract(
673
+ PyFunceble.storage.CONFIGURATION.cli_testing.max_workers
674
+ )
675
+ ):
676
+ if (
677
+ "subject" not in next_contract
678
+ or not next_contract["subject"]
679
+ ):
680
+ continue
651
681
 
682
+ protocol_data = copy.deepcopy(protocol)
683
+
684
+ protocol_data["checker_type"] = next_contract[
685
+ "checker_type"
686
+ ].upper()
687
+ protocol_data["subject_type"] = next_contract["subject_type"]
688
+ protocol_data["subject"] = protocol_data["idna_subject"] = (
689
+ next_contract["subject"]["subject"]
690
+ )
691
+ protocol_data["contract"] = copy.deepcopy(next_contract)
692
+
693
+ self.tester_process_manager.add_to_input_queue(
694
+ protocol_data, worker_name="main"
695
+ )
696
+
697
+ self.ci_stop_in_the_middle_if_time_exceeded()
652
698
  return self
653
699
 
654
700
  def generate_waiting_files(self) -> "SystemLauncher":
@@ -172,6 +172,16 @@ class ConfigLoader:
172
172
  # If timeout is set to a negative digit, switch to the default one.
173
173
  config["lookup"]["timeout"] = 5
174
174
 
175
+ if (
176
+ "cli_testing" in config
177
+ and "testing_mode" in config["cli_testing"]
178
+ and "platform_contribution" in config["cli_testing"]["testing_mode"]
179
+ and config["cli_testing"]["testing_mode"]["platform_contribution"]
180
+ ):
181
+ # If we are under a special testing mode. We shouldn't generate
182
+ # any files
183
+ config["cli_testing"]["file_generation"]["no_file"] = True
184
+
175
185
  return config
176
186
 
177
187
  @staticmethod
@@ -173,6 +173,9 @@ cli_testing:
173
173
  # Activates the reputation test.
174
174
  reputation: no
175
175
 
176
+ # BETA: Activates the platform contribution test.
177
+ platform_contribution: no
178
+
176
179
  days_between:
177
180
  # Provides everything which is x days periodic.
178
181
 
@@ -51,7 +51,7 @@ License:
51
51
  """
52
52
 
53
53
  import json
54
- from typing import List, Optional, Union
54
+ from typing import Generator, List, Optional, Union
55
55
 
56
56
  import requests
57
57
  import requests.exceptions
@@ -447,7 +447,7 @@ class CollectionQueryTool:
447
447
 
448
448
  return self
449
449
 
450
- def ensure_is_modern_api_is_set(func): # pylint: disable=no-self-argument
450
+ def ensure_modern_api(func): # pylint: disable=no-self-argument
451
451
  """
452
452
  Ensures that the :code:`is_modern_api` attribute is set before running
453
453
  the decorated method.
@@ -461,7 +461,7 @@ class CollectionQueryTool:
461
461
 
462
462
  return wrapper
463
463
 
464
- @ensure_is_modern_api_is_set
464
+ @ensure_modern_api
465
465
  def pull(self, subject: str) -> Optional[dict]:
466
466
  """
467
467
  Pulls all data related to the subject or :py:class:`None`
@@ -520,7 +520,113 @@ class CollectionQueryTool:
520
520
 
521
521
  return None
522
522
 
523
- @ensure_is_modern_api_is_set
523
+ @ensure_modern_api
524
+ def pull_contract(self, amount: int = 1) -> Generator[dict, None, None]:
525
+ """
526
+ Pulls the next amount of contracts.
527
+
528
+ :param int amount:
529
+ The amount of data to pull.
530
+
531
+ :return:
532
+ The response of the query.
533
+ """
534
+
535
+ PyFunceble.facility.Logger.info("Starting to pull next contract")
536
+
537
+ url = f"{self.url_base}/v1/contracts/next"
538
+ params = {
539
+ "limit": amount,
540
+ "shuffle": True,
541
+ }
542
+
543
+ try:
544
+ response = self.session.get(
545
+ url,
546
+ params=params,
547
+ timeout=self.timeout,
548
+ )
549
+
550
+ response_json = response.json()
551
+
552
+ if response.status_code == 200:
553
+ PyFunceble.facility.Logger.debug(
554
+ "Successfully pulled next %r contracts. Response: %r", response_json
555
+ )
556
+
557
+ PyFunceble.facility.Logger.info("Finished to pull next contract")
558
+
559
+ yield response_json
560
+ except (requests.RequestException, json.decoder.JSONDecodeError):
561
+ response_json = [{"subject": {}}]
562
+
563
+ PyFunceble.facility.Logger.debug(
564
+ "Failed to pull next contract. Response: %r", response_json
565
+ )
566
+ PyFunceble.facility.Logger.info("Finished to pull next contracts")
567
+
568
+ yield response_json
569
+
570
+ @ensure_modern_api
571
+ def deliver_contract(self, contract: dict, contract_data: dict) -> Optional[dict]:
572
+ """
573
+ Delivers the given contract data.
574
+
575
+ :param contract:
576
+ The contract to deliver.
577
+ :param contract_data:
578
+ The data to deliver.
579
+
580
+ :return:
581
+ The response of the query.
582
+ """
583
+
584
+ PyFunceble.facility.Logger.info(
585
+ "Starting to deliver contract data: %r", contract
586
+ )
587
+
588
+ contract_id = contract["id"]
589
+ contract_data = (
590
+ contract_data.to_json()
591
+ if not isinstance(contract_data, dict)
592
+ else contract_data
593
+ )
594
+ url = f"{self.url_base}/v1/contracts/{contract_id}/delivery"
595
+
596
+ try:
597
+ response = self.session.post(
598
+ url,
599
+ data=contract_data.encode("utf-8"),
600
+ timeout=self.timeout,
601
+ )
602
+
603
+ response_json = response.json()
604
+
605
+ if response.status_code == 200:
606
+ PyFunceble.facility.Logger.debug(
607
+ "Successfully delivered contract: %r. Response: %r",
608
+ contract_data,
609
+ response_json,
610
+ )
611
+
612
+ PyFunceble.facility.Logger.info(
613
+ "Finished to deliver contract: %r", contract_data
614
+ )
615
+
616
+ return response_json
617
+ except (requests.RequestException, json.decoder.JSONDecodeError):
618
+ response_json = {}
619
+
620
+ PyFunceble.facility.Logger.debug(
621
+ "Failed to deliver contract: %r. Response: %r", contract_data, response_json
622
+ )
623
+ PyFunceble.facility.Logger.info(
624
+ "Finished to deliver contract: %r", contract_data
625
+ )
626
+
627
+ return None
628
+
629
+ @ensure_modern_api
524
630
  def push(
525
631
  self,
526
632
  checker_status: Union[
@@ -705,25 +811,36 @@ class CollectionQueryTool:
705
811
  if not self.token:
706
812
  return None
707
813
 
708
- if isinstance(
709
- data,
710
- (AvailabilityCheckerStatus, SyntaxCheckerStatus, ReputationCheckerStatus),
711
- ):
712
- data = data.to_dict()
713
-
714
- if not isinstance(data, dict): # pragma: no cover ## Should never happen
715
- raise TypeError(f"<data> should be {dict}, {type(data)} given.")
716
-
717
814
  PyFunceble.facility.Logger.info("Starting to submit WHOIS: %r", data)
718
815
 
719
816
  url = f"{self.url_base}/v1/status/whois"
720
817
 
721
818
  try:
722
- response = self.session.post(
723
- url,
724
- json=data,
725
- timeout=self.timeout,
726
- )
819
+ if isinstance(data, dict):
820
+ response = self.session.post(
821
+ url,
822
+ json=data,
823
+ timeout=self.timeout,
824
+ )
825
+ elif isinstance(
826
+ data,
827
+ (
828
+ AvailabilityCheckerStatus,
829
+ SyntaxCheckerStatus,
830
+ ReputationCheckerStatus,
831
+ ),
832
+ ):
833
+ response = self.session.post(
834
+ url,
835
+ data=data.to_json(),
836
+ timeout=self.timeout,
837
+ )
838
+ else:
839
+ response = self.session.post(
840
+ url,
841
+ data=data,
842
+ timeout=self.timeout,
843
+ )
727
844
 
728
845
  response_json = response.json()
729
846
 
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.9.dev (Blue Duckling: Ixora)"
64
+ PROJECT_VERSION: str = "4.2.11.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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyFunceble-dev
3
- Version: 4.2.9
3
+ Version: 4.2.11
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,74 +21,74 @@ 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: inflection
25
- Requires-Dist: setuptools >=65.5.1
26
- Requires-Dist: dnspython[doh] ~=2.6.0
27
- Requires-Dist: PyYAML
28
- Requires-Dist: SQLAlchemy ~=2.0
29
- Requires-Dist: cryptography ~=42.0
30
- Requires-Dist: domain2idna ~=1.12.0
31
24
  Requires-Dist: packaging
25
+ Requires-Dist: requests[socks] <3
32
26
  Requires-Dist: python-box[all] ~=6.0.0
33
- Requires-Dist: colorama
34
27
  Requires-Dist: python-dotenv
28
+ Requires-Dist: PyYAML
29
+ Requires-Dist: cryptography ~=42.0
30
+ Requires-Dist: domain2idna ~=1.12.0
31
+ Requires-Dist: alembic
35
32
  Requires-Dist: shtab
36
- Requires-Dist: requests[socks] <3
33
+ Requires-Dist: inflection
34
+ Requires-Dist: dnspython[doh] ~=2.6.0
35
+ Requires-Dist: colorama
36
+ Requires-Dist: SQLAlchemy ~=2.0
37
+ Requires-Dist: setuptools >=65.5.1
37
38
  Requires-Dist: PyMySQL
38
- Requires-Dist: alembic
39
39
  Provides-Extra: dev
40
40
  Requires-Dist: pylint ; extra == 'dev'
41
- Requires-Dist: black ; extra == 'dev'
42
41
  Requires-Dist: flake8 ; extra == 'dev'
43
42
  Requires-Dist: isort ; extra == 'dev'
43
+ Requires-Dist: black ; extra == 'dev'
44
44
  Provides-Extra: docs
45
- Requires-Dist: Pygments >=2.0 ; extra == 'docs'
45
+ Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'docs'
46
46
  Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
47
47
  Requires-Dist: sphinx >=3.4.3 ; extra == 'docs'
48
- Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'docs'
48
+ Requires-Dist: Pygments >=2.0 ; extra == 'docs'
49
49
  Provides-Extra: full
50
+ Requires-Dist: requests[socks] <3 ; extra == 'full'
51
+ Requires-Dist: sphinx-rtd-theme ; extra == 'full'
52
+ Requires-Dist: black ; extra == 'full'
53
+ Requires-Dist: shtab ; extra == 'full'
50
54
  Requires-Dist: inflection ; extra == 'full'
51
- Requires-Dist: domain2idna ~=1.12.0 ; extra == 'full'
52
- Requires-Dist: packaging ; extra == 'full'
53
- Requires-Dist: colorama ; extra == 'full'
54
- Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'full'
55
+ Requires-Dist: flake8 ; extra == 'full'
56
+ Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'full'
55
57
  Requires-Dist: pylint ; extra == 'full'
56
- Requires-Dist: sphinx >=3.4.3 ; extra == 'full'
58
+ Requires-Dist: PyYAML ; extra == 'full'
57
59
  Requires-Dist: cryptography ~=42.0 ; extra == 'full'
58
- Requires-Dist: requests[socks] <3 ; extra == 'full'
59
- Requires-Dist: PyMySQL ; extra == 'full'
60
- Requires-Dist: alembic ; extra == 'full'
61
60
  Requires-Dist: isort ; extra == 'full'
62
- Requires-Dist: setuptools >=65.5.1 ; extra == 'full'
63
- Requires-Dist: PyYAML ; extra == 'full'
64
- Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'full'
65
- Requires-Dist: black ; extra == 'full'
66
- Requires-Dist: sphinx-rtd-theme ; extra == 'full'
67
- Requires-Dist: Pygments >=2.0 ; extra == 'full'
68
- Requires-Dist: coverage ; extra == 'full'
69
61
  Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'full'
70
62
  Requires-Dist: tox ; extra == 'full'
71
- Requires-Dist: flake8 ; extra == 'full'
72
- Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'full'
63
+ Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'full'
64
+ Requires-Dist: coverage ; extra == 'full'
65
+ Requires-Dist: packaging ; extra == 'full'
66
+ Requires-Dist: alabaster <0.8,>=0.7 ; extra == 'full'
67
+ Requires-Dist: domain2idna ~=1.12.0 ; extra == 'full'
68
+ Requires-Dist: setuptools >=65.5.1 ; extra == 'full'
69
+ Requires-Dist: PyMySQL ; extra == 'full'
73
70
  Requires-Dist: python-dotenv ; extra == 'full'
74
- Requires-Dist: shtab ; extra == 'full'
71
+ Requires-Dist: alembic ; extra == 'full'
72
+ Requires-Dist: colorama ; extra == 'full'
73
+ Requires-Dist: sphinx >=3.4.3 ; extra == 'full'
74
+ Requires-Dist: Pygments >=2.0 ; extra == 'full'
75
75
  Provides-Extra: psql
76
- Requires-Dist: inflection ; extra == 'psql'
77
- Requires-Dist: setuptools >=65.5.1 ; extra == 'psql'
78
- Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'psql'
79
- Requires-Dist: PyYAML ; extra == 'psql'
80
- Requires-Dist: psycopg2 ; extra == 'psql'
81
- Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'psql'
82
- Requires-Dist: cryptography ~=42.0 ; extra == 'psql'
83
- Requires-Dist: domain2idna ~=1.12.0 ; extra == 'psql'
84
76
  Requires-Dist: packaging ; extra == 'psql'
77
+ Requires-Dist: requests[socks] <3 ; extra == 'psql'
85
78
  Requires-Dist: python-box[all] ~=6.0.0 ; extra == 'psql'
86
- Requires-Dist: colorama ; extra == 'psql'
79
+ Requires-Dist: psycopg2 ; extra == 'psql'
87
80
  Requires-Dist: python-dotenv ; extra == 'psql'
81
+ Requires-Dist: PyYAML ; extra == 'psql'
82
+ Requires-Dist: cryptography ~=42.0 ; extra == 'psql'
83
+ Requires-Dist: domain2idna ~=1.12.0 ; extra == 'psql'
84
+ Requires-Dist: alembic ; extra == 'psql'
88
85
  Requires-Dist: shtab ; extra == 'psql'
89
- Requires-Dist: requests[socks] <3 ; extra == 'psql'
86
+ Requires-Dist: inflection ; extra == 'psql'
87
+ Requires-Dist: dnspython[doh] ~=2.6.0 ; extra == 'psql'
88
+ Requires-Dist: colorama ; extra == 'psql'
89
+ Requires-Dist: SQLAlchemy ~=2.0 ; extra == 'psql'
90
+ Requires-Dist: setuptools >=65.5.1 ; extra == 'psql'
90
91
  Requires-Dist: PyMySQL ; extra == 'psql'
91
- Requires-Dist: alembic ; extra == 'psql'
92
92
  Provides-Extra: test
93
93
  Requires-Dist: tox ; extra == 'test'
94
94
  Requires-Dist: coverage ; extra == 'test'
@@ -4,7 +4,7 @@ PyFunceble/facility.py,sha256=zwQ-5JFtBr-n0uahkCLIheXNADX34A3uzVcEdFTWT8o,2640
4
4
  PyFunceble/factory.py,sha256=EIMObS1gaWpGamlqIoLoHAg9xpcXdfKEnDGe31O9WIw,2590
5
5
  PyFunceble/logger.py,sha256=8ex6ccGeV8sXtF6MMZsIfCAv2ZJmwKrvRQZd_4cIDCM,16829
6
6
  PyFunceble/sessions.py,sha256=lmqepbwtCCU8KVBNZ-XBo6kFFh5cpCKPgT_GegiLhk8,2582
7
- PyFunceble/storage.py,sha256=Rerw_MC_YtExRXtCzPU7VehQsZCURoE6NvLr5S7VrD0,6298
7
+ PyFunceble/storage.py,sha256=OrsgCIEhg2r_HcaY-Bgj7yaZGM0-AK85A6ec6olpgoc,6299
8
8
  PyFunceble/storage_facility.py,sha256=dnjRkVbH3kFtbWlX7evPyNT6rfo7nGCd4oNC9AajWtY,4833
9
9
  PyFunceble/checker/__init__.py,sha256=aiQBstQTw1nXwZ3IGxf_k3CofRbbtFB4WAu_ezvmi_0,2444
10
10
  PyFunceble/checker/base.py,sha256=iFNezdMIpfx6kwEaaDzniP7erPEbHWsBsIIMG96MAEY,13677
@@ -12,7 +12,7 @@ PyFunceble/checker/complex_json_encoder.py,sha256=BptyN_NI2d-jeSiP41ZroapOoup5QY
12
12
  PyFunceble/checker/params_base.py,sha256=c1n76_VKSDqL0Oj7yWCz7-KhB3AbdcHqid56dklSBk0,3297
13
13
  PyFunceble/checker/status_base.py,sha256=GmjDp62Ax6uGABaiRkw607DVbc9jDgljcx0JlokBRrA,3598
14
14
  PyFunceble/checker/availability/__init__.py,sha256=OF82eWYPW8u4LxQrcU45Twg8z2pdG-BmSLVmHUWvEos,2489
15
- PyFunceble/checker/availability/base.py,sha256=AO4AHsRZOSOOMDk99bEsHD-CQ6HEP7sx_RO0UKdDnyA,39105
15
+ PyFunceble/checker/availability/base.py,sha256=Yj3DCOtdTz4nXYWqA7jMJPaaGaV1No0njMDb8E7me6E,39320
16
16
  PyFunceble/checker/availability/domain.py,sha256=42at5_HdE3cJXKStJuxoMLWDR3h1Gf30154yL6I3rmI,7474
17
17
  PyFunceble/checker/availability/domain_and_ip.py,sha256=6vNzknSiQ08WYAX_cUrA2EyamcnOsC2-3M1dT0EECLE,6603
18
18
  PyFunceble/checker/availability/ip.py,sha256=z3kbNPMwOlTPWPFEqZ4NZRhu-2M1OKjO82EdUt022fk,7065
@@ -72,7 +72,7 @@ PyFunceble/cli/entry_points/production.py,sha256=duhH99ODUqoprwbkbgy9dFK2YZQXrGj
72
72
  PyFunceble/cli/entry_points/public_suffix.py,sha256=n1hNZy3G1jHYWEyu0qUppYu2nqe8aTF705x-uhCMUjo,4346
73
73
  PyFunceble/cli/entry_points/pyfunceble/__init__.py,sha256=X1LHl80LraiZQ7yfB15y-5ohJksTHOBwuQcXO50fx5w,2499
74
74
  PyFunceble/cli/entry_points/pyfunceble/argsparser.py,sha256=3pmbCfTg-im_eVdEMvzg-foethjFoKJpTKrdlkuUnIA,4762
75
- PyFunceble/cli/entry_points/pyfunceble/cli.py,sha256=ACxHLig1RlwQ9Xl26IhGAfU7BxwKeD2CzSuWJ_tjX04,45944
75
+ PyFunceble/cli/entry_points/pyfunceble/cli.py,sha256=f63sSKXFu2ZZklA8FRq_IfDXGpd78CcZlvyEeLe8Csk,47640
76
76
  PyFunceble/cli/filesystem/__init__.py,sha256=sGS4B1rWA5BJLhWVBWzSy2yGX7zzgzyTW8tyEV9RK9k,2497
77
77
  PyFunceble/cli/filesystem/cleanup.py,sha256=AHisLr_f8vCCO9LV90yLGnzW4NWeYYYnQAcE6OKQVMo,4827
78
78
  PyFunceble/cli/filesystem/counter.py,sha256=GXfBL3II6-s_egVH32LwaSp74mA7pxILqaeLhrHZQtE,6977
@@ -120,7 +120,7 @@ PyFunceble/cli/processes/miner.py,sha256=-ZdQKzbW3aInAPsLdsKGwWqFpiFBtkdyBdo2zjg
120
120
  PyFunceble/cli/processes/producer.py,sha256=fD5t0Ise6iV9S495v6aDcvroyxtXjsekFxLAuZBP3q8,2741
121
121
  PyFunceble/cli/processes/tester.py,sha256=nUCjUVIz4jXZsVx9WSfPOqi4-OzlqFsVbXupwm8YD-s,2727
122
122
  PyFunceble/cli/processes/workers/__init__.py,sha256=sC7xz1fB399TNYiG5gpDrOCfSSSARqo8sc4CeirUKLA,2458
123
- PyFunceble/cli/processes/workers/base.py,sha256=EIhM3YxEGCxdsq1B-Op8c6f2k5OOxmmRmyuzR5qQH5U,13964
123
+ PyFunceble/cli/processes/workers/base.py,sha256=w3bR3i3R6IUKeyA23v37oKY4Vje2z4Q4yW3UmF-rTUo,14353
124
124
  PyFunceble/cli/processes/workers/chancy_producer.py,sha256=_oDJym-VSs9t8yfsqe28t_sEU76vLsSPAa6OnIgQkmw,4424
125
125
  PyFunceble/cli/processes/workers/chancy_tester.py,sha256=X39S4u9j08KOMfTpw1OD6ZU8MantBXu5FeyD1FNgobY,3640
126
126
  PyFunceble/cli/processes/workers/dir_files_sorter.py,sha256=qbeLcQ6QiSO-eRat2xQF1b038DigSIvzGeux5Aailgg,6012
@@ -128,7 +128,7 @@ PyFunceble/cli/processes/workers/file_sorter.py,sha256=KLjplewupcLHzpKqWylwAU1_A
128
128
  PyFunceble/cli/processes/workers/file_sorter_base.py,sha256=1GCbEqvLnk9mk0obx5HfCxvo0zkGojhY7tJjV-QBRf0,8042
129
129
  PyFunceble/cli/processes/workers/migrator.py,sha256=jNNplKW4oMj_f0-ApTE-xJk4lEvjiN2rYlgOScOkKmY,3517
130
130
  PyFunceble/cli/processes/workers/miner.py,sha256=ZHxxo6oyVzTWV4IEQEispFSzetq7gO_KfWWqWLq05WQ,7127
131
- PyFunceble/cli/processes/workers/producer.py,sha256=O5KsIgpxGeUNH2uHDEo5-K32FkOTYZQ9l_odLmcCDqo,16995
131
+ PyFunceble/cli/processes/workers/producer.py,sha256=Yi6o1Phtv372KigPi4AtZoP6nrS349rfDrbzFiBhPq4,17181
132
132
  PyFunceble/cli/processes/workers/tester.py,sha256=1VLbhVeAaN4EE0l3fdD0R69Kv4QTL3i9yXvSHiO1SrM,11751
133
133
  PyFunceble/cli/scripts/__init__.py,sha256=jSHEdUgOBxuhESK-n_unZDV7Vts09LNCNRiSJIe9Fno,2451
134
134
  PyFunceble/cli/scripts/iana.py,sha256=IQAu_TKtL-54Lh2q4ymet6T1faqQmiJXg4hME1Md3PU,9991
@@ -137,7 +137,7 @@ PyFunceble/cli/scripts/public_suffix.py,sha256=-xYAQVv2ug_2Uk7-VoEkVyEHqP5Crmj8C
137
137
  PyFunceble/cli/system/__init__.py,sha256=4jXK5yT6fDjsbNg5LULnpfJ8G1yM_uP78-OLkPM1Skc,2522
138
138
  PyFunceble/cli/system/base.py,sha256=E3TsC7y0qrL7hhLLAlaUhFWU9etTbOKOuqIrDSCeRqA,4888
139
139
  PyFunceble/cli/system/integrator.py,sha256=zPi7EcOZsdY437H6qcBffoU4LNTK2tg8En10dahogpw,9257
140
- PyFunceble/cli/system/launcher.py,sha256=oslzg_Dg-9itv5Btyz5WxR0wIbXM7PMf1AUkvoC90xw,42782
140
+ PyFunceble/cli/system/launcher.py,sha256=Q3Mb4GxurUnXs_8vIwmveVMH8KebBe1KesOaoFxP0rk,44773
141
141
  PyFunceble/cli/utils/__init__.py,sha256=69PJomADQHaFLgnfTpS7SFTgVkqZiRdvpUKX41nUuXs,2465
142
142
  PyFunceble/cli/utils/ascii_logo.py,sha256=Zff57bUS-2GkjAzyv6OEpw8THrolr0rhjjvjepsMgR8,4236
143
143
  PyFunceble/cli/utils/sort.py,sha256=Vi2V4S55hbqP9Mrk_OsYxESKAnKIS6DOFZ7nZXEv7u4,4375
@@ -146,7 +146,7 @@ PyFunceble/cli/utils/testing.py,sha256=ojMFnRfDyOFXDPSaCRQpLwEZoADkRk0KUmx-Y7kvA
146
146
  PyFunceble/cli/utils/version.py,sha256=WNpKsy3Evn0vtY7GioLKogekagVgTK1Yh0jEIaSap4k,13358
147
147
  PyFunceble/config/__init__.py,sha256=e1G8cnfAsOuScjf7X-pejBviIWJBg9yV9AlP8QI30yQ,2468
148
148
  PyFunceble/config/compare.py,sha256=ztMwE9wsHMUw1waGZhuHTmeBezkY-ktBQMUQ0EpbuDk,13047
149
- PyFunceble/config/loader.py,sha256=waiOSAP2y1s2ixWZGgqRwe1kEul9-ZUVQN2pYXjnpec,14772
149
+ PyFunceble/config/loader.py,sha256=mebHyET0OvHZFJCN8_WQjyR8DJdc8n0W8-lpsv3LLdY,15220
150
150
  PyFunceble/converter/__init__.py,sha256=N168Ng67JFwvopijVJU4C_Ej-KCbZLlGnwgrJzOSG-s,2450
151
151
  PyFunceble/converter/adblock_input_line2subject.py,sha256=IfOnjXaD5FJ0oK97-MVtV8a8Kjyt339pAZ37GzrCrbE,12939
152
152
  PyFunceble/converter/base.py,sha256=UYwAOivqZCIy_yclkO-Tww4nlQ5Qpf5eRjTHeu1S88Q,4929
@@ -183,7 +183,7 @@ PyFunceble/data/alembic/postgresql/env.py,sha256=8UhlaEdFE4dTHEU8JIGovGO2d2e9xcl
183
183
  PyFunceble/data/alembic/postgresql/script.py.mako,sha256=8_xgA-gm_OhehnO7CiIijWgnm00ZlszEHtIHrAYFJl0,494
184
184
  PyFunceble/data/alembic/postgresql/versions/__init__.py,sha256=qDBHGriN6fj02Rczmil26vaSa63sEDeo9j-Nn7zj9dY,2466
185
185
  PyFunceble/data/alembic/postgresql/versions/a32ac5d66eee_initial_version.py,sha256=xJdnoCnHAG1vmt-nBeomuIEDRwUK1Upv1mtkUt1txQM,2487
186
- PyFunceble/data/infrastructure/.PyFunceble_production.yaml,sha256=uqUeggBBTmxNKKoV51TuthdHODT8Q2OHQU3g6Rrw-zM,11497
186
+ PyFunceble/data/infrastructure/.PyFunceble_production.yaml,sha256=_nZfi3jBmUGdzmDnUnNWVsGhLgGdlkMiaPDeLno2oJY,11582
187
187
  PyFunceble/data/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
188
  PyFunceble/data/infrastructure/dir_structure_production.json,sha256=XpWin49SkoWu3pvnsoNlbNh6j9MlTGVKkvTmX99jZkM,5722
189
189
  PyFunceble/database/__init__.py,sha256=oOHy01SVzNfpqkjrcu8eIQ9mtmsBdi5GpW9RWo7aaIw,2506
@@ -242,7 +242,7 @@ PyFunceble/helpers/list.py,sha256=42SX78D6cbUbSctxBZLE-kBzJmBQ3iZTDQiB7Ficfkk,50
242
242
  PyFunceble/helpers/merge.py,sha256=qU9z5mUGxNEKv2fjPokSU8B-HMC62izEIk8LZQU9duE,6060
243
243
  PyFunceble/helpers/regex.py,sha256=ySrV2FaKJPVL4glaA1jx2_1Jq_5ydup86FWrRsfB7eo,6937
244
244
  PyFunceble/query/__init__.py,sha256=OrSc30ozkbsgboBkO3IWmsHZS3AxhnvfQuJLZlnbhoI,2514
245
- PyFunceble/query/collection.py,sha256=02z7zXWbhWj3UoMMDlUMZzwFNNOo9Lbhxjen9_5qfHY,22748
245
+ PyFunceble/query/collection.py,sha256=g8ETJFpxfAfYw_ZVV4kT2zAzSrnd9xJGm4l62E6nQQE,26199
246
246
  PyFunceble/query/http_status_code.py,sha256=Li6uWA-GLJ0Hj_dKz527w4i4gLX78W-AC87MeVdDJdI,11777
247
247
  PyFunceble/query/dns/__init__.py,sha256=Q0M83ZMZf7wJMgTVFmnXyfLb8XNdBHe2gTWs2dHTpK4,2479
248
248
  PyFunceble/query/dns/nameserver.py,sha256=ogE6jXBOy94f36KtUx4y1kB_G2H_X65SJWTzuaTbVDI,9796
@@ -274,9 +274,9 @@ PyFunceble/utils/__init__.py,sha256=l6Mz-0GPHPCSPXuNFtHbnjD0fYI5BRr-RwDbVgAUdmI,
274
274
  PyFunceble/utils/platform.py,sha256=px_pauOFMCEtc9ST0vYZvDWDhcWNP1S595iKK4P3n7c,3920
275
275
  PyFunceble/utils/profile.py,sha256=Fp5yntq5Ys5eQe-FbQsUpx4ydxDxVYW3ACn-3KcTk_A,4566
276
276
  PyFunceble/utils/version.py,sha256=Tb3DWk96Xl6WbdDa2t3QQGBBDcnKDNJV_iFWMVQfCoc,8330
277
- PyFunceble_dev-4.2.9.dist-info/LICENSE,sha256=JBG6UfPnf3940AtwZB6vwAK6YH82Eo6nzMVnjGqopF0,10796
278
- PyFunceble_dev-4.2.9.dist-info/METADATA,sha256=T5-XYPQTthigbCW6LDEf8Z7xqf6708jGb42JqfIfZ_k,15118
279
- PyFunceble_dev-4.2.9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
280
- PyFunceble_dev-4.2.9.dist-info/entry_points.txt,sha256=Ic1suwopOi_XTgiQi2ErtpY5xT3R8EFMI6B_ONDuR9E,201
281
- PyFunceble_dev-4.2.9.dist-info/top_level.txt,sha256=J7GBKIiNYv93m1AxLy8_gr6ExXyZbMmCVXHMQBTUq2Y,11
282
- PyFunceble_dev-4.2.9.dist-info/RECORD,,
277
+ PyFunceble_dev-4.2.11.dist-info/LICENSE,sha256=JBG6UfPnf3940AtwZB6vwAK6YH82Eo6nzMVnjGqopF0,10796
278
+ PyFunceble_dev-4.2.11.dist-info/METADATA,sha256=3koYulfOss4hoJhAlx5Sq2WL-Z0KT6dg9iALq8L6GNc,15119
279
+ PyFunceble_dev-4.2.11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
280
+ PyFunceble_dev-4.2.11.dist-info/entry_points.txt,sha256=Ic1suwopOi_XTgiQi2ErtpY5xT3R8EFMI6B_ONDuR9E,201
281
+ PyFunceble_dev-4.2.11.dist-info/top_level.txt,sha256=J7GBKIiNYv93m1AxLy8_gr6ExXyZbMmCVXHMQBTUq2Y,11
282
+ PyFunceble_dev-4.2.11.dist-info/RECORD,,