PyFunceble-dev 4.2.6__py3-none-any.whl → 4.2.9__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 (277) hide show
  1. PyFunceble/__init__.py +1 -1
  2. PyFunceble/checker/__init__.py +1 -1
  3. PyFunceble/checker/availability/__init__.py +1 -1
  4. PyFunceble/checker/availability/base.py +17 -10
  5. PyFunceble/checker/availability/domain.py +1 -2
  6. PyFunceble/checker/availability/domain_and_ip.py +1 -1
  7. PyFunceble/checker/availability/extras/__init__.py +1 -1
  8. PyFunceble/checker/availability/extras/base.py +2 -3
  9. PyFunceble/checker/availability/extras/dns.py +1 -1
  10. PyFunceble/checker/availability/extras/etoxic.py +1 -1
  11. PyFunceble/checker/availability/extras/parked.py +1 -1
  12. PyFunceble/checker/availability/extras/rules.py +2 -2
  13. PyFunceble/checker/availability/extras/subject_switch.py +1 -1
  14. PyFunceble/checker/availability/ip.py +1 -2
  15. PyFunceble/checker/availability/params.py +1 -1
  16. PyFunceble/checker/availability/status.py +1 -1
  17. PyFunceble/checker/availability/url.py +1 -2
  18. PyFunceble/checker/base.py +1 -1
  19. PyFunceble/checker/complex_json_encoder.py +1 -1
  20. PyFunceble/checker/params_base.py +1 -1
  21. PyFunceble/checker/reputation/__init__.py +1 -1
  22. PyFunceble/checker/reputation/base.py +1 -2
  23. PyFunceble/checker/reputation/domain.py +1 -2
  24. PyFunceble/checker/reputation/domain_and_ip.py +1 -1
  25. PyFunceble/checker/reputation/ip.py +1 -2
  26. PyFunceble/checker/reputation/params.py +1 -1
  27. PyFunceble/checker/reputation/status.py +1 -1
  28. PyFunceble/checker/reputation/url.py +1 -2
  29. PyFunceble/checker/status_base.py +1 -1
  30. PyFunceble/checker/syntax/__init__.py +1 -1
  31. PyFunceble/checker/syntax/base.py +1 -1
  32. PyFunceble/checker/syntax/domain.py +1 -1
  33. PyFunceble/checker/syntax/domain_and_ip.py +1 -1
  34. PyFunceble/checker/syntax/domain_base.py +1 -1
  35. PyFunceble/checker/syntax/ip.py +1 -1
  36. PyFunceble/checker/syntax/ipv4.py +1 -1
  37. PyFunceble/checker/syntax/ipv6.py +1 -1
  38. PyFunceble/checker/syntax/params.py +1 -1
  39. PyFunceble/checker/syntax/second_lvl_domain.py +7 -3
  40. PyFunceble/checker/syntax/status.py +2 -1
  41. PyFunceble/checker/syntax/subdomain.py +4 -2
  42. PyFunceble/checker/syntax/url.py +1 -2
  43. PyFunceble/checker/utils/__init__.py +1 -1
  44. PyFunceble/checker/utils/whois.py +1 -1
  45. PyFunceble/cli/__init__.py +1 -1
  46. PyFunceble/cli/continuous_integration/__init__.py +1 -1
  47. PyFunceble/cli/continuous_integration/base.py +1 -1
  48. PyFunceble/cli/continuous_integration/exceptions.py +1 -1
  49. PyFunceble/cli/continuous_integration/github_actions.py +1 -1
  50. PyFunceble/cli/continuous_integration/gitlab_ci.py +1 -1
  51. PyFunceble/cli/continuous_integration/jenkins.py +1 -1
  52. PyFunceble/cli/continuous_integration/travis_ci.py +1 -1
  53. PyFunceble/cli/continuous_integration/utils.py +1 -1
  54. PyFunceble/cli/credential_loader.py +4 -4
  55. PyFunceble/cli/entry_points/__init__.py +1 -1
  56. PyFunceble/cli/entry_points/clean.py +1 -1
  57. PyFunceble/cli/entry_points/iana.py +1 -1
  58. PyFunceble/cli/entry_points/production.py +1 -1
  59. PyFunceble/cli/entry_points/public_suffix.py +1 -1
  60. PyFunceble/cli/entry_points/pyfunceble/__init__.py +1 -1
  61. PyFunceble/cli/entry_points/pyfunceble/argsparser.py +1 -1
  62. PyFunceble/cli/entry_points/pyfunceble/cli.py +1 -1
  63. PyFunceble/cli/execution_time.py +1 -1
  64. PyFunceble/cli/facility.py +1 -1
  65. PyFunceble/cli/factory.py +1 -1
  66. PyFunceble/cli/file_preloader.py +4 -4
  67. PyFunceble/cli/filesystem/__init__.py +1 -1
  68. PyFunceble/cli/filesystem/cleanup.py +1 -1
  69. PyFunceble/cli/filesystem/counter.py +1 -1
  70. PyFunceble/cli/filesystem/dir_base.py +1 -1
  71. PyFunceble/cli/filesystem/dir_structure/__init__.py +1 -1
  72. PyFunceble/cli/filesystem/dir_structure/backup.py +1 -1
  73. PyFunceble/cli/filesystem/dir_structure/base.py +1 -1
  74. PyFunceble/cli/filesystem/dir_structure/restore.py +1 -1
  75. PyFunceble/cli/filesystem/json_base.py +1 -1
  76. PyFunceble/cli/filesystem/printer/__init__.py +1 -1
  77. PyFunceble/cli/filesystem/printer/base.py +1 -1
  78. PyFunceble/cli/filesystem/printer/file.py +1 -1
  79. PyFunceble/cli/filesystem/printer/stdout.py +1 -1
  80. PyFunceble/cli/filesystem/registrar_counter.py +1 -1
  81. PyFunceble/cli/filesystem/status_file.py +1 -1
  82. PyFunceble/cli/migrators/__init__.py +1 -1
  83. PyFunceble/cli/migrators/alembic.py +1 -1
  84. PyFunceble/cli/migrators/base.py +1 -2
  85. PyFunceble/cli/migrators/csv_file/__init__.py +1 -1
  86. PyFunceble/cli/migrators/csv_file/base.py +1 -1
  87. PyFunceble/cli/migrators/csv_file/inactive_source_delete.py +1 -1
  88. PyFunceble/cli/migrators/csv_file/whois_registrar_add.py +1 -1
  89. PyFunceble/cli/migrators/db_base.py +1 -1
  90. PyFunceble/cli/migrators/file_cleanup/__init__.py +1 -1
  91. PyFunceble/cli/migrators/file_cleanup/base.py +1 -1
  92. PyFunceble/cli/migrators/file_cleanup/hashes_file.py +1 -1
  93. PyFunceble/cli/migrators/file_cleanup/mining_file.py +1 -1
  94. PyFunceble/cli/migrators/file_cleanup/production_config_file.py +1 -1
  95. PyFunceble/cli/migrators/json2csv/__init__.py +1 -1
  96. PyFunceble/cli/migrators/json2csv/base.py +1 -1
  97. PyFunceble/cli/migrators/json2csv/inactive.py +1 -1
  98. PyFunceble/cli/migrators/json2csv/whois.py +1 -1
  99. PyFunceble/cli/migrators/mariadb/__init__.py +1 -1
  100. PyFunceble/cli/migrators/mariadb/base.py +1 -1
  101. PyFunceble/cli/migrators/mariadb/file_and_status.py +1 -1
  102. PyFunceble/cli/migrators/mariadb/whois_record_idna_subject.py +1 -1
  103. PyFunceble/cli/processes/__init__.py +1 -1
  104. PyFunceble/cli/processes/base.py +1 -1
  105. PyFunceble/cli/processes/chancy_producer.py +1 -1
  106. PyFunceble/cli/processes/chancy_tester.py +1 -1
  107. PyFunceble/cli/processes/dir_files_sorter.py +1 -1
  108. PyFunceble/cli/processes/file_sorter.py +1 -1
  109. PyFunceble/cli/processes/migrator.py +1 -1
  110. PyFunceble/cli/processes/miner.py +1 -1
  111. PyFunceble/cli/processes/producer.py +1 -1
  112. PyFunceble/cli/processes/tester.py +1 -1
  113. PyFunceble/cli/processes/workers/__init__.py +1 -1
  114. PyFunceble/cli/processes/workers/base.py +4 -4
  115. PyFunceble/cli/processes/workers/chancy_producer.py +1 -1
  116. PyFunceble/cli/processes/workers/chancy_tester.py +1 -1
  117. PyFunceble/cli/processes/workers/dir_files_sorter.py +1 -1
  118. PyFunceble/cli/processes/workers/file_sorter.py +1 -1
  119. PyFunceble/cli/processes/workers/file_sorter_base.py +1 -1
  120. PyFunceble/cli/processes/workers/migrator.py +1 -1
  121. PyFunceble/cli/processes/workers/miner.py +1 -1
  122. PyFunceble/cli/processes/workers/producer.py +1 -1
  123. PyFunceble/cli/processes/workers/tester.py +1 -1
  124. PyFunceble/cli/scripts/__init__.py +1 -1
  125. PyFunceble/cli/scripts/iana.py +1 -1
  126. PyFunceble/cli/scripts/production.py +4 -5
  127. PyFunceble/cli/scripts/public_suffix.py +1 -1
  128. PyFunceble/cli/storage.py +6 -4
  129. PyFunceble/cli/storage_facility.py +1 -1
  130. PyFunceble/cli/system/__init__.py +1 -1
  131. PyFunceble/cli/system/base.py +1 -1
  132. PyFunceble/cli/system/integrator.py +1 -1
  133. PyFunceble/cli/system/launcher.py +1 -1
  134. PyFunceble/cli/utils/__init__.py +1 -1
  135. PyFunceble/cli/utils/ascii_logo.py +1 -1
  136. PyFunceble/cli/utils/sort.py +1 -1
  137. PyFunceble/cli/utils/stdout.py +1 -1
  138. PyFunceble/cli/utils/testing.py +2 -4
  139. PyFunceble/cli/utils/version.py +1 -1
  140. PyFunceble/config/__init__.py +1 -1
  141. PyFunceble/config/compare.py +1 -1
  142. PyFunceble/config/loader.py +1 -1
  143. PyFunceble/converter/__init__.py +1 -1
  144. PyFunceble/converter/adblock_input_line2subject.py +1 -1
  145. PyFunceble/converter/base.py +1 -1
  146. PyFunceble/converter/cidr2subject.py +1 -1
  147. PyFunceble/converter/input_line2subject.py +1 -1
  148. PyFunceble/converter/internal_url.py +1 -1
  149. PyFunceble/converter/rpz_input_line2subject.py +1 -1
  150. PyFunceble/converter/rpz_policy2subject.py +1 -1
  151. PyFunceble/converter/subject2complements.py +1 -1
  152. PyFunceble/converter/url2netloc.py +1 -1
  153. PyFunceble/converter/wildcard2subject.py +1 -1
  154. PyFunceble/data/alembic/__init__.py +1 -1
  155. PyFunceble/data/alembic/mysql/__init__.py +1 -1
  156. PyFunceble/data/alembic/mysql/env.py +1 -1
  157. PyFunceble/data/alembic/mysql/versions/35c79626ecb9_fix_some_columns.py +1 -0
  158. PyFunceble/data/alembic/mysql/versions/3a4c55a9320d_add_continue_table.py +1 -0
  159. PyFunceble/data/alembic/mysql/versions/3d6f4a33cdb2_add_inactive_table.py +1 -0
  160. PyFunceble/data/alembic/mysql/versions/45713fea8097_deletion_uneeded_columns_from_whois_.py +1 -0
  161. PyFunceble/data/alembic/mysql/versions/459a0d7b8f09_add_idna_subject_column_into_whois.py +1 -0
  162. PyFunceble/data/alembic/mysql/versions/6f4729deaf03_delete_inactive_source_column.py +1 -0
  163. PyFunceble/data/alembic/mysql/versions/7bcf7fa64ba1_rename_created_to_created_at_and.py +1 -0
  164. PyFunceble/data/alembic/mysql/versions/83ada95132bf_delete_the_file_table.py +1 -0
  165. PyFunceble/data/alembic/mysql/versions/912bbcb77a6c_add_registrar_column.py +1 -0
  166. PyFunceble/data/alembic/mysql/versions/95dc17ddd729_introduction_of_the_session_id_column.py +1 -0
  167. PyFunceble/data/alembic/mysql/versions/__init__.py +1 -1
  168. PyFunceble/data/alembic/mysql/versions/ade87195b0a0_base.py +1 -0
  169. PyFunceble/data/alembic/mysql/versions/bef7bcaac3f2_make_id_a_bigint.py +1 -0
  170. PyFunceble/data/alembic/mysql/versions/d8893cd406db_allow_whois_record_to_be_empty_null.py +1 -0
  171. PyFunceble/data/alembic/mysql/versions/e04e8301d1a2_deletion_of_the_mined_table.py +1 -0
  172. PyFunceble/data/alembic/postgresql/__init__.py +1 -1
  173. PyFunceble/data/alembic/postgresql/env.py +1 -1
  174. PyFunceble/data/alembic/postgresql/versions/__init__.py +1 -1
  175. PyFunceble/data/alembic/postgresql/versions/a32ac5d66eee_initial_version.py +1 -0
  176. PyFunceble/database/__init__.py +1 -1
  177. PyFunceble/database/credential/__init__.py +1 -1
  178. PyFunceble/database/credential/base.py +1 -1
  179. PyFunceble/database/credential/mariadb.py +1 -1
  180. PyFunceble/database/credential/mysql.py +1 -1
  181. PyFunceble/database/credential/postgresql.py +1 -1
  182. PyFunceble/database/schemas/__init__.py +1 -1
  183. PyFunceble/database/schemas/autocontinue.py +1 -1
  184. PyFunceble/database/schemas/inactive.py +1 -1
  185. PyFunceble/database/schemas/status.py +1 -1
  186. PyFunceble/database/schemas/whois_record.py +1 -1
  187. PyFunceble/database/session.py +1 -1
  188. PyFunceble/database/sqlalchemy/__init__.py +1 -1
  189. PyFunceble/database/sqlalchemy/all_schemas.py +1 -1
  190. PyFunceble/database/sqlalchemy/base_schema.py +1 -1
  191. PyFunceble/dataset/__init__.py +1 -1
  192. PyFunceble/dataset/autocontinue/__init__.py +1 -1
  193. PyFunceble/dataset/autocontinue/base.py +1 -1
  194. PyFunceble/dataset/autocontinue/csv.py +1 -1
  195. PyFunceble/dataset/autocontinue/sql.py +1 -1
  196. PyFunceble/dataset/base.py +1 -1
  197. PyFunceble/dataset/csv_base.py +1 -1
  198. PyFunceble/dataset/db_base.py +1 -1
  199. PyFunceble/dataset/iana.py +1 -1
  200. PyFunceble/dataset/inactive/__init__.py +1 -1
  201. PyFunceble/dataset/inactive/base.py +1 -1
  202. PyFunceble/dataset/inactive/csv.py +1 -1
  203. PyFunceble/dataset/inactive/sql.py +1 -1
  204. PyFunceble/dataset/ipv4_reputation.py +1 -1
  205. PyFunceble/dataset/public_suffix.py +1 -1
  206. PyFunceble/dataset/sql_base.py +1 -1
  207. PyFunceble/dataset/user_agent.py +51 -9
  208. PyFunceble/dataset/whois/__init__.py +1 -1
  209. PyFunceble/dataset/whois/base.py +1 -1
  210. PyFunceble/dataset/whois/csv.py +1 -1
  211. PyFunceble/dataset/whois/sql.py +1 -1
  212. PyFunceble/downloader/__init__.py +1 -1
  213. PyFunceble/downloader/base.py +1 -1
  214. PyFunceble/downloader/exceptions.py +1 -1
  215. PyFunceble/downloader/iana.py +1 -1
  216. PyFunceble/downloader/ipv4_reputation.py +1 -1
  217. PyFunceble/downloader/public_suffix.py +1 -1
  218. PyFunceble/downloader/user_agents.py +1 -1
  219. PyFunceble/exceptions.py +1 -1
  220. PyFunceble/facility.py +1 -1
  221. PyFunceble/factory.py +1 -1
  222. PyFunceble/helpers/__init__.py +1 -1
  223. PyFunceble/helpers/command.py +1 -1
  224. PyFunceble/helpers/dict.py +1 -1
  225. PyFunceble/helpers/directory.py +1 -1
  226. PyFunceble/helpers/download.py +1 -1
  227. PyFunceble/helpers/environment_variable.py +1 -1
  228. PyFunceble/helpers/exceptions.py +1 -1
  229. PyFunceble/helpers/file.py +1 -1
  230. PyFunceble/helpers/hash.py +1 -1
  231. PyFunceble/helpers/list.py +1 -1
  232. PyFunceble/helpers/merge.py +1 -1
  233. PyFunceble/helpers/regex.py +1 -1
  234. PyFunceble/logger.py +1 -1
  235. PyFunceble/query/__init__.py +1 -1
  236. PyFunceble/query/collection.py +222 -43
  237. PyFunceble/query/dns/__init__.py +1 -1
  238. PyFunceble/query/dns/nameserver.py +1 -1
  239. PyFunceble/query/dns/query_tool.py +1 -1
  240. PyFunceble/query/dns/resolver.py +1 -1
  241. PyFunceble/query/http_status_code.py +1 -1
  242. PyFunceble/query/netinfo/__init__.py +1 -1
  243. PyFunceble/query/netinfo/address.py +1 -1
  244. PyFunceble/query/netinfo/base.py +1 -1
  245. PyFunceble/query/netinfo/hostbyaddr.py +1 -1
  246. PyFunceble/query/record/__init__.py +1 -1
  247. PyFunceble/query/record/base.py +1 -1
  248. PyFunceble/query/record/dns.py +1 -1
  249. PyFunceble/query/record/whois.py +1 -1
  250. PyFunceble/query/requests/__init__.py +1 -1
  251. PyFunceble/query/requests/adapter/__init__.py +1 -1
  252. PyFunceble/query/requests/adapter/base.py +1 -1
  253. PyFunceble/query/requests/adapter/http.py +1 -1
  254. PyFunceble/query/requests/adapter/https.py +7 -7
  255. PyFunceble/query/requests/requester.py +1 -1
  256. PyFunceble/query/whois/__init__.py +1 -1
  257. PyFunceble/query/whois/converter/__init__.py +1 -1
  258. PyFunceble/query/whois/converter/base.py +1 -1
  259. PyFunceble/query/whois/converter/digit2digits.py +2 -1
  260. PyFunceble/query/whois/converter/expiration_date.py +1 -1
  261. PyFunceble/query/whois/converter/month2unified.py +1 -1
  262. PyFunceble/query/whois/converter/registrar.py +1 -1
  263. PyFunceble/query/whois/query_tool.py +1 -1
  264. PyFunceble/sessions.py +1 -1
  265. PyFunceble/storage.py +5 -3
  266. PyFunceble/storage_facility.py +1 -1
  267. PyFunceble/utils/__init__.py +1 -1
  268. PyFunceble/utils/platform.py +1 -1
  269. PyFunceble/utils/profile.py +1 -1
  270. PyFunceble/utils/version.py +1 -1
  271. {PyFunceble_dev-4.2.6.dist-info → PyFunceble_dev-4.2.9.dist-info}/LICENSE +1 -1
  272. {PyFunceble_dev-4.2.6.dist-info → PyFunceble_dev-4.2.9.dist-info}/METADATA +46 -46
  273. PyFunceble_dev-4.2.9.dist-info/RECORD +282 -0
  274. {PyFunceble_dev-4.2.6.dist-info → PyFunceble_dev-4.2.9.dist-info}/WHEEL +1 -1
  275. PyFunceble_dev-4.2.6.dist-info/RECORD +0 -282
  276. {PyFunceble_dev-4.2.6.dist-info → PyFunceble_dev-4.2.9.dist-info}/entry_points.txt +0 -0
  277. {PyFunceble_dev-4.2.6.dist-info → PyFunceble_dev-4.2.9.dist-info}/top_level.txt +0 -0
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
PyFunceble/exceptions.py CHANGED
@@ -36,7 +36,7 @@ License:
36
36
  ::
37
37
 
38
38
 
39
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
39
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
40
40
 
41
41
  Licensed under the Apache License, Version 2.0 (the "License");
42
42
  you may not use this file except in compliance with the License.
PyFunceble/facility.py CHANGED
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
PyFunceble/factory.py CHANGED
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ License:
36
36
  ::
37
37
 
38
38
 
39
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
39
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
40
40
 
41
41
  Licensed under the Apache License, Version 2.0 (the "License");
42
42
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
PyFunceble/logger.py CHANGED
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ License:
36
36
  ::
37
37
 
38
38
 
39
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
39
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
40
40
 
41
41
  Licensed under the Apache License, Version 2.0 (the "License");
42
42
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -51,8 +51,6 @@ License:
51
51
  """
52
52
 
53
53
  import json
54
- import logging
55
- from datetime import datetime
56
54
  from typing import List, Optional, Union
57
55
 
58
56
  import requests
@@ -90,6 +88,7 @@ class CollectionQueryTool:
90
88
 
91
89
  STD_URL_BASE: str = "http://localhost:8001"
92
90
  STD_PREFERRED_STATUS_ORIGIN: str = "frequent"
91
+ STD_TIMEOUT: float = 5.0
93
92
 
94
93
  _token: Optional[str] = None
95
94
  """
@@ -106,6 +105,16 @@ class CollectionQueryTool:
106
105
  The preferred data origin
107
106
  """
108
107
 
108
+ _is_modern_api: Optional[bool] = None
109
+ """
110
+ Whether we are working with the modern or legacy API.
111
+ """
112
+
113
+ _timeout: float = 5.0
114
+ """
115
+ The timeout to use while communicating with the API.
116
+ """
117
+
109
118
  session: Optional[requests.Session] = None
110
119
 
111
120
  def __init__(
@@ -114,6 +123,7 @@ class CollectionQueryTool:
114
123
  token: Optional[str] = None,
115
124
  url_base: Optional[str] = None,
116
125
  preferred_status_origin: Optional[str] = None,
126
+ timeout: Optional[float] = None,
117
127
  ) -> None:
118
128
  if token is not None:
119
129
  self.token = token
@@ -132,10 +142,16 @@ class CollectionQueryTool:
132
142
  else:
133
143
  self.guess_and_set_preferred_status_origin()
134
144
 
145
+ if timeout is not None:
146
+ self.timeout = timeout
147
+ else:
148
+ self.guess_and_set_timeout()
149
+
135
150
  self.session = requests.Session()
136
151
  self.session.headers.update(
137
152
  {
138
153
  "Authorization": f"Bearer {self.token}" if self.token else None,
154
+ "X-Pyfunceble-Version": PyFunceble.storage.PROJECT_VERSION,
139
155
  "Content-Type": "application/json",
140
156
  }
141
157
  )
@@ -242,6 +258,80 @@ class CollectionQueryTool:
242
258
 
243
259
  return self
244
260
 
261
+ @property
262
+ def is_modern_api(self) -> bool:
263
+ """
264
+ Provides the value of the :code:`_is_modern_api` attribute.
265
+ """
266
+
267
+ return self._is_modern_api
268
+
269
+ @is_modern_api.setter
270
+ def is_modern_api(self, value: bool) -> None:
271
+ """
272
+ Sets the value of the :code:`_is_modern_api` attribute.
273
+
274
+ :param value:
275
+ The value to set.
276
+
277
+ :raise TypeError:
278
+ When the given :code:`value` is not a :py:class:`bool`.
279
+ """
280
+
281
+ if not isinstance(value, bool):
282
+ raise TypeError(f"<value> should be {bool}, {type(value)} given.")
283
+
284
+ self._is_modern_api = value
285
+
286
+ def set_is_modern_api(self, value: bool) -> "CollectionQueryTool":
287
+ """
288
+ Sets the value of the :code:`_is_modern_api` attribute.
289
+
290
+ :param value:
291
+ The value to set.
292
+ """
293
+
294
+ self.is_modern_api = value
295
+
296
+ return self
297
+
298
+ @property
299
+ def timeout(self) -> float:
300
+ """
301
+ Provides the value of the :code:`_timeout` attribute.
302
+ """
303
+
304
+ return self._timeout
305
+
306
+ @timeout.setter
307
+ def timeout(self, value: float) -> None:
308
+ """
309
+ Sets the value of the :code:`_timeout` attribute.
310
+
311
+ :param value:
312
+ The value to set.
313
+
314
+ :raise TypeError:
315
+ When the given :code:`value` is not a :py:class:`float`.
316
+ """
317
+
318
+ if not isinstance(value, (int, float)):
319
+ raise TypeError(f"<value> should be {float}, {type(value)} given.")
320
+
321
+ self._timeout = value
322
+
323
+ def set_timeout(self, value: float) -> "CollectionQueryTool":
324
+ """
325
+ Sets the value of the :code:`_timeout` attribute.
326
+
327
+ :param value:
328
+ The value to set.
329
+ """
330
+
331
+ self.timeout = value
332
+
333
+ return self
334
+
245
335
  def guess_and_set_url_base(self) -> "CollectionQueryTool":
246
336
  """
247
337
  Try to guess the URL base to work with.
@@ -252,11 +342,37 @@ class CollectionQueryTool:
252
342
  self.url_base = PyFunceble.storage.CONFIGURATION.collection.url_base
253
343
  else:
254
344
  self.url_base = self.STD_URL_BASE
345
+ elif EnvironmentVariableHelper("PYFUNCEBLE_COLLECTION_API_URL").exists():
346
+ self.url_base = EnvironmentVariableHelper(
347
+ "PYFUNCEBLE_COLLECTION_API_URL"
348
+ ).get_value()
255
349
  else:
256
350
  self.url_base = self.STD_URL_BASE
257
351
 
258
352
  return self
259
353
 
354
+ def guess_and_set_is_modern_api(self) -> "CollectionQueryTool":
355
+ """
356
+ Try to guess if we are working with a legacy version.
357
+ """
358
+
359
+ if self.token:
360
+ try:
361
+ response = self.session.get(
362
+ f"{self.url_base}/v1/stats/subject",
363
+ timeout=self.timeout,
364
+ )
365
+
366
+ response.raise_for_status()
367
+
368
+ self.is_modern_api = False
369
+ except (requests.RequestException, json.decoder.JSONDecodeError):
370
+ self.is_modern_api = True
371
+ else:
372
+ self.is_modern_api = False
373
+
374
+ return self
375
+
260
376
  @property
261
377
  def preferred_status_origin(self) -> Optional[str]:
262
378
  """
@@ -319,6 +435,33 @@ class CollectionQueryTool:
319
435
 
320
436
  return self
321
437
 
438
+ def guess_and_set_timeout(self) -> "CollectionQueryTool":
439
+ """
440
+ Try to guess the timeout to use.
441
+ """
442
+
443
+ if PyFunceble.facility.ConfigLoader.is_already_loaded():
444
+ self.timeout = PyFunceble.storage.CONFIGURATION.lookup.timeout
445
+ else:
446
+ self.timeout = self.STD_TIMEOUT
447
+
448
+ return self
449
+
450
+ def ensure_is_modern_api_is_set(func): # pylint: disable=no-self-argument
451
+ """
452
+ Ensures that the :code:`is_modern_api` attribute is set before running
453
+ the decorated method.
454
+ """
455
+
456
+ def wrapper(self, *args, **kwargs):
457
+ if self.is_modern_api is None:
458
+ self.guess_and_set_is_modern_api()
459
+
460
+ return func(self, *args, **kwargs) # pylint: disable=not-callable
461
+
462
+ return wrapper
463
+
464
+ @ensure_is_modern_api_is_set
322
465
  def pull(self, subject: str) -> Optional[dict]:
323
466
  """
324
467
  Pulls all data related to the subject or :py:class:`None`
@@ -333,41 +476,51 @@ class CollectionQueryTool:
333
476
  The response of the search.
334
477
  """
335
478
 
336
- logging.info("Starting to search subject: %r", subject)
479
+ PyFunceble.facility.Logger.info("Starting to search subject: %r", subject)
337
480
 
338
481
  if not isinstance(subject, str):
339
482
  raise TypeError(f"<subject> should be {str}, {type(subject)} given.")
340
483
 
341
- url = f"{self.url_base}/v1/subject/search"
484
+ if self.is_modern_api:
485
+ if self.token:
486
+ url = f"{self.url_base}/v1/aggregation/subject/search"
487
+ else:
488
+ url = f"{self.url_base}/v1/hub/aggregation/subject/search"
489
+ else:
490
+ url = f"{self.url_base}/v1/subject/search"
342
491
 
343
492
  try:
344
493
  response = self.session.post(
345
494
  url,
346
495
  json={"subject": subject},
496
+ timeout=self.timeout,
347
497
  )
348
498
 
349
499
  response_json = response.json()
350
500
 
351
501
  if response.status_code == 200:
352
- logging.debug(
502
+ PyFunceble.facility.Logger.debug(
353
503
  "Successfully search subject: %r. Response: %r",
354
504
  subject,
355
505
  response_json,
356
506
  )
357
507
 
358
- logging.info("Finished to search subject: %r", subject)
508
+ PyFunceble.facility.Logger.info(
509
+ "Finished to search subject: %r", subject
510
+ )
359
511
 
360
512
  return response_json
361
513
  except (requests.RequestException, json.decoder.JSONDecodeError):
362
514
  response_json = {}
363
515
 
364
- logging.debug(
516
+ PyFunceble.facility.Logger.debug(
365
517
  "Failed to search subject: %r. Response: %r", subject, response_json
366
518
  )
367
- logging.info("Finished to search subject: %r", subject)
519
+ PyFunceble.facility.Logger.info("Finished to search subject: %r", subject)
368
520
 
369
521
  return None
370
522
 
523
+ @ensure_is_modern_api_is_set
371
524
  def push(
372
525
  self,
373
526
  checker_status: Union[
@@ -418,29 +571,15 @@ class CollectionQueryTool:
418
571
  if checker_status.subject == "":
419
572
  raise ValueError("<checker_status.subject> cannot be empty.")
420
573
 
421
- status_to_subject = {
422
- "status": checker_status.status,
423
- "status_source": checker_status.status_source,
424
- "tested_at": checker_status.tested_at.isoformat(),
425
- "subject": checker_status.idna_subject,
426
- }
427
-
428
574
  if (
429
- hasattr(checker_status, "expiration_date")
575
+ not self.is_modern_api
576
+ and hasattr(checker_status, "expiration_date")
430
577
  and checker_status.expiration_date
431
578
  ):
432
- self.__push_whois(
433
- {
434
- "subject": checker_status.idna_subject,
435
- "expiration_date": datetime.strptime(
436
- checker_status.expiration_date, "%d-%b-%Y"
437
- ).isoformat(),
438
- "registrar": checker_status.registrar,
439
- }
440
- )
579
+ self.__push_whois(checker_status)
441
580
 
442
581
  data = self.__push_status(
443
- checker_status.checker_type.lower(), status_to_subject
582
+ checker_status.checker_type.lower(), checker_status.to_json()
444
583
  )
445
584
 
446
585
  return data
@@ -462,7 +601,9 @@ class CollectionQueryTool:
462
601
 
463
602
  return self
464
603
 
465
- def __push_status(self, checker_type: str, data: dict) -> Optional[dict]:
604
+ def __push_status(
605
+ self, checker_type: str, data: Union[dict, str]
606
+ ) -> Optional[dict]:
466
607
  """
467
608
  Submits the given status to the collection.
468
609
 
@@ -486,31 +627,60 @@ class CollectionQueryTool:
486
627
  if checker_type not in self.SUPPORTED_CHECKERS:
487
628
  raise ValueError(f"<checker_type> ({checker_type}) is not supported.")
488
629
 
489
- logging.info("Starting to submit status: %r", data)
630
+ PyFunceble.facility.Logger.info("Starting to submit status: %r", data)
490
631
 
491
- url = f"{self.url_base}/v1/status/{checker_type}"
632
+ if self.is_modern_api:
633
+ if not self.token:
634
+ url = f"{self.url_base}/v1/hub/status/{checker_type}"
635
+ else:
636
+ url = f"{self.url_base}/v1/contracts/self-delivery"
637
+ else:
638
+ url = f"{self.url_base}/v1/status/{checker_type}"
492
639
 
493
640
  try:
494
- response = self.session.post(
495
- url,
496
- json=data,
497
- )
641
+ if isinstance(data, dict):
642
+ response = self.session.post(
643
+ url,
644
+ json=data,
645
+ timeout=self.timeout,
646
+ )
647
+ elif isinstance(
648
+ data,
649
+ (
650
+ AvailabilityCheckerStatus,
651
+ SyntaxCheckerStatus,
652
+ ReputationCheckerStatus,
653
+ ),
654
+ ):
655
+ response = self.session.post(
656
+ url,
657
+ json=data.to_dict(),
658
+ timeout=self.timeout,
659
+ )
660
+ else:
661
+ response = self.session.post(
662
+ url,
663
+ data=data,
664
+ timeout=self.timeout,
665
+ )
498
666
 
499
667
  response_json = response.json()
500
668
 
501
669
  if response.status_code == 200:
502
- logging.debug("Successfully submitted data: %r to %s", data, url)
670
+ PyFunceble.facility.Logger.debug(
671
+ "Successfully submitted data: %r to %s", data, url
672
+ )
503
673
 
504
- logging.info("Finished to submit status: %r", data)
674
+ PyFunceble.facility.Logger.info("Finished to submit status: %r", data)
505
675
  return response_json
506
676
  except (requests.RequestException, json.decoder.JSONDecodeError):
507
677
  response_json = {}
508
678
 
509
- logging.debug(
679
+ PyFunceble.facility.Logger.debug(
510
680
  "Failed to submit data: %r to %s. Response: %r", data, url, response_json
511
681
  )
512
682
 
513
- logging.info("Finished to submit status: %r", data)
683
+ PyFunceble.facility.Logger.info("Finished to submit status: %r", data)
514
684
 
515
685
  return None
516
686
 
@@ -535,10 +705,16 @@ class CollectionQueryTool:
535
705
  if not self.token:
536
706
  return None
537
707
 
708
+ if isinstance(
709
+ data,
710
+ (AvailabilityCheckerStatus, SyntaxCheckerStatus, ReputationCheckerStatus),
711
+ ):
712
+ data = data.to_dict()
713
+
538
714
  if not isinstance(data, dict): # pragma: no cover ## Should never happen
539
715
  raise TypeError(f"<data> should be {dict}, {type(data)} given.")
540
716
 
541
- logging.info("Starting to submit WHOIS: %r", data)
717
+ PyFunceble.facility.Logger.info("Starting to submit WHOIS: %r", data)
542
718
 
543
719
  url = f"{self.url_base}/v1/status/whois"
544
720
 
@@ -546,21 +722,24 @@ class CollectionQueryTool:
546
722
  response = self.session.post(
547
723
  url,
548
724
  json=data,
725
+ timeout=self.timeout,
549
726
  )
550
727
 
551
728
  response_json = response.json()
552
729
 
553
730
  if response.status_code == 200:
554
- logging.debug("Successfully submitted WHOIS data: %r to %s", data, url)
731
+ PyFunceble.facility.Logger.debug(
732
+ "Successfully submitted WHOIS data: %r to %s", data, url
733
+ )
555
734
 
556
- logging.info("Finished to submit WHOIS: %r", data)
735
+ PyFunceble.facility.Logger.info("Finished to submit WHOIS: %r", data)
557
736
  return response_json
558
737
  except (requests.RequestException, json.decoder.JSONDecodeError):
559
738
  response_json = {}
560
739
 
561
- logging.debug(
740
+ PyFunceble.facility.Logger.debug(
562
741
  "Failed to WHOIS data: %r to %s. Response: %r", data, url, response_json
563
742
  )
564
743
 
565
- logging.info("Finished to submit WHOIS: %r", data)
744
+ PyFunceble.facility.Logger.info("Finished to submit WHOIS: %r", data)
566
745
  return None
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ License:
35
35
  ::
36
36
 
37
37
 
38
- Copyright 2017, 2018, 2019, 2020, 2022, 2023 Nissar Chababy
38
+ Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024 Nissar Chababy
39
39
 
40
40
  Licensed under the Apache License, Version 2.0 (the "License");
41
41
  you may not use this file except in compliance with the License.