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.
- tasks/__init__.py +109 -107
- tasks/helpers.py +18 -18
- udata/__init__.py +4 -4
- udata/admin/views.py +5 -5
- udata/api/__init__.py +135 -124
- udata/api/commands.py +45 -37
- udata/api/errors.py +5 -4
- udata/api/fields.py +23 -21
- udata/api/oauth2.py +55 -74
- udata/api/parsers.py +15 -15
- udata/api/signals.py +1 -1
- udata/api_fields.py +137 -89
- udata/app.py +56 -54
- udata/assets.py +5 -5
- udata/auth/__init__.py +37 -26
- udata/auth/forms.py +23 -15
- udata/auth/helpers.py +1 -1
- udata/auth/mails.py +3 -3
- udata/auth/password_validation.py +19 -15
- udata/auth/views.py +94 -68
- udata/commands/__init__.py +71 -69
- udata/commands/cache.py +7 -7
- udata/commands/db.py +201 -140
- udata/commands/dcat.py +36 -30
- udata/commands/fixtures.py +100 -84
- udata/commands/images.py +21 -20
- udata/commands/info.py +17 -20
- udata/commands/init.py +10 -10
- udata/commands/purge.py +12 -13
- udata/commands/serve.py +41 -29
- udata/commands/static.py +16 -18
- udata/commands/test.py +20 -20
- udata/commands/tests/fixtures.py +26 -24
- udata/commands/worker.py +31 -33
- udata/core/__init__.py +12 -12
- udata/core/activity/__init__.py +0 -1
- udata/core/activity/api.py +59 -49
- udata/core/activity/models.py +28 -26
- udata/core/activity/signals.py +1 -1
- udata/core/activity/tasks.py +16 -10
- udata/core/badges/api.py +6 -6
- udata/core/badges/commands.py +14 -13
- udata/core/badges/fields.py +8 -5
- udata/core/badges/forms.py +7 -4
- udata/core/badges/models.py +16 -31
- udata/core/badges/permissions.py +1 -3
- udata/core/badges/signals.py +2 -2
- udata/core/badges/tasks.py +3 -2
- udata/core/badges/tests/test_commands.py +10 -10
- udata/core/badges/tests/test_model.py +24 -31
- udata/core/contact_point/api.py +19 -18
- udata/core/contact_point/api_fields.py +21 -14
- udata/core/contact_point/factories.py +2 -2
- udata/core/contact_point/forms.py +7 -6
- udata/core/contact_point/models.py +3 -5
- udata/core/dataservices/api.py +26 -21
- udata/core/dataservices/factories.py +13 -11
- udata/core/dataservices/models.py +35 -40
- udata/core/dataservices/permissions.py +4 -4
- udata/core/dataservices/rdf.py +40 -17
- udata/core/dataservices/tasks.py +4 -3
- udata/core/dataset/actions.py +10 -10
- udata/core/dataset/activities.py +21 -23
- udata/core/dataset/api.py +321 -298
- udata/core/dataset/api_fields.py +443 -271
- udata/core/dataset/apiv2.py +305 -229
- udata/core/dataset/commands.py +38 -36
- udata/core/dataset/constants.py +61 -54
- udata/core/dataset/csv.py +70 -74
- udata/core/dataset/events.py +39 -32
- udata/core/dataset/exceptions.py +8 -4
- udata/core/dataset/factories.py +57 -65
- udata/core/dataset/forms.py +87 -63
- udata/core/dataset/models.py +336 -280
- udata/core/dataset/permissions.py +9 -6
- udata/core/dataset/preview.py +15 -17
- udata/core/dataset/rdf.py +156 -122
- udata/core/dataset/search.py +92 -77
- udata/core/dataset/signals.py +1 -1
- udata/core/dataset/tasks.py +63 -54
- udata/core/discussions/actions.py +5 -5
- udata/core/discussions/api.py +124 -120
- udata/core/discussions/factories.py +2 -2
- udata/core/discussions/forms.py +9 -7
- udata/core/discussions/metrics.py +1 -3
- udata/core/discussions/models.py +25 -24
- udata/core/discussions/notifications.py +18 -14
- udata/core/discussions/permissions.py +3 -3
- udata/core/discussions/signals.py +4 -4
- udata/core/discussions/tasks.py +24 -28
- udata/core/followers/api.py +32 -33
- udata/core/followers/models.py +9 -9
- udata/core/followers/signals.py +3 -3
- udata/core/jobs/actions.py +7 -7
- udata/core/jobs/api.py +99 -92
- udata/core/jobs/commands.py +48 -49
- udata/core/jobs/forms.py +11 -11
- udata/core/jobs/models.py +6 -6
- udata/core/metrics/__init__.py +2 -2
- udata/core/metrics/commands.py +34 -30
- udata/core/metrics/models.py +2 -4
- udata/core/metrics/signals.py +1 -1
- udata/core/metrics/tasks.py +3 -3
- udata/core/organization/activities.py +12 -15
- udata/core/organization/api.py +167 -174
- udata/core/organization/api_fields.py +183 -124
- udata/core/organization/apiv2.py +32 -32
- udata/core/organization/commands.py +20 -22
- udata/core/organization/constants.py +11 -11
- udata/core/organization/csv.py +17 -15
- udata/core/organization/factories.py +8 -11
- udata/core/organization/forms.py +32 -26
- udata/core/organization/metrics.py +2 -1
- udata/core/organization/models.py +87 -67
- udata/core/organization/notifications.py +18 -14
- udata/core/organization/permissions.py +10 -11
- udata/core/organization/rdf.py +14 -14
- udata/core/organization/search.py +30 -28
- udata/core/organization/signals.py +7 -7
- udata/core/organization/tasks.py +42 -61
- udata/core/owned.py +38 -27
- udata/core/post/api.py +82 -81
- udata/core/post/constants.py +8 -5
- udata/core/post/factories.py +4 -4
- udata/core/post/forms.py +13 -14
- udata/core/post/models.py +20 -22
- udata/core/post/tests/test_api.py +30 -32
- udata/core/reports/api.py +8 -7
- udata/core/reports/constants.py +1 -3
- udata/core/reports/models.py +10 -10
- udata/core/reuse/activities.py +15 -19
- udata/core/reuse/api.py +123 -126
- udata/core/reuse/api_fields.py +120 -85
- udata/core/reuse/apiv2.py +11 -10
- udata/core/reuse/constants.py +23 -23
- udata/core/reuse/csv.py +18 -18
- udata/core/reuse/factories.py +5 -9
- udata/core/reuse/forms.py +24 -21
- udata/core/reuse/models.py +55 -51
- udata/core/reuse/permissions.py +2 -2
- udata/core/reuse/search.py +49 -46
- udata/core/reuse/signals.py +1 -1
- udata/core/reuse/tasks.py +4 -5
- udata/core/site/api.py +47 -50
- udata/core/site/factories.py +2 -2
- udata/core/site/forms.py +4 -5
- udata/core/site/models.py +94 -63
- udata/core/site/rdf.py +14 -14
- udata/core/spam/api.py +16 -9
- udata/core/spam/constants.py +4 -4
- udata/core/spam/fields.py +13 -7
- udata/core/spam/models.py +27 -20
- udata/core/spam/signals.py +1 -1
- udata/core/spam/tests/test_spam.py +6 -5
- udata/core/spatial/api.py +72 -80
- udata/core/spatial/api_fields.py +73 -58
- udata/core/spatial/commands.py +67 -64
- udata/core/spatial/constants.py +3 -3
- udata/core/spatial/factories.py +37 -54
- udata/core/spatial/forms.py +27 -26
- udata/core/spatial/geoids.py +17 -17
- udata/core/spatial/models.py +43 -47
- udata/core/spatial/tasks.py +2 -1
- udata/core/spatial/tests/test_api.py +115 -130
- udata/core/spatial/tests/test_fields.py +74 -77
- udata/core/spatial/tests/test_geoid.py +22 -22
- udata/core/spatial/tests/test_models.py +5 -7
- udata/core/spatial/translations.py +16 -16
- udata/core/storages/__init__.py +16 -18
- udata/core/storages/api.py +66 -64
- udata/core/storages/tasks.py +7 -7
- udata/core/storages/utils.py +15 -15
- udata/core/storages/views.py +5 -6
- udata/core/tags/api.py +17 -14
- udata/core/tags/csv.py +4 -4
- udata/core/tags/models.py +8 -5
- udata/core/tags/tasks.py +11 -13
- udata/core/tags/views.py +4 -4
- udata/core/topic/api.py +84 -73
- udata/core/topic/apiv2.py +157 -127
- udata/core/topic/factories.py +3 -4
- udata/core/topic/forms.py +12 -14
- udata/core/topic/models.py +14 -19
- udata/core/topic/parsers.py +26 -26
- udata/core/user/activities.py +30 -29
- udata/core/user/api.py +151 -152
- udata/core/user/api_fields.py +132 -100
- udata/core/user/apiv2.py +7 -7
- udata/core/user/commands.py +38 -38
- udata/core/user/factories.py +8 -9
- udata/core/user/forms.py +14 -11
- udata/core/user/metrics.py +2 -2
- udata/core/user/models.py +68 -69
- udata/core/user/permissions.py +4 -5
- udata/core/user/rdf.py +7 -8
- udata/core/user/tasks.py +2 -2
- udata/core/user/tests/test_user_model.py +24 -16
- udata/db/tasks.py +2 -1
- udata/entrypoints.py +35 -31
- udata/errors.py +2 -1
- udata/event/values.py +6 -6
- udata/factories.py +2 -2
- udata/features/identicon/api.py +5 -6
- udata/features/identicon/backends.py +48 -55
- udata/features/identicon/tests/test_backends.py +4 -5
- udata/features/notifications/__init__.py +0 -1
- udata/features/notifications/actions.py +9 -9
- udata/features/notifications/api.py +17 -13
- udata/features/territories/__init__.py +12 -10
- udata/features/territories/api.py +14 -15
- udata/features/territories/models.py +23 -28
- udata/features/transfer/actions.py +8 -11
- udata/features/transfer/api.py +84 -77
- udata/features/transfer/factories.py +2 -1
- udata/features/transfer/models.py +11 -12
- udata/features/transfer/notifications.py +19 -15
- udata/features/transfer/permissions.py +5 -5
- udata/forms/__init__.py +5 -2
- udata/forms/fields.py +164 -172
- udata/forms/validators.py +19 -22
- udata/forms/widgets.py +9 -13
- udata/frontend/__init__.py +31 -26
- udata/frontend/csv.py +68 -58
- udata/frontend/markdown.py +40 -44
- udata/harvest/actions.py +89 -77
- udata/harvest/api.py +294 -238
- udata/harvest/backends/__init__.py +4 -4
- udata/harvest/backends/base.py +128 -111
- udata/harvest/backends/dcat.py +80 -66
- udata/harvest/commands.py +56 -60
- udata/harvest/csv.py +8 -8
- udata/harvest/exceptions.py +6 -3
- udata/harvest/filters.py +24 -23
- udata/harvest/forms.py +27 -28
- udata/harvest/models.py +88 -80
- udata/harvest/notifications.py +15 -10
- udata/harvest/signals.py +13 -13
- udata/harvest/tasks.py +11 -10
- udata/harvest/tests/factories.py +23 -24
- udata/harvest/tests/test_actions.py +136 -166
- udata/harvest/tests/test_api.py +220 -214
- udata/harvest/tests/test_base_backend.py +117 -112
- udata/harvest/tests/test_dcat_backend.py +380 -308
- udata/harvest/tests/test_filters.py +33 -22
- udata/harvest/tests/test_models.py +11 -14
- udata/harvest/tests/test_notifications.py +6 -7
- udata/harvest/tests/test_tasks.py +7 -6
- udata/i18n.py +237 -78
- udata/linkchecker/backends.py +5 -11
- udata/linkchecker/checker.py +23 -22
- udata/linkchecker/commands.py +4 -6
- udata/linkchecker/models.py +6 -6
- udata/linkchecker/tasks.py +18 -20
- udata/mail.py +21 -21
- udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
- udata/migrations/2020-08-24-add-fs-filename.py +9 -8
- udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
- udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
- udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
- udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
- udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
- udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
- udata/migrations/2021-08-17-follow-integrity.py +5 -4
- udata/migrations/2021-08-17-harvest-integrity.py +13 -12
- udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
- udata/migrations/2021-08-17-transfer-integrity.py +5 -4
- udata/migrations/2021-08-17-users-integrity.py +9 -8
- udata/migrations/2021-12-14-reuse-topics.py +7 -6
- udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
- udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
- udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
- udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
- udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
- udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
- udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
- udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
- udata/migrations/__init__.py +123 -105
- udata/models/__init__.py +4 -4
- udata/mongo/__init__.py +13 -11
- udata/mongo/badges_field.py +3 -2
- udata/mongo/datetime_fields.py +13 -12
- udata/mongo/document.py +17 -16
- udata/mongo/engine.py +15 -16
- udata/mongo/errors.py +2 -1
- udata/mongo/extras_fields.py +30 -20
- udata/mongo/queryset.py +12 -12
- udata/mongo/slug_fields.py +38 -28
- udata/mongo/taglist_field.py +1 -2
- udata/mongo/url_field.py +5 -5
- udata/mongo/uuid_fields.py +4 -3
- udata/notifications/__init__.py +1 -1
- udata/notifications/mattermost.py +10 -9
- udata/rdf.py +167 -188
- udata/routing.py +40 -45
- udata/search/__init__.py +18 -19
- udata/search/adapter.py +17 -16
- udata/search/commands.py +44 -51
- udata/search/fields.py +13 -20
- udata/search/query.py +23 -18
- udata/search/result.py +9 -10
- udata/sentry.py +21 -19
- udata/settings.py +262 -198
- udata/sitemap.py +8 -6
- udata/static/chunks/{11.e9b9ca1f3e03d4020377.js → 11.52e531c19f8de80c00cf.js} +3 -3
- udata/static/chunks/{11.e9b9ca1f3e03d4020377.js.map → 11.52e531c19f8de80c00cf.js.map} +1 -1
- udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js → 13.c3343a7f1070061c0e10.js} +2 -2
- udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js.map → 13.c3343a7f1070061c0e10.js.map} +1 -1
- udata/static/chunks/{16.0baa2b64a74a2dcde25c.js → 16.8fa42440ad75ca172e6d.js} +2 -2
- udata/static/chunks/{16.0baa2b64a74a2dcde25c.js.map → 16.8fa42440ad75ca172e6d.js.map} +1 -1
- udata/static/chunks/{19.350a9f150b074b4ecefa.js → 19.9c6c8412729cd6d59cfa.js} +3 -3
- udata/static/chunks/{19.350a9f150b074b4ecefa.js.map → 19.9c6c8412729cd6d59cfa.js.map} +1 -1
- udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js → 5.71d15c2e4f21feee2a9a.js} +3 -3
- udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js.map → 5.71d15c2e4f21feee2a9a.js.map} +1 -1
- udata/static/chunks/{6.d8a5f7b017bcbd083641.js → 6.9139dc098b8ea640b890.js} +3 -3
- udata/static/chunks/{6.d8a5f7b017bcbd083641.js.map → 6.9139dc098b8ea640b890.js.map} +1 -1
- udata/static/common.js +1 -1
- udata/static/common.js.map +1 -1
- udata/storage/s3.py +20 -13
- udata/tags.py +4 -5
- udata/tasks.py +43 -42
- udata/tests/__init__.py +9 -6
- udata/tests/api/__init__.py +5 -6
- udata/tests/api/test_auth_api.py +395 -321
- udata/tests/api/test_base_api.py +31 -33
- udata/tests/api/test_contact_points.py +7 -9
- udata/tests/api/test_dataservices_api.py +211 -158
- udata/tests/api/test_datasets_api.py +823 -812
- udata/tests/api/test_follow_api.py +13 -15
- udata/tests/api/test_me_api.py +95 -112
- udata/tests/api/test_organizations_api.py +301 -339
- udata/tests/api/test_reports_api.py +35 -25
- udata/tests/api/test_reuses_api.py +134 -139
- udata/tests/api/test_swagger.py +5 -5
- udata/tests/api/test_tags_api.py +18 -25
- udata/tests/api/test_topics_api.py +94 -94
- udata/tests/api/test_transfer_api.py +53 -48
- udata/tests/api/test_user_api.py +128 -141
- udata/tests/apiv2/test_datasets.py +290 -198
- udata/tests/apiv2/test_me_api.py +10 -11
- udata/tests/apiv2/test_organizations.py +56 -74
- udata/tests/apiv2/test_swagger.py +5 -5
- udata/tests/apiv2/test_topics.py +69 -87
- udata/tests/cli/test_cli_base.py +8 -8
- udata/tests/cli/test_db_cli.py +21 -19
- udata/tests/dataservice/test_dataservice_tasks.py +8 -12
- udata/tests/dataset/test_csv_adapter.py +44 -35
- udata/tests/dataset/test_dataset_actions.py +2 -3
- udata/tests/dataset/test_dataset_commands.py +7 -8
- udata/tests/dataset/test_dataset_events.py +36 -29
- udata/tests/dataset/test_dataset_model.py +224 -217
- udata/tests/dataset/test_dataset_rdf.py +142 -131
- udata/tests/dataset/test_dataset_tasks.py +15 -15
- udata/tests/dataset/test_resource_preview.py +10 -13
- udata/tests/features/territories/__init__.py +9 -13
- udata/tests/features/territories/test_territories_api.py +71 -91
- udata/tests/forms/test_basic_fields.py +7 -7
- udata/tests/forms/test_current_user_field.py +39 -66
- udata/tests/forms/test_daterange_field.py +31 -39
- udata/tests/forms/test_dict_field.py +28 -26
- udata/tests/forms/test_extras_fields.py +102 -76
- udata/tests/forms/test_form_field.py +8 -8
- udata/tests/forms/test_image_field.py +33 -26
- udata/tests/forms/test_model_field.py +134 -123
- udata/tests/forms/test_model_list_field.py +7 -7
- udata/tests/forms/test_nested_model_list_field.py +117 -79
- udata/tests/forms/test_publish_as_field.py +36 -65
- udata/tests/forms/test_reference_field.py +34 -53
- udata/tests/forms/test_user_forms.py +23 -21
- udata/tests/forms/test_uuid_field.py +6 -10
- udata/tests/frontend/__init__.py +9 -6
- udata/tests/frontend/test_auth.py +7 -6
- udata/tests/frontend/test_csv.py +81 -96
- udata/tests/frontend/test_hooks.py +43 -43
- udata/tests/frontend/test_markdown.py +211 -191
- udata/tests/helpers.py +32 -37
- udata/tests/models.py +2 -2
- udata/tests/organization/test_csv_adapter.py +21 -16
- udata/tests/organization/test_notifications.py +11 -18
- udata/tests/organization/test_organization_model.py +13 -13
- udata/tests/organization/test_organization_rdf.py +29 -22
- udata/tests/organization/test_organization_tasks.py +16 -17
- udata/tests/plugin.py +76 -73
- udata/tests/reuse/test_reuse_model.py +21 -21
- udata/tests/reuse/test_reuse_task.py +11 -13
- udata/tests/search/__init__.py +11 -12
- udata/tests/search/test_adapter.py +60 -70
- udata/tests/search/test_query.py +16 -16
- udata/tests/search/test_results.py +10 -7
- udata/tests/site/test_site_api.py +11 -16
- udata/tests/site/test_site_metrics.py +20 -30
- udata/tests/site/test_site_model.py +4 -5
- udata/tests/site/test_site_rdf.py +94 -78
- udata/tests/test_activity.py +17 -17
- udata/tests/test_discussions.py +292 -299
- udata/tests/test_i18n.py +37 -40
- udata/tests/test_linkchecker.py +91 -85
- udata/tests/test_mail.py +13 -17
- udata/tests/test_migrations.py +219 -180
- udata/tests/test_model.py +164 -157
- udata/tests/test_notifications.py +17 -17
- udata/tests/test_owned.py +14 -14
- udata/tests/test_rdf.py +25 -23
- udata/tests/test_routing.py +89 -93
- udata/tests/test_storages.py +137 -128
- udata/tests/test_tags.py +44 -46
- udata/tests/test_topics.py +7 -7
- udata/tests/test_transfer.py +42 -49
- udata/tests/test_uris.py +160 -161
- udata/tests/test_utils.py +79 -71
- udata/tests/user/test_user_rdf.py +5 -9
- udata/tests/workers/test_jobs_commands.py +57 -58
- udata/tests/workers/test_tasks_routing.py +23 -29
- udata/tests/workers/test_workers_api.py +125 -131
- udata/tests/workers/test_workers_helpers.py +6 -6
- udata/tracking.py +4 -6
- udata/uris.py +45 -46
- udata/utils.py +68 -66
- udata/wsgi.py +1 -1
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/METADATA +3 -2
- udata-9.1.2.dev30382.dist-info/RECORD +704 -0
- udata-9.1.2.dev30355.dist-info/RECORD +0 -704
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/LICENSE +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/WHEEL +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/entry_points.txt +0 -0
- {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.
|
|
14
|
-
from udata.core.dataset.models import
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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.
|
|
29
|
-
from udata.
|
|
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,
|
|
37
|
-
(FREQ.monthly,
|
|
38
|
-
(FREQ.daily,
|
|
39
|
-
(FREQ.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 =
|
|
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(
|
|
75
|
-
|
|
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(
|
|
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(
|
|
119
|
+
assert frequency_to_rdf("hourly") == FREQ.continuous
|
|
104
120
|
|
|
105
|
-
assert frequency_to_rdf(
|
|
106
|
-
assert frequency_to_rdf(
|
|
107
|
-
assert frequency_to_rdf(
|
|
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(
|
|
125
|
+
assert frequency_to_rdf("fourTimesAWeek") == FREQ.threeTimesAWeek
|
|
110
126
|
|
|
111
|
-
assert frequency_to_rdf(
|
|
112
|
-
assert frequency_to_rdf(
|
|
127
|
+
assert frequency_to_rdf("punctual") is None
|
|
128
|
+
assert frequency_to_rdf("unknown") is None
|
|
113
129
|
|
|
114
|
-
assert frequency_to_rdf(
|
|
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=
|
|
150
|
+
resource = ResourceFactory(format="csv")
|
|
135
151
|
dataset = DatasetFactory(resources=[resource], license=license)
|
|
136
|
-
permalink = url_for(
|
|
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
|
|
157
|
-
|
|
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=
|
|
163
|
-
end = faker.future_date(end_date=
|
|
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(
|
|
177
|
-
|
|
178
|
-
|
|
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) ==
|
|
185
|
-
assert d.value(DCT.identifier) == Literal(
|
|
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
|
-
|
|
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[
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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=
|
|
288
|
-
end = faker.future_date(end_date=
|
|
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 ==
|
|
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(
|
|
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 ==
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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=
|
|
407
|
-
modified = faker.past_datetime(start_date=
|
|
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(
|
|
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 ==
|
|
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 ==
|
|
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 =
|
|
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 =
|
|
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 ==
|
|
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 =
|
|
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(
|
|
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 == _(
|
|
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 =
|
|
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 == _(
|
|
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 =
|
|
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 == _(
|
|
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
|
-
|
|
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=
|
|
700
|
-
end = faker.future_date(end_date=
|
|
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=
|
|
714
|
-
end = faker.future_date(end_date=
|
|
725
|
+
start = faker.past_date(start_date="-30d")
|
|
726
|
+
end = faker.future_date(end_date="+30d")
|
|
715
727
|
|
|
716
|
-
pot = Literal(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
798
|
-
|
|
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(
|
|
805
|
-
|
|
806
|
-
|
|
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
|
-
|
|
820
|
+
"""Check we have valid XML as output"""
|
|
813
821
|
dataset = DatasetFactory()
|
|
814
|
-
url = url_for(
|
|
815
|
-
headers = {
|
|
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 ==
|
|
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
|
|
823
|
-
url = url_for(
|
|
824
|
-
response = client.get(url, headers={
|
|
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 ==
|
|
827
|
-
assert response.json[
|
|
828
|
-
|
|
829
|
-
@pytest.mark.parametrize(
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
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(
|
|
841
|
-
response = client.get(url, headers={
|
|
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
|