PyFunceble-dev 4.2.29__py3-none-any.whl → 4.3.0a2__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 +14 -5
- PyFunceble/config/compare.py +2 -0
- PyFunceble/config/loader.py +146 -22
- PyFunceble/data/infrastructure/.PyFunceble_production.yaml +2 -8
- PyFunceble/database/credential/base.py +46 -3
- PyFunceble/dataset/base.py +3 -3
- PyFunceble/dataset/db_base.py +44 -0
- PyFunceble/dataset/iana.py +3 -6
- PyFunceble/dataset/inactive/csv.py +1 -1
- PyFunceble/dataset/ipv4_reputation.py +5 -9
- PyFunceble/dataset/public_suffix.py +4 -8
- PyFunceble/dataset/sql_base.py +1 -1
- 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.29.dist-info → PyFunceble_dev-4.3.0a2.dist-info}/METADATA +58 -58
- {PyFunceble_dev-4.2.29.dist-info → PyFunceble_dev-4.3.0a2.dist-info}/RECORD +39 -39
- {PyFunceble_dev-4.2.29.dist-info → PyFunceble_dev-4.3.0a2.dist-info}/LICENSE +0 -0
- {PyFunceble_dev-4.2.29.dist-info → PyFunceble_dev-4.3.0a2.dist-info}/WHEEL +0 -0
- {PyFunceble_dev-4.2.29.dist-info → PyFunceble_dev-4.3.0a2.dist-info}/entry_points.txt +0 -0
- {PyFunceble_dev-4.2.29.dist-info → PyFunceble_dev-4.3.0a2.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.0a2.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.0a2
|
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: python-box[all]~=6.0.0
|
25
26
|
Requires-Dist: domain2idna~=1.12.0
|
26
|
-
Requires-Dist:
|
27
|
+
Requires-Dist: cryptography~=42.0
|
28
|
+
Requires-Dist: packaging
|
27
29
|
Requires-Dist: requests[socks]<3
|
28
|
-
Requires-Dist:
|
29
|
-
Requires-Dist: inflection
|
30
|
+
Requires-Dist: dnspython[doh]~=2.6.0
|
30
31
|
Requires-Dist: python-dotenv
|
31
|
-
Requires-Dist:
|
32
|
-
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0
|
33
|
-
Requires-Dist: python-box[all]~=6.0.0
|
34
|
-
Requires-Dist: setuptools>=65.5.1
|
35
|
-
Requires-Dist: cryptography~=42.0
|
32
|
+
Requires-Dist: inflection
|
36
33
|
Requires-Dist: PyMySQL
|
37
|
-
Requires-Dist:
|
34
|
+
Requires-Dist: PyYAML
|
35
|
+
Requires-Dist: setuptools>=65.5.1
|
38
36
|
Requires-Dist: alembic
|
37
|
+
Requires-Dist: shtab
|
38
|
+
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0
|
39
39
|
Requires-Dist: colorama
|
40
40
|
Provides-Extra: dev
|
41
41
|
Requires-Dist: black; extra == "dev"
|
42
|
+
Requires-Dist: flake8; extra == "dev"
|
42
43
|
Requires-Dist: pylint; extra == "dev"
|
43
44
|
Requires-Dist: isort; extra == "dev"
|
44
|
-
Requires-Dist: flake8; extra == "dev"
|
45
45
|
Provides-Extra: docs
|
46
|
-
Requires-Dist: zipp>=3.19.1; extra == "docs"
|
47
46
|
Requires-Dist: mkdocstrings[python]~=0.26; extra == "docs"
|
48
|
-
Requires-Dist: mkdocs
|
49
|
-
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
|
47
|
+
Requires-Dist: mkdocs~=1.5; extra == "docs"
|
50
48
|
Requires-Dist: mkdocs-section-index~=0.3; extra == "docs"
|
51
|
-
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
|
52
49
|
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "docs"
|
53
|
-
Requires-Dist: mkdocs~=1.5; extra == "docs"
|
54
|
-
Requires-Dist: mkdocs-material~=9.5; extra == "docs"
|
55
50
|
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "docs"
|
51
|
+
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "docs"
|
56
52
|
Requires-Dist: pymdown-extensions~=10.9; extra == "docs"
|
53
|
+
Requires-Dist: zipp>=3.19.1; extra == "docs"
|
54
|
+
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "docs"
|
55
|
+
Requires-Dist: mkdocs-material~=9.5; extra == "docs"
|
56
|
+
Requires-Dist: mkdocs-gen-files~=0.5; extra == "docs"
|
57
57
|
Provides-Extra: full
|
58
|
-
Requires-Dist:
|
59
|
-
Requires-Dist:
|
58
|
+
Requires-Dist: cryptography~=42.0; extra == "full"
|
59
|
+
Requires-Dist: pymdown-extensions~=10.9; extra == "full"
|
60
60
|
Requires-Dist: dnspython[doh]~=2.6.0; extra == "full"
|
61
|
-
Requires-Dist:
|
62
|
-
Requires-Dist:
|
61
|
+
Requires-Dist: isort; extra == "full"
|
62
|
+
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "full"
|
63
|
+
Requires-Dist: alembic; extra == "full"
|
64
|
+
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "full"
|
65
|
+
Requires-Dist: flake8; extra == "full"
|
66
|
+
Requires-Dist: packaging; extra == "full"
|
63
67
|
Requires-Dist: python-dotenv; extra == "full"
|
64
|
-
Requires-Dist:
|
68
|
+
Requires-Dist: inflection; extra == "full"
|
69
|
+
Requires-Dist: PyMySQL; extra == "full"
|
70
|
+
Requires-Dist: shtab; extra == "full"
|
71
|
+
Requires-Dist: mkdocstrings[python]~=0.26; extra == "full"
|
72
|
+
Requires-Dist: mkdocs~=1.5; extra == "full"
|
73
|
+
Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
|
74
|
+
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
|
65
75
|
Requires-Dist: mkdocs-macros-plugin~=1.2; extra == "full"
|
76
|
+
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
|
77
|
+
Requires-Dist: requests[socks]<3; extra == "full"
|
66
78
|
Requires-Dist: PyYAML; extra == "full"
|
79
|
+
Requires-Dist: mkdocs-material~=9.5; extra == "full"
|
80
|
+
Requires-Dist: colorama; extra == "full"
|
67
81
|
Requires-Dist: mkdocs-gen-files~=0.5; extra == "full"
|
82
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "full"
|
68
83
|
Requires-Dist: coverage; extra == "full"
|
69
|
-
Requires-Dist:
|
84
|
+
Requires-Dist: domain2idna~=1.12.0; extra == "full"
|
85
|
+
Requires-Dist: pylint; extra == "full"
|
86
|
+
Requires-Dist: zipp>=3.19.1; extra == "full"
|
87
|
+
Requires-Dist: black; extra == "full"
|
70
88
|
Requires-Dist: setuptools>=65.5.1; extra == "full"
|
71
|
-
Requires-Dist: cryptography~=42.0; extra == "full"
|
72
|
-
Requires-Dist: colorama; extra == "full"
|
73
|
-
Requires-Dist: flake8; extra == "full"
|
74
89
|
Requires-Dist: tox; extra == "full"
|
75
|
-
Requires-Dist: mkdocstrings[python]~=0.26; extra == "full"
|
76
|
-
Requires-Dist: mkdocs-literate-nav~=0.6; extra == "full"
|
77
|
-
Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.2; extra == "full"
|
78
|
-
Requires-Dist: isort; extra == "full"
|
79
|
-
Requires-Dist: pymdown-extensions~=10.9; extra == "full"
|
80
|
-
Requires-Dist: packaging; extra == "full"
|
81
|
-
Requires-Dist: alembic; extra == "full"
|
82
|
-
Requires-Dist: mkdocs-section-index~=0.3; extra == "full"
|
83
|
-
Requires-Dist: mkdocs-git-authors-plugin~=0.9; extra == "full"
|
84
|
-
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "full"
|
85
|
-
Requires-Dist: mkdocs~=1.5; extra == "full"
|
86
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "full"
|
87
|
-
Requires-Dist: PyMySQL; extra == "full"
|
88
|
-
Requires-Dist: mkdocs-material~=9.5; extra == "full"
|
89
|
-
Requires-Dist: black; extra == "full"
|
90
90
|
Provides-Extra: psql
|
91
|
+
Requires-Dist: python-box[all]~=6.0.0; extra == "psql"
|
91
92
|
Requires-Dist: domain2idna~=1.12.0; extra == "psql"
|
92
|
-
Requires-Dist:
|
93
|
+
Requires-Dist: cryptography~=42.0; extra == "psql"
|
94
|
+
Requires-Dist: packaging; extra == "psql"
|
93
95
|
Requires-Dist: requests[socks]<3; extra == "psql"
|
94
|
-
Requires-Dist:
|
95
|
-
Requires-Dist:
|
96
|
+
Requires-Dist: dnspython[doh]~=2.6.0; extra == "psql"
|
97
|
+
Requires-Dist: psycopg2; extra == "psql"
|
96
98
|
Requires-Dist: python-dotenv; extra == "psql"
|
97
|
-
Requires-Dist:
|
98
|
-
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "psql"
|
99
|
-
Requires-Dist: python-box[all]~=6.0.0; extra == "psql"
|
100
|
-
Requires-Dist: setuptools>=65.5.1; extra == "psql"
|
101
|
-
Requires-Dist: cryptography~=42.0; extra == "psql"
|
99
|
+
Requires-Dist: inflection; extra == "psql"
|
102
100
|
Requires-Dist: PyMySQL; extra == "psql"
|
103
|
-
Requires-Dist:
|
104
|
-
Requires-Dist:
|
101
|
+
Requires-Dist: PyYAML; extra == "psql"
|
102
|
+
Requires-Dist: setuptools>=65.5.1; extra == "psql"
|
105
103
|
Requires-Dist: alembic; extra == "psql"
|
104
|
+
Requires-Dist: shtab; extra == "psql"
|
105
|
+
Requires-Dist: SQLAlchemy[postgresql-psycopg2binary]~=2.0; extra == "psql"
|
106
106
|
Requires-Dist: colorama; 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>
|