udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30454__py2.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.

Potentially problematic release.


This version of udata might be problematic. Click here for more details.

Files changed (413) hide show
  1. tasks/__init__.py +109 -107
  2. tasks/helpers.py +18 -18
  3. udata/__init__.py +4 -4
  4. udata/admin/views.py +5 -5
  5. udata/api/__init__.py +111 -134
  6. udata/api/commands.py +45 -37
  7. udata/api/errors.py +5 -4
  8. udata/api/fields.py +23 -21
  9. udata/api/oauth2.py +55 -74
  10. udata/api/parsers.py +15 -15
  11. udata/api/signals.py +1 -1
  12. udata/api_fields.py +137 -89
  13. udata/app.py +58 -55
  14. udata/assets.py +5 -5
  15. udata/auth/__init__.py +37 -26
  16. udata/auth/forms.py +23 -15
  17. udata/auth/helpers.py +1 -1
  18. udata/auth/mails.py +3 -3
  19. udata/auth/password_validation.py +19 -15
  20. udata/auth/views.py +94 -68
  21. udata/commands/__init__.py +71 -69
  22. udata/commands/cache.py +7 -7
  23. udata/commands/db.py +201 -140
  24. udata/commands/dcat.py +36 -30
  25. udata/commands/fixtures.py +100 -84
  26. udata/commands/images.py +21 -20
  27. udata/commands/info.py +17 -20
  28. udata/commands/init.py +10 -10
  29. udata/commands/purge.py +12 -13
  30. udata/commands/serve.py +41 -29
  31. udata/commands/static.py +16 -18
  32. udata/commands/test.py +20 -20
  33. udata/commands/tests/fixtures.py +26 -24
  34. udata/commands/worker.py +31 -33
  35. udata/core/__init__.py +12 -12
  36. udata/core/activity/__init__.py +0 -1
  37. udata/core/activity/api.py +59 -49
  38. udata/core/activity/models.py +28 -26
  39. udata/core/activity/signals.py +1 -1
  40. udata/core/activity/tasks.py +16 -10
  41. udata/core/badges/api.py +6 -6
  42. udata/core/badges/commands.py +14 -13
  43. udata/core/badges/fields.py +8 -5
  44. udata/core/badges/forms.py +7 -4
  45. udata/core/badges/models.py +16 -31
  46. udata/core/badges/permissions.py +1 -3
  47. udata/core/badges/signals.py +2 -2
  48. udata/core/badges/tasks.py +3 -2
  49. udata/core/badges/tests/test_commands.py +10 -10
  50. udata/core/badges/tests/test_model.py +24 -31
  51. udata/core/contact_point/api.py +19 -18
  52. udata/core/contact_point/api_fields.py +21 -14
  53. udata/core/contact_point/factories.py +2 -2
  54. udata/core/contact_point/forms.py +7 -6
  55. udata/core/contact_point/models.py +3 -5
  56. udata/core/dataservices/api.py +26 -21
  57. udata/core/dataservices/factories.py +13 -11
  58. udata/core/dataservices/models.py +35 -40
  59. udata/core/dataservices/permissions.py +4 -4
  60. udata/core/dataservices/rdf.py +40 -17
  61. udata/core/dataservices/tasks.py +4 -3
  62. udata/core/dataset/actions.py +10 -10
  63. udata/core/dataset/activities.py +21 -23
  64. udata/core/dataset/api.py +321 -298
  65. udata/core/dataset/api_fields.py +443 -271
  66. udata/core/dataset/apiv2.py +305 -229
  67. udata/core/dataset/commands.py +38 -36
  68. udata/core/dataset/constants.py +61 -54
  69. udata/core/dataset/csv.py +70 -74
  70. udata/core/dataset/events.py +39 -32
  71. udata/core/dataset/exceptions.py +8 -4
  72. udata/core/dataset/factories.py +57 -65
  73. udata/core/dataset/forms.py +87 -63
  74. udata/core/dataset/models.py +336 -280
  75. udata/core/dataset/permissions.py +9 -6
  76. udata/core/dataset/preview.py +15 -17
  77. udata/core/dataset/rdf.py +156 -122
  78. udata/core/dataset/search.py +92 -77
  79. udata/core/dataset/signals.py +1 -1
  80. udata/core/dataset/tasks.py +63 -54
  81. udata/core/discussions/actions.py +5 -5
  82. udata/core/discussions/api.py +124 -120
  83. udata/core/discussions/factories.py +2 -2
  84. udata/core/discussions/forms.py +9 -7
  85. udata/core/discussions/metrics.py +1 -3
  86. udata/core/discussions/models.py +25 -24
  87. udata/core/discussions/notifications.py +18 -14
  88. udata/core/discussions/permissions.py +3 -3
  89. udata/core/discussions/signals.py +4 -4
  90. udata/core/discussions/tasks.py +24 -28
  91. udata/core/followers/api.py +32 -33
  92. udata/core/followers/models.py +9 -9
  93. udata/core/followers/signals.py +3 -3
  94. udata/core/jobs/actions.py +7 -7
  95. udata/core/jobs/api.py +99 -92
  96. udata/core/jobs/commands.py +48 -49
  97. udata/core/jobs/forms.py +11 -11
  98. udata/core/jobs/models.py +6 -6
  99. udata/core/metrics/__init__.py +2 -2
  100. udata/core/metrics/commands.py +34 -30
  101. udata/core/metrics/models.py +2 -4
  102. udata/core/metrics/signals.py +1 -1
  103. udata/core/metrics/tasks.py +3 -3
  104. udata/core/organization/activities.py +12 -15
  105. udata/core/organization/api.py +167 -174
  106. udata/core/organization/api_fields.py +183 -124
  107. udata/core/organization/apiv2.py +32 -32
  108. udata/core/organization/commands.py +20 -22
  109. udata/core/organization/constants.py +11 -11
  110. udata/core/organization/csv.py +17 -15
  111. udata/core/organization/factories.py +8 -11
  112. udata/core/organization/forms.py +32 -26
  113. udata/core/organization/metrics.py +2 -1
  114. udata/core/organization/models.py +87 -67
  115. udata/core/organization/notifications.py +18 -14
  116. udata/core/organization/permissions.py +10 -11
  117. udata/core/organization/rdf.py +14 -14
  118. udata/core/organization/search.py +30 -28
  119. udata/core/organization/signals.py +7 -7
  120. udata/core/organization/tasks.py +42 -61
  121. udata/core/owned.py +38 -27
  122. udata/core/post/api.py +82 -81
  123. udata/core/post/constants.py +8 -5
  124. udata/core/post/factories.py +4 -4
  125. udata/core/post/forms.py +13 -14
  126. udata/core/post/models.py +20 -22
  127. udata/core/post/tests/test_api.py +30 -32
  128. udata/core/reports/api.py +8 -7
  129. udata/core/reports/constants.py +1 -3
  130. udata/core/reports/models.py +10 -10
  131. udata/core/reuse/activities.py +15 -19
  132. udata/core/reuse/api.py +123 -126
  133. udata/core/reuse/api_fields.py +120 -85
  134. udata/core/reuse/apiv2.py +11 -10
  135. udata/core/reuse/constants.py +23 -23
  136. udata/core/reuse/csv.py +18 -18
  137. udata/core/reuse/factories.py +5 -9
  138. udata/core/reuse/forms.py +24 -21
  139. udata/core/reuse/models.py +55 -51
  140. udata/core/reuse/permissions.py +2 -2
  141. udata/core/reuse/search.py +49 -46
  142. udata/core/reuse/signals.py +1 -1
  143. udata/core/reuse/tasks.py +4 -5
  144. udata/core/site/api.py +47 -50
  145. udata/core/site/factories.py +2 -2
  146. udata/core/site/forms.py +4 -5
  147. udata/core/site/models.py +94 -63
  148. udata/core/site/rdf.py +14 -14
  149. udata/core/spam/api.py +16 -9
  150. udata/core/spam/constants.py +4 -4
  151. udata/core/spam/fields.py +13 -7
  152. udata/core/spam/models.py +27 -20
  153. udata/core/spam/signals.py +1 -1
  154. udata/core/spam/tests/test_spam.py +6 -5
  155. udata/core/spatial/api.py +72 -80
  156. udata/core/spatial/api_fields.py +73 -58
  157. udata/core/spatial/commands.py +67 -64
  158. udata/core/spatial/constants.py +3 -3
  159. udata/core/spatial/factories.py +37 -54
  160. udata/core/spatial/forms.py +27 -26
  161. udata/core/spatial/geoids.py +17 -17
  162. udata/core/spatial/models.py +43 -47
  163. udata/core/spatial/tasks.py +2 -1
  164. udata/core/spatial/tests/test_api.py +115 -130
  165. udata/core/spatial/tests/test_fields.py +74 -77
  166. udata/core/spatial/tests/test_geoid.py +22 -22
  167. udata/core/spatial/tests/test_models.py +5 -7
  168. udata/core/spatial/translations.py +16 -16
  169. udata/core/storages/__init__.py +16 -18
  170. udata/core/storages/api.py +66 -64
  171. udata/core/storages/tasks.py +7 -7
  172. udata/core/storages/utils.py +15 -15
  173. udata/core/storages/views.py +5 -6
  174. udata/core/tags/api.py +17 -14
  175. udata/core/tags/csv.py +4 -4
  176. udata/core/tags/models.py +8 -5
  177. udata/core/tags/tasks.py +11 -13
  178. udata/core/tags/views.py +4 -4
  179. udata/core/topic/api.py +84 -73
  180. udata/core/topic/apiv2.py +157 -127
  181. udata/core/topic/factories.py +3 -4
  182. udata/core/topic/forms.py +12 -14
  183. udata/core/topic/models.py +14 -19
  184. udata/core/topic/parsers.py +26 -26
  185. udata/core/user/activities.py +30 -29
  186. udata/core/user/api.py +151 -152
  187. udata/core/user/api_fields.py +132 -100
  188. udata/core/user/apiv2.py +7 -7
  189. udata/core/user/commands.py +38 -38
  190. udata/core/user/factories.py +8 -9
  191. udata/core/user/forms.py +14 -11
  192. udata/core/user/metrics.py +2 -2
  193. udata/core/user/models.py +68 -69
  194. udata/core/user/permissions.py +4 -5
  195. udata/core/user/rdf.py +7 -8
  196. udata/core/user/tasks.py +2 -2
  197. udata/core/user/tests/test_user_model.py +24 -16
  198. udata/cors.py +99 -0
  199. udata/db/tasks.py +2 -1
  200. udata/entrypoints.py +35 -31
  201. udata/errors.py +2 -1
  202. udata/event/values.py +6 -6
  203. udata/factories.py +2 -2
  204. udata/features/identicon/api.py +5 -6
  205. udata/features/identicon/backends.py +48 -55
  206. udata/features/identicon/tests/test_backends.py +4 -5
  207. udata/features/notifications/__init__.py +0 -1
  208. udata/features/notifications/actions.py +9 -9
  209. udata/features/notifications/api.py +17 -13
  210. udata/features/territories/__init__.py +12 -10
  211. udata/features/territories/api.py +14 -15
  212. udata/features/territories/models.py +23 -28
  213. udata/features/transfer/actions.py +8 -11
  214. udata/features/transfer/api.py +84 -77
  215. udata/features/transfer/factories.py +2 -1
  216. udata/features/transfer/models.py +11 -12
  217. udata/features/transfer/notifications.py +19 -15
  218. udata/features/transfer/permissions.py +5 -5
  219. udata/forms/__init__.py +5 -2
  220. udata/forms/fields.py +164 -172
  221. udata/forms/validators.py +19 -22
  222. udata/forms/widgets.py +9 -13
  223. udata/frontend/__init__.py +31 -26
  224. udata/frontend/csv.py +68 -58
  225. udata/frontend/markdown.py +40 -44
  226. udata/harvest/actions.py +89 -77
  227. udata/harvest/api.py +294 -238
  228. udata/harvest/backends/__init__.py +4 -4
  229. udata/harvest/backends/base.py +128 -111
  230. udata/harvest/backends/dcat.py +80 -66
  231. udata/harvest/commands.py +56 -60
  232. udata/harvest/csv.py +8 -8
  233. udata/harvest/exceptions.py +6 -3
  234. udata/harvest/filters.py +24 -23
  235. udata/harvest/forms.py +27 -28
  236. udata/harvest/models.py +88 -80
  237. udata/harvest/notifications.py +15 -10
  238. udata/harvest/signals.py +13 -13
  239. udata/harvest/tasks.py +11 -10
  240. udata/harvest/tests/factories.py +23 -24
  241. udata/harvest/tests/test_actions.py +136 -166
  242. udata/harvest/tests/test_api.py +220 -214
  243. udata/harvest/tests/test_base_backend.py +117 -112
  244. udata/harvest/tests/test_dcat_backend.py +380 -308
  245. udata/harvest/tests/test_filters.py +33 -22
  246. udata/harvest/tests/test_models.py +11 -14
  247. udata/harvest/tests/test_notifications.py +6 -7
  248. udata/harvest/tests/test_tasks.py +7 -6
  249. udata/i18n.py +237 -78
  250. udata/linkchecker/backends.py +5 -11
  251. udata/linkchecker/checker.py +23 -22
  252. udata/linkchecker/commands.py +4 -6
  253. udata/linkchecker/models.py +6 -6
  254. udata/linkchecker/tasks.py +18 -20
  255. udata/mail.py +21 -21
  256. udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
  257. udata/migrations/2020-08-24-add-fs-filename.py +9 -8
  258. udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
  259. udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
  260. udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
  261. udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
  262. udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
  263. udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
  264. udata/migrations/2021-08-17-follow-integrity.py +5 -4
  265. udata/migrations/2021-08-17-harvest-integrity.py +13 -12
  266. udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
  267. udata/migrations/2021-08-17-transfer-integrity.py +5 -4
  268. udata/migrations/2021-08-17-users-integrity.py +9 -8
  269. udata/migrations/2021-12-14-reuse-topics.py +7 -6
  270. udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
  271. udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
  272. udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
  273. udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
  274. udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
  275. udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
  276. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
  277. udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
  278. udata/migrations/__init__.py +123 -105
  279. udata/models/__init__.py +4 -4
  280. udata/mongo/__init__.py +13 -11
  281. udata/mongo/badges_field.py +3 -2
  282. udata/mongo/datetime_fields.py +13 -12
  283. udata/mongo/document.py +17 -16
  284. udata/mongo/engine.py +15 -16
  285. udata/mongo/errors.py +2 -1
  286. udata/mongo/extras_fields.py +30 -20
  287. udata/mongo/queryset.py +12 -12
  288. udata/mongo/slug_fields.py +38 -28
  289. udata/mongo/taglist_field.py +1 -2
  290. udata/mongo/url_field.py +5 -5
  291. udata/mongo/uuid_fields.py +4 -3
  292. udata/notifications/__init__.py +1 -1
  293. udata/notifications/mattermost.py +10 -9
  294. udata/rdf.py +167 -188
  295. udata/routing.py +40 -45
  296. udata/search/__init__.py +18 -19
  297. udata/search/adapter.py +17 -16
  298. udata/search/commands.py +44 -51
  299. udata/search/fields.py +13 -20
  300. udata/search/query.py +23 -18
  301. udata/search/result.py +9 -10
  302. udata/sentry.py +21 -19
  303. udata/settings.py +262 -198
  304. udata/sitemap.py +8 -6
  305. udata/storage/s3.py +20 -13
  306. udata/tags.py +4 -5
  307. udata/tasks.py +43 -42
  308. udata/tests/__init__.py +9 -6
  309. udata/tests/api/__init__.py +8 -6
  310. udata/tests/api/test_auth_api.py +395 -321
  311. udata/tests/api/test_base_api.py +33 -35
  312. udata/tests/api/test_contact_points.py +7 -9
  313. udata/tests/api/test_dataservices_api.py +211 -158
  314. udata/tests/api/test_datasets_api.py +823 -812
  315. udata/tests/api/test_follow_api.py +13 -15
  316. udata/tests/api/test_me_api.py +95 -112
  317. udata/tests/api/test_organizations_api.py +301 -339
  318. udata/tests/api/test_reports_api.py +35 -25
  319. udata/tests/api/test_reuses_api.py +134 -139
  320. udata/tests/api/test_swagger.py +5 -5
  321. udata/tests/api/test_tags_api.py +18 -25
  322. udata/tests/api/test_topics_api.py +94 -94
  323. udata/tests/api/test_transfer_api.py +53 -48
  324. udata/tests/api/test_user_api.py +128 -141
  325. udata/tests/apiv2/test_datasets.py +290 -198
  326. udata/tests/apiv2/test_me_api.py +10 -11
  327. udata/tests/apiv2/test_organizations.py +56 -74
  328. udata/tests/apiv2/test_swagger.py +5 -5
  329. udata/tests/apiv2/test_topics.py +69 -87
  330. udata/tests/cli/test_cli_base.py +8 -8
  331. udata/tests/cli/test_db_cli.py +21 -19
  332. udata/tests/dataservice/test_dataservice_tasks.py +8 -12
  333. udata/tests/dataset/test_csv_adapter.py +44 -35
  334. udata/tests/dataset/test_dataset_actions.py +2 -3
  335. udata/tests/dataset/test_dataset_commands.py +7 -8
  336. udata/tests/dataset/test_dataset_events.py +36 -29
  337. udata/tests/dataset/test_dataset_model.py +224 -217
  338. udata/tests/dataset/test_dataset_rdf.py +142 -131
  339. udata/tests/dataset/test_dataset_tasks.py +15 -15
  340. udata/tests/dataset/test_resource_preview.py +10 -13
  341. udata/tests/features/territories/__init__.py +9 -13
  342. udata/tests/features/territories/test_territories_api.py +71 -91
  343. udata/tests/forms/test_basic_fields.py +7 -7
  344. udata/tests/forms/test_current_user_field.py +39 -66
  345. udata/tests/forms/test_daterange_field.py +31 -39
  346. udata/tests/forms/test_dict_field.py +28 -26
  347. udata/tests/forms/test_extras_fields.py +102 -76
  348. udata/tests/forms/test_form_field.py +8 -8
  349. udata/tests/forms/test_image_field.py +33 -26
  350. udata/tests/forms/test_model_field.py +134 -123
  351. udata/tests/forms/test_model_list_field.py +7 -7
  352. udata/tests/forms/test_nested_model_list_field.py +117 -79
  353. udata/tests/forms/test_publish_as_field.py +36 -65
  354. udata/tests/forms/test_reference_field.py +34 -53
  355. udata/tests/forms/test_user_forms.py +23 -21
  356. udata/tests/forms/test_uuid_field.py +6 -10
  357. udata/tests/frontend/__init__.py +9 -6
  358. udata/tests/frontend/test_auth.py +7 -6
  359. udata/tests/frontend/test_csv.py +81 -96
  360. udata/tests/frontend/test_hooks.py +43 -43
  361. udata/tests/frontend/test_markdown.py +211 -191
  362. udata/tests/helpers.py +32 -37
  363. udata/tests/models.py +2 -2
  364. udata/tests/organization/test_csv_adapter.py +21 -16
  365. udata/tests/organization/test_notifications.py +11 -18
  366. udata/tests/organization/test_organization_model.py +13 -13
  367. udata/tests/organization/test_organization_rdf.py +29 -22
  368. udata/tests/organization/test_organization_tasks.py +16 -17
  369. udata/tests/plugin.py +79 -73
  370. udata/tests/reuse/test_reuse_model.py +21 -21
  371. udata/tests/reuse/test_reuse_task.py +11 -13
  372. udata/tests/search/__init__.py +11 -12
  373. udata/tests/search/test_adapter.py +60 -70
  374. udata/tests/search/test_query.py +16 -16
  375. udata/tests/search/test_results.py +10 -7
  376. udata/tests/site/test_site_api.py +11 -16
  377. udata/tests/site/test_site_metrics.py +20 -30
  378. udata/tests/site/test_site_model.py +4 -5
  379. udata/tests/site/test_site_rdf.py +94 -78
  380. udata/tests/test_activity.py +17 -17
  381. udata/tests/test_cors.py +62 -0
  382. udata/tests/test_discussions.py +292 -299
  383. udata/tests/test_i18n.py +37 -40
  384. udata/tests/test_linkchecker.py +91 -85
  385. udata/tests/test_mail.py +13 -17
  386. udata/tests/test_migrations.py +219 -180
  387. udata/tests/test_model.py +164 -157
  388. udata/tests/test_notifications.py +17 -17
  389. udata/tests/test_owned.py +14 -14
  390. udata/tests/test_rdf.py +25 -23
  391. udata/tests/test_routing.py +89 -93
  392. udata/tests/test_storages.py +137 -128
  393. udata/tests/test_tags.py +44 -46
  394. udata/tests/test_topics.py +7 -7
  395. udata/tests/test_transfer.py +42 -49
  396. udata/tests/test_uris.py +160 -161
  397. udata/tests/test_utils.py +79 -71
  398. udata/tests/user/test_user_rdf.py +5 -9
  399. udata/tests/workers/test_jobs_commands.py +57 -58
  400. udata/tests/workers/test_tasks_routing.py +23 -29
  401. udata/tests/workers/test_workers_api.py +125 -131
  402. udata/tests/workers/test_workers_helpers.py +6 -6
  403. udata/tracking.py +4 -6
  404. udata/uris.py +45 -46
  405. udata/utils.py +68 -66
  406. udata/wsgi.py +1 -1
  407. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/METADATA +7 -3
  408. udata-9.1.2.dev30454.dist-info/RECORD +706 -0
  409. udata-9.1.2.dev30355.dist-info/RECORD +0 -704
  410. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/LICENSE +0 -0
  411. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/WHEEL +0 -0
  412. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/entry_points.txt +0 -0
  413. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/top_level.txt +0 -0
@@ -1,24 +1,23 @@
1
1
  import pytest
2
2
 
3
- from udata.auth import login_user, PermissionDenied
4
-
5
- from udata.features.transfer.factories import TransferFactory
6
- from udata.features.transfer.actions import request_transfer, accept_transfer
7
- from udata.features.transfer.notifications import (
8
- transfer_request_notifications
9
- )
10
- from udata.models import Member, Dataset
11
-
12
- from udata.utils import faker
3
+ from udata.auth import PermissionDenied, login_user
13
4
  from udata.core.dataset.factories import DatasetFactory
14
5
  from udata.core.organization.factories import OrganizationFactory
15
- from udata.core.organization.metrics import update_org_metrics # noqa needed to register signals
16
- from udata.core.user.factories import UserFactory
17
- from udata.core.user.metrics import update_owner_metrics # noqa needed to register signals
6
+ from udata.core.organization.metrics import (
7
+ update_org_metrics, # noqa needed to register signals
8
+ )
9
+ from udata.core.user.factories import UserFactory
10
+ from udata.core.user.metrics import (
11
+ update_owner_metrics, # noqa needed to register signals
12
+ )
13
+ from udata.features.transfer.actions import accept_transfer, request_transfer
14
+ from udata.features.transfer.factories import TransferFactory
15
+ from udata.features.transfer.notifications import transfer_request_notifications
16
+ from udata.models import Dataset, Member
18
17
  from udata.tests.helpers import assert_emit
18
+ from udata.utils import faker
19
19
 
20
-
21
- pytestmark = pytest.mark.usefixtures('clean_db')
20
+ pytestmark = pytest.mark.usefixtures("clean_db")
22
21
 
23
22
 
24
23
  class TransferStartTest:
@@ -29,7 +28,7 @@ class TransferStartTest:
29
28
  assert transfer.recipient == recipient
30
29
  assert transfer.subject == subject
31
30
  assert transfer.comment == comment
32
- assert transfer.status == 'pending'
31
+ assert transfer.status == "pending"
33
32
 
34
33
  def test_request_transfer_owner_to_user(self):
35
34
  user = UserFactory()
@@ -42,7 +41,7 @@ class TransferStartTest:
42
41
 
43
42
  def test_request_transfer_organization_to_user(self):
44
43
  user = UserFactory()
45
- member = Member(user=user, role='admin')
44
+ member = Member(user=user, role="admin")
46
45
  org = OrganizationFactory(members=[member])
47
46
  dataset = DatasetFactory(owner=user, organization=org)
48
47
  recipient = UserFactory()
@@ -72,7 +71,7 @@ class TransferStartTest:
72
71
 
73
72
  def test_request_transfer_not_authorized_not_admin(self):
74
73
  user = UserFactory()
75
- member = Member(user=user, role='editor')
74
+ member = Member(user=user, role="editor")
76
75
  org = OrganizationFactory(members=[member])
77
76
  dataset = DatasetFactory(organization=org)
78
77
  recipient = UserFactory()
@@ -93,7 +92,7 @@ class TransferStartTest:
93
92
 
94
93
  def test_request_transfer_to_same_organization(self):
95
94
  user = UserFactory()
96
- member = Member(user=user, role='admin')
95
+ member = Member(user=user, role="admin")
97
96
  org = OrganizationFactory(members=[member])
98
97
  dataset = DatasetFactory(owner=user, organization=org)
99
98
  comment = faker.sentence()
@@ -109,74 +108,68 @@ class TransferAcceptTest:
109
108
  owner = UserFactory()
110
109
  recipient = UserFactory()
111
110
  subject = DatasetFactory(owner=owner)
112
- transfer = TransferFactory(owner=owner,
113
- recipient=recipient,
114
- subject=subject)
111
+ transfer = TransferFactory(owner=owner, recipient=recipient, subject=subject)
115
112
 
116
113
  owner.reload() # Needs updated metrics
117
- assert owner.get_metrics()['datasets'] == 1
114
+ assert owner.get_metrics()["datasets"] == 1
118
115
 
119
116
  recipient.reload() # Needs updated metrics
120
- assert recipient.get_metrics()['datasets'] == 0
117
+ assert recipient.get_metrics()["datasets"] == 0
121
118
 
122
119
  login_user(recipient)
123
120
  transfer = accept_transfer(transfer)
124
121
 
125
- assert transfer.status == 'accepted'
122
+ assert transfer.status == "accepted"
126
123
 
127
124
  subject.reload()
128
125
  assert subject.owner == recipient
129
126
 
130
127
  recipient.reload()
131
- assert recipient.get_metrics()['datasets'] == 1
128
+ assert recipient.get_metrics()["datasets"] == 1
132
129
 
133
130
  owner.reload()
134
- assert owner.get_metrics()['datasets'] == 0
131
+ assert owner.get_metrics()["datasets"] == 0
135
132
 
136
133
  def test_org_admin_can_accept_transfer(self):
137
134
  owner = UserFactory()
138
135
  admin = UserFactory()
139
- org = OrganizationFactory(members=[Member(user=admin, role='admin')])
136
+ org = OrganizationFactory(members=[Member(user=admin, role="admin")])
140
137
  subject = DatasetFactory(owner=owner)
141
- transfer = TransferFactory(owner=owner,
142
- recipient=org,
143
- subject=subject)
138
+ transfer = TransferFactory(owner=owner, recipient=org, subject=subject)
144
139
 
145
140
  owner.reload() # Needs updated metrics
146
- assert owner.get_metrics()['datasets'] == 1
141
+ assert owner.get_metrics()["datasets"] == 1
147
142
 
148
143
  org.reload() # Needs updated metrics
149
- assert org.get_metrics()['datasets'] == 0
144
+ assert org.get_metrics()["datasets"] == 0
150
145
 
151
146
  admin.reload() # Needs updated metrics
152
- assert admin.get_metrics()['datasets'] == 0
147
+ assert admin.get_metrics()["datasets"] == 0
153
148
 
154
149
  login_user(admin)
155
150
  transfer = accept_transfer(transfer)
156
151
 
157
- assert transfer.status == 'accepted'
152
+ assert transfer.status == "accepted"
158
153
 
159
154
  subject.reload()
160
155
  assert subject.organization == org
161
156
  assert subject.owner is None
162
157
 
163
158
  org.reload()
164
- assert org.get_metrics()['datasets'] == 1
159
+ assert org.get_metrics()["datasets"] == 1
165
160
 
166
161
  admin.reload()
167
- assert admin.get_metrics()['datasets'] == 0
162
+ assert admin.get_metrics()["datasets"] == 0
168
163
 
169
164
  owner.reload()
170
- assert owner.get_metrics()['datasets'] == 0
165
+ assert owner.get_metrics()["datasets"] == 0
171
166
 
172
167
  def test_org_editor_cant_accept_transfer(self):
173
168
  owner = UserFactory()
174
169
  editor = UserFactory()
175
- org = OrganizationFactory(members=[Member(user=editor, role='editor')])
170
+ org = OrganizationFactory(members=[Member(user=editor, role="editor")])
176
171
  subject = DatasetFactory(organization=org)
177
- transfer = TransferFactory(owner=owner,
178
- recipient=org,
179
- subject=subject)
172
+ transfer = TransferFactory(owner=owner, recipient=org, subject=subject)
180
173
 
181
174
  login_user(editor)
182
175
  with pytest.raises(PermissionDenied):
@@ -201,15 +194,15 @@ class TransferNotificationsTest:
201
194
  notifications = transfer_request_notifications(recipient)
202
195
  assert len(notifications) == len(datasets)
203
196
  for dt, details in notifications:
204
- transfer = transfers[details['id']]
205
- assert details['subject']['class'] == 'dataset'
206
- assert details['subject']['id'] == transfer.subject.id
197
+ transfer = transfers[details["id"]]
198
+ assert details["subject"]["class"] == "dataset"
199
+ assert details["subject"]["id"] == transfer.subject.id
207
200
 
208
201
  def test_pending_transfer_request_for_org(self):
209
202
  user = UserFactory()
210
203
  datasets = DatasetFactory.create_batch(2, owner=user)
211
204
  recipient = UserFactory()
212
- member = Member(user=recipient, role='editor')
205
+ member = Member(user=recipient, role="editor")
213
206
  org = OrganizationFactory(members=[member])
214
207
  comment = faker.sentence()
215
208
  transfers = {}
@@ -224,6 +217,6 @@ class TransferNotificationsTest:
224
217
  notifications = transfer_request_notifications(recipient)
225
218
  assert len(notifications) == len(datasets)
226
219
  for dt, details in notifications:
227
- transfer = transfers[details['id']]
228
- assert details['subject']['class'] == 'dataset'
229
- assert details['subject']['id'] == transfer.subject.id
220
+ transfer = transfers[details["id"]]
221
+ assert details["subject"]["class"] == "dataset"
222
+ assert details["subject"]["id"] == transfer.subject.id
udata/tests/test_uris.py CHANGED
@@ -3,290 +3,289 @@ import pytest
3
3
  from udata import uris
4
4
  from udata.settings import Defaults
5
5
 
6
-
7
6
  PUBLIC_HOSTS = [
8
- 'http://foo.com/blah_blah',
9
- 'http://foo.com/blah_blah/',
10
- 'http://foo.com/blah_blah_(wikipedia)',
11
- 'http://foo.com/blah_blah_(wikipedia)_(again)',
12
- 'http://www.example.com/wpstyle/?p=364',
13
- 'https://www.example.com/foo/?bar=baz&inga=42&quux',
14
- 'http://✪df.ws/123',
15
- 'http://➡.ws/䨹',
16
- 'http://⌘.ws',
17
- 'http://⌘.ws/',
18
- 'http://foo.com/blah_(wikipedia)#cite-1',
19
- 'http://foo.com/blah_(wikipedia)_blah#cite-1',
20
- 'http://foo.com/unicode_(✪)_in_parens',
21
- 'http://foo.com/(something)?after=parens',
22
- 'http://☺.damowmow.com/',
23
- 'http://code.google.com/events/#&product=browser',
24
- 'http://j.mp',
25
- 'ftp://foo.bar/baz',
26
- 'http://foo.bar/?q=Test%20URL-encoded%20stuff',
27
- 'http://مثال.إختبار.com',
28
- 'http://例子.测试.com',
29
- 'http://उदाहरण.परीक्षा.com',
30
- 'http://-.~_!$&\'()*+,;=:%40:80%2f::::::@example.com',
31
- 'http://1337.net',
32
- 'http://a.b-c.de',
33
- 'https://foo_bar.example.com/',
34
- 'ftps://foo.bar/',
35
- '//foo.bar/',
7
+ "http://foo.com/blah_blah",
8
+ "http://foo.com/blah_blah/",
9
+ "http://foo.com/blah_blah_(wikipedia)",
10
+ "http://foo.com/blah_blah_(wikipedia)_(again)",
11
+ "http://www.example.com/wpstyle/?p=364",
12
+ "https://www.example.com/foo/?bar=baz&inga=42&quux",
13
+ "http://✪df.ws/123",
14
+ "http://➡.ws/䨹",
15
+ "http://⌘.ws",
16
+ "http://⌘.ws/",
17
+ "http://foo.com/blah_(wikipedia)#cite-1",
18
+ "http://foo.com/blah_(wikipedia)_blah#cite-1",
19
+ "http://foo.com/unicode_(✪)_in_parens",
20
+ "http://foo.com/(something)?after=parens",
21
+ "http://☺.damowmow.com/",
22
+ "http://code.google.com/events/#&product=browser",
23
+ "http://j.mp",
24
+ "ftp://foo.bar/baz",
25
+ "http://foo.bar/?q=Test%20URL-encoded%20stuff",
26
+ "http://مثال.إختبار.com",
27
+ "http://例子.测试.com",
28
+ "http://उदाहरण.परीक्षा.com",
29
+ "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
30
+ "http://1337.net",
31
+ "http://a.b-c.de",
32
+ "https://foo_bar.example.com/",
33
+ "ftps://foo.bar/",
34
+ "//foo.bar/",
36
35
  ]
37
36
 
38
37
  PUBLIC_HOSTS_IDN = [
39
- 'http://例子.中国',
40
- 'http://somewhere.укр',
38
+ "http://例子.中国",
39
+ "http://somewhere.укр",
41
40
  ]
42
41
 
43
42
  WITH_CREDENTIALS = [
44
- 'http://userid:password@example.com:8080',
45
- 'http://userid:password@example.com:8080/',
46
- 'http://userid@example.com',
47
- 'http://userid@example.com/',
48
- 'http://userid@example.com:8080',
49
- 'http://userid@example.com:8080/',
50
- 'http://userid:password@example.com',
51
- 'http://userid:password@example.com/',
43
+ "http://userid:password@example.com:8080",
44
+ "http://userid:password@example.com:8080/",
45
+ "http://userid@example.com",
46
+ "http://userid@example.com/",
47
+ "http://userid@example.com:8080",
48
+ "http://userid@example.com:8080/",
49
+ "http://userid:password@example.com",
50
+ "http://userid:password@example.com/",
52
51
  ]
53
52
 
54
53
  PUBLIC_IPS = [
55
- 'http://142.42.1.1/',
56
- 'http://142.42.1.1:8080',
57
- 'http://142.42.1.1:8080/',
58
- 'http://223.255.255.254',
59
- 'http://[2a00:1450:4007:80e::2004]',
60
- 'http://[2a00:1450:4007:80e::2004]:8080',
61
- 'http://[2a00:1450:4007:80e::2004]:8080/',
54
+ "http://142.42.1.1/",
55
+ "http://142.42.1.1:8080",
56
+ "http://142.42.1.1:8080/",
57
+ "http://223.255.255.254",
58
+ "http://[2a00:1450:4007:80e::2004]",
59
+ "http://[2a00:1450:4007:80e::2004]:8080",
60
+ "http://[2a00:1450:4007:80e::2004]:8080/",
62
61
  ]
63
62
 
64
63
  PUBLIC = PUBLIC_HOSTS + PUBLIC_HOSTS_IDN + PUBLIC_IPS + WITH_CREDENTIALS
65
64
 
66
65
  PRIVATE_IPS = [
67
- 'http://10.1.1.1',
68
- 'http://10.1.1.1:8080',
69
- 'http://10.1.1.1:8080/index.html',
70
- 'http://10.1.1.254',
71
- 'http://10.1.1.254:8080',
72
- 'http://10.1.1.254:8080/index.html',
73
- 'http://[fc00::1]',
74
- 'http://[fc00::1]:8080',
75
- 'http://[fc00::1]:8080/index.html',
66
+ "http://10.1.1.1",
67
+ "http://10.1.1.1:8080",
68
+ "http://10.1.1.1:8080/index.html",
69
+ "http://10.1.1.254",
70
+ "http://10.1.1.254:8080",
71
+ "http://10.1.1.254:8080/index.html",
72
+ "http://[fc00::1]",
73
+ "http://[fc00::1]:8080",
74
+ "http://[fc00::1]:8080/index.html",
76
75
  ]
77
76
 
78
77
  PRIVATE = PRIVATE_IPS
79
78
 
80
79
  LOCAL_HOSTS = [
81
- 'http://localhost',
82
- 'http://localhost:8080',
83
- 'http://localhost:8080/index.html',
84
- 'http://localhost.localdomain',
85
- 'http://localhost.localdomain:8080',
86
- 'http://localhost.localdomain:8080/index.html',
80
+ "http://localhost",
81
+ "http://localhost:8080",
82
+ "http://localhost:8080/index.html",
83
+ "http://localhost.localdomain",
84
+ "http://localhost.localdomain:8080",
85
+ "http://localhost.localdomain:8080/index.html",
87
86
  ]
88
87
 
89
88
  LOCAL_IPS = [
90
- 'http://127.0.0.1',
91
- 'http://127.0.0.1:8080',
92
- 'http://127.0.0.1:8080/index.html',
93
- 'http://127.0.1.1',
94
- 'http://127.0.1.1:8080',
95
- 'http://127.0.1.1:8080/index.html',
96
- 'http://[::1]',
97
- 'http://[::1]:8080',
98
- 'http://[::1]:8080/index.html',
89
+ "http://127.0.0.1",
90
+ "http://127.0.0.1:8080",
91
+ "http://127.0.0.1:8080/index.html",
92
+ "http://127.0.1.1",
93
+ "http://127.0.1.1:8080",
94
+ "http://127.0.1.1:8080/index.html",
95
+ "http://[::1]",
96
+ "http://[::1]:8080",
97
+ "http://[::1]:8080/index.html",
99
98
  ]
100
99
 
101
100
  LOCAL = LOCAL_HOSTS + LOCAL_IPS
102
101
 
103
102
  MULTICAST = [
104
- 'http://224.1.1.1',
105
- 'http://224.1.1.1:8080',
106
- 'http://224.1.1.1:8080/index.html',
107
- 'http://[ff00::1]',
108
- 'http://[ff00::1]:8080',
109
- 'http://[ff00::1]:8080/index.html',
103
+ "http://224.1.1.1",
104
+ "http://224.1.1.1:8080",
105
+ "http://224.1.1.1:8080/index.html",
106
+ "http://[ff00::1]",
107
+ "http://[ff00::1]:8080",
108
+ "http://[ff00::1]:8080/index.html",
110
109
  ]
111
110
 
112
111
  INVALID = [
113
- 'http://',
114
- 'h/://.',
115
- 'http://..',
116
- 'http://../',
117
- 'http://?',
118
- 'http://??',
119
- 'http://??/',
120
- 'http://#',
121
- 'http://##',
122
- 'http://##/',
123
- 'http://foo.bar?q=Spaces should be encoded',
124
- 'http://foo.bar?q=Spaces should be encoded with unicode é',
125
- '//',
126
- '//a',
127
- '///a',
128
- '///',
129
- 'http:///a',
130
- 'foo.com',
131
- 'rdar://1234',
132
- 'h://test',
133
- 'http:// shouldfail.com',
134
- ':// should fail',
135
- 'http://foo.bar/foo(bar)baz quux',
136
- 'http://-error-.invalid/',
137
- 'http://_error_.invalid/',
138
- 'http://a.b--c.de/',
139
- 'http://-a.b.co',
140
- 'http://a.b-.co',
141
- 'http://0.0.0.0',
142
- 'http://10.1.1.0',
143
- 'http://10.1.1.255',
144
- 'http://1.1.1.1.1',
145
- 'http://123.123.123',
146
- 'http://3628126748',
147
- 'http://.www.foo.bar/',
148
- 'http://www.foo.bar./',
149
- 'http://.www.foo.bar./',
150
- 'http://[fffff:1450:4007:80e::2004]',
151
- 'http://[fffff:1450:4007:80e::2004]:8080',
152
- 'http://[fffff:1450:4007:80e::2004]:8080/index.html',
153
- 'http://[::]',
154
- 'http://[::]:8080',
155
- 'http://[::]:8080/index.html',
112
+ "http://",
113
+ "h/://.",
114
+ "http://..",
115
+ "http://../",
116
+ "http://?",
117
+ "http://??",
118
+ "http://??/",
119
+ "http://#",
120
+ "http://##",
121
+ "http://##/",
122
+ "http://foo.bar?q=Spaces should be encoded",
123
+ "http://foo.bar?q=Spaces should be encoded with unicode é",
124
+ "//",
125
+ "//a",
126
+ "///a",
127
+ "///",
128
+ "http:///a",
129
+ "foo.com",
130
+ "rdar://1234",
131
+ "h://test",
132
+ "http:// shouldfail.com",
133
+ ":// should fail",
134
+ "http://foo.bar/foo(bar)baz quux",
135
+ "http://-error-.invalid/",
136
+ "http://_error_.invalid/",
137
+ "http://a.b--c.de/",
138
+ "http://-a.b.co",
139
+ "http://a.b-.co",
140
+ "http://0.0.0.0",
141
+ "http://10.1.1.0",
142
+ "http://10.1.1.255",
143
+ "http://1.1.1.1.1",
144
+ "http://123.123.123",
145
+ "http://3628126748",
146
+ "http://.www.foo.bar/",
147
+ "http://www.foo.bar./",
148
+ "http://.www.foo.bar./",
149
+ "http://[fffff:1450:4007:80e::2004]",
150
+ "http://[fffff:1450:4007:80e::2004]:8080",
151
+ "http://[fffff:1450:4007:80e::2004]:8080/index.html",
152
+ "http://[::]",
153
+ "http://[::]:8080",
154
+ "http://[::]:8080/index.html",
156
155
  ]
157
156
 
158
157
  DEFAULT_SCHEMES = Defaults.URLS_ALLOWED_SCHEMES
159
158
  # Custom schemes not in uris.SCHEMES
160
- CUSTOM_SCHEMES = ['irc', 'unknown']
159
+ CUSTOM_SCHEMES = ["irc", "unknown"]
161
160
 
162
161
  # Extract some default TLDs
163
162
  DEFAULT_TLDS = list(Defaults.URLS_ALLOWED_TLDS)[:2]
164
163
  # Custom TLDs not in IANA official list
165
- CUSTOM_TLDS = ['i2', 'unknown']
164
+ CUSTOM_TLDS = ["i2", "unknown"]
166
165
 
167
166
 
168
167
  def test_validate_strip_url():
169
- assert uris.validate(' http://somewhere.com ') == 'http://somewhere.com'
168
+ assert uris.validate(" http://somewhere.com ") == "http://somewhere.com"
170
169
 
171
170
 
172
- @pytest.mark.parametrize('url', PUBLIC_HOSTS)
171
+ @pytest.mark.parametrize("url", PUBLIC_HOSTS)
173
172
  def test_default_should_validate_public_urls(url):
174
173
  assert uris.validate(url) == url
175
174
 
176
175
 
177
- @pytest.mark.parametrize('url', PUBLIC_HOSTS_IDN)
176
+ @pytest.mark.parametrize("url", PUBLIC_HOSTS_IDN)
178
177
  def test_default_should_validate_public_urls_with_utf8_tld(url):
179
178
  assert uris.validate(url) == url
180
179
 
181
180
 
182
- @pytest.mark.parametrize('url', PUBLIC_IPS)
181
+ @pytest.mark.parametrize("url", PUBLIC_IPS)
183
182
  def test_default_should_validate_public_ips(url):
184
183
  assert uris.validate(url) == url
185
184
 
186
185
 
187
- @pytest.mark.parametrize('scheme', DEFAULT_SCHEMES)
186
+ @pytest.mark.parametrize("scheme", DEFAULT_SCHEMES)
188
187
  def test_default_should_validate_default_schemes(scheme):
189
- url = '{0}://somewhere.com'.format(scheme)
188
+ url = "{0}://somewhere.com".format(scheme)
190
189
  assert uris.validate(url) == url
191
190
 
192
191
 
193
- @pytest.mark.parametrize('scheme', CUSTOM_SCHEMES)
192
+ @pytest.mark.parametrize("scheme", CUSTOM_SCHEMES)
194
193
  def test_default_should_not_validate_non_default_schemes(scheme):
195
- url = '{0}://somewhere.com'.format(scheme)
196
- with pytest.raises(uris.ValidationError, match='Invalid scheme'):
194
+ url = "{0}://somewhere.com".format(scheme)
195
+ with pytest.raises(uris.ValidationError, match="Invalid scheme"):
197
196
  uris.validate(url)
198
197
 
199
198
 
200
- @pytest.mark.parametrize('tld', CUSTOM_TLDS)
199
+ @pytest.mark.parametrize("tld", CUSTOM_TLDS)
201
200
  def test_default_should_not_validate_unknown_tlds(tld):
202
- url = 'http://somewhere.{0}'.format(tld)
203
- with pytest.raises(uris.ValidationError, match='Invalid TLD'):
201
+ url = "http://somewhere.{0}".format(tld)
202
+ with pytest.raises(uris.ValidationError, match="Invalid TLD"):
204
203
  uris.validate(url)
205
204
 
206
205
 
207
- @pytest.mark.parametrize('url', PRIVATE)
206
+ @pytest.mark.parametrize("url", PRIVATE)
208
207
  def test_default_should_not_validate_private_urls(url):
209
- with pytest.raises(uris.ValidationError, match='private URL'):
208
+ with pytest.raises(uris.ValidationError, match="private URL"):
210
209
  uris.validate(url)
211
210
 
212
211
 
213
- @pytest.mark.parametrize('url', LOCAL_HOSTS)
212
+ @pytest.mark.parametrize("url", LOCAL_HOSTS)
214
213
  def test_default_should_not_validate_local_hosts(url):
215
- with pytest.raises(uris.ValidationError, match='local URL'):
214
+ with pytest.raises(uris.ValidationError, match="local URL"):
216
215
  uris.validate(url)
217
216
 
218
217
 
219
- @pytest.mark.parametrize('url', INVALID)
218
+ @pytest.mark.parametrize("url", INVALID)
220
219
  def test_should_not_validate_bad_urls(url):
221
- with pytest.raises(uris.ValidationError, match='Invalid URL'):
220
+ with pytest.raises(uris.ValidationError, match="Invalid URL"):
222
221
  uris.validate(url)
223
222
 
224
223
 
225
- @pytest.mark.parametrize('url', MULTICAST)
224
+ @pytest.mark.parametrize("url", MULTICAST)
226
225
  def test_should_not_validate_multicast_urls(url):
227
- with pytest.raises(uris.ValidationError, match='multicast IP'):
226
+ with pytest.raises(uris.ValidationError, match="multicast IP"):
228
227
  uris.validate(url)
229
228
 
230
229
 
231
- @pytest.mark.parametrize('url', PUBLIC + PRIVATE)
230
+ @pytest.mark.parametrize("url", PUBLIC + PRIVATE)
232
231
  def test_private_should_validate_public_and_private_urls(url):
233
232
  assert uris.validate(url, private=True) == url
234
233
 
235
234
 
236
- @pytest.mark.parametrize('url', LOCAL)
235
+ @pytest.mark.parametrize("url", LOCAL)
237
236
  def test_private_should_not_validate_local_urls(url):
238
- with pytest.raises(uris.ValidationError, match='local URL'):
237
+ with pytest.raises(uris.ValidationError, match="local URL"):
239
238
  uris.validate(url, private=True)
240
239
 
241
240
 
242
- @pytest.mark.parametrize('url', PUBLIC + LOCAL)
241
+ @pytest.mark.parametrize("url", PUBLIC + LOCAL)
243
242
  def test_local_should_validate_public_and_local_urls(url):
244
243
  assert uris.validate(url, local=True) == url
245
244
 
246
245
 
247
- @pytest.mark.parametrize('url', PRIVATE)
246
+ @pytest.mark.parametrize("url", PRIVATE)
248
247
  def test_local_should_not_validate_private_urls(url):
249
- with pytest.raises(uris.ValidationError, match='private URL'):
248
+ with pytest.raises(uris.ValidationError, match="private URL"):
250
249
  uris.validate(url, local=True)
251
250
 
252
251
 
253
- @pytest.mark.parametrize('url', PUBLIC + LOCAL + PRIVATE)
252
+ @pytest.mark.parametrize("url", PUBLIC + LOCAL + PRIVATE)
254
253
  def test_private_local_should_validate_any_valid_urls(url):
255
254
  assert uris.validate(url, local=True, private=True) == url
256
255
 
257
256
 
258
- @pytest.mark.parametrize('scheme', CUSTOM_SCHEMES)
257
+ @pytest.mark.parametrize("scheme", CUSTOM_SCHEMES)
259
258
  def test_custom_schemes(scheme):
260
- url = '{0}://somewhere.com'.format(scheme)
259
+ url = "{0}://somewhere.com".format(scheme)
261
260
  assert uris.validate(url, schemes=CUSTOM_SCHEMES) == url
262
261
 
263
262
 
264
- @pytest.mark.parametrize('scheme', DEFAULT_SCHEMES)
263
+ @pytest.mark.parametrize("scheme", DEFAULT_SCHEMES)
265
264
  def test_custom_schemes_should_not_validate_defaults(scheme):
266
- url = '{0}://somewhere.com'.format(scheme)
267
- with pytest.raises(uris.ValidationError, match='Invalid scheme'):
265
+ url = "{0}://somewhere.com".format(scheme)
266
+ with pytest.raises(uris.ValidationError, match="Invalid scheme"):
268
267
  uris.validate(url, schemes=CUSTOM_SCHEMES)
269
268
 
270
269
 
271
- @pytest.mark.parametrize('tld', CUSTOM_TLDS)
270
+ @pytest.mark.parametrize("tld", CUSTOM_TLDS)
272
271
  def test_custom_tlds(tld):
273
- url = 'http://somewhere.{0}'.format(tld)
272
+ url = "http://somewhere.{0}".format(tld)
274
273
  assert uris.validate(url, tlds=CUSTOM_TLDS) == url
275
274
 
276
275
 
277
- @pytest.mark.parametrize('tld', DEFAULT_TLDS)
276
+ @pytest.mark.parametrize("tld", DEFAULT_TLDS)
278
277
  def test_custom_tlds_should_not_validate_defaults(tld):
279
- url = 'http://somewhere.{0}'.format(tld)
280
- with pytest.raises(uris.ValidationError, match='Invalid '):
278
+ url = "http://somewhere.{0}".format(tld)
279
+ with pytest.raises(uris.ValidationError, match="Invalid "):
281
280
  uris.validate(url, tlds=CUSTOM_TLDS)
282
281
 
283
282
 
284
- @pytest.mark.parametrize('url', WITH_CREDENTIALS)
283
+ @pytest.mark.parametrize("url", WITH_CREDENTIALS)
285
284
  def test_with_credentials(url):
286
285
  assert uris.validate(url) == url
287
286
 
288
287
 
289
- @pytest.mark.parametrize('url', WITH_CREDENTIALS)
288
+ @pytest.mark.parametrize("url", WITH_CREDENTIALS)
290
289
  def test_with_credentials_disabled(url):
291
- with pytest.raises(uris.ValidationError, match='Credentials in URL are not allowed'):
290
+ with pytest.raises(uris.ValidationError, match="Credentials in URL are not allowed"):
292
291
  uris.validate(url, credentials=False)