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.
- PyFunceble/cli/entry_points/pyfunceble/cli.py +22 -0
- PyFunceble/cli/filesystem/dir_structure/base.py +1 -2
- PyFunceble/cli/migrators/base.py +47 -1
- PyFunceble/cli/migrators/csv_file/inactive_source_delete.py +1 -1
- PyFunceble/cli/migrators/csv_file/whois_registrar_add.py +1 -1
- PyFunceble/cli/migrators/file_cleanup/hashes_file.py +1 -1
- PyFunceble/cli/migrators/file_cleanup/mining_file.py +1 -1
- PyFunceble/cli/migrators/file_cleanup/production_config_file.py +1 -1
- PyFunceble/cli/migrators/json2csv/inactive.py +1 -1
- PyFunceble/cli/migrators/json2csv/whois.py +1 -1
- PyFunceble/cli/scripts/production.py +67 -26
- PyFunceble/cli/system/integrator.py +51 -14
- PyFunceble/cli/system/launcher.py +17 -6
- PyFunceble/config/loader.py +146 -22
- PyFunceble/database/credential/base.py +46 -3
- PyFunceble/dataset/base.py +3 -3
- PyFunceble/dataset/csv_base.py +3 -1
- PyFunceble/dataset/db_base.py +44 -0
- PyFunceble/dataset/iana.py +3 -6
- PyFunceble/dataset/inactive/csv.py +4 -2
- PyFunceble/dataset/ipv4_reputation.py +5 -9
- PyFunceble/dataset/public_suffix.py +4 -8
- PyFunceble/dataset/user_agent.py +4 -7
- PyFunceble/dataset/whois/csv.py +1 -1
- PyFunceble/downloader/base.py +64 -5
- PyFunceble/downloader/iana.py +4 -11
- PyFunceble/downloader/ipv4_reputation.py +2 -11
- PyFunceble/downloader/public_suffix.py +5 -11
- PyFunceble/downloader/user_agents.py +5 -11
- PyFunceble/query/whois/query_tool.py +1 -0
- PyFunceble/storage.py +2 -19
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/METADATA +67 -67
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/RECORD +37 -37
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/LICENSE +0 -0
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/WHEEL +0 -0
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/entry_points.txt +0 -0
- {PyFunceble_dev-4.2.28a1.dist-info → PyFunceble_dev-4.3.0a1.dist-info}/top_level.txt +0 -0
PyFunceble/downloader/base.py
CHANGED
@@ -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 =
|
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
|
"""
|
PyFunceble/downloader/iana.py
CHANGED
@@ -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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
68
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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:
|
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.
|
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"
|
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.
|
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:
|
28
|
-
Requires-Dist:
|
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:
|
37
|
-
Requires-Dist:
|
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:
|
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:
|
74
|
-
Requires-Dist:
|
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:
|
77
|
-
Requires-Dist:
|
78
|
-
Requires-Dist:
|
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:
|
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:
|
88
|
-
Requires-Dist:
|
89
|
-
Requires-Dist:
|
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:
|
94
|
-
Requires-Dist:
|
95
|
-
Requires-Dist:
|
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:
|
103
|
-
Requires-Dist:
|
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
|

|
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>
|