PyFunceble-dev 4.2.28a1__py3-none-any.whl → 4.3.0a1__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 (37) hide show
  1. PyFunceble/cli/entry_points/pyfunceble/cli.py +22 -0
  2. PyFunceble/cli/filesystem/dir_structure/base.py +1 -2
  3. PyFunceble/cli/migrators/base.py +47 -1
  4. PyFunceble/cli/migrators/csv_file/inactive_source_delete.py +1 -1
  5. PyFunceble/cli/migrators/csv_file/whois_registrar_add.py +1 -1
  6. PyFunceble/cli/migrators/file_cleanup/hashes_file.py +1 -1
  7. PyFunceble/cli/migrators/file_cleanup/mining_file.py +1 -1
  8. PyFunceble/cli/migrators/file_cleanup/production_config_file.py +1 -1
  9. PyFunceble/cli/migrators/json2csv/inactive.py +1 -1
  10. PyFunceble/cli/migrators/json2csv/whois.py +1 -1
  11. PyFunceble/cli/scripts/production.py +67 -26
  12. PyFunceble/cli/system/integrator.py +51 -14
  13. PyFunceble/cli/system/launcher.py +17 -6
  14. PyFunceble/config/loader.py +146 -22
  15. PyFunceble/database/credential/base.py +46 -3
  16. PyFunceble/dataset/base.py +3 -3
  17. PyFunceble/dataset/csv_base.py +3 -1
  18. PyFunceble/dataset/db_base.py +44 -0
  19. PyFunceble/dataset/iana.py +3 -6
  20. PyFunceble/dataset/inactive/csv.py +4 -2
  21. PyFunceble/dataset/ipv4_reputation.py +5 -9
  22. PyFunceble/dataset/public_suffix.py +4 -8
  23. PyFunceble/dataset/user_agent.py +4 -7
  24. PyFunceble/dataset/whois/csv.py +1 -1
  25. PyFunceble/downloader/base.py +64 -5
  26. PyFunceble/downloader/iana.py +4 -11
  27. PyFunceble/downloader/ipv4_reputation.py +2 -11
  28. PyFunceble/downloader/public_suffix.py +5 -11
  29. PyFunceble/downloader/user_agents.py +5 -11
  30. PyFunceble/query/whois/query_tool.py +1 -0
  31. PyFunceble/storage.py +2 -19
  32. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/METADATA +67 -67
  33. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/RECORD +37 -37
  34. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/LICENSE +0 -0
  35. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/WHEEL +0 -0
  36. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/entry_points.txt +0 -0
  37. {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/top_level.txt +0 -0
@@ -89,25 +89,47 @@ class DownloaderBase:
89
89
  every hour.
90
90
  """
91
91
 
92
+ DEFAULT_DOWNLOAD_URL: Optional[str] = None
93
+ """
94
+ The URL to download.
95
+ """
96
+
97
+ DEFAULT_FILENAME: Optional[str] = None
98
+ """
99
+ The name of the file to download.
100
+ """
101
+
92
102
  all_downtimes: Optional[dict] = {}
93
103
  """
94
104
  Stores the download time of all files (self managed).
95
105
  """
96
106
 
107
+ _config_dir: Optional[str] = None
97
108
  _destination: Optional[str] = None
98
109
  _download_link: Optional[str] = None
99
110
 
100
- dict_helper: DictHelper = DictHelper()
111
+ dict_helper: Optional[DictHelper] = None
112
+
113
+ def __init__(self, *, config_dir: Optional[str] = None) -> None:
114
+ self.dict_helper = DictHelper()
115
+
116
+ if config_dir is not None:
117
+ self.config_dir = config_dir
118
+ else:
119
+ self.config_dir = PyFunceble.storage.CONFIG_DIRECTORY
101
120
 
102
- def __init__(self) -> None:
103
121
  self.downtimes_file = FileHelper(
104
- os.path.join(
105
- PyFunceble.storage.CONFIG_DIRECTORY, PyFunceble.storage.DOWN_FILENAME
106
- )
122
+ os.path.join(self.config_dir, ".pyfunceble_intern_downtime.json")
107
123
  )
108
124
 
109
125
  self.all_downtimes.update(self.get_all_downtimes())
110
126
 
127
+ if self.DEFAULT_DOWNLOAD_URL is not None:
128
+ self.download_link = self.DEFAULT_DOWNLOAD_URL
129
+
130
+ if self.DEFAULT_FILENAME is not None:
131
+ self.destination = os.path.join(self.config_dir, self.DEFAULT_FILENAME)
132
+
111
133
  @property
112
134
  def authorized(self) -> bool:
113
135
  """
@@ -116,6 +138,43 @@ class DownloaderBase:
116
138
 
117
139
  raise NotImplementedError()
118
140
 
141
+ @property
142
+ def config_dir(self) -> Optional[str]:
143
+ """
144
+ Provides the current state of the :code:`_config_dir` attribute.
145
+ """
146
+
147
+ return self._config_dir
148
+
149
+ @config_dir.setter
150
+ def config_dir(self, value: str) -> None:
151
+ """
152
+ Sets the configuration directory.
153
+
154
+ :param value:
155
+ The value to set.
156
+
157
+ :raise TypeError:
158
+ When value is not a :py:class:`str`.
159
+ """
160
+
161
+ if not isinstance(value, str):
162
+ raise TypeError(f"<value> should be {str}, {type(value)} given.")
163
+
164
+ self._config_dir = value
165
+
166
+ def set_config_dir(self, value: str) -> "DownloaderBase":
167
+ """
168
+ Sets the configuration directory.
169
+
170
+ :param value:
171
+ The value to set.
172
+ """
173
+
174
+ self.config_dir = value
175
+
176
+ return self
177
+
119
178
  @property
120
179
  def destination(self) -> Optional[str]:
121
180
  """
@@ -50,9 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import os
54
-
55
- import PyFunceble.storage
56
53
  from PyFunceble.downloader.base import DownloaderBase
57
54
 
58
55
 
@@ -64,14 +61,10 @@ class IANADownloader(DownloaderBase):
64
61
  DOWNTIME_INDEX: str = "iana"
65
62
  DOWNLOAD_FREQUENCY: int = 1
66
63
 
67
- def __init__(self) -> None:
68
- self.destination = os.path.join(
69
- PyFunceble.storage.CONFIG_DIRECTORY,
70
- PyFunceble.storage.IANA_DUMP_FILENAME,
71
- )
72
- self.download_link = PyFunceble.storage.IANA_DUMP_LINK
73
-
74
- super().__init__()
64
+ DEFAULT_DOWNLOAD_URL: str = (
65
+ "https://raw.githubusercontent.com/PyFunceble/iana/master/iana-domains-db.json"
66
+ )
67
+ DEFAULT_FILENAME: str = "iana-domains-db.json"
75
68
 
76
69
  @property
77
70
  def authorized(self) -> bool:
@@ -50,9 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import os
54
-
55
- import PyFunceble.storage
56
53
  from PyFunceble.downloader.base import DownloaderBase
57
54
 
58
55
 
@@ -64,14 +61,8 @@ class IPV4ReputationDownloader(DownloaderBase):
64
61
  DOWNTIME_INDEX: str = "ipv4_reputation"
65
62
  DOWNLOAD_FREQUENCY: int = 1
66
63
 
67
- def __init__(self) -> None:
68
- self.destination = os.path.join(
69
- PyFunceble.storage.CONFIG_DIRECTORY,
70
- PyFunceble.storage.IPV4_REPUTATION_FILENAME,
71
- )
72
- self.download_link = PyFunceble.storage.IPV4_REPUTATION_DUMP_LINK
73
-
74
- super().__init__()
64
+ DEFAULT_DOWNLOAD_URL: str = "https://reputation.alienvault.com/reputation.data"
65
+ DEFAULT_FILENAME: str = "ipv4_reputation.data"
75
66
 
76
67
  @property
77
68
  def authorized(self) -> bool: # pragma: no cover ## Always True.
@@ -50,9 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import os
54
-
55
- import PyFunceble.storage
56
53
  from PyFunceble.downloader.base import DownloaderBase
57
54
 
58
55
 
@@ -64,14 +61,11 @@ class PublicSuffixDownloader(DownloaderBase):
64
61
  DOWNTIME_INDEX: str = "psl"
65
62
  DOWNLOAD_FREQUENCY: int = 1
66
63
 
67
- def __init__(self) -> None:
68
- self.destination = os.path.join(
69
- PyFunceble.storage.CONFIG_DIRECTORY,
70
- PyFunceble.storage.PUBLIC_SUFFIX_DUMP_FILENAME,
71
- )
72
- self.download_link = PyFunceble.storage.PUBLIC_SUFFIX_DUMP_LINK
73
-
74
- super().__init__()
64
+ # pylint: disable=line-too-long
65
+ DEFAULT_DOWNLOAD_URL: str = (
66
+ "https://raw.githubusercontent.com/PyFunceble/public-suffix/master/public-suffix.json"
67
+ )
68
+ DEFAULT_FILENAME: str = "public-suffix.json"
75
69
 
76
70
  @property
77
71
  def authorized(self) -> bool:
@@ -50,9 +50,6 @@ License:
50
50
  limitations under the License.
51
51
  """
52
52
 
53
- import os
54
-
55
- import PyFunceble.storage
56
53
  from PyFunceble.downloader.base import DownloaderBase
57
54
 
58
55
 
@@ -64,14 +61,11 @@ class UserAgentsDownloader(DownloaderBase):
64
61
  DOWNTIME_INDEX: str = "user_agents"
65
62
  DOWNLOAD_FREQUENCY: int = 1
66
63
 
67
- def __init__(self) -> None:
68
- self.destination = os.path.join(
69
- PyFunceble.storage.CONFIG_DIRECTORY,
70
- PyFunceble.storage.USER_AGENT_FILENAME,
71
- )
72
- self.download_link = PyFunceble.storage.USER_AGENT_DUMP_LINK
73
-
74
- super().__init__()
64
+ # pylint: disable=line-too-long
65
+ DEFAULT_DOWNLOAD_URL: str = (
66
+ "https://raw.githubusercontent.com/PyFunceble/user_agents/master/user_agents.json"
67
+ )
68
+ DEFAULT_FILENAME: str = "user_agents.json"
75
69
 
76
70
  @property
77
71
  def authorized(self) -> bool:
@@ -369,6 +369,7 @@ class WhoisQueryTool:
369
369
 
370
370
  return self.iana_dataset.get_whois_server(extension)
371
371
 
372
+ @update_lookup_record
372
373
  def get_lookup_record(
373
374
  self,
374
375
  ) -> Optional[WhoisQueryToolRecord]:
PyFunceble/storage.py CHANGED
@@ -61,36 +61,19 @@ 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.28a1.dev (Blue Duckling: Tulip)"
64
+ PROJECT_VERSION: str = "4.3.0a1.dev (Blue Duckling: Tulip)"
65
65
 
66
66
  DISTRIBUTED_CONFIGURATION_FILENAME: str = ".PyFunceble_production.yaml"
67
- DISTRIBUTED_DIR_STRUCTURE_FILENAME: str = "dir_structure_production.json"
68
67
 
69
- IANA_DUMP_FILENAME: str = "iana-domains-db.json"
70
- PUBLIC_SUFFIX_DUMP_FILENAME: str = "public-suffix.json"
71
68
  CONFIGURATION_FILENAME: str = ".PyFunceble.yaml"
72
- CONFIGURATION_OVERWRITE_FILENAME: str = ".PyFunceble.overwrite.yaml"
73
69
  ENV_FILENAME: str = ".pyfunceble-env"
74
- DOWN_FILENAME: str = ".pyfunceble_intern_downtime.json"
75
- USER_AGENT_FILENAME: str = "user_agents.json"
76
- IPV4_REPUTATION_FILENAME: str = "ipv4_reputation.data"
77
70
 
78
71
  # pylint: disable=line-too-long
79
- IANA_DUMP_LINK: str = (
80
- "https://raw.githubusercontent.com/PyFunceble/iana/master/iana-domains-db.json"
81
- )
82
- PUBLIC_SUFFIX_DUMP_LINK: str = (
83
- "https://raw.githubusercontent.com/PyFunceble/public-suffix/master/public-suffix.json"
84
- )
85
- USER_AGENT_DUMP_LINK: str = (
86
- "https://raw.githubusercontent.com/PyFunceble/user_agents/master/user_agents.json"
87
- )
88
- IPV4_REPUTATION_DUMP_LINK: str = "https://reputation.alienvault.com/reputation.data"
89
72
 
90
73
  SHORT_REPO_LINK: str = "https://pyfunceble.github.io"
91
74
  REPO_LINK: str = "https://github.com/funilrys/PyFunceble"
92
75
 
93
- NOT_RESOLVED_STD_HOSTNAME: str = f"pyfunceble-{secrets.token_hex(12)}.com"
76
+ NOT_RESOLVED_STD_HOSTNAME: str = f"{secrets.token_hex(12)}.mock-resolver.pyfunceble.com"
94
77
 
95
78
  IANA: Optional[dict] = {}
96
79
  PUBLIC_SUFFIX: Optional[dict] = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyFunceble-dev
3
- Version: 4.2.28a1
3
+ Version: 4.3.0a1
4
4
  Summary: The tool to check the availability or syntax of domain, IP or URL.
5
5
  Home-page: https://github.com/funilrys/PyFunceble
6
6
  Author: funilrys
@@ -22,91 +22,91 @@ Classifier: License :: OSI Approved
22
22
  Requires-Python: >=3.8, <4
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- Requires-Dist: inflection
26
25
  Requires-Dist: setuptools>=65.5.1
27
- Requires-Dist: dnspython[doh]~=2.6.0
28
- Requires-Dist: SQLAlchemy~=2.0
29
- Requires-Dist: PyMySQL
26
+ Requires-Dist: requests[socks]<3
27
+ Requires-Dist: inflection
30
28
  Requires-Dist: packaging
31
- Requires-Dist: cryptography~=42.0
32
- Requires-Dist: shtab
33
- Requires-Dist: domain2idna~=1.12.0
34
- Requires-Dist: PyYAML
35
29
  Requires-Dist: colorama
36
- Requires-Dist: alembic
37
- Requires-Dist: python-dotenv
38
- Requires-Dist: requests[socks]<3
30
+ Requires-Dist: PyMySQL
31
+ Requires-Dist: PyYAML
39
32
  Requires-Dist: python-box[all]~=6.0.0
33
+ Requires-Dist: shtab
34
+ Requires-Dist: python-dotenv
35
+ Requires-Dist: dnspython[doh]~=2.6.0
36
+ Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0
37
+ Requires-Dist: cryptography~=42.0
38
+ Requires-Dist: alembic
39
+ Requires-Dist: domain2idna~=1.12.0
40
40
  Provides-Extra: dev
41
- Requires-Dist: flake8; extra == "dev"
42
- Requires-Dist: black; extra == "dev"
43
41
  Requires-Dist: isort; extra == "dev"
42
+ Requires-Dist: black; extra == "dev"
43
+ Requires-Dist: flake8; extra == "dev"
44
44
  Requires-Dist: pylint; extra == "dev"
45
45
  Provides-Extra: docs
46
- Requires-Dist: mkdocstrings[python]~=0.26; extra == "docs"
47
- Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
48
46
  Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
49
- Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
50
- Requires-Dist: zipp>=3.19.1; extra == "docs"
51
- Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
52
- Requires-Dist: mkdocs~=1.5; extra == "docs"
53
- Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "docs"
54
- Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
55
47
  Requires-Dist: mkdocs-material~=9.5; extra == "docs"
56
48
  Requires-Dist: mkdocs-gen-files~=0.5; extra == "docs"
49
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "docs"
50
+ Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
51
+ Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
52
+ Requires-Dist: mkdocstrings[python]~=0.26; extra == "docs"
53
+ Requires-Dist: zipp>=3.19.1; extra == "docs"
54
+ Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
55
+ Requires-Dist: mkdocs~=1.5; extra == "docs"
56
+ Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
57
57
  Provides-Extra: full
58
- Requires-Dist: inflection; extra == "full"
59
- Requires-Dist: dnspython[doh]~=2.6.0; extra == "full"
60
- Requires-Dist: coverage; extra == "full"
61
- Requires-Dist: zipp>=3.19.1; extra == "full"
62
- Requires-Dist: black; extra == "full"
63
- Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
64
- Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
65
- Requires-Dist: mkdocs-material~=9.5; extra == "full"
66
- Requires-Dist: requests[socks]<3; extra == "full"
67
- Requires-Dist: PyMySQL; extra == "full"
58
+ Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
68
59
  Requires-Dist: mkdocstrings[python]~=0.26; extra == "full"
69
- Requires-Dist: shtab; extra == "full"
70
- Requires-Dist: pylint; extra == "full"
71
- Requires-Dist: PyYAML; extra == "full"
72
60
  Requires-Dist: python-dotenv; extra == "full"
73
- Requires-Dist: setuptools>=65.5.1; extra == "full"
74
- Requires-Dist: flake8; extra == "full"
61
+ Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "full"
62
+ Requires-Dist: pymdown-extensions~=10.9; extra == "full"
75
63
  Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "full"
76
- Requires-Dist: cryptography~=42.0; extra == "full"
77
- Requires-Dist: mkdocs~=1.5; extra == "full"
78
- Requires-Dist: alembic; extra == "full"
79
- Requires-Dist: isort; extra == "full"
80
- Requires-Dist: python-box[all]~=6.0.0; extra == "full"
81
- Requires-Dist: mkdocs-gen-files~=0.5; extra == "full"
82
- Requires-Dist: SQLAlchemy~=2.0; extra == "full"
64
+ Requires-Dist: tox; extra == "full"
65
+ Requires-Dist: pylint; extra == "full"
66
+ Requires-Dist: shtab; extra == "full"
83
67
  Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "full"
68
+ Requires-Dist: mkdocs-material~=9.5; extra == "full"
69
+ Requires-Dist: colorama; extra == "full"
70
+ Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
71
+ Requires-Dist: PyMySQL; extra == "full"
72
+ Requires-Dist: dnspython[doh]~=2.6.0; extra == "full"
73
+ Requires-Dist: setuptools>=65.5.1; extra == "full"
74
+ Requires-Dist: isort; extra == "full"
75
+ Requires-Dist: inflection; extra == "full"
84
76
  Requires-Dist: packaging; extra == "full"
85
- Requires-Dist: pymdown-extensions~=10.9; extra == "full"
77
+ Requires-Dist: python-box[all]~=6.0.0; extra == "full"
78
+ Requires-Dist: black; extra == "full"
79
+ Requires-Dist: zipp>=3.19.1; extra == "full"
80
+ Requires-Dist: cryptography~=42.0; extra == "full"
81
+ Requires-Dist: requests[socks]<3; extra == "full"
86
82
  Requires-Dist: domain2idna~=1.12.0; extra == "full"
87
- Requires-Dist: colorama; extra == "full"
88
- Requires-Dist: tox; extra == "full"
89
- Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
83
+ Requires-Dist: mkdocs-gen-files~=0.5; extra == "full"
84
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
85
+ Requires-Dist: PyYAML; extra == "full"
86
+ Requires-Dist: mkdocs~=1.5; extra == "full"
87
+ Requires-Dist: coverage; extra == "full"
88
+ Requires-Dist: flake8; extra == "full"
89
+ Requires-Dist: alembic; extra == "full"
90
90
  Provides-Extra: psql
91
- Requires-Dist: inflection; extra == "psql"
92
91
  Requires-Dist: setuptools>=65.5.1; extra == "psql"
93
- Requires-Dist: dnspython[doh]~=2.6.0; extra == "psql"
94
- Requires-Dist: SQLAlchemy~=2.0; extra == "psql"
95
- Requires-Dist: PyMySQL; extra == "psql"
92
+ Requires-Dist: requests[socks]<3; extra == "psql"
93
+ Requires-Dist: inflection; extra == "psql"
94
+ Requires-Dist: psycopg2; extra == "psql"
96
95
  Requires-Dist: packaging; extra == "psql"
97
- Requires-Dist: cryptography~=42.0; extra == "psql"
98
- Requires-Dist: shtab; extra == "psql"
99
- Requires-Dist: domain2idna~=1.12.0; extra == "psql"
100
- Requires-Dist: PyYAML; extra == "psql"
101
96
  Requires-Dist: colorama; extra == "psql"
102
- Requires-Dist: alembic; extra == "psql"
103
- Requires-Dist: python-dotenv; extra == "psql"
104
- Requires-Dist: psycopg2; extra == "psql"
105
- Requires-Dist: requests[socks]<3; extra == "psql"
97
+ Requires-Dist: PyMySQL; extra == "psql"
98
+ Requires-Dist: PyYAML; extra == "psql"
106
99
  Requires-Dist: python-box[all]~=6.0.0; extra == "psql"
100
+ Requires-Dist: shtab; extra == "psql"
101
+ Requires-Dist: python-dotenv; extra == "psql"
102
+ Requires-Dist: dnspython[doh]~=2.6.0; extra == "psql"
103
+ Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "psql"
104
+ Requires-Dist: cryptography~=42.0; extra == "psql"
105
+ Requires-Dist: alembic; extra == "psql"
106
+ Requires-Dist: domain2idna~=1.12.0; extra == "psql"
107
107
  Provides-Extra: test
108
- Requires-Dist: coverage; extra == "test"
109
108
  Requires-Dist: tox; extra == "test"
109
+ Requires-Dist: coverage; extra == "test"
110
110
 
111
111
  ![image](https://raw.githubusercontent.com/PyFunceble/logo/dev/Green/HD/RM.png)
112
112
 
@@ -153,8 +153,6 @@ Happy testing with PyFunceble!
153
153
 
154
154
  # Table of Content
155
155
 
156
- - [The tool to check the availability or syntax of domain, IP or URL](#the-tool-to-check-the-availability-or-syntax-of-domain-ip-or-url)
157
- - [Table of Content](#table-of-content)
158
156
  - [Installation](#installation)
159
157
  - [Packages \& Versioning](#packages--versioning)
160
158
  - [PyPi - Python Package Index](#pypi---python-package-index)
@@ -507,6 +505,7 @@ contribution(s) and or issue report which made or make
507
505
  <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
508
506
  <!-- prettier-ignore-start -->
509
507
  <!-- markdownlint-disable -->
508
+
510
509
  <table>
511
510
  <tbody>
512
511
  <tr>
@@ -524,34 +523,35 @@ contribution(s) and or issue report which made or make
524
523
  <td align="center" valign="top" width="20%"><a href="https://github.com/ybreza"><img src="https://avatars.githubusercontent.com/u/35470865?v=4?s=100" width="100px;" alt="Reza Rizqullah"/><br /><sub><b>Reza Rizqullah</b></sub></a><br /><a href="#design-ybreza" title="Design">🎨</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=ybreza" title="Code">💻</a></td>
525
524
  </tr>
526
525
  <tr>
526
+ <td align="center" valign="top" width="20%"><a href="https://github.com/techdragon"><img src="https://avatars.githubusercontent.com/u/2115079?v=4?s=100" width="100px;" alt="Samuel Bishop"/><br /><sub><b>Samuel Bishop</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Atechdragon" title="Bug reports">🐛</a> <a href="#ideas-techdragon" title="Ideas, Planning, & Feedback">🤔</a></td>
527
527
  <td align="center" valign="top" width="20%"><a href="https://scripttiger.github.io/"><img src="https://avatars.githubusercontent.com/u/29940916?v=4?s=100" width="100px;" alt="ScriptTiger"/><br /><sub><b>ScriptTiger</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AScriptTiger" title="Bug reports">🐛</a> <a href="#ideas-ScriptTiger" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=ScriptTiger" title="Tests">⚠️</a></td>
528
528
  <td align="center" valign="top" width="20%"><a href="https://github.com/sjhgvr"><img src="https://avatars.githubusercontent.com/u/51121527?v=4?s=100" width="100px;" alt="Stephan van Ruth"/><br /><sub><b>Stephan van Ruth</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Asjhgvr" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=sjhgvr" title="Tests">⚠️</a></td>
529
529
  <td align="center" valign="top" width="20%"><a href="http://stevenblack.com/"><img src="https://avatars.githubusercontent.com/u/80144?v=4?s=100" width="100px;" alt="Steven Black"/><br /><sub><b>Steven Black</b></sub></a><br /><a href="#ideas-StevenBlack" title="Ideas, Planning, & Feedback">🤔</a> <a href="#financial-StevenBlack" title="Financial">💵</a></td>
530
530
  <td align="center" valign="top" width="20%"><a href="https://github.com/T145"><img src="https://avatars.githubusercontent.com/u/1214129?v=4?s=100" width="100px;" alt="T145"/><br /><sub><b>T145</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AT145" title="Bug reports">🐛</a> <a href="#ideas-T145" title="Ideas, Planning, & Feedback">🤔</a></td>
531
- <td align="center" valign="top" width="20%"><a href="https://infosec.exchange/@wally3k"><img src="https://avatars.githubusercontent.com/u/3049142?v=4?s=100" width="100px;" alt="WaLLy3K"/><br /><sub><b>WaLLy3K</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AWaLLy3K" title="Bug reports">🐛</a> <a href="#ideas-WaLLy3K" title="Ideas, Planning, & Feedback">🤔</a></td>
532
531
  </tr>
533
532
  <tr>
533
+ <td align="center" valign="top" width="20%"><a href="https://infosec.exchange/@wally3k"><img src="https://avatars.githubusercontent.com/u/3049142?v=4?s=100" width="100px;" alt="WaLLy3K"/><br /><sub><b>WaLLy3K</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AWaLLy3K" title="Bug reports">🐛</a> <a href="#ideas-WaLLy3K" title="Ideas, Planning, & Feedback">🤔</a></td>
534
534
  <td align="center" valign="top" width="20%"><a href="https://github.com/Yuki2718"><img src="https://avatars.githubusercontent.com/u/58900598?v=4?s=100" width="100px;" alt="Yuki2718"/><br /><sub><b>Yuki2718</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AYuki2718" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=Yuki2718" title="Tests">⚠️</a></td>
535
535
  <td align="center" valign="top" width="20%"><a href="https://github.com/Zachinquarantine"><img src="https://avatars.githubusercontent.com/u/69423184?v=4?s=100" width="100px;" alt="Zachinquarantine"/><br /><sub><b>Zachinquarantine</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/commits?author=Zachinquarantine" title="Code">💻</a></td>
536
536
  <td align="center" valign="top" width="20%"><a href="http://bit.ly/cBWeb"><img src="https://avatars.githubusercontent.com/u/28985171?v=4?s=100" width="100px;" alt="ZeroDot1"/><br /><sub><b>ZeroDot1</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AZeroDot1" title="Bug reports">🐛</a> <a href="#ideas-ZeroDot1" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-ZeroDot1" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=ZeroDot1" title="Tests">⚠️</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=ZeroDot1" title="Code">💻</a></td>
537
537
  <td align="center" valign="top" width="20%"><a href="https://github.com/avatartw"><img src="https://avatars.githubusercontent.com/u/69660730?v=4?s=100" width="100px;" alt="avatartw"/><br /><sub><b>avatartw</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Aavatartw" title="Bug reports">🐛</a></td>
538
- <td align="center" valign="top" width="20%"><a href="https://github.com/dnmTX"><img src="https://avatars.githubusercontent.com/u/34774426?v=4?s=100" width="100px;" alt="dnmTX"/><br /><sub><b>dnmTX</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AdnmTX" title="Bug reports">🐛</a> <a href="#ideas-dnmTX" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-dnmTX" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/pulls?q=is%3Apr+reviewed-by%3AdnmTX" title="Reviewed Pull Requests">👀</a> <a href="#data-dnmTX" title="Data">🔣</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=dnmTX" title="Tests">⚠️</a></td>
539
538
  </tr>
540
539
  <tr>
540
+ <td align="center" valign="top" width="20%"><a href="https://github.com/dnmTX"><img src="https://avatars.githubusercontent.com/u/34774426?v=4?s=100" width="100px;" alt="dnmTX"/><br /><sub><b>dnmTX</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3AdnmTX" title="Bug reports">🐛</a> <a href="#ideas-dnmTX" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-dnmTX" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/pulls?q=is%3Apr+reviewed-by%3AdnmTX" title="Reviewed Pull Requests">👀</a> <a href="#data-dnmTX" title="Data">🔣</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=dnmTX" title="Tests">⚠️</a></td>
541
541
  <td align="center" valign="top" width="20%"><a href="https://github.com/gwarser"><img src="https://avatars.githubusercontent.com/u/886325?v=4?s=100" width="100px;" alt="gwarser"/><br /><sub><b>gwarser</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Agwarser" title="Bug reports">🐛</a> <a href="#data-gwarser" title="Data">🔣</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=gwarser" title="Tests">⚠️</a></td>
542
542
  <td align="center" valign="top" width="20%"><a href="https://github.com/hawkeye116477"><img src="https://avatars.githubusercontent.com/u/19818572?v=4?s=100" width="100px;" alt="hawkeye116477"/><br /><sub><b>hawkeye116477</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Ahawkeye116477" title="Bug reports">🐛</a></td>
543
543
  <td align="center" valign="top" width="20%"><a href="https://github.com/jawz101"><img src="https://avatars.githubusercontent.com/u/14151703?v=4?s=100" width="100px;" alt="jawz101"/><br /><sub><b>jawz101</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Ajawz101" title="Bug reports">🐛</a> <a href="#ideas-jawz101" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-jawz101" title="Answering Questions">💬</a> <a href="#data-jawz101" title="Data">🔣</a></td>
544
544
  <td align="center" valign="top" width="20%"><a href="https://github.com/keczuppp"><img src="https://avatars.githubusercontent.com/u/74409207?v=4?s=100" width="100px;" alt="keczuppp"/><br /><sub><b>keczuppp</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Akeczuppp" title="Bug reports">🐛</a> <a href="#ideas-keczuppp" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-keczuppp" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=keczuppp" title="Tests">⚠️</a> <a href="#data-keczuppp" title="Data">🔣</a></td>
545
- <td align="center" valign="top" width="20%"><a href="https://github.com/opav"><img src="https://avatars.githubusercontent.com/u/6770347?v=4?s=100" width="100px;" alt="opav"/><br /><sub><b>opav</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Aopav" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=opav" title="Tests">⚠️</a></td>
546
545
  </tr>
547
546
  <tr>
547
+ <td align="center" valign="top" width="20%"><a href="https://github.com/opav"><img src="https://avatars.githubusercontent.com/u/6770347?v=4?s=100" width="100px;" alt="opav"/><br /><sub><b>opav</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Aopav" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=opav" title="Tests">⚠️</a></td>
548
548
  <td align="center" valign="top" width="20%"><a href="https://github.com/rusty-snake"><img src="https://avatars.githubusercontent.com/u/41237666?v=4?s=100" width="100px;" alt="rusty-snake"/><br /><sub><b>rusty-snake</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Arusty-snake" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=rusty-snake" title="Documentation">📖</a></td>
549
549
  <td align="center" valign="top" width="20%"><a href="https://github.com/smed79"><img src="https://avatars.githubusercontent.com/u/1873139?v=4?s=100" width="100px;" alt="smed79"/><br /><sub><b>smed79</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Asmed79" title="Bug reports">🐛</a> <a href="#ideas-smed79" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=smed79" title="Code">💻</a> <a href="#question-smed79" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=smed79" title="Tests">⚠️</a></td>
550
550
  <td align="center" valign="top" width="20%"><a href="https://speedmann.de/"><img src="https://avatars.githubusercontent.com/u/424659?v=4?s=100" width="100px;" alt="speedmann"/><br /><sub><b>speedmann</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Aspeedmann" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=speedmann" title="Tests">⚠️</a></td>
551
551
  <td align="center" valign="top" width="20%"><a href="https://www.mypdns.org/"><img src="https://avatars.githubusercontent.com/u/44526987?v=4?s=100" width="100px;" alt="spirillen"/><br /><sub><b>spirillen</b></sub></a><br /><a href="#a11y-spirillen" title="Accessibility">️️️️♿️</a> <a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Aspirillen" title="Bug reports">🐛</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=spirillen" title="Code">💻</a> <a href="#content-spirillen" title="Content">🖋</a> <a href="#data-spirillen" title="Data">🔣</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=spirillen" title="Documentation">📖</a> <a href="#example-spirillen" title="Examples">💡</a> <a href="#ideas-spirillen" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-spirillen" title="Maintenance">🚧</a> <a href="#mentoring-spirillen" title="Mentoring">🧑‍🏫</a> <a href="#promotion-spirillen" title="Promotion">📣</a> <a href="#question-spirillen" title="Answering Questions">💬</a> <a href="https://github.com/funilrys/PyFunceble/pulls?q=is%3Apr+reviewed-by%3Aspirillen" title="Reviewed Pull Requests">👀</a> <a href="#tool-spirillen" title="Tools">🔧</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=spirillen" title="Tests">⚠️</a> <a href="#tutorial-spirillen" title="Tutorials">✅</a> <a href="#talk-spirillen" title="Talks">📢</a> <a href="#userTesting-spirillen" title="User Testing">📓</a></td>
552
- <td align="center" valign="top" width="20%"><a href="https://github.com/NeolithEra"><img src="https://avatars.githubusercontent.com/u/52778917?v=4?s=100" width="100px;" alt="watchman-pypi"/><br /><sub><b>watchman-pypi</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3ANeolithEra" title="Bug reports">🐛</a></td>
553
552
  </tr>
554
553
  <tr>
554
+ <td align="center" valign="top" width="20%"><a href="https://github.com/NeolithEra"><img src="https://avatars.githubusercontent.com/u/52778917?v=4?s=100" width="100px;" alt="watchman-pypi"/><br /><sub><b>watchman-pypi</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3ANeolithEra" title="Bug reports">🐛</a></td>
555
555
  <td align="center" valign="top" width="20%"><a href="https://github.com/xxcriticxx"><img src="https://avatars.githubusercontent.com/u/15007183?v=4?s=100" width="100px;" alt="xxcriticxx"/><br /><sub><b>xxcriticxx</b></sub></a><br /><a href="https://github.com/funilrys/PyFunceble/issues?q=author%3Axxcriticxx" title="Bug reports">🐛</a> <a href="#ideas-xxcriticxx" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/funilrys/PyFunceble/commits?author=xxcriticxx" title="Tests">⚠️</a></td>
556
556
  </tr>
557
557
  </tbody>