PyFunceble-dev 4.3.1__py3-none-any.whl → 4.4.0__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.
@@ -54,7 +54,7 @@ License:
54
54
 
55
55
  import multiprocessing
56
56
  from datetime import datetime
57
- from typing import Dict, List, Optional
57
+ from typing import Any, Dict, List, Optional
58
58
 
59
59
  from sqlalchemy.orm import Session
60
60
 
@@ -110,8 +110,12 @@ class AvailabilityCheckerBase(CheckerBase):
110
110
  Optional, Activates/Disables the check of the status before the actual
111
111
  status gathering.
112
112
  :param bool use_whois_db:
113
- Optional, Activates/Disable the usage of a local database to store the
113
+ Optional, Activates/Disables the usage of a local database to store the
114
114
  WHOIS datasets.
115
+ :param bool use_platform:
116
+ Optional, Activates/Disables the usage of the platform features.
117
+ :param multiprocessing.Lock shared_lock:
118
+ Optional, The shared lock to use to access shared resources.
115
119
  """
116
120
 
117
121
  # pylint: disable=too-many-public-methods, too-many-instance-attributes
@@ -160,6 +164,7 @@ class AvailabilityCheckerBase(CheckerBase):
160
164
  db_session: Optional[Session] = None,
161
165
  use_whois_db: Optional[bool] = None,
162
166
  use_platform: Optional[bool] = None,
167
+ shared_lock: Optional[Any] = None,
163
168
  ) -> None:
164
169
  self.dns_query_tool = DNSQueryTool()
165
170
  self.whois_query_tool = WhoisQueryTool()
@@ -226,6 +231,7 @@ class AvailabilityCheckerBase(CheckerBase):
226
231
  do_syntax_check_first=do_syntax_check_first,
227
232
  db_session=db_session,
228
233
  use_platform=use_platform,
234
+ shared_lock=shared_lock,
229
235
  )
230
236
 
231
237
  @property
@@ -761,7 +767,9 @@ class AvailabilityCheckerBase(CheckerBase):
761
767
  if (
762
768
  PyFunceble.facility.ConfigLoader.is_already_loaded() and self.use_whois_db
763
769
  ): # pragma: no cover ## Not interesting enough to spend time on it.
764
- whois_object = get_whois_dataset_object(db_session=self.db_session)
770
+ whois_object = get_whois_dataset_object(
771
+ db_session=self.db_session, shared_lock=self.shared_lock
772
+ )
765
773
  known_record = whois_object[self.subject]
766
774
 
767
775
  if known_record and not isinstance(known_record, dict):
@@ -115,7 +115,9 @@ class DomainAvailabilityChecker(AvailabilityCheckerBase):
115
115
  self.status.idna_subject,
116
116
  )
117
117
 
118
- lookup_result = DomainReputationChecker(self.status.idna_subject).get_status()
118
+ lookup_result = DomainReputationChecker(
119
+ self.status.idna_subject, shared_lock=self.shared_lock
120
+ ).get_status()
119
121
 
120
122
  # pylint: disable=no-member
121
123
  if lookup_result and lookup_result.is_malicious():
@@ -112,6 +112,7 @@ class DomainAndIPAvailabilityChecker(AvailabilityCheckerBase):
112
112
  db_session=self.db_session,
113
113
  use_whois_db=self.use_whois_db,
114
114
  use_platform=self.use_platform,
115
+ shared_lock=self.shared_lock,
115
116
  )
116
117
  else:
117
118
  query_object = DomainAvailabilityChecker(
@@ -126,6 +127,7 @@ class DomainAndIPAvailabilityChecker(AvailabilityCheckerBase):
126
127
  db_session=self.db_session,
127
128
  use_whois_db=self.use_whois_db,
128
129
  use_platform=self.use_platform,
130
+ shared_lock=self.shared_lock,
129
131
  )
130
132
 
131
133
  query_object.dns_query_tool = self.dns_query_tool
@@ -52,7 +52,7 @@ License:
52
52
 
53
53
  import datetime
54
54
  import functools
55
- from typing import Optional
55
+ from typing import Any, Optional
56
56
 
57
57
  import domain2idna
58
58
  from sqlalchemy.orm import Session
@@ -77,6 +77,12 @@ class CheckerBase:
77
77
 
78
78
  .. warning::
79
79
  This does not apply to the syntax checker - itself.
80
+ :param Session db_session:
81
+ Optional, The database session to use.
82
+ :param bool use_platform:
83
+ Optional, Authorizes the usage of the platform.
84
+ :param Any shared_lock:
85
+ Optional, The shared lock to use to access shared resources.
80
86
  """
81
87
 
82
88
  STD_DO_SYNTAX_CHECK_FIRST: bool = False
@@ -97,6 +103,8 @@ class CheckerBase:
97
103
  status: Optional[CheckerStatusBase] = None
98
104
  params: Optional[CheckerParamsBase] = None
99
105
 
106
+ shared_lock: Optional[Any] = None
107
+
100
108
  def __init__(
101
109
  self,
102
110
  subject: Optional[str] = None,
@@ -104,6 +112,7 @@ class CheckerBase:
104
112
  do_syntax_check_first: Optional[bool] = None,
105
113
  db_session: Optional[Session] = None,
106
114
  use_platform: Optional[bool] = None,
115
+ shared_lock: Optional[Any] = None,
107
116
  ) -> None:
108
117
  self.platform_query_tool = PlatformQueryTool()
109
118
  self.url2netloc = Url2Netloc()
@@ -115,6 +124,9 @@ class CheckerBase:
115
124
  if self.status is None:
116
125
  self.status = CheckerStatusBase()
117
126
 
127
+ if shared_lock is not None:
128
+ self.shared_lock = shared_lock
129
+
118
130
  if subject is not None:
119
131
  self.subject = subject
120
132
 
@@ -50,7 +50,7 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- from typing import List, Optional
53
+ from typing import Any, List, Optional
54
54
 
55
55
  from sqlalchemy.orm import Session
56
56
 
@@ -75,6 +75,12 @@ class ReputationCheckerBase(CheckerBase):
75
75
  :param bool do_syntax_check_first:
76
76
  Optional, Activates/Disables the check of the status before the actual
77
77
  status gathering.
78
+ :param Session db_session:
79
+ Optional, The database session to use.
80
+ :param bool use_platform:
81
+ Optional, Authorizes the usage of the platform.
82
+ :param Any shared_lock:
83
+ Optional, The shared lock to use to access shared resources.
78
84
  """
79
85
 
80
86
  dns_query_tool: Optional[DNSQueryTool] = None
@@ -92,9 +98,10 @@ class ReputationCheckerBase(CheckerBase):
92
98
  do_syntax_check_first: Optional[bool] = None,
93
99
  db_session: Optional[Session] = None,
94
100
  use_platform: Optional[bool] = None,
101
+ shared_lock: Optional[Any] = None,
95
102
  ) -> None:
96
103
  self.dns_query_tool = DNSQueryTool()
97
- self.ipv4_reputation_query_tool = IPV4ReputationDataset()
104
+ self.ipv4_reputation_query_tool = IPV4ReputationDataset(shared_lock=shared_lock)
98
105
  self.domain_syntax_checker = DomainSyntaxChecker()
99
106
  self.ip_syntax_checker = IPSyntaxChecker()
100
107
  self.url_syntax_checker = URLSyntaxChecker()
@@ -110,6 +117,7 @@ class ReputationCheckerBase(CheckerBase):
110
117
  do_syntax_check_first=do_syntax_check_first,
111
118
  db_session=db_session,
112
119
  use_platform=use_platform,
120
+ shared_lock=shared_lock,
113
121
  )
114
122
 
115
123
  @staticmethod
@@ -50,7 +50,7 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- from typing import Optional
53
+ from typing import Any, Optional
54
54
 
55
55
  from sqlalchemy.orm import Session
56
56
 
@@ -78,13 +78,16 @@ class SyntaxCheckerBase(CheckerBase):
78
78
  self,
79
79
  subject: Optional[str] = None,
80
80
  db_session: Optional[Session] = None,
81
+ shared_lock: Optional[Any] = None,
81
82
  ) -> None:
82
83
  self.params = SyntaxCheckerParams()
83
84
 
84
85
  self.status = SyntaxCheckerStatus()
85
86
  self.status.params = self.params
86
87
 
87
- super().__init__(subject=subject, db_session=db_session)
88
+ super().__init__(
89
+ subject=subject, db_session=db_session, shared_lock=shared_lock
90
+ )
88
91
 
89
92
  def subject_propagator(self) -> "CheckerBase":
90
93
  """
@@ -50,7 +50,7 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- from typing import Optional, Union
53
+ from typing import Any, Optional, Union
54
54
 
55
55
  from sqlalchemy.orm import Session
56
56
 
@@ -64,13 +64,17 @@ from PyFunceble.dataset.whois.sql import SQLDBWhoisDataset
64
64
 
65
65
 
66
66
  def get_whois_dataset_object(
67
- *, db_session: Optional[Session] = None
67
+ *,
68
+ db_session: Optional[Session] = None,
69
+ shared_lock: Optional[Any] = None,
68
70
  ) -> Union[DatasetBase, CSVDatasetBase, DBDatasetBase]:
69
71
  """
70
72
  Provides the whois dataset object to work with.
71
73
 
72
74
  :param db_session:
73
75
  A database session to use.
76
+ :param shared_lock:
77
+ Optional, The shared lock to use to access shared resources.
74
78
 
75
79
  :raise ValueError:
76
80
  When the given database type is unknown.
@@ -80,7 +84,7 @@ def get_whois_dataset_object(
80
84
 
81
85
  if PyFunceble.facility.ConfigLoader.is_already_loaded():
82
86
  if PyFunceble.storage.CONFIGURATION.cli_testing.db_type == "csv":
83
- return CSVWhoisDataset().set_authorized(
87
+ return CSVWhoisDataset(shared_lock=shared_lock).set_authorized(
84
88
  bool(PyFunceble.storage.CONFIGURATION.cli_testing.whois_db)
85
89
  )
86
90
 
@@ -60,3 +60,10 @@ class ProcessesManagerBase(PyFunceble.ext.process_manager.ProcessManagerCore):
60
60
  """
61
61
  Provides the base of all classes.
62
62
  """
63
+
64
+ def __init__(self, *args, **kwargs) -> None:
65
+ # Better handling of shared locks.
66
+ # This help be be retro-compatible. Allowing existing users to
67
+ # not get exceptions.
68
+ shared_lock = kwargs.pop("shared_lock", None)
69
+ super().__init__(*args, **kwargs, shared_lock=shared_lock)
@@ -125,9 +125,15 @@ class ProducerWorker(WorkerBase):
125
125
  self.file_printer = FilePrinter(
126
126
  skip_column=skip_columns, extra_formatters=extra_formatters
127
127
  )
128
- self.whois_dataset = get_whois_dataset_object(db_session=self.db_session)
129
- self.inactive_dataset = get_inactive_dataset_object(db_session=self.db_session)
130
- self.continue_dataset = get_continue_dataset_object(db_session=self.db_session)
128
+ self.whois_dataset = get_whois_dataset_object(
129
+ db_session=self.db_session, shared_lock=self.shared_lock
130
+ )
131
+ self.inactive_dataset = get_inactive_dataset_object(
132
+ db_session=self.db_session, shared_lock=self.shared_lock
133
+ )
134
+ self.continue_dataset = get_continue_dataset_object(
135
+ db_session=self.db_session, shared_lock=self.shared_lock
136
+ )
131
137
  self.status_file_generator = StatusFileGenerator().guess_all_settings()
132
138
  self.counter = FilesystemCounter()
133
139
  self.registrar_counter = RegistrarCounter()
@@ -90,12 +90,12 @@ class TesterWorker(WorkerBase):
90
90
 
91
91
  self.continue_dataset = (
92
92
  PyFunceble.cli.utils.testing.get_continue_dataset_object(
93
- db_session=self.db_session
93
+ db_session=self.db_session, shared_lock=self.shared_lock
94
94
  )
95
95
  )
96
96
  self.inactive_dataset = (
97
97
  PyFunceble.cli.utils.testing.get_inactive_dataset_object(
98
- db_session=self.db_session
98
+ db_session=self.db_session, shared_lock=self.shared_lock
99
99
  )
100
100
  )
101
101
 
@@ -191,7 +191,7 @@ class TesterWorker(WorkerBase):
191
191
  self.initiated_testing_objects[checker_type][
192
192
  subject_type
193
193
  ] = self.known_testing_objects[checker_type][subject_type](
194
- db_session=self.db_session
194
+ db_session=self.db_session, shared_lock=self.shared_lock
195
195
  ).set_do_syntax_check_first(
196
196
  # We want to always check the syntax first (ONLY UNDER THE CLI)
197
197
  not bool(PyFunceble.storage.CONFIGURATION.cli_testing.local_network)
@@ -278,12 +278,12 @@ class TesterWorker(WorkerBase):
278
278
  test_dataset["idna_subject"],
279
279
  )
280
280
 
281
- self._init_testing_object(
281
+ testing_object = self._init_testing_object(
282
282
  test_dataset["subject_type"], test_dataset["checker_type"]
283
283
  )
284
284
 
285
285
  result = (
286
- self.testing_object.set_subject(test_dataset["idna_subject"])
286
+ testing_object.set_subject(test_dataset["idna_subject"])
287
287
  .query_status()
288
288
  .get_status()
289
289
  )
@@ -156,6 +156,7 @@ class SystemLauncher(SystemBase):
156
156
  file_preloader: Optional[FilePreloader] = None
157
157
 
158
158
  manager: Optional[multiprocessing.Manager]
159
+ shared_lock: Optional[multiprocessing.Lock] = None
159
160
  tester_process_manager: Optional[
160
161
  Union[TesterProcessesManager, ChancyTesterProcessesManager]
161
162
  ] = None
@@ -185,11 +186,20 @@ class SystemLauncher(SystemBase):
185
186
  except TypeError:
186
187
  self.db_session = None
187
188
 
189
+ self.manager = multiprocessing.Manager()
190
+ self.shared_lock = multiprocessing.Lock()
191
+
188
192
  self.execution_time_holder = ExecutionTime().set_start_time()
189
193
  self.checker_type = get_testing_mode()
190
- self.continue_dataset = get_continue_dataset_object(db_session=self.db_session)
191
- self.inactive_dataset = get_inactive_dataset_object(db_session=self.db_session)
192
- self.whois_dataset = get_whois_dataset_object(db_session=self.db_session)
194
+ self.continue_dataset = get_continue_dataset_object(
195
+ db_session=self.db_session, shared_lock=self.shared_lock
196
+ )
197
+ self.inactive_dataset = get_inactive_dataset_object(
198
+ db_session=self.db_session, shared_lock=self.shared_lock
199
+ )
200
+ self.whois_dataset = get_whois_dataset_object(
201
+ db_session=self.db_session, shared_lock=self.shared_lock
202
+ )
193
203
  self.continuous_integration = ci_object()
194
204
 
195
205
  if self.continuous_integration.authorized:
@@ -197,8 +207,6 @@ class SystemLauncher(SystemBase):
197
207
 
198
208
  self.stdout_printer.guess_allow_coloration().guess_allow_background_coloration()
199
209
 
200
- self.manager = multiprocessing.Manager()
201
-
202
210
  if not PyFunceble.storage.CONFIGURATION.cli_testing.chancy_tester:
203
211
  self.tester_process_manager = TesterProcessesManager(
204
212
  max_workers=PyFunceble.storage.CONFIGURATION.cli_testing.max_workers,
@@ -215,6 +223,7 @@ class SystemLauncher(SystemBase):
215
223
  delay_shutdown=PyFunceble.storage.CONFIGURATION.cli_testing.mining,
216
224
  generate_configuration_queue=False,
217
225
  continuous_integration=self.continuous_integration,
226
+ shared_lock=self.shared_lock,
218
227
  )
219
228
 
220
229
  self.producer_process_manager = ProducerProcessesManager(
@@ -227,6 +236,7 @@ class SystemLauncher(SystemBase):
227
236
  delay_shutdown=PyFunceble.storage.CONFIGURATION.cli_testing.mining,
228
237
  generate_configuration_queue=False,
229
238
  continuous_integration=self.continuous_integration,
239
+ shared_lock=self.shared_lock,
230
240
  )
231
241
  else:
232
242
  self.tester_process_manager = ChancyTesterProcessesManager(
@@ -266,6 +276,7 @@ class SystemLauncher(SystemBase):
266
276
  daemon=True,
267
277
  generate_output_queue=False,
268
278
  generate_configuration_queue=False,
279
+ shared_lock=self.shared_lock,
269
280
  )
270
281
  self.migrator_process_manager = MigratorProcessesManager(
271
282
  manager=self.manager,
@@ -273,6 +284,7 @@ class SystemLauncher(SystemBase):
273
284
  daemon=True,
274
285
  generate_input_queue=False,
275
286
  generate_output_queue=False,
287
+ shared_lock=self.shared_lock,
276
288
  )
277
289
 
278
290
  if PyFunceble.storage.CONFIGURATION.cli_testing.mining:
@@ -287,6 +299,7 @@ class SystemLauncher(SystemBase):
287
299
  spread_stop_signal=False,
288
300
  spread_wait_signal=True,
289
301
  delay_shutdown=PyFunceble.storage.CONFIGURATION.cli_testing.mining,
302
+ shared_lock=self.shared_lock,
290
303
  )
291
304
 
292
305
  self.tester_process_manager.add_dependent_manager(
@@ -51,7 +51,7 @@ License:
51
51
  """
52
52
 
53
53
  import os
54
- from typing import List, Optional, Union
54
+ from typing import Any, List, Optional, Union
55
55
 
56
56
  from sqlalchemy.orm import Session
57
57
 
@@ -92,12 +92,15 @@ def get_testing_mode() -> str:
92
92
 
93
93
  def get_continue_dataset_object(
94
94
  db_session: Optional[Session] = None,
95
+ shared_lock: Optional[Any] = None,
95
96
  ) -> Union[DatasetBase, CSVDatasetBase, DBDatasetBase]:
96
97
  """
97
98
  Provides the continue object to work with.
98
99
 
99
100
  :param db_session:
100
101
  A database session to use.
102
+ :param shared_lock:
103
+ Optional, The shared lock to use to access shared resources.
101
104
 
102
105
  :raise ValueError:
103
106
  When the given database type is unkown.
@@ -106,7 +109,7 @@ def get_continue_dataset_object(
106
109
  result = None
107
110
 
108
111
  if PyFunceble.storage.CONFIGURATION.cli_testing.db_type in "csv":
109
- result = CSVContinueDataset()
112
+ result = CSVContinueDataset(shared_lock=shared_lock)
110
113
  elif PyFunceble.storage.CONFIGURATION.cli_testing.db_type in (
111
114
  "mariadb",
112
115
  "mysql",
@@ -129,12 +132,15 @@ def get_continue_dataset_object(
129
132
 
130
133
  def get_inactive_dataset_object(
131
134
  db_session: Optional[Session] = None,
135
+ shared_lock: Optional[Any] = None,
132
136
  ) -> Union[DatasetBase, CSVDatasetBase, DBDatasetBase]:
133
137
  """
134
138
  Provides the inactive object to work with.
135
139
 
136
140
  :param db_session:
137
141
  A database session to use.
142
+ :param shared_lock:
143
+ An optional shared lock to use.
138
144
 
139
145
  :raise ValueError:
140
146
  When the given database type is unkown.
@@ -143,7 +149,7 @@ def get_inactive_dataset_object(
143
149
  result = None
144
150
 
145
151
  if PyFunceble.storage.CONFIGURATION.cli_testing.db_type == "csv":
146
- result = CSVInactiveDataset()
152
+ result = CSVInactiveDataset(shared_lock=shared_lock)
147
153
  elif PyFunceble.storage.CONFIGURATION.cli_testing.db_type in (
148
154
  "mariadb",
149
155
  "mysql",
@@ -66,6 +66,17 @@ class CSVContinueDataset(CSVDatasetBase, ContinueDatasetBase):
66
66
  """
67
67
  Provides the interface for the management of the continue
68
68
  CSV file.
69
+
70
+ :param bool authorized:
71
+ Optional, Authorizes/Disables the usage of this dataset.
72
+ If not set, :code:`STD_AUTHORIZED` is used.
73
+ :param bool remove_unneeded_fields:
74
+ Optional, Activates/Deactivates the removal of unneeded fields.
75
+ If not set, :code:`STD_REMOVE_UNNEEDED_FIELDS` is used.
76
+ :param str base_directory:
77
+ Optional, The base directory to use.
78
+ :param Any shared_lock:
79
+ Optional, The shared lock to use to access shared resources.
69
80
  """
70
81
 
71
82
  source_file: Optional[str] = None
@@ -78,12 +89,15 @@ class CSVContinueDataset(CSVDatasetBase, ContinueDatasetBase):
78
89
  authorized: Optional[bool] = None,
79
90
  remove_unneeded_fields: Optional[bool] = None,
80
91
  base_directory: Optional[str] = None,
92
+ shared_lock: Optional[Any] = None,
81
93
  ) -> None:
82
94
  if base_directory is not None:
83
95
  self.set_base_directory(base_directory)
84
96
 
85
97
  super().__init__(
86
- authorized=authorized, remove_unneeded_fields=remove_unneeded_fields
98
+ authorized=authorized,
99
+ remove_unneeded_fields=remove_unneeded_fields,
100
+ shared_lock=shared_lock,
87
101
  )
88
102
 
89
103
  def __contains__(self, value: str) -> bool:
@@ -57,11 +57,15 @@ import PyFunceble.storage
57
57
  from PyFunceble.downloader.base import DownloaderBase
58
58
  from PyFunceble.helpers.dict import DictHelper
59
59
  from PyFunceble.helpers.file import FileHelper
60
+ from PyFunceble.utils.platform import PlatformUtility
60
61
 
61
62
 
62
63
  class DatasetBase:
63
64
  """
64
65
  Provides the base of all dataset.
66
+
67
+ :param Any shared_lock:
68
+ Optional, The shared lock to use to access shared resources.
65
69
  """
66
70
 
67
71
  STORAGE_INDEX: Optional[str] = None
@@ -69,6 +73,12 @@ class DatasetBase:
69
73
 
70
74
  source_file: Optional[str] = None
71
75
 
76
+ shared_lock: Optional[Any] = None
77
+
78
+ def __init__(self, *, shared_lock: Optional[Any] = None) -> None:
79
+ if shared_lock is not None:
80
+ self.shared_lock = shared_lock
81
+
72
82
  def __contains__(self, value: Any): # pragma: no cover
73
83
  raise NotImplementedError()
74
84
 
@@ -110,7 +120,22 @@ class DatasetBase:
110
120
 
111
121
  return wrapper
112
122
 
123
+ def autolock(func): # pylint: disable=no-self-argument
124
+ """
125
+ A decorator to automatically lock and unlock the shared lock.
126
+ """
127
+
128
+ @functools.wraps(func)
129
+ def wrapper(self, *args, **kwargs):
130
+ if PlatformUtility.is_windows() and self.shared_lock is not None:
131
+ with self.shared_lock:
132
+ return func(self, *args, **kwargs) # pylint: disable=not-callable
133
+ return func(self, *args, **kwargs) # pylint: disable=not-callable
134
+
135
+ return wrapper
136
+
113
137
  @ensure_source_file_exists
138
+ @autolock
114
139
  def get_content(self) -> Optional[dict]:
115
140
  """
116
141
  Provides the cached or the real contend of the dataset (after caching)
@@ -118,6 +118,7 @@ class CSVDatasetBase(DBDatasetBase):
118
118
 
119
119
  @DBDatasetBase.ensure_source_file_exists
120
120
  @DBDatasetBase.execute_if_authorized(None)
121
+ @DBDatasetBase.autolock
121
122
  def add(self, row: dict) -> "CSVDatasetBase":
122
123
  """
123
124
  Adds the given dataset into the CSV file.
@@ -151,6 +152,7 @@ class CSVDatasetBase(DBDatasetBase):
151
152
 
152
153
  @DBDatasetBase.ensure_source_file_exists
153
154
  @DBDatasetBase.execute_if_authorized(None)
155
+ @DBDatasetBase.autolock
154
156
  def remove(self, row: dict) -> "CSVDatasetBase":
155
157
  """
156
158
  Removes the given dataset from the CSV file.
@@ -194,6 +196,7 @@ class CSVDatasetBase(DBDatasetBase):
194
196
 
195
197
  @DBDatasetBase.ensure_source_file_exists
196
198
  @DBDatasetBase.execute_if_authorized(None)
199
+ @DBDatasetBase.autolock
197
200
  def get_content(self) -> Generator[Optional[dict], None, None]:
198
201
  """
199
202
  Provides a generator which provides the next line to read.
@@ -60,6 +60,17 @@ from PyFunceble.dataset.base import DatasetBase
60
60
  class DBDatasetBase(DatasetBase):
61
61
  """
62
62
  Provides the base of all datasets which acts as database interface.
63
+
64
+ :param bool authorized:
65
+ Optional, Whether we are authorized to process or not.
66
+ If not set, :code:`STD_AUTHORIZED` is used.
67
+ :param bool remove_unneeded_fields:
68
+ Optional, Whether we should remove unneeded fields or not.
69
+ If not set, :code:`STD_REMOVE_UNNEEDED_FIELDS` is used.
70
+ :param str config_dir:
71
+ Optional, The configuration directory to use.
72
+ :param Any shared_lock:
73
+ Optional, The shared lock to use to access shared resources.
63
74
  """
64
75
 
65
76
  STD_REMOVE_UNNEEDED_FIELDS: bool = True
@@ -79,6 +90,7 @@ class DBDatasetBase(DatasetBase):
79
90
  authorized: Optional[bool] = None,
80
91
  remove_unneeded_fields: Optional[bool] = None,
81
92
  config_dir: Optional[str] = None,
93
+ shared_lock: Optional[Any] = None,
82
94
  ) -> None:
83
95
  if config_dir is not None:
84
96
  self.config_dir = config_dir
@@ -91,6 +103,8 @@ class DBDatasetBase(DatasetBase):
91
103
  if remove_unneeded_fields is not None:
92
104
  self.set_remove_unneeded_fields(remove_unneeded_fields)
93
105
 
106
+ super().__init__(shared_lock=shared_lock)
107
+
94
108
  self.__post_init__()
95
109
 
96
110
  def __post_init__(self) -> None:
@@ -59,15 +59,20 @@ from PyFunceble.downloader.iana import IANADownloader
59
59
  class IanaDataset(DatasetBase):
60
60
  """
61
61
  Provides the dataset handler for the IANA dataset.
62
+
63
+ :param Any shared_lock:
64
+ Optional, The shared lock to use to access shared resources.
62
65
  """
63
66
 
64
67
  STORAGE_INDEX: str = "IANA"
65
68
  downloader: Optional[IANADownloader] = None
66
69
 
67
- def __init__(self) -> None:
70
+ def __init__(self, *, shared_lock: Optional[Any] = None) -> None:
68
71
  self.downloader = IANADownloader()
69
72
  self.source_file = self.downloader.destination
70
73
 
74
+ super().__init__(shared_lock=shared_lock)
75
+
71
76
  def __contains__(self, value: Any) -> bool:
72
77
  if value.startswith("."):
73
78
  value = value[1:]
@@ -60,15 +60,20 @@ from PyFunceble.helpers.file import FileHelper
60
60
  class IPV4ReputationDataset(DatasetBase):
61
61
  """
62
62
  Provides the interface for the lookup of the IPv4 reputation.
63
+
64
+ :param Any shared_lock:
65
+ Optional, The shared lock to use to access shared resources.
63
66
  """
64
67
 
65
68
  STORAGE_INDEX: Optional[str] = None
66
69
  downloader: Optional[IPV4ReputationDownloader] = None
67
70
 
68
- def __init__(self) -> None:
71
+ def __init__(self, *, shared_lock: Optional[Any] = None) -> None:
69
72
  self.downloader = IPV4ReputationDownloader()
70
73
  self.source_file = self.downloader.destination
71
74
 
75
+ super().__init__(shared_lock=shared_lock)
76
+
72
77
  def __contains__(self, value: Any) -> bool:
73
78
  with self.get_content() as file_stream:
74
79
  for line in file_stream:
@@ -80,6 +85,7 @@ class IPV4ReputationDataset(DatasetBase):
80
85
  return False
81
86
 
82
87
  @DatasetBase.ensure_source_file_exists
88
+ @DatasetBase.autolock
83
89
  def get_content(self) -> open:
84
90
  """
85
91
  Provides a file handler which does let you read the content line by
@@ -59,15 +59,20 @@ from PyFunceble.downloader.public_suffix import PublicSuffixDownloader
59
59
  class PublicSuffixDataset(DatasetBase):
60
60
  """
61
61
  Provides the dataset handler for the Public Suffix List dataset.
62
+
63
+ :param Any shared_lock:
64
+ Optional, The shared lock to use to access shared resources.
62
65
  """
63
66
 
64
67
  STORAGE_INDEX: str = "PUBLIC_SUFFIX"
65
68
  downloader: Optional[PublicSuffixDownloader] = None
66
69
 
67
- def __init__(self) -> None:
70
+ def __init__(self, *, shared_lock: Optional[Any] = None) -> None:
68
71
  self.downloader = PublicSuffixDownloader()
69
72
  self.source_file = self.downloader.destination
70
73
 
74
+ super().__init__(shared_lock=shared_lock)
75
+
71
76
  def __contains__(self, value: Any) -> bool:
72
77
  if value.startswith("."):
73
78
  value = value[1:]
@@ -62,6 +62,9 @@ from PyFunceble.downloader.user_agents import UserAgentsDownloader
62
62
  class UserAgentDataset(DatasetBase):
63
63
  """
64
64
  Provides the dataset and infrastructure for the User Agent navigation
65
+
66
+ :param Any shared_lock:
67
+ Optional, The shared lock to use to access shared resources.
65
68
  """
66
69
 
67
70
  STORAGE_INDEX: str = "USER_AGENTS"
@@ -70,10 +73,12 @@ class UserAgentDataset(DatasetBase):
70
73
  preferred_browser: str = "chrome"
71
74
  preferred_platform: str = "linux"
72
75
 
73
- def __init__(self) -> None:
76
+ def __init__(self, *, shared_lock: Optional[Any] = None) -> None:
74
77
  self.downloader = UserAgentsDownloader()
75
78
  self.source_file = self.downloader.destination
76
79
 
80
+ super().__init__(shared_lock=shared_lock)
81
+
77
82
  def __contains__(self, value: Any) -> bool:
78
83
  content = self.get_content()
79
84
 
PyFunceble/storage.py CHANGED
@@ -60,7 +60,7 @@ from dotenv import load_dotenv
60
60
  from PyFunceble.storage_facility import get_config_directory
61
61
 
62
62
  PROJECT_NAME: str = "PyFunceble"
63
- PROJECT_VERSION: str = "4.3.1.dev"
63
+ PROJECT_VERSION: str = "4.4.0.dev"
64
64
 
65
65
  DISTRIBUTED_CONFIGURATION_FILENAME: str = ".PyFunceble_production.yaml"
66
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFunceble-dev
3
- Version: 4.3.1
3
+ Version: 4.4.0
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,179 +21,179 @@ Classifier: Programming Language :: Python :: 3
21
21
  Requires-Python: >=3.10, <4
22
22
  Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
- Requires-Dist: dnspython[DOH]~=2.8.0
25
- Requires-Dist: PyMySQL
24
+ Requires-Dist: pyfunceble-process-manager==1.0.10
26
25
  Requires-Dist: python-box[all]~=7.3.2
27
- Requires-Dist: requests[socks]<3
28
- Requires-Dist: domain2idna~=1.12.0
26
+ Requires-Dist: PyYAML
29
27
  Requires-Dist: setuptools>=65.5.1
30
- Requires-Dist: python-dotenv
28
+ Requires-Dist: alembic
29
+ Requires-Dist: domain2idna~=1.12.0
31
30
  Requires-Dist: SQLAlchemy~=2.0
32
31
  Requires-Dist: colorama
33
- Requires-Dist: PyYAML
34
- Requires-Dist: packaging
35
- Requires-Dist: pyfunceble-process-manager==1.0.10
36
32
  Requires-Dist: shtab
37
- Requires-Dist: alembic
33
+ Requires-Dist: PyMySQL
38
34
  Requires-Dist: inflection
35
+ Requires-Dist: packaging
36
+ Requires-Dist: requests[socks]<3
37
+ Requires-Dist: dnspython[DOH]~=2.8.0
38
+ Requires-Dist: python-dotenv
39
39
  Provides-Extra: docs
40
- Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
40
+ Requires-Dist: mkdocs-material~=9.5; extra == "docs"
41
41
  Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
42
- Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
43
- Requires-Dist: zipp>=3.19.1; extra == "docs"
42
+ Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
44
43
  Requires-Dist: mkdocs-gen-files~=0.5; extra == "docs"
45
44
  Requires-Dist: mkdocs~=1.5; extra == "docs"
46
- Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
47
- Requires-Dist: mkdocstrings[python]~=1.0; extra == "docs"
45
+ Requires-Dist: zipp>=3.19.1; extra == "docs"
46
+ Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
48
47
  Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
49
48
  Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "docs"
50
- Requires-Dist: mkdocs-material~=9.5; extra == "docs"
49
+ Requires-Dist: mkdocstrings[python]~=1.0; extra == "docs"
50
+ Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
51
51
  Provides-Extra: dev
52
- Requires-Dist: flake8; extra == "dev"
53
- Requires-Dist: isort; extra == "dev"
54
52
  Requires-Dist: black; extra == "dev"
55
53
  Requires-Dist: pylint; extra == "dev"
54
+ Requires-Dist: flake8; extra == "dev"
56
55
  Requires-Dist: bandit; extra == "dev"
56
+ Requires-Dist: isort; extra == "dev"
57
57
  Provides-Extra: test
58
- Requires-Dist: coverage; extra == "test"
59
58
  Requires-Dist: tox; extra == "test"
59
+ Requires-Dist: coverage; extra == "test"
60
60
  Provides-Extra: psql
61
- Requires-Dist: dnspython[DOH]~=2.8.0; extra == "psql"
62
- Requires-Dist: PyMySQL; extra == "psql"
61
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "psql"
63
62
  Requires-Dist: python-box[all]~=7.3.2; extra == "psql"
64
- Requires-Dist: requests[socks]<3; extra == "psql"
65
- Requires-Dist: domain2idna~=1.12.0; extra == "psql"
63
+ Requires-Dist: PyYAML; extra == "psql"
66
64
  Requires-Dist: setuptools>=65.5.1; extra == "psql"
67
- Requires-Dist: python-dotenv; extra == "psql"
65
+ Requires-Dist: psycopg2; extra == "psql"
66
+ Requires-Dist: alembic; extra == "psql"
67
+ Requires-Dist: domain2idna~=1.12.0; extra == "psql"
68
68
  Requires-Dist: SQLAlchemy~=2.0; extra == "psql"
69
69
  Requires-Dist: colorama; extra == "psql"
70
- Requires-Dist: PyYAML; extra == "psql"
71
- Requires-Dist: psycopg2; extra == "psql"
72
- Requires-Dist: packaging; extra == "psql"
73
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "psql"
74
70
  Requires-Dist: shtab; extra == "psql"
75
- Requires-Dist: alembic; extra == "psql"
71
+ Requires-Dist: PyMySQL; extra == "psql"
76
72
  Requires-Dist: inflection; extra == "psql"
73
+ Requires-Dist: packaging; extra == "psql"
74
+ Requires-Dist: requests[socks]<3; extra == "psql"
75
+ Requires-Dist: dnspython[DOH]~=2.8.0; extra == "psql"
76
+ Requires-Dist: python-dotenv; extra == "psql"
77
77
  Provides-Extra: psql-binary
78
- Requires-Dist: dnspython[DOH]~=2.8.0; extra == "psql-binary"
79
- Requires-Dist: psycopg2-binary; extra == "psql-binary"
80
- Requires-Dist: PyMySQL; extra == "psql-binary"
78
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "psql-binary"
81
79
  Requires-Dist: python-box[all]~=7.3.2; extra == "psql-binary"
82
- Requires-Dist: requests[socks]<3; extra == "psql-binary"
83
- Requires-Dist: domain2idna~=1.12.0; extra == "psql-binary"
80
+ Requires-Dist: PyYAML; extra == "psql-binary"
84
81
  Requires-Dist: setuptools>=65.5.1; extra == "psql-binary"
85
- Requires-Dist: python-dotenv; extra == "psql-binary"
82
+ Requires-Dist: alembic; extra == "psql-binary"
83
+ Requires-Dist: domain2idna~=1.12.0; extra == "psql-binary"
86
84
  Requires-Dist: SQLAlchemy~=2.0; extra == "psql-binary"
87
85
  Requires-Dist: colorama; extra == "psql-binary"
88
- Requires-Dist: PyYAML; extra == "psql-binary"
89
- Requires-Dist: packaging; extra == "psql-binary"
90
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "psql-binary"
91
86
  Requires-Dist: shtab; extra == "psql-binary"
92
- Requires-Dist: alembic; extra == "psql-binary"
87
+ Requires-Dist: PyMySQL; extra == "psql-binary"
93
88
  Requires-Dist: inflection; extra == "psql-binary"
89
+ Requires-Dist: psycopg2-binary; extra == "psql-binary"
90
+ Requires-Dist: packaging; extra == "psql-binary"
91
+ Requires-Dist: requests[socks]<3; extra == "psql-binary"
92
+ Requires-Dist: dnspython[DOH]~=2.8.0; extra == "psql-binary"
93
+ Requires-Dist: python-dotenv; extra == "psql-binary"
94
94
  Provides-Extra: postgresql
95
- Requires-Dist: dnspython[DOH]~=2.8.0; extra == "postgresql"
96
- Requires-Dist: PyMySQL; extra == "postgresql"
95
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "postgresql"
97
96
  Requires-Dist: python-box[all]~=7.3.2; extra == "postgresql"
98
- Requires-Dist: requests[socks]<3; extra == "postgresql"
99
- Requires-Dist: domain2idna~=1.12.0; extra == "postgresql"
97
+ Requires-Dist: PyYAML; extra == "postgresql"
100
98
  Requires-Dist: setuptools>=65.5.1; extra == "postgresql"
101
- Requires-Dist: python-dotenv; extra == "postgresql"
99
+ Requires-Dist: psycopg2; extra == "postgresql"
100
+ Requires-Dist: alembic; extra == "postgresql"
101
+ Requires-Dist: domain2idna~=1.12.0; extra == "postgresql"
102
102
  Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql"
103
103
  Requires-Dist: colorama; extra == "postgresql"
104
- Requires-Dist: PyYAML; extra == "postgresql"
105
- Requires-Dist: psycopg2; extra == "postgresql"
106
- Requires-Dist: packaging; extra == "postgresql"
107
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "postgresql"
108
104
  Requires-Dist: shtab; extra == "postgresql"
109
- Requires-Dist: alembic; extra == "postgresql"
105
+ Requires-Dist: PyMySQL; extra == "postgresql"
110
106
  Requires-Dist: inflection; extra == "postgresql"
107
+ Requires-Dist: packaging; extra == "postgresql"
108
+ Requires-Dist: requests[socks]<3; extra == "postgresql"
109
+ Requires-Dist: dnspython[DOH]~=2.8.0; extra == "postgresql"
110
+ Requires-Dist: python-dotenv; extra == "postgresql"
111
111
  Provides-Extra: postgresql-binary
112
- Requires-Dist: dnspython[DOH]~=2.8.0; extra == "postgresql-binary"
113
- Requires-Dist: psycopg2-binary; extra == "postgresql-binary"
114
- Requires-Dist: PyMySQL; extra == "postgresql-binary"
112
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "postgresql-binary"
115
113
  Requires-Dist: python-box[all]~=7.3.2; extra == "postgresql-binary"
116
- Requires-Dist: requests[socks]<3; extra == "postgresql-binary"
117
- Requires-Dist: domain2idna~=1.12.0; extra == "postgresql-binary"
114
+ Requires-Dist: PyYAML; extra == "postgresql-binary"
118
115
  Requires-Dist: setuptools>=65.5.1; extra == "postgresql-binary"
119
- Requires-Dist: python-dotenv; extra == "postgresql-binary"
116
+ Requires-Dist: alembic; extra == "postgresql-binary"
117
+ Requires-Dist: domain2idna~=1.12.0; extra == "postgresql-binary"
120
118
  Requires-Dist: SQLAlchemy~=2.0; extra == "postgresql-binary"
121
119
  Requires-Dist: colorama; extra == "postgresql-binary"
122
- Requires-Dist: PyYAML; extra == "postgresql-binary"
123
- Requires-Dist: packaging; extra == "postgresql-binary"
124
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "postgresql-binary"
125
120
  Requires-Dist: shtab; extra == "postgresql-binary"
126
- Requires-Dist: alembic; extra == "postgresql-binary"
121
+ Requires-Dist: PyMySQL; extra == "postgresql-binary"
127
122
  Requires-Dist: inflection; extra == "postgresql-binary"
123
+ Requires-Dist: psycopg2-binary; extra == "postgresql-binary"
124
+ Requires-Dist: packaging; extra == "postgresql-binary"
125
+ Requires-Dist: requests[socks]<3; extra == "postgresql-binary"
126
+ Requires-Dist: dnspython[DOH]~=2.8.0; extra == "postgresql-binary"
127
+ Requires-Dist: python-dotenv; extra == "postgresql-binary"
128
128
  Provides-Extra: full
129
- Requires-Dist: python-box[all]~=7.3.2; extra == "full"
130
- Requires-Dist: flake8; extra == "full"
131
- Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
132
- Requires-Dist: domain2idna~=1.12.0; extra == "full"
133
- Requires-Dist: tox; extra == "full"
134
- Requires-Dist: SQLAlchemy~=2.0; extra == "full"
135
- Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "full"
129
+ Requires-Dist: PyYAML; extra == "full"
136
130
  Requires-Dist: mkdocs-gen-files~=0.5; extra == "full"
131
+ Requires-Dist: shtab; extra == "full"
132
+ Requires-Dist: PyMySQL; 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: tox; extra == "full"
136
+ Requires-Dist: bandit; extra == "full"
137
137
  Requires-Dist: isort; extra == "full"
138
+ Requires-Dist: mkdocs-material~=9.5; extra == "full"
139
+ Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
140
+ Requires-Dist: mkdocs~=1.5; extra == "full"
141
+ Requires-Dist: SQLAlchemy~=2.0; extra == "full"
138
142
  Requires-Dist: coverage; extra == "full"
139
- Requires-Dist: mkdocstrings[python]~=1.0; extra == "full"
140
- Requires-Dist: alembic; extra == "full"
141
143
  Requires-Dist: inflection; extra == "full"
142
144
  Requires-Dist: dnspython[DOH]~=2.8.0; extra == "full"
143
- Requires-Dist: bandit; extra == "full"
144
- Requires-Dist: PyMySQL; extra == "full"
145
+ Requires-Dist: pymdown-extensions~=10.9; extra == "full"
146
+ Requires-Dist: python-box[all]~=7.3.2; extra == "full"
147
+ Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
148
+ Requires-Dist: alembic; extra == "full"
145
149
  Requires-Dist: colorama; extra == "full"
146
- Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "full"
147
- Requires-Dist: zipp>=3.19.1; extra == "full"
148
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "full"
149
- Requires-Dist: mkdocs~=1.5; extra == "full"
150
- Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
151
- Requires-Dist: setuptools>=65.5.1; extra == "full"
152
- Requires-Dist: python-dotenv; extra == "full"
153
- Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
154
- Requires-Dist: PyYAML; extra == "full"
155
150
  Requires-Dist: packaging; extra == "full"
156
- Requires-Dist: pymdown-extensions~=10.9; extra == "full"
157
- Requires-Dist: pylint; extra == "full"
158
151
  Requires-Dist: requests[socks]<3; extra == "full"
159
- Requires-Dist: shtab; extra == "full"
152
+ Requires-Dist: python-dotenv; extra == "full"
153
+ Requires-Dist: mkdocstrings[python]~=1.0; extra == "full"
154
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "full"
160
155
  Requires-Dist: black; extra == "full"
161
- Requires-Dist: mkdocs-material~=9.5; extra == "full"
156
+ Requires-Dist: setuptools>=65.5.1; extra == "full"
157
+ Requires-Dist: domain2idna~=1.12.0; extra == "full"
158
+ Requires-Dist: zipp>=3.19.1; extra == "full"
159
+ Requires-Dist: flake8; extra == "full"
160
+ Requires-Dist: pylint; extra == "full"
161
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
162
162
  Provides-Extra: all
163
- Requires-Dist: psycopg2-binary; extra == "all"
164
- Requires-Dist: python-box[all]~=7.3.2; extra == "all"
165
- Requires-Dist: flake8; extra == "all"
166
- Requires-Dist: mkdocs-literate-nav~=0.6; extra == "all"
167
- Requires-Dist: domain2idna~=1.12.0; extra == "all"
168
- Requires-Dist: tox; extra == "all"
169
- Requires-Dist: SQLAlchemy~=2.0; extra == "all"
170
- Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "all"
163
+ Requires-Dist: PyYAML; extra == "all"
171
164
  Requires-Dist: mkdocs-gen-files~=0.5; extra == "all"
165
+ Requires-Dist: shtab; extra == "all"
166
+ Requires-Dist: PyMySQL; extra == "all"
167
+ Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "all"
168
+ Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "all"
169
+ Requires-Dist: tox; extra == "all"
170
+ Requires-Dist: bandit; extra == "all"
172
171
  Requires-Dist: isort; extra == "all"
172
+ Requires-Dist: mkdocs-material~=9.5; extra == "all"
173
+ Requires-Dist: mkdocs-section-index~=0.3; extra == "all"
174
+ Requires-Dist: mkdocs~=1.5; extra == "all"
175
+ Requires-Dist: SQLAlchemy~=2.0; extra == "all"
173
176
  Requires-Dist: coverage; extra == "all"
174
- Requires-Dist: mkdocstrings[python]~=1.0; extra == "all"
175
- Requires-Dist: alembic; extra == "all"
176
177
  Requires-Dist: inflection; extra == "all"
177
178
  Requires-Dist: dnspython[DOH]~=2.8.0; extra == "all"
178
- Requires-Dist: bandit; extra == "all"
179
- Requires-Dist: PyMySQL; extra == "all"
179
+ Requires-Dist: pymdown-extensions~=10.9; extra == "all"
180
+ Requires-Dist: python-box[all]~=7.3.2; extra == "all"
181
+ Requires-Dist: mkdocs-literate-nav~=0.6; extra == "all"
182
+ Requires-Dist: alembic; extra == "all"
180
183
  Requires-Dist: colorama; extra == "all"
181
- Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "all"
182
- Requires-Dist: zipp>=3.19.1; extra == "all"
183
- Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "all"
184
- Requires-Dist: mkdocs~=1.5; extra == "all"
185
- Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "all"
186
- Requires-Dist: setuptools>=65.5.1; extra == "all"
187
- Requires-Dist: python-dotenv; extra == "all"
188
- Requires-Dist: mkdocs-section-index~=0.3; extra == "all"
189
- Requires-Dist: PyYAML; extra == "all"
190
184
  Requires-Dist: packaging; extra == "all"
191
- Requires-Dist: pymdown-extensions~=10.9; extra == "all"
192
- Requires-Dist: pylint; extra == "all"
193
185
  Requires-Dist: requests[socks]<3; extra == "all"
194
- Requires-Dist: shtab; extra == "all"
186
+ Requires-Dist: python-dotenv; extra == "all"
187
+ Requires-Dist: mkdocstrings[python]~=1.0; extra == "all"
188
+ Requires-Dist: pyfunceble-process-manager==1.0.10; extra == "all"
195
189
  Requires-Dist: black; extra == "all"
196
- Requires-Dist: mkdocs-material~=9.5; extra == "all"
190
+ Requires-Dist: setuptools>=65.5.1; extra == "all"
191
+ Requires-Dist: domain2idna~=1.12.0; extra == "all"
192
+ Requires-Dist: zipp>=3.19.1; extra == "all"
193
+ Requires-Dist: flake8; extra == "all"
194
+ Requires-Dist: pylint; extra == "all"
195
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "all"
196
+ Requires-Dist: psycopg2-binary; extra == "all"
197
197
  Dynamic: author
198
198
  Dynamic: author-email
199
199
  Dynamic: classifier
@@ -4,17 +4,17 @@ PyFunceble/facility.py,sha256=GXjY78VPTh7eBHccpesohjJH7K5jSM6efJcZGk7gulQ,2664
4
4
  PyFunceble/factory.py,sha256=-tJEHJhX_yhfp0fOl7np2OCaxSdfKuWj5ioa57MoB48,2614
5
5
  PyFunceble/logger.py,sha256=ATiCxdpzH3ht5NHHQCY87-_8vHSe6tZ7P6y2QwAgn6g,17617
6
6
  PyFunceble/sessions.py,sha256=5zgaUjY_QiGSSH9IeMI8fP_g9Ypcn_1_-Cif623elK0,2574
7
- PyFunceble/storage.py,sha256=PO1OP15LlUbSRaYWxfGHrol6rODJJwoi3X554iomQno,5376
7
+ PyFunceble/storage.py,sha256=s_F1ZDvGG17rTFXYcuZU-3ahbe5NTW9JvTS1Thw82EY,5376
8
8
  PyFunceble/storage_facility.py,sha256=hK7eoCtFdBaMFcGsEMEU-mNGxr0kqneyVJSuSgB4CuM,4825
9
9
  PyFunceble/checker/__init__.py,sha256=jv0IWODVKAOBFq9hK8ZUMXMUV7JN_6CKUSzKCH-MOD8,2436
10
- PyFunceble/checker/base.py,sha256=GEUwyHgg0rn4tn1mN7fTa_ywL9Uhp5C4rA1ieX3qIKM,13800
10
+ PyFunceble/checker/base.py,sha256=nS2IGjb_UFY9vFfOeL0wxLj7YYl-Rk2hv3qammV8V_k,14228
11
11
  PyFunceble/checker/complex_json_encoder.py,sha256=zDDKTFB2R5kB-QoTFAdQJ09dXp3DUWGBWwFFoQxjVUk,3196
12
12
  PyFunceble/checker/params_base.py,sha256=IJqWVtsD0nRDzwJ1SpxbCTpsBam8id0CUZEvVArT85g,3287
13
13
  PyFunceble/checker/status_base.py,sha256=7ujpDw9lnqIe_2WVSNfRYFuKdslKr3Dw2HSW35JrODM,3590
14
14
  PyFunceble/checker/availability/__init__.py,sha256=ZhJytBKoC0js52SADxNJkYvgXCKG9-OLpmZ6lfHuMas,2481
15
- PyFunceble/checker/availability/base.py,sha256=FKiH0KwYIZjoIKsVjyAwrzgBl6fwTqwNxlxXu6xvQmw,39757
16
- PyFunceble/checker/availability/domain.py,sha256=HF8xk4BqYVIQevCM58ZbUo4wJz75yCAhDtxsxzF9qUI,8040
17
- PyFunceble/checker/availability/domain_and_ip.py,sha256=T794OhT_5NGpOa28HlA_6IrqpoNRz71NYtdSGAY8KbU,6583
15
+ PyFunceble/checker/availability/base.py,sha256=w6uUumrU0-LGqJqNoJrPYNmGZocXYxrcCY_53hOyL-c,40120
16
+ PyFunceble/checker/availability/domain.py,sha256=jcQmg_ZqrpRma6Hk1PytJ7C8uEfVHPh9xH8OWd-1LG0,8092
17
+ PyFunceble/checker/availability/domain_and_ip.py,sha256=z8gjPFyWibVIRO6RdVLZC9hfsXqYfYBXGyMUjnJ2j7o,6675
18
18
  PyFunceble/checker/availability/ip.py,sha256=_A-vCoxTShR9xjpRJuKdWyXdggSQzrsxE9LuwMlW4YQ,7627
19
19
  PyFunceble/checker/availability/params.py,sha256=7dvDTvB1NlI3eTFr1yIX1v0NU_SzTgmh3rzDjiOEQfU,3210
20
20
  PyFunceble/checker/availability/status.py,sha256=dlIQ8rcGNyBCiWJfrCCKiHpea0XZ3Y2sS4iCoL4RcS4,5400
@@ -28,7 +28,7 @@ PyFunceble/checker/availability/extras/parked.py,sha256=r_ylA8efXj8ASb_EXmKaLrKU
28
28
  PyFunceble/checker/availability/extras/rules.py,sha256=PZp79hsl2A7RY0Y0IO_ymqLShLM0NTFTvR0X6TzNpcQ,11546
29
29
  PyFunceble/checker/availability/extras/subject_switch.py,sha256=j1f_nAC9NkJvWiXKP1nfqIm5a58iHx5Y0cBBRjUHPAs,5842
30
30
  PyFunceble/checker/reputation/__init__.py,sha256=iS_hjva8eKqdgyyOzDoR5agcsZgEduCsh9eUDsQk-BU,2480
31
- PyFunceble/checker/reputation/base.py,sha256=6bWjmINlmfrQjc7HyPcqRLJcDMPWYc4lTrsUcK9ki7Q,12259
31
+ PyFunceble/checker/reputation/base.py,sha256=JmWFMPkLGrC7C7oIxtadw-6DxZvkdL9Y-Nlc7rj7vIg,12628
32
32
  PyFunceble/checker/reputation/domain.py,sha256=rJ5aIgNH_byy4IqqZKZLbuZUCpF-fJEbRKtG9NKPu6k,3460
33
33
  PyFunceble/checker/reputation/domain_and_ip.py,sha256=pQRGS7a-IFf_DdjP7TXL27n90VUg6Dt_PXSl3ENpiB4,4164
34
34
  PyFunceble/checker/reputation/ip.py,sha256=nasmBs9doJvi8EWghqFDQAXsb5PuhmSPvLU4LvT2SVU,3779
@@ -36,7 +36,7 @@ PyFunceble/checker/reputation/params.py,sha256=4EVikg27BDx2sDCzFi6KPlM0SIxPT0v_w
36
36
  PyFunceble/checker/reputation/status.py,sha256=vn4NSoUTMZN_N__65-NSs_aXc-NbqEgt-fWt3f-koB8,4059
37
37
  PyFunceble/checker/reputation/url.py,sha256=2vgamJA02MxlgvWAvFBlCBnJ_PW2hzLcGdH0l4M0bOs,4548
38
38
  PyFunceble/checker/syntax/__init__.py,sha256=U9g1-TJ3W91F_aE80LCPokXmEdNFzYCbBgyE_BVzths,2476
39
- PyFunceble/checker/syntax/base.py,sha256=uPO8P_Qb1eMM7KeFZWR_aYfCJpSYfxtiudRPSk3Jp8g,4555
39
+ PyFunceble/checker/syntax/base.py,sha256=1uMmtFw-2n-xY1MVB_abTq92d2juCWySIssHOo_YlqI,4650
40
40
  PyFunceble/checker/syntax/domain.py,sha256=wnJzv8R82nsyNDtTy4GIMUtyH-i6-loBoC3V8SB-z9M,4943
41
41
  PyFunceble/checker/syntax/domain_and_ip.py,sha256=a7zokxjNWY3ToAGn8HYg27lS-2vo2xaRAyVGzgzD08c,3656
42
42
  PyFunceble/checker/syntax/domain_base.py,sha256=n5EHw2iRgDsVO3VcfyZCRqB1R3gVNamFdhO1wAM2Mxk,6899
@@ -49,7 +49,7 @@ PyFunceble/checker/syntax/status.py,sha256=MW4f3T8EDeKL-SpF4IHEeWxQhH__A4FSCDKqg
49
49
  PyFunceble/checker/syntax/subdomain.py,sha256=LV38_53Zk3KbPeLpNfP7f_6qTfXFybBHMe4WstdoLX0,4260
50
50
  PyFunceble/checker/syntax/url.py,sha256=6b3CEW7JoUuW3U5EZ2fpOshETUPRMDPUOXlIzxUwRGM,4513
51
51
  PyFunceble/checker/utils/__init__.py,sha256=H3XMmhfP8oWzwhXZrtUAzkcVoQ7eaBT-v168PzP7B1g,2462
52
- PyFunceble/checker/utils/whois.py,sha256=4s4HqBvf0TQsle2HbVY04grRf5YyNittPn6P521Pa-U,4076
52
+ PyFunceble/checker/utils/whois.py,sha256=jaYlFPw4M1Z_xAljWD3Zo-C-BX1jhdEzTejjNiqNwW8,4241
53
53
  PyFunceble/cli/__init__.py,sha256=aJSPStzK8t9XjrmFRx0gixMjvJwZBcB7V0Qm9gZ9GAM,2459
54
54
  PyFunceble/cli/credential_loader.py,sha256=hNYzmnhneOX-RW-ISUIPOZR6BtHFoMfamwoop0Isnnw,10557
55
55
  PyFunceble/cli/execution_time.py,sha256=NXvS5rBFH8Qplt4A70fMa69PZZihVRxaPqjsCbkvCPo,7223
@@ -112,7 +112,7 @@ PyFunceble/cli/migrators/mariadb/base.py,sha256=_FIR7bEav0T6zbIGm9JcnyzgbiZ4-vJU
112
112
  PyFunceble/cli/migrators/mariadb/file_and_status.py,sha256=cFor7GAcCmn_vm8GXeI8_ZjhTTQcjRREb16QQVqcZHQ,7314
113
113
  PyFunceble/cli/migrators/mariadb/whois_record_idna_subject.py,sha256=vp8T1MPb9lLSq40nz5PGfBBQ8FHeEoGRlM_Ph75iBjc,4385
114
114
  PyFunceble/cli/processes/__init__.py,sha256=7fatRX9WDgzEZVrmiaio5-A0izU1RMTi41p6TpBvGRs,2652
115
- PyFunceble/cli/processes/base.py,sha256=Ja5e4fleVAlM1fO6lvT5lH5FerBqskeI_bKBbl_Jx-A,2721
115
+ PyFunceble/cli/processes/base.py,sha256=wRxl32EOyeOhOT1sScgS-unjirExoB5ZMyYH81ID0SQ,3036
116
116
  PyFunceble/cli/processes/chancy_producer.py,sha256=vPvdrIKqkl2p0g5hvO5FQmDV4Hvt8Yd_Z37lbmcmQhs,3111
117
117
  PyFunceble/cli/processes/chancy_tester.py,sha256=ZCrkX7QOSJZ23VZPg3s0DVqJjxJ-QT-QJr5K3n9DuxY,3095
118
118
  PyFunceble/cli/processes/dir_files_sorter.py,sha256=J14pRoTxMOINdkFv70BL6AovRmwJ05VR_dtAiqBEoi4,2851
@@ -130,8 +130,8 @@ PyFunceble/cli/processes/workers/file_sorter.py,sha256=TRYcbdRbC22laJ3Wju3zCOuN2
130
130
  PyFunceble/cli/processes/workers/file_sorter_base.py,sha256=giMqirqjxvGNdAyIDl1E0QfWjR0hlx28LzQfKk1DSyo,8008
131
131
  PyFunceble/cli/processes/workers/migrator.py,sha256=aXGPxW_cZcaMxwfmXFPoqeYi4Y-K4sFWq6pwtN3qi6g,3473
132
132
  PyFunceble/cli/processes/workers/miner.py,sha256=olP3Z-oe-nvUl2NJaEjTEjQlByFSdFmsgZL7ukXiCpY,7085
133
- PyFunceble/cli/processes/workers/producer.py,sha256=SZy7PS1kFNRme3IqLji_XMYX9sJ45FSY_egjqr5pg5k,17973
134
- PyFunceble/cli/processes/workers/tester.py,sha256=gCUXOL3WyTLECeEN8qUXaRkqf_qHF1i37BXyAoXc8sM,11595
133
+ PyFunceble/cli/processes/workers/producer.py,sha256=ttmS0U2J_LYXo6VzjNefUOXqeCKA3xzVzVlIu_6xZdU,18129
134
+ PyFunceble/cli/processes/workers/tester.py,sha256=RCPwu6stKOu6fpuBuGtSifi39ZsWBgRCpFsGk5pE588,11697
135
135
  PyFunceble/cli/scripts/__init__.py,sha256=p1aKZKkngIZiexgTByBOhn0CqkDI_OQWbZwoNvbFVH4,2443
136
136
  PyFunceble/cli/scripts/iana.py,sha256=BN9dngD3rfQ0KeDx_scpWd8U2XAv6duIKE1ybq2MPXI,10538
137
137
  PyFunceble/cli/scripts/production.py,sha256=FTFe7zheoDNv61gxcLlJvsDeag_yhuGMrD_FBhdrt2I,16626
@@ -139,12 +139,12 @@ PyFunceble/cli/scripts/public_suffix.py,sha256=BY0eTJbZ5NIebbz89q9V1NoULFvetWjVy
139
139
  PyFunceble/cli/system/__init__.py,sha256=wBriuC2hLkzZzx9xH2Su2K-4pRaXDSv4Y-soVT10cdc,2514
140
140
  PyFunceble/cli/system/base.py,sha256=MIrGkm8YvE0oBk3bWSs_7oVkAXAOBlm1vy7m4eWL1S4,4881
141
141
  PyFunceble/cli/system/integrator.py,sha256=U-yEWX-1cDB2-N-mTT-3f2Q9q9RE6rVRPaBZ0UalTT4,12338
142
- PyFunceble/cli/system/launcher.py,sha256=Uk0SM7HXxKaJpsmHazow-pvajdL_Vdh1DR4P1iHXHTA,48585
142
+ PyFunceble/cli/system/launcher.py,sha256=q_zAK587y8ElfZWBfHEOuJRMkc-Dz7SlRFaZUD98yNs,49068
143
143
  PyFunceble/cli/utils/__init__.py,sha256=yu_2nPAZ-16yYYnUIoS0bbMwscMgH0i5dB2CdcxRU_I,2457
144
144
  PyFunceble/cli/utils/ascii_logo.py,sha256=sTtpa8OxRkGgAy_gMB8ubINyZ3ExkDna7WuN4fpa3EI,4228
145
145
  PyFunceble/cli/utils/sort.py,sha256=fPaVucMT6xzGq27EvMtgTYHA7wC3WVez3mBQuH-NwyE,4367
146
146
  PyFunceble/cli/utils/stdout.py,sha256=4JmrfX8sgrdarJUAlrzMG5FGU8maJBc8bHii7JcBvlM,5631
147
- PyFunceble/cli/utils/testing.py,sha256=QDLgMvYPpTTZei4A5ZoxskmIDd83S60_CCv4vTIJZnA,9713
147
+ PyFunceble/cli/utils/testing.py,sha256=7omJfxclbQS5ceyaTF9QKcGuUT8EjuigvJ1o6AGdLQg,9999
148
148
  PyFunceble/cli/utils/version.py,sha256=dk4xImLNBvDM3PMhqg3h7LVDBDMUdatmEsr4o5dSM6s,13921
149
149
  PyFunceble/config/__init__.py,sha256=RZVudb1KuB_KZ_QIKg7EyHXMDm8ULPwT63ZcOkbC9Js,2460
150
150
  PyFunceble/config/compare.py,sha256=Ut1y-gFz2cNyYB7Z5J4Pt3jk5fHhn2YhxD03g2fkLq8,13737
@@ -204,17 +204,17 @@ PyFunceble/database/sqlalchemy/__init__.py,sha256=Cu-8bn3igMOtsRr3Eh2Op7Df4nm4s3
204
204
  PyFunceble/database/sqlalchemy/all_schemas.py,sha256=2gLbvH_4bC1jHU0aC08z5IpNawwxlLfBhdkisYZGZBI,2661
205
205
  PyFunceble/database/sqlalchemy/base_schema.py,sha256=SABdemDiteFv0l8Je0GMG8CDYwkVksGWPHORQ7XBcTc,3593
206
206
  PyFunceble/dataset/__init__.py,sha256=xS4Kfv_pQFwTGRB0sf9M8Wta4HfDURhdvw2XXov9pjs,2461
207
- PyFunceble/dataset/base.py,sha256=O4CYdhpO7oIITlP8TmslClAHXCb17bIn3mdM1FaZORk,5281
208
- PyFunceble/dataset/csv_base.py,sha256=qQjchYOFD8LikJfl-UwVn5dl7Bm05rZbwv8JSzbAjCo,9842
209
- PyFunceble/dataset/db_base.py,sha256=KnDYzENPgs4Cmee2AlCkaVKXpKzC_wuFURGy5b6f5yI,10474
210
- PyFunceble/dataset/iana.py,sha256=_DAYcX4wmxHyIPVbkrzhdbA_fid-awb5EyVQ4nt8w7A,4027
211
- PyFunceble/dataset/ipv4_reputation.py,sha256=VlfMoqSzBdtBCB7rdCpYcUPziDUWlshfcQ7w7XZoCls,3983
212
- PyFunceble/dataset/public_suffix.py,sha256=fAvf0h2ks0-lkBf9-NUpsW2RNI3drbDqxMnbs4OoOcQ,4091
207
+ PyFunceble/dataset/base.py,sha256=m5Z6IpoMZKBpWZ7tKm4CKw1Pv48kNls2i4RA4dq6pS4,6174
208
+ PyFunceble/dataset/csv_base.py,sha256=yeJhK43ugzypJwpgrpVIu_PTQ2mDZC9G6PzKuuVUTtE,9926
209
+ PyFunceble/dataset/db_base.py,sha256=rWfEQ_s92AQEvid03P6LbZYHG3Q2j4e0CGhoTNNHJbw,11061
210
+ PyFunceble/dataset/iana.py,sha256=kN1mddYMyHMb-zX-0Wnkg7qbGQWd3i1wVrQr93bbJ-Y,4214
211
+ PyFunceble/dataset/ipv4_reputation.py,sha256=XRsj0ZUJ3FS4-n47yu4cyLuvptdUSwr4hTbC9gbOcb0,4196
212
+ PyFunceble/dataset/public_suffix.py,sha256=CUGLYnxPphNjy4IQni-gSaapisy8gc2_3BsLVErz2rA,4278
213
213
  PyFunceble/dataset/sql_base.py,sha256=UQVcHFq7fPyTQu5clOeAnOah_fwfMlWxuhQqDYHc6qA,10576
214
- PyFunceble/dataset/user_agent.py,sha256=tuBdYRi975ueuZuZGy08GANcqr8IsBJht0V047inN0M,9010
214
+ PyFunceble/dataset/user_agent.py,sha256=xLnpykaXEIfClGedy-maixEbYin6ZtykawpnxDecu70,9197
215
215
  PyFunceble/dataset/autocontinue/__init__.py,sha256=3wGegJYhcs5DpJnl0hR2Z8u03iGz0Qp1PrHJ1zk-HhU,2467
216
216
  PyFunceble/dataset/autocontinue/base.py,sha256=XBvkPIEnHCFDrkvL6Ox91ohF6IxJT14XetW6qjlbOeY,3505
217
- PyFunceble/dataset/autocontinue/csv.py,sha256=Ktc52HlpyNnrR3gS37u5d1IWs2issyujlK0FthjfOAA,6281
217
+ PyFunceble/dataset/autocontinue/csv.py,sha256=5cQBif8-zTCupaIUBx5DlRwXc1GrezhA1PYXzVKxaSI,6869
218
218
  PyFunceble/dataset/autocontinue/sql.py,sha256=NLMenhfk2Rdvd3FMF7T1zncK8vEnGP3CrT8D0kInfzw,4277
219
219
  PyFunceble/dataset/inactive/__init__.py,sha256=TYGknHk2j-dP6N8_WK1ESFfWG3CSyD7c0VfNydJpYmI,2476
220
220
  PyFunceble/dataset/inactive/base.py,sha256=NmSGwiR1wJXTWKiVNYHno3V5WiSsGObUow3ptCIulmI,3248
@@ -276,9 +276,9 @@ PyFunceble/utils/__init__.py,sha256=AmqnVKTnt-IjOH2yhJzB6rrQbCy9oGSymXXk447rLd0,
276
276
  PyFunceble/utils/platform.py,sha256=OSXmgySSiHJNOaFK5yvLJFB5QARWI45iqQARZx9F1D4,3912
277
277
  PyFunceble/utils/profile.py,sha256=gk4wSFjwt6nj2ytvE2EtJJy16W7NsJwNu1HudRDngEw,4558
278
278
  PyFunceble/utils/version.py,sha256=WEQhJcfsvhoUStFK63cLVTlTtAMW1-EZUnfH5N4AkOc,8377
279
- pyfunceble_dev-4.3.1.dist-info/licenses/LICENSE,sha256=rE8fp-5WWAbUGya8mg2fMTIkcw3fPA1PNG86URxH3U4,10802
280
- pyfunceble_dev-4.3.1.dist-info/METADATA,sha256=RUIygmAcbBTywt8acHC91HFuH4l1nGU_W4Q_bgYN0mU,47752
281
- pyfunceble_dev-4.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
282
- pyfunceble_dev-4.3.1.dist-info/entry_points.txt,sha256=Ic1suwopOi_XTgiQi2ErtpY5xT3R8EFMI6B_ONDuR9E,201
283
- pyfunceble_dev-4.3.1.dist-info/top_level.txt,sha256=J7GBKIiNYv93m1AxLy8_gr6ExXyZbMmCVXHMQBTUq2Y,11
284
- pyfunceble_dev-4.3.1.dist-info/RECORD,,
279
+ pyfunceble_dev-4.4.0.dist-info/licenses/LICENSE,sha256=rE8fp-5WWAbUGya8mg2fMTIkcw3fPA1PNG86URxH3U4,10802
280
+ pyfunceble_dev-4.4.0.dist-info/METADATA,sha256=Rst02xbb0ESu_6Bay5KhWv5WqeOmyx66V8wLhaNiSuE,47752
281
+ pyfunceble_dev-4.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
282
+ pyfunceble_dev-4.4.0.dist-info/entry_points.txt,sha256=Ic1suwopOi_XTgiQi2ErtpY5xT3R8EFMI6B_ONDuR9E,201
283
+ pyfunceble_dev-4.4.0.dist-info/top_level.txt,sha256=J7GBKIiNYv93m1AxLy8_gr6ExXyZbMmCVXHMQBTUq2Y,11
284
+ pyfunceble_dev-4.4.0.dist-info/RECORD,,