udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30382__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 (425) 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 +135 -124
  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 +56 -54
  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/db/tasks.py +2 -1
  199. udata/entrypoints.py +35 -31
  200. udata/errors.py +2 -1
  201. udata/event/values.py +6 -6
  202. udata/factories.py +2 -2
  203. udata/features/identicon/api.py +5 -6
  204. udata/features/identicon/backends.py +48 -55
  205. udata/features/identicon/tests/test_backends.py +4 -5
  206. udata/features/notifications/__init__.py +0 -1
  207. udata/features/notifications/actions.py +9 -9
  208. udata/features/notifications/api.py +17 -13
  209. udata/features/territories/__init__.py +12 -10
  210. udata/features/territories/api.py +14 -15
  211. udata/features/territories/models.py +23 -28
  212. udata/features/transfer/actions.py +8 -11
  213. udata/features/transfer/api.py +84 -77
  214. udata/features/transfer/factories.py +2 -1
  215. udata/features/transfer/models.py +11 -12
  216. udata/features/transfer/notifications.py +19 -15
  217. udata/features/transfer/permissions.py +5 -5
  218. udata/forms/__init__.py +5 -2
  219. udata/forms/fields.py +164 -172
  220. udata/forms/validators.py +19 -22
  221. udata/forms/widgets.py +9 -13
  222. udata/frontend/__init__.py +31 -26
  223. udata/frontend/csv.py +68 -58
  224. udata/frontend/markdown.py +40 -44
  225. udata/harvest/actions.py +89 -77
  226. udata/harvest/api.py +294 -238
  227. udata/harvest/backends/__init__.py +4 -4
  228. udata/harvest/backends/base.py +128 -111
  229. udata/harvest/backends/dcat.py +80 -66
  230. udata/harvest/commands.py +56 -60
  231. udata/harvest/csv.py +8 -8
  232. udata/harvest/exceptions.py +6 -3
  233. udata/harvest/filters.py +24 -23
  234. udata/harvest/forms.py +27 -28
  235. udata/harvest/models.py +88 -80
  236. udata/harvest/notifications.py +15 -10
  237. udata/harvest/signals.py +13 -13
  238. udata/harvest/tasks.py +11 -10
  239. udata/harvest/tests/factories.py +23 -24
  240. udata/harvest/tests/test_actions.py +136 -166
  241. udata/harvest/tests/test_api.py +220 -214
  242. udata/harvest/tests/test_base_backend.py +117 -112
  243. udata/harvest/tests/test_dcat_backend.py +380 -308
  244. udata/harvest/tests/test_filters.py +33 -22
  245. udata/harvest/tests/test_models.py +11 -14
  246. udata/harvest/tests/test_notifications.py +6 -7
  247. udata/harvest/tests/test_tasks.py +7 -6
  248. udata/i18n.py +237 -78
  249. udata/linkchecker/backends.py +5 -11
  250. udata/linkchecker/checker.py +23 -22
  251. udata/linkchecker/commands.py +4 -6
  252. udata/linkchecker/models.py +6 -6
  253. udata/linkchecker/tasks.py +18 -20
  254. udata/mail.py +21 -21
  255. udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
  256. udata/migrations/2020-08-24-add-fs-filename.py +9 -8
  257. udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
  258. udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
  259. udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
  260. udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
  261. udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
  262. udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
  263. udata/migrations/2021-08-17-follow-integrity.py +5 -4
  264. udata/migrations/2021-08-17-harvest-integrity.py +13 -12
  265. udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
  266. udata/migrations/2021-08-17-transfer-integrity.py +5 -4
  267. udata/migrations/2021-08-17-users-integrity.py +9 -8
  268. udata/migrations/2021-12-14-reuse-topics.py +7 -6
  269. udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
  270. udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
  271. udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
  272. udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
  273. udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
  274. udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
  275. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
  276. udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
  277. udata/migrations/__init__.py +123 -105
  278. udata/models/__init__.py +4 -4
  279. udata/mongo/__init__.py +13 -11
  280. udata/mongo/badges_field.py +3 -2
  281. udata/mongo/datetime_fields.py +13 -12
  282. udata/mongo/document.py +17 -16
  283. udata/mongo/engine.py +15 -16
  284. udata/mongo/errors.py +2 -1
  285. udata/mongo/extras_fields.py +30 -20
  286. udata/mongo/queryset.py +12 -12
  287. udata/mongo/slug_fields.py +38 -28
  288. udata/mongo/taglist_field.py +1 -2
  289. udata/mongo/url_field.py +5 -5
  290. udata/mongo/uuid_fields.py +4 -3
  291. udata/notifications/__init__.py +1 -1
  292. udata/notifications/mattermost.py +10 -9
  293. udata/rdf.py +167 -188
  294. udata/routing.py +40 -45
  295. udata/search/__init__.py +18 -19
  296. udata/search/adapter.py +17 -16
  297. udata/search/commands.py +44 -51
  298. udata/search/fields.py +13 -20
  299. udata/search/query.py +23 -18
  300. udata/search/result.py +9 -10
  301. udata/sentry.py +21 -19
  302. udata/settings.py +262 -198
  303. udata/sitemap.py +8 -6
  304. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js → 11.52e531c19f8de80c00cf.js} +3 -3
  305. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js.map → 11.52e531c19f8de80c00cf.js.map} +1 -1
  306. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js → 13.c3343a7f1070061c0e10.js} +2 -2
  307. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js.map → 13.c3343a7f1070061c0e10.js.map} +1 -1
  308. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js → 16.8fa42440ad75ca172e6d.js} +2 -2
  309. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js.map → 16.8fa42440ad75ca172e6d.js.map} +1 -1
  310. udata/static/chunks/{19.350a9f150b074b4ecefa.js → 19.9c6c8412729cd6d59cfa.js} +3 -3
  311. udata/static/chunks/{19.350a9f150b074b4ecefa.js.map → 19.9c6c8412729cd6d59cfa.js.map} +1 -1
  312. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js → 5.71d15c2e4f21feee2a9a.js} +3 -3
  313. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js.map → 5.71d15c2e4f21feee2a9a.js.map} +1 -1
  314. udata/static/chunks/{6.d8a5f7b017bcbd083641.js → 6.9139dc098b8ea640b890.js} +3 -3
  315. udata/static/chunks/{6.d8a5f7b017bcbd083641.js.map → 6.9139dc098b8ea640b890.js.map} +1 -1
  316. udata/static/common.js +1 -1
  317. udata/static/common.js.map +1 -1
  318. udata/storage/s3.py +20 -13
  319. udata/tags.py +4 -5
  320. udata/tasks.py +43 -42
  321. udata/tests/__init__.py +9 -6
  322. udata/tests/api/__init__.py +5 -6
  323. udata/tests/api/test_auth_api.py +395 -321
  324. udata/tests/api/test_base_api.py +31 -33
  325. udata/tests/api/test_contact_points.py +7 -9
  326. udata/tests/api/test_dataservices_api.py +211 -158
  327. udata/tests/api/test_datasets_api.py +823 -812
  328. udata/tests/api/test_follow_api.py +13 -15
  329. udata/tests/api/test_me_api.py +95 -112
  330. udata/tests/api/test_organizations_api.py +301 -339
  331. udata/tests/api/test_reports_api.py +35 -25
  332. udata/tests/api/test_reuses_api.py +134 -139
  333. udata/tests/api/test_swagger.py +5 -5
  334. udata/tests/api/test_tags_api.py +18 -25
  335. udata/tests/api/test_topics_api.py +94 -94
  336. udata/tests/api/test_transfer_api.py +53 -48
  337. udata/tests/api/test_user_api.py +128 -141
  338. udata/tests/apiv2/test_datasets.py +290 -198
  339. udata/tests/apiv2/test_me_api.py +10 -11
  340. udata/tests/apiv2/test_organizations.py +56 -74
  341. udata/tests/apiv2/test_swagger.py +5 -5
  342. udata/tests/apiv2/test_topics.py +69 -87
  343. udata/tests/cli/test_cli_base.py +8 -8
  344. udata/tests/cli/test_db_cli.py +21 -19
  345. udata/tests/dataservice/test_dataservice_tasks.py +8 -12
  346. udata/tests/dataset/test_csv_adapter.py +44 -35
  347. udata/tests/dataset/test_dataset_actions.py +2 -3
  348. udata/tests/dataset/test_dataset_commands.py +7 -8
  349. udata/tests/dataset/test_dataset_events.py +36 -29
  350. udata/tests/dataset/test_dataset_model.py +224 -217
  351. udata/tests/dataset/test_dataset_rdf.py +142 -131
  352. udata/tests/dataset/test_dataset_tasks.py +15 -15
  353. udata/tests/dataset/test_resource_preview.py +10 -13
  354. udata/tests/features/territories/__init__.py +9 -13
  355. udata/tests/features/territories/test_territories_api.py +71 -91
  356. udata/tests/forms/test_basic_fields.py +7 -7
  357. udata/tests/forms/test_current_user_field.py +39 -66
  358. udata/tests/forms/test_daterange_field.py +31 -39
  359. udata/tests/forms/test_dict_field.py +28 -26
  360. udata/tests/forms/test_extras_fields.py +102 -76
  361. udata/tests/forms/test_form_field.py +8 -8
  362. udata/tests/forms/test_image_field.py +33 -26
  363. udata/tests/forms/test_model_field.py +134 -123
  364. udata/tests/forms/test_model_list_field.py +7 -7
  365. udata/tests/forms/test_nested_model_list_field.py +117 -79
  366. udata/tests/forms/test_publish_as_field.py +36 -65
  367. udata/tests/forms/test_reference_field.py +34 -53
  368. udata/tests/forms/test_user_forms.py +23 -21
  369. udata/tests/forms/test_uuid_field.py +6 -10
  370. udata/tests/frontend/__init__.py +9 -6
  371. udata/tests/frontend/test_auth.py +7 -6
  372. udata/tests/frontend/test_csv.py +81 -96
  373. udata/tests/frontend/test_hooks.py +43 -43
  374. udata/tests/frontend/test_markdown.py +211 -191
  375. udata/tests/helpers.py +32 -37
  376. udata/tests/models.py +2 -2
  377. udata/tests/organization/test_csv_adapter.py +21 -16
  378. udata/tests/organization/test_notifications.py +11 -18
  379. udata/tests/organization/test_organization_model.py +13 -13
  380. udata/tests/organization/test_organization_rdf.py +29 -22
  381. udata/tests/organization/test_organization_tasks.py +16 -17
  382. udata/tests/plugin.py +76 -73
  383. udata/tests/reuse/test_reuse_model.py +21 -21
  384. udata/tests/reuse/test_reuse_task.py +11 -13
  385. udata/tests/search/__init__.py +11 -12
  386. udata/tests/search/test_adapter.py +60 -70
  387. udata/tests/search/test_query.py +16 -16
  388. udata/tests/search/test_results.py +10 -7
  389. udata/tests/site/test_site_api.py +11 -16
  390. udata/tests/site/test_site_metrics.py +20 -30
  391. udata/tests/site/test_site_model.py +4 -5
  392. udata/tests/site/test_site_rdf.py +94 -78
  393. udata/tests/test_activity.py +17 -17
  394. udata/tests/test_discussions.py +292 -299
  395. udata/tests/test_i18n.py +37 -40
  396. udata/tests/test_linkchecker.py +91 -85
  397. udata/tests/test_mail.py +13 -17
  398. udata/tests/test_migrations.py +219 -180
  399. udata/tests/test_model.py +164 -157
  400. udata/tests/test_notifications.py +17 -17
  401. udata/tests/test_owned.py +14 -14
  402. udata/tests/test_rdf.py +25 -23
  403. udata/tests/test_routing.py +89 -93
  404. udata/tests/test_storages.py +137 -128
  405. udata/tests/test_tags.py +44 -46
  406. udata/tests/test_topics.py +7 -7
  407. udata/tests/test_transfer.py +42 -49
  408. udata/tests/test_uris.py +160 -161
  409. udata/tests/test_utils.py +79 -71
  410. udata/tests/user/test_user_rdf.py +5 -9
  411. udata/tests/workers/test_jobs_commands.py +57 -58
  412. udata/tests/workers/test_tasks_routing.py +23 -29
  413. udata/tests/workers/test_workers_api.py +125 -131
  414. udata/tests/workers/test_workers_helpers.py +6 -6
  415. udata/tracking.py +4 -6
  416. udata/uris.py +45 -46
  417. udata/utils.py +68 -66
  418. udata/wsgi.py +1 -1
  419. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/METADATA +3 -2
  420. udata-9.1.2.dev30382.dist-info/RECORD +704 -0
  421. udata-9.1.2.dev30355.dist-info/RECORD +0 -704
  422. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/LICENSE +0 -0
  423. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/WHEEL +0 -0
  424. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/entry_points.txt +0 -0
  425. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/top_level.txt +0 -0
@@ -1,45 +1,58 @@
1
- import pytest
2
- import requests
3
-
4
1
  from datetime import date
5
2
  from xml.etree.ElementTree import XML
6
3
 
4
+ import pytest
5
+ import requests
7
6
  from flask import url_for
8
-
9
- from rdflib import Graph, URIRef, Literal, BNode
7
+ from rdflib import BNode, Graph, Literal, URIRef
10
8
  from rdflib.namespace import FOAF, RDF
11
9
  from rdflib.resource import Resource as RdfResource
12
10
 
13
- from udata.mongo import db
14
- from udata.core.dataset.models import Dataset, Resource, License, Checksum, HarvestDatasetMetadata
15
- from udata.core.dataset.factories import (
16
- DatasetFactory, ResourceFactory, LicenseFactory
11
+ from udata.core.dataset.factories import DatasetFactory, LicenseFactory, ResourceFactory
12
+ from udata.core.dataset.models import (
13
+ Checksum,
14
+ Dataset,
15
+ HarvestDatasetMetadata,
16
+ License,
17
+ Resource,
17
18
  )
18
19
  from udata.core.dataset.rdf import (
19
- dataset_to_rdf, dataset_from_rdf, resource_to_rdf, resource_from_rdf,
20
- temporal_from_rdf, frequency_to_rdf, frequency_from_rdf,
21
- EU_RDF_REQUENCIES
22
- )
23
- from udata.rdf import (
24
- TAG_TO_EU_HVD_CATEGORIES
20
+ EU_RDF_REQUENCIES,
21
+ dataset_from_rdf,
22
+ dataset_to_rdf,
23
+ frequency_from_rdf,
24
+ frequency_to_rdf,
25
+ resource_from_rdf,
26
+ resource_to_rdf,
27
+ temporal_from_rdf,
25
28
  )
26
29
  from udata.core.organization.factories import OrganizationFactory
27
30
  from udata.i18n import gettext as _
28
- from udata.rdf import DCAT, DCATAP, DCT, FREQ, SPDX, SCHEMA, SKOS, HVD_LEGISLATION
29
- from udata.utils import faker
31
+ from udata.mongo import db
32
+ from udata.rdf import (
33
+ DCAT,
34
+ DCATAP,
35
+ DCT,
36
+ FREQ,
37
+ HVD_LEGISLATION,
38
+ SCHEMA,
39
+ SKOS,
40
+ SPDX,
41
+ TAG_TO_EU_HVD_CATEGORIES,
42
+ )
30
43
  from udata.tests.helpers import assert200, assert_redirects
44
+ from udata.utils import faker
31
45
 
32
-
33
- pytestmark = pytest.mark.usefixtures('app')
46
+ pytestmark = pytest.mark.usefixtures("app")
34
47
 
35
48
  FREQ_SAMPLE = [
36
- (FREQ.annual, 'annual'),
37
- (FREQ.monthly, 'monthly'),
38
- (FREQ.daily, 'daily'),
39
- (FREQ.continuous, 'continuous'),
49
+ (FREQ.annual, "annual"),
50
+ (FREQ.monthly, "monthly"),
51
+ (FREQ.daily, "daily"),
52
+ (FREQ.continuous, "continuous"),
40
53
  ]
41
54
 
42
- GOV_UK_REF = 'http://reference.data.gov.uk/id/year/2017'
55
+ GOV_UK_REF = "http://reference.data.gov.uk/id/year/2017"
43
56
 
44
57
  try:
45
58
  requests.head(GOV_UK_REF, timeout=0.1)
@@ -51,7 +64,6 @@ else:
51
64
 
52
65
  @pytest.mark.frontend
53
66
  class DatasetToRdfTest:
54
-
55
67
  def test_minimal(self):
56
68
  dataset = DatasetFactory.build() # Does not have an URL
57
69
  d = dataset_to_rdf(dataset)
@@ -71,8 +83,13 @@ class DatasetToRdfTest:
71
83
  def test_all_dataset_fields(self):
72
84
  resources = ResourceFactory.build_batch(3)
73
85
  org = OrganizationFactory(name="organization")
74
- dataset = DatasetFactory(tags=faker.words(nb=3), resources=resources,
75
- frequency='daily', acronym='acro', organization=org)
86
+ dataset = DatasetFactory(
87
+ tags=faker.words(nb=3),
88
+ resources=resources,
89
+ frequency="daily",
90
+ acronym="acro",
91
+ organization=org,
92
+ )
76
93
  d = dataset_to_rdf(dataset)
77
94
  g = d.graph
78
95
 
@@ -82,8 +99,7 @@ class DatasetToRdfTest:
82
99
  assert g.value(d.identifier, RDF.type) == DCAT.Dataset
83
100
 
84
101
  assert isinstance(d.identifier, URIRef)
85
- uri = url_for('api.dataset',
86
- dataset=dataset.id, _external=True)
102
+ uri = url_for("api.dataset", dataset=dataset.id, _external=True)
87
103
  assert str(d.identifier) == uri
88
104
  assert d.value(DCT.identifier) == Literal(dataset.id)
89
105
  assert d.value(DCT.title) == Literal(dataset.title)
@@ -100,18 +116,18 @@ class DatasetToRdfTest:
100
116
  assert org.value(FOAF.name) == Literal("organization")
101
117
 
102
118
  def test_map_unkownn_frequencies(self):
103
- assert frequency_to_rdf('hourly') == FREQ.continuous
119
+ assert frequency_to_rdf("hourly") == FREQ.continuous
104
120
 
105
- assert frequency_to_rdf('fourTimesADay') == FREQ.daily
106
- assert frequency_to_rdf('threeTimesADay') == FREQ.daily
107
- assert frequency_to_rdf('semidaily') == FREQ.daily
121
+ assert frequency_to_rdf("fourTimesADay") == FREQ.daily
122
+ assert frequency_to_rdf("threeTimesADay") == FREQ.daily
123
+ assert frequency_to_rdf("semidaily") == FREQ.daily
108
124
 
109
- assert frequency_to_rdf('fourTimesAWeek') == FREQ.threeTimesAWeek
125
+ assert frequency_to_rdf("fourTimesAWeek") == FREQ.threeTimesAWeek
110
126
 
111
- assert frequency_to_rdf('punctual') is None
112
- assert frequency_to_rdf('unknown') is None
127
+ assert frequency_to_rdf("punctual") is None
128
+ assert frequency_to_rdf("unknown") is None
113
129
 
114
- assert frequency_to_rdf('quinquennial') is None # Better idea ?
130
+ assert frequency_to_rdf("quinquennial") is None # Better idea ?
115
131
 
116
132
  def test_minimal_resource_fields(self):
117
133
  resource = ResourceFactory()
@@ -131,11 +147,9 @@ class DatasetToRdfTest:
131
147
 
132
148
  def test_all_resource_fields(self):
133
149
  license = LicenseFactory()
134
- resource = ResourceFactory(format='csv')
150
+ resource = ResourceFactory(format="csv")
135
151
  dataset = DatasetFactory(resources=[resource], license=license)
136
- permalink = url_for('api.resource_redirect',
137
- id=resource.id,
138
- _external=True)
152
+ permalink = url_for("api.resource_redirect", id=resource.id, _external=True)
139
153
 
140
154
  r = resource_to_rdf(resource, dataset)
141
155
 
@@ -153,14 +167,12 @@ class DatasetToRdfTest:
153
167
 
154
168
  checksum = r.value(SPDX.checksum)
155
169
  assert r.graph.value(checksum.identifier, RDF.type) == SPDX.Checksum
156
- assert (r.graph.value(checksum.identifier, SPDX.algorithm)
157
- == SPDX.checksumAlgorithm_sha1)
158
- assert (checksum.value(SPDX.checksumValue)
159
- == Literal(resource.checksum.value))
170
+ assert r.graph.value(checksum.identifier, SPDX.algorithm) == SPDX.checksumAlgorithm_sha1
171
+ assert checksum.value(SPDX.checksumValue) == Literal(resource.checksum.value)
160
172
 
161
173
  def test_temporal_coverage(self):
162
- start = faker.past_date(start_date='-30d')
163
- end = faker.future_date(end_date='+30d')
174
+ start = faker.past_date(start_date="-30d")
175
+ end = faker.future_date(end_date="+30d")
164
176
  temporal_coverage = db.DateRange(start=start, end=end)
165
177
  dataset = DatasetFactory(temporal_coverage=temporal_coverage)
166
178
 
@@ -173,34 +185,34 @@ class DatasetToRdfTest:
173
185
  assert pot.value(DCAT.endDate).toPython() == end
174
186
 
175
187
  def test_from_external_repository(self):
176
- dataset = DatasetFactory(harvest=HarvestDatasetMetadata(
177
- dct_identifier='an-identifier',
178
- uri='https://somewhere.org/dataset'
179
- ))
188
+ dataset = DatasetFactory(
189
+ harvest=HarvestDatasetMetadata(
190
+ dct_identifier="an-identifier", uri="https://somewhere.org/dataset"
191
+ )
192
+ )
180
193
 
181
194
  d = dataset_to_rdf(dataset)
182
195
 
183
196
  assert isinstance(d.identifier, URIRef)
184
- assert str(d.identifier) == 'https://somewhere.org/dataset'
185
- assert d.value(DCT.identifier) == Literal('an-identifier')
197
+ assert str(d.identifier) == "https://somewhere.org/dataset"
198
+ assert d.value(DCT.identifier) == Literal("an-identifier")
186
199
 
187
200
  def test_hvd_dataset(self):
188
- '''Test that a dataset tagged hvd has appropriate DCAT-AP HVD properties'''
201
+ """Test that a dataset tagged hvd has appropriate DCAT-AP HVD properties"""
189
202
  dataset = DatasetFactory(
190
- resources=ResourceFactory.build_batch(3),
191
- tags=['hvd', 'mobilite', 'test']
203
+ resources=ResourceFactory.build_batch(3), tags=["hvd", "mobilite", "test"]
192
204
  )
193
205
  d = dataset_to_rdf(dataset)
194
206
 
195
207
  assert d.value(DCATAP.applicableLegislation).identifier == URIRef(HVD_LEGISLATION)
196
208
  assert d.value(DCATAP.hvdCategory).identifier == URIRef(
197
- TAG_TO_EU_HVD_CATEGORIES['mobilite']
209
+ TAG_TO_EU_HVD_CATEGORIES["mobilite"]
198
210
  )
199
211
  for distrib in d.objects(DCAT.distribution):
200
212
  assert distrib.value(DCATAP.applicableLegislation).identifier == URIRef(HVD_LEGISLATION)
201
213
 
202
214
 
203
- @pytest.mark.usefixtures('clean_db')
215
+ @pytest.mark.usefixtures("clean_db")
204
216
  class RdfToDatasetTest:
205
217
  def test_minimal(self):
206
218
  node = BNode()
@@ -219,7 +231,7 @@ class RdfToDatasetTest:
219
231
  def test_update(self):
220
232
  original = DatasetFactory()
221
233
 
222
- node = URIRef('https://test.org/dataset')
234
+ node = URIRef("https://test.org/dataset")
223
235
  g = Graph()
224
236
 
225
237
  new_title = faker.sentence()
@@ -255,7 +267,7 @@ class RdfToDatasetTest:
255
267
  def test_update_from_multiple(self):
256
268
  original = DatasetFactory()
257
269
 
258
- node = URIRef('https://test.org/dataset')
270
+ node = URIRef("https://test.org/dataset")
259
271
  g = Graph()
260
272
 
261
273
  new_title = faker.sentence()
@@ -275,7 +287,7 @@ class RdfToDatasetTest:
275
287
  assert dataset.title == new_title
276
288
 
277
289
  def test_all_fields(self):
278
- uri = 'https://test.org/dataset'
290
+ uri = "https://test.org/dataset"
279
291
  node = URIRef(uri)
280
292
  g = Graph()
281
293
 
@@ -284,8 +296,8 @@ class RdfToDatasetTest:
284
296
  acronym = faker.word()
285
297
  description = faker.paragraph()
286
298
  tags = faker.words(nb=3)
287
- start = faker.past_date(start_date='-30d')
288
- end = faker.future_date(end_date='+30d')
299
+ start = faker.past_date(start_date="-30d")
300
+ end = faker.future_date(end_date="+30d")
289
301
  g.set((node, RDF.type, DCAT.Dataset))
290
302
  g.set((node, DCT.identifier, Literal(id)))
291
303
  g.set((node, DCT.title, Literal(title)))
@@ -307,7 +319,7 @@ class RdfToDatasetTest:
307
319
  assert dataset.title == title
308
320
  assert dataset.acronym == acronym
309
321
  assert dataset.description == description
310
- assert dataset.frequency == 'daily'
322
+ assert dataset.frequency == "daily"
311
323
  assert set(dataset.tags) == set(tags)
312
324
  assert isinstance(dataset.temporal_coverage, db.DateRange)
313
325
  assert dataset.temporal_coverage.start == start
@@ -323,13 +335,13 @@ class RdfToDatasetTest:
323
335
  g.add((node, RDF.type, DCAT.Dataset))
324
336
  g.add((node, DCT.identifier, Literal(faker.uuid4())))
325
337
  g.add((node, DCT.title, Literal(faker.sentence())))
326
- g.add((node, DCT.description, Literal('<div>a description</div>')))
338
+ g.add((node, DCT.description, Literal("<div>a description</div>")))
327
339
 
328
340
  dataset = dataset_from_rdf(g)
329
341
  dataset.validate()
330
342
 
331
343
  assert isinstance(dataset, Dataset)
332
- assert dataset.description == 'a description'
344
+ assert dataset.description == "a description"
333
345
 
334
346
  def test_theme_and_tags(self):
335
347
  node = BNode()
@@ -350,31 +362,31 @@ class RdfToDatasetTest:
350
362
  assert isinstance(dataset, Dataset)
351
363
  assert set(dataset.tags) == set(tags + themes)
352
364
 
353
- @pytest.mark.parametrize('freq,expected', FREQ_SAMPLE)
365
+ @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
354
366
  def test_parse_dublin_core_frequencies(self, freq, expected):
355
367
  assert frequency_from_rdf(freq) == expected
356
368
 
357
- @pytest.mark.parametrize('freq,expected', FREQ_SAMPLE)
369
+ @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
358
370
  def test_parse_dublin_core_frequencies_as_resource(self, freq, expected):
359
371
  g = Graph()
360
372
  resource = RdfResource(g, freq)
361
373
  assert frequency_from_rdf(resource) == expected
362
374
 
363
- @pytest.mark.parametrize('freq,expected', FREQ_SAMPLE)
375
+ @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
364
376
  def test_parse_dublin_core_frequencies_as_url(self, freq, expected):
365
377
  assert frequency_from_rdf(str(freq)) == expected
366
378
 
367
- @pytest.mark.parametrize('freq,expected', EU_RDF_REQUENCIES.items())
379
+ @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
368
380
  def test_parse_european_frequencies(self, freq, expected):
369
381
  assert frequency_from_rdf(freq) == expected
370
382
 
371
- @pytest.mark.parametrize('freq,expected', EU_RDF_REQUENCIES.items())
383
+ @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
372
384
  def test_parse_european_frequencies_as_resource(self, freq, expected):
373
385
  g = Graph()
374
386
  resource = RdfResource(g, freq)
375
387
  assert frequency_from_rdf(resource) == expected
376
388
 
377
- @pytest.mark.parametrize('freq,expected', EU_RDF_REQUENCIES.items())
389
+ @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
378
390
  def test_parse_european_frequencies_as_url(self, freq, expected):
379
391
  assert frequency_from_rdf(str(freq)) == expected
380
392
 
@@ -403,8 +415,8 @@ class RdfToDatasetTest:
403
415
  url = faker.uri()
404
416
  description = faker.paragraph()
405
417
  filesize = faker.pyint()
406
- issued = faker.date_time_between(start_date='-60d', end_date='-30d')
407
- modified = faker.past_datetime(start_date='-30d')
418
+ issued = faker.date_time_between(start_date="-60d", end_date="-30d")
419
+ modified = faker.past_datetime(start_date="-30d")
408
420
  mime = faker.mime_type()
409
421
  sha1 = faker.sha1()
410
422
 
@@ -416,7 +428,7 @@ class RdfToDatasetTest:
416
428
  g.add((node, DCT.modified, Literal(modified)))
417
429
  g.add((node, DCAT.byteSize, Literal(filesize)))
418
430
  g.add((node, DCAT.mediaType, Literal(mime)))
419
- g.add((node, DCT.format, Literal('CSV')))
431
+ g.add((node, DCT.format, Literal("CSV")))
420
432
 
421
433
  checksum = BNode()
422
434
  g.add((node, SPDX.checksum, checksum))
@@ -434,11 +446,11 @@ class RdfToDatasetTest:
434
446
  assert resource.filesize == filesize
435
447
  assert resource.mime == mime
436
448
  assert isinstance(resource.checksum, Checksum)
437
- assert resource.checksum.type == 'sha1'
449
+ assert resource.checksum.type == "sha1"
438
450
  assert resource.checksum.value == sha1
439
451
  assert resource.harvest.created_at.date() == issued.date()
440
452
  assert resource.harvest.modified_at.date() == modified.date()
441
- assert resource.format == 'csv'
453
+ assert resource.format == "csv"
442
454
 
443
455
  def test_download_url_over_access_url(self):
444
456
  node = BNode()
@@ -465,7 +477,7 @@ class RdfToDatasetTest:
465
477
  g = Graph()
466
478
 
467
479
  description = faker.paragraph()
468
- html_description = '<div>{0}</div>'.format(description)
480
+ html_description = "<div>{0}</div>".format(description)
469
481
  g.add((node, RDF.type, DCAT.Distribution))
470
482
  g.add((node, DCT.title, Literal(faker.sentence())))
471
483
  g.add((node, DCT.description, Literal(html_description)))
@@ -479,7 +491,7 @@ class RdfToDatasetTest:
479
491
  def test_resource_title_from_url(self):
480
492
  node = BNode()
481
493
  g = Graph()
482
- url = 'https://www.somewhere.com/somefile.csv'
494
+ url = "https://www.somewhere.com/somefile.csv"
483
495
 
484
496
  g.set((node, RDF.type, DCAT.Distribution))
485
497
  g.set((node, DCAT.downloadURL, URIRef(url)))
@@ -487,26 +499,26 @@ class RdfToDatasetTest:
487
499
  resource = resource_from_rdf(g)
488
500
  resource.validate()
489
501
 
490
- assert resource.title == 'somefile.csv'
502
+ assert resource.title == "somefile.csv"
491
503
 
492
504
  def test_resource_title_from_format(self):
493
505
  node = BNode()
494
506
  g = Graph()
495
- url = 'https://www.somewhere.com/no-extension/'
507
+ url = "https://www.somewhere.com/no-extension/"
496
508
 
497
509
  g.set((node, RDF.type, DCAT.Distribution))
498
510
  g.set((node, DCAT.downloadURL, URIRef(url)))
499
- g.set((node, DCT.format, Literal('CSV')))
511
+ g.set((node, DCT.format, Literal("CSV")))
500
512
 
501
513
  resource = resource_from_rdf(g)
502
514
  resource.validate()
503
515
 
504
- assert resource.title == _('{format} resource').format(format='csv')
516
+ assert resource.title == _("{format} resource").format(format="csv")
505
517
 
506
518
  def test_resource_generic_title(self):
507
519
  node = BNode()
508
520
  g = Graph()
509
- url = 'https://www.somewhere.com/no-extension/'
521
+ url = "https://www.somewhere.com/no-extension/"
510
522
 
511
523
  g.set((node, RDF.type, DCAT.Distribution))
512
524
  g.set((node, DCAT.downloadURL, URIRef(url)))
@@ -514,12 +526,12 @@ class RdfToDatasetTest:
514
526
  resource = resource_from_rdf(g)
515
527
  resource.validate()
516
528
 
517
- assert resource.title == _('Nameless resource')
529
+ assert resource.title == _("Nameless resource")
518
530
 
519
531
  def test_resource_title_ignore_dynamic_url(self):
520
532
  node = BNode()
521
533
  g = Graph()
522
- url = 'https://www.somewhere.com/endpoint.json?param=value'
534
+ url = "https://www.somewhere.com/endpoint.json?param=value"
523
535
 
524
536
  g.set((node, RDF.type, DCAT.Distribution))
525
537
  g.set((node, DCAT.downloadURL, URIRef(url)))
@@ -527,7 +539,7 @@ class RdfToDatasetTest:
527
539
  resource = resource_from_rdf(g)
528
540
  resource.validate()
529
541
 
530
- assert resource.title == _('Nameless resource')
542
+ assert resource.title == _("Nameless resource")
531
543
 
532
544
  def test_match_existing_resource_by_url(self):
533
545
  dataset = DatasetFactory(resources=ResourceFactory.build_batch(3))
@@ -583,7 +595,7 @@ class RdfToDatasetTest:
583
595
  assert len(dataset.resources) == 3
584
596
 
585
597
  def test_dataset_has_resources_from_buggy_plural_distribution(self):
586
- '''Try to extract resources from the wrong distributions attribute'''
598
+ """Try to extract resources from the wrong distributions attribute"""
587
599
  node = BNode()
588
600
  g = Graph()
589
601
 
@@ -696,8 +708,8 @@ class RdfToDatasetTest:
696
708
  def test_parse_temporal_as_schema_format(self):
697
709
  node = BNode()
698
710
  g = Graph()
699
- start = faker.past_date(start_date='-30d')
700
- end = faker.future_date(end_date='+30d')
711
+ start = faker.past_date(start_date="-30d")
712
+ end = faker.future_date(end_date="+30d")
701
713
 
702
714
  g.set((node, RDF.type, DCT.PeriodOfTime))
703
715
  g.set((node, SCHEMA.startDate, Literal(start)))
@@ -710,10 +722,10 @@ class RdfToDatasetTest:
710
722
  assert daterange.end == end
711
723
 
712
724
  def test_parse_temporal_as_iso_interval(self):
713
- start = faker.past_date(start_date='-30d')
714
- end = faker.future_date(end_date='+30d')
725
+ start = faker.past_date(start_date="-30d")
726
+ end = faker.future_date(end_date="+30d")
715
727
 
716
- pot = Literal('{0}/{1}'.format(start.isoformat(), end.isoformat()))
728
+ pot = Literal("{0}/{1}".format(start.isoformat(), end.isoformat()))
717
729
 
718
730
  daterange = temporal_from_rdf(pot)
719
731
 
@@ -722,7 +734,7 @@ class RdfToDatasetTest:
722
734
  assert daterange.end == end
723
735
 
724
736
  def test_parse_temporal_as_iso_year(self):
725
- pot = Literal('2017')
737
+ pot = Literal("2017")
726
738
 
727
739
  daterange = temporal_from_rdf(pot)
728
740
 
@@ -731,7 +743,7 @@ class RdfToDatasetTest:
731
743
  assert daterange.end, date(2017, 12 == 31)
732
744
 
733
745
  def test_parse_temporal_as_iso_month(self):
734
- pot = Literal('2017-06')
746
+ pot = Literal("2017-06")
735
747
 
736
748
  daterange = temporal_from_rdf(pot)
737
749
 
@@ -739,10 +751,9 @@ class RdfToDatasetTest:
739
751
  assert daterange.start, date(2017, 6 == 1)
740
752
  assert daterange.end, date(2017, 6 == 30)
741
753
 
742
- @pytest.mark.skipif(not GOV_UK_REF_IS_UP,
743
- reason='Gov.uk references is unreachable')
754
+ @pytest.mark.skipif(not GOV_UK_REF_IS_UP, reason="Gov.uk references is unreachable")
744
755
  def test_parse_temporal_as_gov_uk_format(self):
745
- node = URIRef('http://reference.data.gov.uk/id/year/2017')
756
+ node = URIRef("http://reference.data.gov.uk/id/year/2017")
746
757
  g = Graph()
747
758
 
748
759
  g.set((node, RDF.type, DCT.PeriodOfTime))
@@ -754,18 +765,18 @@ class RdfToDatasetTest:
754
765
  assert daterange.end, date(2017, 12 == 31)
755
766
 
756
767
  def test_parse_temporal_is_failsafe(self):
757
- node = URIRef('http://nowhere.org')
768
+ node = URIRef("http://nowhere.org")
758
769
  g = Graph()
759
770
 
760
771
  g.set((node, RDF.type, DCT.PeriodOfTime))
761
772
 
762
773
  assert temporal_from_rdf(g.resource(node)) is None
763
- assert temporal_from_rdf(Literal('unparseable')) is None
774
+ assert temporal_from_rdf(Literal("unparseable")) is None
764
775
 
765
776
  def test_unicode(self):
766
777
  g = Graph()
767
- title = 'ééé'
768
- description = 'éééé'
778
+ title = "ééé"
779
+ description = "éééé"
769
780
 
770
781
  node = BNode()
771
782
  g.add((node, RDF.type, DCAT.Dataset))
@@ -791,53 +802,53 @@ class RdfToDatasetTest:
791
802
 
792
803
  @pytest.mark.frontend
793
804
  class DatasetRdfViewsTest:
794
-
795
805
  def test_rdf_default_to_jsonld(self, client):
796
806
  dataset = DatasetFactory()
797
- expected = url_for('api.dataset_rdf_format',
798
- dataset=dataset.id, format='json')
799
- response = client.get(url_for('api.dataset_rdf', dataset=dataset))
807
+ expected = url_for("api.dataset_rdf_format", dataset=dataset.id, format="json")
808
+ response = client.get(url_for("api.dataset_rdf", dataset=dataset))
800
809
  assert_redirects(response, expected)
801
810
 
802
811
  def test_rdf_perform_content_negociation(self, client):
803
812
  dataset = DatasetFactory()
804
- expected = url_for('api.dataset_rdf_format',
805
- dataset=dataset.id, format='xml')
806
- url = url_for('api.dataset_rdf', dataset=dataset)
807
- headers = {'accept': 'application/xml'}
813
+ expected = url_for("api.dataset_rdf_format", dataset=dataset.id, format="xml")
814
+ url = url_for("api.dataset_rdf", dataset=dataset)
815
+ headers = {"accept": "application/xml"}
808
816
  response = client.get(url, headers=headers)
809
817
  assert_redirects(response, expected)
810
818
 
811
819
  def test_rdf_perform_content_negociation_response(self, client):
812
- '''Check we have valid XML as output'''
820
+ """Check we have valid XML as output"""
813
821
  dataset = DatasetFactory()
814
- url = url_for('api.dataset_rdf', dataset=dataset)
815
- headers = {'accept': 'application/xml'}
822
+ url = url_for("api.dataset_rdf", dataset=dataset)
823
+ headers = {"accept": "application/xml"}
816
824
  response = client.get(url, headers=headers, follow_redirects=True)
817
825
  element = XML(response.data)
818
- assert element.tag == '{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF'
826
+ assert element.tag == "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF"
819
827
 
820
828
  def test_dataset_rdf_json_ld(self, client):
821
829
  dataset = DatasetFactory()
822
- for fmt in 'json', 'jsonld':
823
- url = url_for('api.dataset_rdf_format', dataset=dataset, format=fmt)
824
- response = client.get(url, headers={'Accept': 'application/ld+json'})
830
+ for fmt in "json", "jsonld":
831
+ url = url_for("api.dataset_rdf_format", dataset=dataset, format=fmt)
832
+ response = client.get(url, headers={"Accept": "application/ld+json"})
825
833
  assert200(response)
826
- assert response.content_type == 'application/ld+json'
827
- assert response.json['@context']['@vocab'] == 'http://www.w3.org/ns/dcat#'
828
-
829
- @pytest.mark.parametrize('fmt,mime', [
830
- ('n3', 'text/n3'),
831
- ('nt', 'application/n-triples'),
832
- ('ttl', 'application/x-turtle'),
833
- ('xml', 'application/rdf+xml'),
834
- ('rdf', 'application/rdf+xml'),
835
- ('owl', 'application/rdf+xml'),
836
- ('trig', 'application/trig'),
837
- ])
834
+ assert response.content_type == "application/ld+json"
835
+ assert response.json["@context"]["@vocab"] == "http://www.w3.org/ns/dcat#"
836
+
837
+ @pytest.mark.parametrize(
838
+ "fmt,mime",
839
+ [
840
+ ("n3", "text/n3"),
841
+ ("nt", "application/n-triples"),
842
+ ("ttl", "application/x-turtle"),
843
+ ("xml", "application/rdf+xml"),
844
+ ("rdf", "application/rdf+xml"),
845
+ ("owl", "application/rdf+xml"),
846
+ ("trig", "application/trig"),
847
+ ],
848
+ )
838
849
  def test_dataset_rdf_formats(self, client, fmt, mime):
839
850
  dataset = DatasetFactory()
840
- url = url_for('api.dataset_rdf_format', dataset=dataset, format=fmt)
841
- response = client.get(url, headers={'Accept': mime})
851
+ url = url_for("api.dataset_rdf_format", dataset=dataset, format=fmt)
852
+ response = client.get(url, headers={"Accept": mime})
842
853
  assert200(response)
843
854
  assert response.content_type == mime