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.
- 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 +111 -134
- 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 +58 -55
- 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/cors.py +99 -0
- 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/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 +8 -6
- udata/tests/api/test_auth_api.py +395 -321
- udata/tests/api/test_base_api.py +33 -35
- 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 +79 -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_cors.py +62 -0
- 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.dev30454.dist-info}/METADATA +7 -3
- udata-9.1.2.dev30454.dist-info/RECORD +706 -0
- udata-9.1.2.dev30355.dist-info/RECORD +0 -704
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/LICENSE +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/WHEEL +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/entry_points.txt +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/top_level.txt +0 -0
udata/commands/__init__.py
CHANGED
|
@@ -1,36 +1,35 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
-
import pkg_resources
|
|
4
3
|
import sys
|
|
5
|
-
|
|
6
4
|
from glob import iglob
|
|
7
5
|
|
|
8
6
|
import click
|
|
7
|
+
import pkg_resources
|
|
8
|
+
from flask.cli import FlaskGroup, ScriptInfo, shell_command
|
|
9
9
|
|
|
10
|
-
from flask.cli import FlaskGroup, shell_command, ScriptInfo
|
|
11
10
|
from udata import entrypoints
|
|
12
|
-
from udata.app import create_app, standalone
|
|
11
|
+
from udata.app import VERBOSE_LOGGERS, create_app, standalone
|
|
13
12
|
from udata.utils import safe_unicode
|
|
14
13
|
|
|
15
14
|
log = logging.getLogger(__name__)
|
|
16
15
|
|
|
17
16
|
IS_TTY = sys.__stdin__.isatty()
|
|
18
17
|
|
|
19
|
-
INFO =
|
|
20
|
-
DEBUG =
|
|
21
|
-
OK =
|
|
22
|
-
KO =
|
|
23
|
-
WARNING =
|
|
24
|
-
HEADER =
|
|
18
|
+
INFO = "➢"
|
|
19
|
+
DEBUG = "⇝"
|
|
20
|
+
OK = "✔"
|
|
21
|
+
KO = "✘"
|
|
22
|
+
WARNING = "⚠"
|
|
23
|
+
HEADER = "✯"
|
|
25
24
|
|
|
26
25
|
NO_CAST = (int, float, bool)
|
|
27
26
|
|
|
28
27
|
CONTEXT_SETTINGS = {
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
"auto_envvar_prefix": "udata",
|
|
29
|
+
"help_option_names": ["-?", "-h", "--help"],
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
DEFAULT_INFO_SETTINGS =
|
|
32
|
+
DEFAULT_INFO_SETTINGS = "udata.settings.Defaults"
|
|
34
33
|
|
|
35
34
|
click.disable_unicode_literals_warning = True
|
|
36
35
|
|
|
@@ -39,36 +38,36 @@ def color(name, **kwargs):
|
|
|
39
38
|
return lambda t: click.style(str(t), fg=name, **kwargs)
|
|
40
39
|
|
|
41
40
|
|
|
42
|
-
green = color(
|
|
43
|
-
yellow = color(
|
|
44
|
-
red = color(
|
|
45
|
-
cyan = color(
|
|
46
|
-
magenta = color(
|
|
47
|
-
white = color(
|
|
41
|
+
green = color("green", bold=True)
|
|
42
|
+
yellow = color("yellow", bold=True)
|
|
43
|
+
red = color("red", bold=True)
|
|
44
|
+
cyan = color("cyan", bold=True)
|
|
45
|
+
magenta = color("magenta", bold=True)
|
|
46
|
+
white = color("white", bold=True)
|
|
48
47
|
echo = click.echo
|
|
49
48
|
|
|
50
49
|
|
|
51
50
|
def header(msg):
|
|
52
|
-
|
|
53
|
-
echo(
|
|
51
|
+
"""Display an header"""
|
|
52
|
+
echo(" ".join((yellow(HEADER), white(safe_unicode(msg)), yellow(HEADER))))
|
|
54
53
|
|
|
55
54
|
|
|
56
55
|
def success(msg):
|
|
57
|
-
|
|
58
|
-
echo(
|
|
56
|
+
"""Display a success message"""
|
|
57
|
+
echo("{0} {1}".format(green(OK), white(safe_unicode(msg))))
|
|
59
58
|
|
|
60
59
|
|
|
61
60
|
def error(msg, details=None):
|
|
62
|
-
|
|
63
|
-
msg =
|
|
61
|
+
"""Display an error message with optional details"""
|
|
62
|
+
msg = "{0} {1}".format(red(KO), white(safe_unicode(msg)))
|
|
64
63
|
msg = safe_unicode(msg)
|
|
65
64
|
if details:
|
|
66
|
-
msg =
|
|
65
|
+
msg = "\n".join((msg, safe_unicode(details)))
|
|
67
66
|
echo(format_multiline(msg))
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
def exit_with_error(msg, details=None, code=-1):
|
|
71
|
-
|
|
70
|
+
"""Exit with error"""
|
|
72
71
|
error(msg, details)
|
|
73
72
|
sys.exit(code)
|
|
74
73
|
|
|
@@ -77,7 +76,7 @@ LEVEL_COLORS = {
|
|
|
77
76
|
logging.DEBUG: cyan,
|
|
78
77
|
logging.WARNING: yellow,
|
|
79
78
|
logging.ERROR: red,
|
|
80
|
-
logging.CRITICAL: color(
|
|
79
|
+
logging.CRITICAL: color("white", bg="red", bold=True),
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
LEVELS_PREFIX = {
|
|
@@ -88,8 +87,8 @@ LEVELS_PREFIX = {
|
|
|
88
87
|
|
|
89
88
|
def format_multiline(string):
|
|
90
89
|
string = safe_unicode(string)
|
|
91
|
-
string = string.replace(
|
|
92
|
-
return safe_unicode(replace_last(string,
|
|
90
|
+
string = string.replace("\n", "\n│ ")
|
|
91
|
+
return safe_unicode(replace_last(string, "│", "└"))
|
|
93
92
|
|
|
94
93
|
|
|
95
94
|
def replace_last(string, char, replacement):
|
|
@@ -104,26 +103,26 @@ class CliFormatter(logging.Formatter):
|
|
|
104
103
|
Convert a `logging.LogRecord' object into colored text, using ANSI
|
|
105
104
|
escape sequences.
|
|
106
105
|
"""
|
|
106
|
+
|
|
107
107
|
def format(self, record):
|
|
108
108
|
if not IS_TTY:
|
|
109
109
|
return super(CliFormatter, self).format(record)
|
|
110
110
|
record.msg = format_multiline(record.msg)
|
|
111
|
-
record.msg =
|
|
112
|
-
record.args = tuple(a if isinstance(a, NO_CAST) else safe_unicode(a)
|
|
113
|
-
for a in record.args)
|
|
111
|
+
record.msg = " ".join((self._prefix(record), record.msg))
|
|
112
|
+
record.args = tuple(a if isinstance(a, NO_CAST) else safe_unicode(a) for a in record.args)
|
|
114
113
|
return super(CliFormatter, self).format(record)
|
|
115
114
|
|
|
116
115
|
def formatException(self, ei):
|
|
117
|
-
|
|
116
|
+
"""Indent traceback info for better readability"""
|
|
118
117
|
out = super(CliFormatter, self).formatException(ei)
|
|
119
|
-
return
|
|
118
|
+
return "│" + format_multiline(out)
|
|
120
119
|
|
|
121
120
|
def _prefix(self, record):
|
|
122
121
|
if record.levelno in LEVELS_PREFIX:
|
|
123
122
|
return safe_unicode(LEVELS_PREFIX[record.levelno])
|
|
124
123
|
else:
|
|
125
124
|
color = LEVEL_COLORS.get(record.levelno, white)
|
|
126
|
-
return safe_unicode(
|
|
125
|
+
return safe_unicode("{0}:".format(color(record.levelname.upper())))
|
|
127
126
|
|
|
128
127
|
|
|
129
128
|
class CliHandler(logging.Handler):
|
|
@@ -145,7 +144,7 @@ def init_logging(app):
|
|
|
145
144
|
handler.setFormatter(CliFormatter())
|
|
146
145
|
handler.setLevel(log_level)
|
|
147
146
|
|
|
148
|
-
logger = logging.getLogger(
|
|
147
|
+
logger = logging.getLogger("__main__")
|
|
149
148
|
logger.setLevel(log_level)
|
|
150
149
|
logger.handlers = []
|
|
151
150
|
logger.addHandler(handler)
|
|
@@ -178,17 +177,17 @@ def create_cli_app():
|
|
|
178
177
|
|
|
179
178
|
|
|
180
179
|
MODULES_WITH_COMMANDS = [
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
180
|
+
"api",
|
|
181
|
+
"core.badges",
|
|
182
|
+
"core.dataset",
|
|
183
|
+
"core.jobs",
|
|
184
|
+
"core.metrics",
|
|
185
|
+
"core.organization",
|
|
186
|
+
"core.spatial",
|
|
187
|
+
"core.user",
|
|
188
|
+
"harvest",
|
|
189
|
+
"linkchecker",
|
|
190
|
+
"search",
|
|
192
191
|
]
|
|
193
192
|
|
|
194
193
|
|
|
@@ -206,70 +205,73 @@ class UdataGroup(FlaskGroup):
|
|
|
206
205
|
return super(UdataGroup, self).list_commands(ctx)
|
|
207
206
|
|
|
208
207
|
def load_udata_commands(self, ctx):
|
|
209
|
-
|
|
208
|
+
"""
|
|
210
209
|
Load udata commands from:
|
|
211
210
|
- `udata.commands.*` module
|
|
212
211
|
- known internal modules with commands
|
|
213
212
|
- plugins exporting a `udata.commands` entrypoint
|
|
214
|
-
|
|
213
|
+
"""
|
|
215
214
|
if self._udata_commands_loaded:
|
|
216
215
|
return
|
|
217
216
|
|
|
218
217
|
# Load all commands submodules
|
|
219
|
-
pattern = os.path.join(os.path.dirname(__file__),
|
|
218
|
+
pattern = os.path.join(os.path.dirname(__file__), "[!_]*.py")
|
|
220
219
|
for filename in iglob(pattern):
|
|
221
220
|
module = os.path.splitext(os.path.basename(filename))[0]
|
|
222
221
|
try:
|
|
223
|
-
__import__(
|
|
222
|
+
__import__("udata.commands.{0}".format(module))
|
|
224
223
|
except Exception as e:
|
|
225
|
-
error(
|
|
224
|
+
error("Unable to import {0}".format(module), e)
|
|
226
225
|
|
|
227
226
|
# Load all core modules commands
|
|
228
227
|
for module in MODULES_WITH_COMMANDS:
|
|
229
228
|
try:
|
|
230
|
-
__import__(
|
|
229
|
+
__import__("udata.{0}.commands".format(module))
|
|
231
230
|
except Exception as e:
|
|
232
|
-
error(
|
|
231
|
+
error("Unable to import {0}".format(module), e)
|
|
233
232
|
|
|
234
233
|
# Load commands from entry points for enabled plugins
|
|
235
234
|
app = ctx.ensure_object(ScriptInfo).load_app()
|
|
236
|
-
entrypoints.get_enabled(
|
|
235
|
+
entrypoints.get_enabled("udata.commands", app)
|
|
237
236
|
|
|
238
237
|
# Ensure loading happens once
|
|
239
238
|
self._udata_commands_loaded = False
|
|
240
239
|
|
|
241
240
|
def main(self, *args, **kwargs):
|
|
242
|
-
|
|
241
|
+
"""
|
|
243
242
|
Instanciate ScriptInfo before parent does
|
|
244
243
|
to ensure the `settings` parameters is available to `create_app
|
|
245
|
-
|
|
246
|
-
obj = kwargs.get(
|
|
244
|
+
"""
|
|
245
|
+
obj = kwargs.get("obj")
|
|
247
246
|
if obj is None:
|
|
248
247
|
obj = ScriptInfo(create_app=self.create_app)
|
|
249
248
|
# This is the import line: allows create_app to access the settings
|
|
250
|
-
obj.settings = kwargs.pop(
|
|
251
|
-
kwargs[
|
|
249
|
+
obj.settings = kwargs.pop("settings", DEFAULT_INFO_SETTINGS)
|
|
250
|
+
kwargs["obj"] = obj
|
|
252
251
|
return super(UdataGroup, self).main(*args, **kwargs)
|
|
253
252
|
|
|
254
253
|
|
|
255
254
|
def print_version(ctx, param, value):
|
|
256
255
|
if not value or ctx.resilient_parsing:
|
|
257
256
|
return
|
|
258
|
-
click.echo(pkg_resources.get_distribution(
|
|
257
|
+
click.echo(pkg_resources.get_distribution("udata").version)
|
|
259
258
|
ctx.exit()
|
|
260
259
|
|
|
261
260
|
|
|
262
|
-
@click.group(
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
261
|
+
@click.group(
|
|
262
|
+
context_settings=CONTEXT_SETTINGS,
|
|
263
|
+
cls=UdataGroup,
|
|
264
|
+
create_app=create_cli_app,
|
|
265
|
+
add_version_option=False,
|
|
266
|
+
add_default_commands=False,
|
|
267
|
+
)
|
|
268
|
+
@click.option("--version", is_flag=True, callback=print_version, expose_value=False, is_eager=True)
|
|
267
269
|
def cli():
|
|
268
|
-
|
|
270
|
+
"""udata management client"""
|
|
269
271
|
|
|
270
272
|
|
|
271
273
|
# Adds the default flask shell command
|
|
272
274
|
cli.add_command(shell_command)
|
|
273
275
|
|
|
274
|
-
if __name__ ==
|
|
276
|
+
if __name__ == "__main__": # pragma: no cover
|
|
275
277
|
cli()
|
udata/commands/cache.py
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from udata.commands import cli, success
|
|
4
3
|
from udata.app import cache
|
|
4
|
+
from udata.commands import cli, success
|
|
5
5
|
|
|
6
6
|
log = logging.getLogger(__name__)
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
@cli.group(
|
|
9
|
+
@cli.group("cache")
|
|
10
10
|
def grp():
|
|
11
|
-
|
|
11
|
+
"""
|
|
12
12
|
Cache related operations.
|
|
13
|
-
|
|
13
|
+
"""
|
|
14
14
|
pass
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
@grp.command()
|
|
18
18
|
def flush():
|
|
19
|
-
|
|
20
|
-
log.info(
|
|
19
|
+
"""Flush the cache"""
|
|
20
|
+
log.info("Flushing cache")
|
|
21
21
|
cache.clear()
|
|
22
|
-
success(
|
|
22
|
+
success("Cache flushed")
|