kinto 18.0.0__tar.gz → 18.1.1__tar.gz
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 kinto might be problematic. Click here for more details.
- {kinto-18.0.0 → kinto-18.1.1}/.github/workflows/publish.yml +3 -3
- {kinto-18.0.0 → kinto-18.1.1}/.github/workflows/test.yml +8 -6
- {kinto-18.0.0 → kinto-18.1.1}/Dockerfile +12 -15
- {kinto-18.0.0 → kinto-18.1.1}/Makefile +16 -7
- {kinto-18.0.0/kinto.egg-info → kinto-18.1.1}/PKG-INFO +2 -2
- {kinto-18.0.0 → kinto-18.1.1}/constraints.in +1 -1
- {kinto-18.0.0 → kinto-18.1.1}/constraints.txt +62 -88
- {kinto-18.0.0 → kinto-18.1.1}/docs/community.rst +2 -11
- {kinto-18.0.0 → kinto-18.1.1}/docs/requirements.txt +5 -5
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/install.rst +2 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/__init__.py +3 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/initialization.py +24 -1
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/resource/__init__.py +6 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/scripts.py +1 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/exceptions.py +1 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/utils.py +1 -0
- kinto-18.1.1/kinto/plugins/admin/VERSION +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/VERSION +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/asn1-8gHclKtu.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/clojure-plf_rynZ.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/css-tpsEXL3H.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/index-iVTdxamX.js +175 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/index-vylaZGUr.css +6 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/javascript-upQ8KtFH.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/logo-FQUYikj1.png +0 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/mllike-ilm95jrV.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/python-xljIYvii.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/rpm-cddeyEgF.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/sql-3IaSLchm.js +1 -0
- kinto-18.1.1/kinto/plugins/admin/build/assets/ttcn-cfg-9oMIyPXS.js +1 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/admin/build/index.html +2 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/admin/public/help.html +2 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/admin/views.py +1 -1
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/quotas/scripts.py +1 -0
- {kinto-18.0.0 → kinto-18.1.1/kinto.egg-info}/PKG-INFO +2 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto.egg-info/SOURCES.txt +15 -2
- {kinto-18.0.0 → kinto-18.1.1}/kinto.egg-info/requires.txt +1 -1
- {kinto-18.0.0 → kinto-18.1.1}/pyproject.toml +2 -2
- kinto-18.1.1/scripts/pull-kinto-admin.sh +12 -0
- kinto-18.1.1/tests/browser.py +38 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_filter.py +9 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_views_cors.py +9 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_initialization.py +25 -2
- kinto-18.1.1/tests/core/testplugin/__init__.py +52 -0
- kinto-18.0.0/kinto/plugins/admin/VERSION +0 -1
- kinto-18.0.0/scripts/build-kinto-admin.sh +0 -29
- kinto-18.0.0/tests/browser.py +0 -68
- kinto-18.0.0/tests/core/testplugin/__init__.py +0 -19
- {kinto-18.0.0 → kinto-18.1.1}/.dockerignore +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/CODE_OF_CONDUCT.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/CONTRIBUTING.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/dependabot.yml +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/release.yml +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.github/workflows/labels.yaml +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/.gitignore +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/CHANGELOG.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/CONTRIBUTORS.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/LICENSE +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/README.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/SECURITY.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/SUPPORT.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/app.wsgi +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/contribute.json +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docker-compose.yml +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/_static/piwik.js +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/_static/theme_overrides.css +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/_templates/footer.html +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/_templates/indexcontent.html +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/_templates/layout.html +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-delete-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-delete-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-get-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-get-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-head-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-patch-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-post-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_details-put-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-delete-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-delete-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-get-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-get-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-patch-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-post-list.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/_status-put-object.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/accounts.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/admin.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/authentication.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/backoff.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/batch.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/buckets.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/collections.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/deprecation.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/errors.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/filtering.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/flush.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/groups.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/history.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/openapi.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/openid.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/pagination.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/permissions.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/quotas.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/records.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/selecting_fields.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/sorting.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/timestamps.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/1.x/utilities.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/api/versioning.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/changelog.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/commandline.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/concepts.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/conf.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/configuration/good-practices.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/configuration/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/configuration/production.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/configuration/settings.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/_static/theme_overrides.css +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/api.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/cache.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/decorators.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/errors.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/glossary.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/images/cliquet-base.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/images/cliquet-mozilla.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/notifications.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/permission.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/quickstart.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/rationale.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/resource.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/storage.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/testing.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/utils.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/core/viewsets.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/faq.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/alwaysdata-button.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/architecture.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/color-formatter.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/concepts-general.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/concepts-permissions.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/heroku-button.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/kinto-logo.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/kinto-logo.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-admin.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-attachment.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-community.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-demos.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-history.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-indexing.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-javascript.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-jsonschema.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-livesync.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-multiapps.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-offline.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-permissions.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-python.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-quotas.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-selfhostable.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-signature.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/logo-synchronisation.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/overview-deployonce-selfhost.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/overview-features.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/overview-synchronisation.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/overview-use-cases.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/scalingo-button.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/screenshot-kinto-admin-1.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/screenshot-kinto-admin-2.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/screenshot-kinto-admin-3.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/screenshot-kinto-admin-4.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/sequence-storage.png +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/sync-both.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/sync-newest.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/images/sync-oldest.svg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/kinto-admin.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/overview.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/troubleshooting.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/app-examples.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/authentication-github.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/client-side-encryption.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/custom-id-generator.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/first-steps.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/index.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/notifications-custom.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/notifications-websockets.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/permission-setups.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/permissions.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/synchronisation.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/docs/tutorials/write-plugin.rst +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/__main__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/authorization.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/config/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/config/kinto.tpl +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/authentication.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/authorization.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/memcached.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/memory.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/postgresql/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/postgresql/schema.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/cache/testing.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/decorators.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/errors.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/events.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/listeners/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/openapi.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/memory.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/postgresql/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/postgresql/migrations/migration_001_002.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/postgresql/schema.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/permission/testing.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/resource/model.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/resource/schema.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/resource/viewset.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/schema.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/statsd.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/generators.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/memory.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/client.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_001_002.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_002_003.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_003_004.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_004_005.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_005_006.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_006_007.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_007_008.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_008_009.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_009_010.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_010_011.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_011_012.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_012_013.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_013_014.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_014_015.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_015_016.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_016_017.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_017_018.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_018_019.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_019_020.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_020_021.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrations/migration_021_022.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/migrator.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/pool.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/postgresql/schema.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/storage/testing.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/testing.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/utils.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/batch.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/errors.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/heartbeat.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/hello.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/openapi.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/core/views/version.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/events.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/authentication.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/mails.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/scripts.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/utils.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/views/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/accounts/views/validation.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/admin/README.md +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/admin/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/default_bucket/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/flush.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/history/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/history/listener.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/history/views.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/openid/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/openid/utils.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/openid/views.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/quotas/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/quotas/listener.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/plugins/quotas/utils.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/schema_validation.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/scripts.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/admin.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/buckets.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/collections.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/contribute.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/groups.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/permissions.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto/views/records.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto.egg-info/dependency_links.txt +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto.egg-info/entry_points.txt +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/kinto.egg-info/top_level.txt +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/setup.cfg +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/browser.ini +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/listeners.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_base.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_cache_expires.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_events.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_model.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_object.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_object_permissions.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_pagination.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_partial_response.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_preconditions.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_schema.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_sort.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_sync.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_views.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/resource/test_viewset.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/schema/postgresql-permission-1.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/schema/postgresql-storage-1.6.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/schema/postgresql-storage-11.sql +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/support.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_authentication.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_authorization.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_cache.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_decorators.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_deprecation.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_errors.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_listeners.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_logging.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_openapi.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_permission.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_schema.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_scripts.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_statsd.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_storage.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_storage_migrations.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_storage_pool.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_utils.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_batch.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_errors.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_heartbeat.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_hello.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_openapi.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_postgresql.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/test_views_transaction.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/testapp/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/testapp/static/index.html +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/core/testapp/views.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/functional.ini +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/functional.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/support.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_plugins.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_resources.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_responses_buckets.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_responses_collections.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_responses_errors.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_responses_groups.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_responses_records.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/openapi/test_validation.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/__init__.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_accounts.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_admin.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_default_bucket.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_flush.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_history.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_openid.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/plugins/test_quotas.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/support.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_authorization.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_config.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_configuration/test.ini +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_init.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_main.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_scripts.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_admin.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_buckets.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_collections.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_collections_cache.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_contribute.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_disable_default.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_groups.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_hello.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_objects_permissions.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_permissions.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_records.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_schema_collection.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_schema_group.py +0 -0
- {kinto-18.0.0 → kinto-18.1.1}/tests/test_views_schema_record.py +0 -0
- {kinto-18.0.0/tests/core → kinto-18.1.1/tests}/test_views_version.py +0 -0
|
@@ -28,8 +28,8 @@ jobs:
|
|
|
28
28
|
node --version
|
|
29
29
|
npm --version
|
|
30
30
|
|
|
31
|
-
- name:
|
|
32
|
-
run: make
|
|
31
|
+
- name: Pull Admin UI
|
|
32
|
+
run: make pull-kinto-admin
|
|
33
33
|
|
|
34
34
|
- name: Install pypa/build
|
|
35
35
|
run: python3 -m pip install build
|
|
@@ -86,7 +86,7 @@ jobs:
|
|
|
86
86
|
images: kinto/kinto-server
|
|
87
87
|
|
|
88
88
|
- name: Build and push Docker image
|
|
89
|
-
uses: docker/build-push-action@
|
|
89
|
+
uses: docker/build-push-action@v6
|
|
90
90
|
with:
|
|
91
91
|
context: .
|
|
92
92
|
file: ./Dockerfile
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
runs-on: ubuntu-latest
|
|
33
33
|
strategy:
|
|
34
34
|
matrix:
|
|
35
|
-
pyenv: [py38, py39, py310, py311,
|
|
35
|
+
pyenv: [py38, py39, py310, py311, py312, py312-raw]
|
|
36
36
|
include:
|
|
37
37
|
- pyenv: py38
|
|
38
38
|
python-version: "3.8"
|
|
@@ -42,8 +42,10 @@ jobs:
|
|
|
42
42
|
python-version: "3.10"
|
|
43
43
|
- pyenv: py311
|
|
44
44
|
python-version: "3.11"
|
|
45
|
-
- pyenv:
|
|
46
|
-
python-version: "3.
|
|
45
|
+
- pyenv: py312
|
|
46
|
+
python-version: "3.12"
|
|
47
|
+
- pyenv: py312-raw
|
|
48
|
+
python-version: "3.12"
|
|
47
49
|
services:
|
|
48
50
|
postgres:
|
|
49
51
|
image: postgres
|
|
@@ -177,7 +179,7 @@ jobs:
|
|
|
177
179
|
install: true
|
|
178
180
|
|
|
179
181
|
- name: Build container
|
|
180
|
-
uses: docker/build-push-action@
|
|
182
|
+
uses: docker/build-push-action@v6
|
|
181
183
|
with:
|
|
182
184
|
cache-from: type=local,src=${{ env.DOCKER_CACHE}}
|
|
183
185
|
cache-to: type=local,dest=${{ env.DOCKER_CACHE}},mode=max
|
|
@@ -227,8 +229,8 @@ jobs:
|
|
|
227
229
|
which firefox
|
|
228
230
|
firefox --version
|
|
229
231
|
|
|
230
|
-
- name: make
|
|
231
|
-
run: make
|
|
232
|
+
- name: make pull-kinto-admin
|
|
233
|
+
run: make pull-kinto-admin
|
|
232
234
|
|
|
233
235
|
- name: Install dependencies
|
|
234
236
|
run: make install-dev
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
# Mozilla Kinto server
|
|
2
|
-
|
|
3
|
-
FROM node:lts-bullseye-slim as node-builder
|
|
4
|
-
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl
|
|
5
|
-
COPY scripts/build-kinto-admin.sh .
|
|
6
|
-
COPY /kinto/plugins/admin ./kinto/plugins/admin
|
|
7
|
-
RUN bash build-kinto-admin.sh
|
|
8
|
-
|
|
9
|
-
FROM python:3.10-slim-bullseye as python-builder
|
|
2
|
+
FROM python:3.10-bullseye as python-builder
|
|
10
3
|
RUN python -m venv /opt/venv
|
|
11
|
-
RUN apt-get update && apt-get install -y --no-install-recommends build-essential libpq-dev
|
|
12
4
|
ARG KINTO_VERSION=1
|
|
13
5
|
ENV SETUPTOOLS_SCM_PRETEND_VERSION_FOR_KINTO=${KINTO_VERSION} \
|
|
14
6
|
PATH="/opt/venv/bin:$PATH"
|
|
15
7
|
# At this stage we only fetch and build all dependencies.
|
|
8
|
+
|
|
9
|
+
# Pull kinto-admin before building kinto so we can cache it
|
|
10
|
+
WORKDIR /kinto-admin
|
|
11
|
+
COPY kinto/plugins/admin kinto/plugins/admin
|
|
12
|
+
COPY scripts/pull-kinto-admin.sh .
|
|
13
|
+
RUN bash pull-kinto-admin.sh
|
|
14
|
+
|
|
16
15
|
WORKDIR /pkg-kinto
|
|
17
|
-
COPY constraints.txt .
|
|
18
|
-
|
|
16
|
+
COPY constraints.txt pyproject.toml ./
|
|
17
|
+
RUN pip install --upgrade pip && pip install -r constraints.txt
|
|
19
18
|
COPY kinto/ kinto/
|
|
20
|
-
RUN
|
|
21
|
-
|
|
22
|
-
pip install kinto-attachment kinto-emailer httpie
|
|
19
|
+
RUN cp -r /kinto-admin/kinto/plugins/admin/build kinto/plugins/admin/
|
|
20
|
+
RUN pip install ".[postgresql,memcached,monitoring]" -c constraints.txt && pip install kinto-attachment kinto-emailer httpie
|
|
23
21
|
|
|
24
22
|
FROM python:3.10-slim-bullseye
|
|
25
23
|
RUN apt-get update && apt-get install -y --no-install-recommends libpq-dev
|
|
@@ -27,7 +25,6 @@ RUN groupadd --gid 10001 app && \
|
|
|
27
25
|
useradd --uid 10001 --gid 10001 --home /app --create-home app
|
|
28
26
|
|
|
29
27
|
COPY --from=python-builder /opt/venv /opt/venv
|
|
30
|
-
COPY --from=node-builder /kinto/plugins/admin/build ./kinto/plugins/admin/build
|
|
31
28
|
|
|
32
29
|
ENV KINTO_INI=/etc/kinto/kinto.ini \
|
|
33
30
|
PORT=8888 \
|
|
@@ -20,13 +20,14 @@ help:
|
|
|
20
20
|
@echo " install-monitoring enable monitoring features like StatsD and Newrelic"
|
|
21
21
|
@echo " install-postgres install postgresql support"
|
|
22
22
|
@echo " install-dev install dependencies and everything needed to run tests"
|
|
23
|
-
@echo "
|
|
23
|
+
@echo " pull-kinto-admin pull the Kinto admin UI plugin (requires npm)"
|
|
24
24
|
@echo " serve start the kinto server on default port"
|
|
25
25
|
@echo " migrate run the kinto migrations"
|
|
26
26
|
@echo " lint run the code linters"
|
|
27
27
|
@echo " tests run all the tests with all the supported python interpreters (same as CI)"
|
|
28
|
+
@echo " test-deps pulls and runs docker postgres and memcached containers for tests"
|
|
28
29
|
@echo " tdd run pytest-watch to rerun tests automatically on changes for tdd"
|
|
29
|
-
@echo " tests-once
|
|
30
|
+
@echo " tests-once only run the tests once with the default python interpreter"
|
|
30
31
|
@echo " functional run functional test against a real kinto"
|
|
31
32
|
@echo " browser-test run browser test against a real kinto"
|
|
32
33
|
@echo " clean remove *.pyc files and __pycache__ directory"
|
|
@@ -67,8 +68,8 @@ $(DOC_STAMP): $(PYTHON) docs/requirements.txt
|
|
|
67
68
|
constraints.txt: constraints.in
|
|
68
69
|
pip-compile -o constraints.txt constraints.in
|
|
69
70
|
|
|
70
|
-
|
|
71
|
-
scripts/
|
|
71
|
+
pull-kinto-admin:
|
|
72
|
+
scripts/pull-kinto-admin.sh
|
|
72
73
|
|
|
73
74
|
$(SERVER_CONFIG):
|
|
74
75
|
$(VENV)/bin/kinto init --ini $(SERVER_CONFIG)
|
|
@@ -94,6 +95,14 @@ tests: install-postgres install-monitoring install-memcached version-file instal
|
|
|
94
95
|
tests-raw: version-file install-dev
|
|
95
96
|
$(VENV)/bin/py.test
|
|
96
97
|
|
|
98
|
+
test-deps:
|
|
99
|
+
docker pull memcached
|
|
100
|
+
docker pull postgres
|
|
101
|
+
docker run -p 11211:11211 --name kinto-memcached -d memcached || echo "cannot start memcached, already exists?"
|
|
102
|
+
docker run -p 5432:5432 --name kinto-postgres -e POSTGRES_PASSWORD=postgres -d postgres || echo "cannot start postgres, already exists?"
|
|
103
|
+
sleep 2
|
|
104
|
+
PGPASSWORD=postgres psql -c "CREATE DATABASE testdb ENCODING 'UTF8' TEMPLATE template0;" -U postgres -h localhost
|
|
105
|
+
|
|
97
106
|
lint: install-dev
|
|
98
107
|
$(VENV)/bin/ruff check kinto tests docs/conf.py
|
|
99
108
|
$(VENV)/bin/ruff format --check kinto tests docs/conf.py
|
|
@@ -105,9 +114,6 @@ format: install-dev
|
|
|
105
114
|
tdd: install-dev
|
|
106
115
|
$(VENV)/bin/ptw --runner $(VENV)/bin/py.test
|
|
107
116
|
|
|
108
|
-
need-npm:
|
|
109
|
-
@npm --version 2>/dev/null 1>&2 || (echo "The 'npm' command is required to build the Kinto Admin UI." && exit 1)
|
|
110
|
-
|
|
111
117
|
need-kinto-running:
|
|
112
118
|
@curl http://localhost:8888/v0/ 2>/dev/null 1>&2 || (echo "Run 'make runkinto' before starting tests." && exit 1)
|
|
113
119
|
|
|
@@ -119,12 +125,15 @@ functional: install-dev need-kinto-running
|
|
|
119
125
|
$(VENV)/bin/py.test tests/functional.py
|
|
120
126
|
|
|
121
127
|
browser-test: need-kinto-running
|
|
128
|
+
$(VENV)/bin/playwright install firefox
|
|
122
129
|
$(VENV)/bin/py.test tests/browser.py
|
|
123
130
|
|
|
124
131
|
clean:
|
|
125
132
|
find . -name '*.pyc' -delete
|
|
126
133
|
find . -name '__pycache__' -type d | xargs rm -fr
|
|
127
134
|
rm -fr docs/_build/
|
|
135
|
+
docker rm -f kinto-memcached || echo ""
|
|
136
|
+
docker rm -f kinto-postgres || echo ""
|
|
128
137
|
|
|
129
138
|
distclean: clean
|
|
130
139
|
rm -fr *.egg *.egg-info/ dist/ build/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: kinto
|
|
3
|
-
Version: 18.
|
|
3
|
+
Version: 18.1.1
|
|
4
4
|
Summary: Kinto Web Service - Store, Sync, Share, and Self-Host.
|
|
5
5
|
Author-email: Mozilla Services <developers@kinto-storage.org>
|
|
6
6
|
License: Copyright 2012 - Mozilla Foundation
|
|
@@ -66,7 +66,7 @@ Requires-Dist: bravado; extra == "test"
|
|
|
66
66
|
Requires-Dist: pytest; extra == "test"
|
|
67
67
|
Requires-Dist: pytest-cache; extra == "test"
|
|
68
68
|
Requires-Dist: pytest-cov; extra == "test"
|
|
69
|
-
Requires-Dist:
|
|
69
|
+
Requires-Dist: playwright; extra == "test"
|
|
70
70
|
Requires-Dist: webtest; extra == "test"
|
|
71
71
|
Provides-Extra: dev
|
|
72
72
|
Requires-Dist: build; extra == "dev"
|
|
@@ -1,70 +1,61 @@
|
|
|
1
1
|
#
|
|
2
|
-
# This file is autogenerated by pip-compile with Python 3.
|
|
2
|
+
# This file is autogenerated by pip-compile with Python 3.10
|
|
3
3
|
# by the following command:
|
|
4
4
|
#
|
|
5
|
-
# pip-compile --strip-extras
|
|
5
|
+
# pip-compile --output-file=constraints.txt --strip-extras constraints.in
|
|
6
6
|
#
|
|
7
7
|
arrow==1.3.0
|
|
8
8
|
# via isoduration
|
|
9
9
|
attrs==23.2.0
|
|
10
10
|
# via
|
|
11
11
|
# jsonschema
|
|
12
|
-
# outcome
|
|
13
12
|
# referencing
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# via -r requirements.in
|
|
13
|
+
bcrypt==4.1.3
|
|
14
|
+
# via -r constraints.in
|
|
17
15
|
beautifulsoup4==4.12.3
|
|
18
16
|
# via webtest
|
|
19
17
|
bravado-core==6.1.1
|
|
20
|
-
# via -r
|
|
21
|
-
build==1.
|
|
22
|
-
# via -r
|
|
18
|
+
# via -r constraints.in
|
|
19
|
+
build==1.2.1
|
|
20
|
+
# via -r constraints.in
|
|
23
21
|
certifi==2023.11.17
|
|
24
22
|
# via
|
|
25
23
|
# requests
|
|
26
|
-
# selenium
|
|
27
24
|
# sentry-sdk
|
|
28
25
|
charset-normalizer==3.3.2
|
|
29
26
|
# via requests
|
|
30
27
|
colander==2.0
|
|
31
28
|
# via
|
|
32
|
-
# -r
|
|
29
|
+
# -r constraints.in
|
|
33
30
|
# cornice-swagger
|
|
34
31
|
colorama==0.4.6
|
|
35
32
|
# via logging-color-formatter
|
|
36
33
|
cornice==6.0.1
|
|
37
34
|
# via
|
|
38
|
-
# -r
|
|
35
|
+
# -r constraints.in
|
|
39
36
|
# cornice-swagger
|
|
40
37
|
cornice-swagger==1.0.1
|
|
41
|
-
# via -r
|
|
38
|
+
# via -r constraints.in
|
|
42
39
|
coverage==7.4.0
|
|
43
|
-
# via
|
|
44
|
-
|
|
45
|
-
#
|
|
46
|
-
dockerflow==2024.1.0
|
|
47
|
-
# via -r requirements.in
|
|
40
|
+
# via pytest-cov
|
|
41
|
+
dockerflow==2024.4.2
|
|
42
|
+
# via -r constraints.in
|
|
48
43
|
exceptiongroup==1.2.0
|
|
49
|
-
# via
|
|
50
|
-
# pytest
|
|
51
|
-
# trio
|
|
52
|
-
# trio-websocket
|
|
44
|
+
# via pytest
|
|
53
45
|
execnet==2.0.2
|
|
54
46
|
# via pytest-cache
|
|
55
47
|
fqdn==1.5.1
|
|
56
48
|
# via jsonschema
|
|
57
|
-
|
|
58
|
-
# via
|
|
49
|
+
greenlet==3.0.3
|
|
50
|
+
# via
|
|
51
|
+
# playwright
|
|
52
|
+
# sqlalchemy
|
|
59
53
|
hupper==1.12
|
|
60
54
|
# via pyramid
|
|
61
|
-
idna==3.
|
|
55
|
+
idna==3.7
|
|
62
56
|
# via
|
|
63
57
|
# jsonschema
|
|
64
58
|
# requests
|
|
65
|
-
# trio
|
|
66
|
-
importlib-metadata==7.0.1
|
|
67
|
-
# via build
|
|
68
59
|
iniconfig==2.0.0
|
|
69
60
|
# via pytest
|
|
70
61
|
iso8601==2.1.0
|
|
@@ -72,30 +63,28 @@ iso8601==2.1.0
|
|
|
72
63
|
isoduration==20.11.0
|
|
73
64
|
# via jsonschema
|
|
74
65
|
jsonpatch==1.33
|
|
75
|
-
# via -r
|
|
66
|
+
# via -r constraints.in
|
|
76
67
|
jsonpointer==2.4
|
|
77
68
|
# via
|
|
78
69
|
# jsonpatch
|
|
79
70
|
# jsonschema
|
|
80
71
|
jsonref==1.1.0
|
|
81
72
|
# via bravado-core
|
|
82
|
-
jsonschema==4.
|
|
73
|
+
jsonschema==4.22.0
|
|
83
74
|
# via
|
|
84
|
-
# -r
|
|
75
|
+
# -r constraints.in
|
|
85
76
|
# bravado-core
|
|
86
77
|
# swagger-spec-validator
|
|
87
78
|
jsonschema-specifications==2023.12.1
|
|
88
79
|
# via jsonschema
|
|
89
80
|
logging-color-formatter==1.1.0
|
|
90
|
-
# via -r
|
|
81
|
+
# via -r constraints.in
|
|
91
82
|
markupsafe==2.1.4
|
|
92
83
|
# via werkzeug
|
|
93
84
|
msgpack==1.0.7
|
|
94
85
|
# via bravado-core
|
|
95
|
-
newrelic==9.
|
|
96
|
-
# via -r
|
|
97
|
-
outcome==1.3.0.post0
|
|
98
|
-
# via trio
|
|
86
|
+
newrelic==9.11.0
|
|
87
|
+
# via -r constraints.in
|
|
99
88
|
packaging==23.2
|
|
100
89
|
# via
|
|
101
90
|
# build
|
|
@@ -109,45 +98,47 @@ plaster==1.1.2
|
|
|
109
98
|
# pyramid
|
|
110
99
|
plaster-pastedeploy==1.0.1
|
|
111
100
|
# via pyramid
|
|
112
|
-
|
|
101
|
+
playwright==1.44.0
|
|
102
|
+
# via -r constraints.in
|
|
103
|
+
pluggy==1.5.0
|
|
113
104
|
# via pytest
|
|
114
105
|
psycopg2==2.9.9
|
|
115
|
-
# via -r
|
|
106
|
+
# via -r constraints.in
|
|
107
|
+
pyee==11.1.0
|
|
108
|
+
# via playwright
|
|
116
109
|
pyproject-hooks==1.0.0
|
|
117
110
|
# via build
|
|
118
111
|
pyramid==2.0.2
|
|
119
112
|
# via
|
|
120
|
-
# -r
|
|
113
|
+
# -r constraints.in
|
|
121
114
|
# cornice
|
|
122
115
|
# pyramid-mailer
|
|
123
116
|
# pyramid-multiauth
|
|
124
117
|
# pyramid-tm
|
|
125
118
|
pyramid-mailer==0.15.1
|
|
126
|
-
# via -r
|
|
127
|
-
pyramid-multiauth==1.0.
|
|
128
|
-
# via -r
|
|
119
|
+
# via -r constraints.in
|
|
120
|
+
pyramid-multiauth==1.0.2
|
|
121
|
+
# via -r constraints.in
|
|
129
122
|
pyramid-tm==2.5
|
|
130
|
-
# via -r
|
|
131
|
-
|
|
132
|
-
# via urllib3
|
|
133
|
-
pytest==7.4.4
|
|
123
|
+
# via -r constraints.in
|
|
124
|
+
pytest==8.2.2
|
|
134
125
|
# via
|
|
135
|
-
# -r
|
|
126
|
+
# -r constraints.in
|
|
136
127
|
# pytest-cache
|
|
137
128
|
# pytest-cov
|
|
138
129
|
pytest-cache==1.0
|
|
139
|
-
# via -r
|
|
140
|
-
pytest-cov==
|
|
141
|
-
# via -r
|
|
142
|
-
python-dateutil==2.
|
|
130
|
+
# via -r constraints.in
|
|
131
|
+
pytest-cov==5.0.0
|
|
132
|
+
# via -r constraints.in
|
|
133
|
+
python-dateutil==2.9.0.post0
|
|
143
134
|
# via
|
|
144
|
-
# -r
|
|
135
|
+
# -r constraints.in
|
|
145
136
|
# arrow
|
|
146
137
|
# bravado-core
|
|
147
138
|
python-memcached==1.62
|
|
148
|
-
# via -r
|
|
139
|
+
# via -r constraints.in
|
|
149
140
|
python-rapidjson==1.14
|
|
150
|
-
# via -r
|
|
141
|
+
# via -r constraints.in
|
|
151
142
|
pytz==2023.3.post1
|
|
152
143
|
# via bravado-core
|
|
153
144
|
pyyaml==6.0.1
|
|
@@ -160,9 +151,9 @@ referencing==0.32.1
|
|
|
160
151
|
# jsonschema-specifications
|
|
161
152
|
repoze-sendmail==4.4.1
|
|
162
153
|
# via pyramid-mailer
|
|
163
|
-
requests==2.
|
|
154
|
+
requests==2.32.3
|
|
164
155
|
# via
|
|
165
|
-
# -r
|
|
156
|
+
# -r constraints.in
|
|
166
157
|
# bravado-core
|
|
167
158
|
rfc3339-validator==0.1.4
|
|
168
159
|
# via jsonschema
|
|
@@ -172,12 +163,10 @@ rpds-py==0.17.1
|
|
|
172
163
|
# via
|
|
173
164
|
# jsonschema
|
|
174
165
|
# referencing
|
|
175
|
-
ruff==0.
|
|
176
|
-
# via -r
|
|
177
|
-
selenium==4.12.0
|
|
178
|
-
# via -r requirements.in
|
|
166
|
+
ruff==0.4.9
|
|
167
|
+
# via -r constraints.in
|
|
179
168
|
sentry-sdk==1.39.2
|
|
180
|
-
# via -r
|
|
169
|
+
# via -r constraints.in
|
|
181
170
|
simplejson==3.19.2
|
|
182
171
|
# via bravado-core
|
|
183
172
|
six==1.16.0
|
|
@@ -186,19 +175,15 @@ six==1.16.0
|
|
|
186
175
|
# cornice-swagger
|
|
187
176
|
# python-dateutil
|
|
188
177
|
# rfc3339-validator
|
|
189
|
-
sniffio==1.3.0
|
|
190
|
-
# via trio
|
|
191
|
-
sortedcontainers==2.4.0
|
|
192
|
-
# via trio
|
|
193
178
|
soupsieve==2.5
|
|
194
179
|
# via beautifulsoup4
|
|
195
|
-
sqlalchemy==2.0.
|
|
180
|
+
sqlalchemy==2.0.30
|
|
196
181
|
# via
|
|
197
|
-
# -r
|
|
182
|
+
# -r constraints.in
|
|
198
183
|
# sentry-sdk
|
|
199
184
|
# zope-sqlalchemy
|
|
200
185
|
statsd==4.0.1
|
|
201
|
-
# via -r
|
|
186
|
+
# via -r constraints.in
|
|
202
187
|
swagger-spec-validator==3.0.3
|
|
203
188
|
# via bravado-core
|
|
204
189
|
tomli==2.0.1
|
|
@@ -209,7 +194,7 @@ tomli==2.0.1
|
|
|
209
194
|
# pytest
|
|
210
195
|
transaction==4.0
|
|
211
196
|
# via
|
|
212
|
-
# -r
|
|
197
|
+
# -r constraints.in
|
|
213
198
|
# pyramid-mailer
|
|
214
199
|
# pyramid-tm
|
|
215
200
|
# repoze-sendmail
|
|
@@ -218,33 +203,26 @@ translationstring==1.4
|
|
|
218
203
|
# via
|
|
219
204
|
# colander
|
|
220
205
|
# pyramid
|
|
221
|
-
trio==0.24.0
|
|
222
|
-
# via
|
|
223
|
-
# selenium
|
|
224
|
-
# trio-websocket
|
|
225
|
-
trio-websocket==0.11.1
|
|
226
|
-
# via selenium
|
|
227
206
|
types-python-dateutil==2.8.19.20240106
|
|
228
207
|
# via arrow
|
|
229
208
|
typing-extensions==4.9.0
|
|
230
209
|
# via
|
|
231
|
-
#
|
|
210
|
+
# pyee
|
|
232
211
|
# sqlalchemy
|
|
233
212
|
# swagger-spec-validator
|
|
234
213
|
uri-template==1.3.0
|
|
235
214
|
# via jsonschema
|
|
236
|
-
urllib3==2.
|
|
215
|
+
urllib3==2.2.2
|
|
237
216
|
# via
|
|
238
217
|
# requests
|
|
239
|
-
# selenium
|
|
240
218
|
# sentry-sdk
|
|
241
219
|
venusian==3.1.0
|
|
242
220
|
# via
|
|
243
221
|
# cornice
|
|
244
222
|
# pyramid
|
|
245
|
-
waitress==
|
|
223
|
+
waitress==3.0.0
|
|
246
224
|
# via
|
|
247
|
-
# -r
|
|
225
|
+
# -r constraints.in
|
|
248
226
|
# webtest
|
|
249
227
|
webcolors==1.13
|
|
250
228
|
# via jsonschema
|
|
@@ -253,13 +231,9 @@ webob==1.8.7
|
|
|
253
231
|
# pyramid
|
|
254
232
|
# webtest
|
|
255
233
|
webtest==3.0.0
|
|
256
|
-
# via -r
|
|
257
|
-
werkzeug==3.0.
|
|
258
|
-
# via -r
|
|
259
|
-
wsproto==1.2.0
|
|
260
|
-
# via trio-websocket
|
|
261
|
-
zipp==3.17.0
|
|
262
|
-
# via importlib-metadata
|
|
234
|
+
# via -r constraints.in
|
|
235
|
+
werkzeug==3.0.3
|
|
236
|
+
# via -r constraints.in
|
|
263
237
|
zope-deprecation==5.0
|
|
264
238
|
# via pyramid
|
|
265
239
|
zope-interface==6.1
|
|
@@ -269,7 +243,7 @@ zope-interface==6.1
|
|
|
269
243
|
# transaction
|
|
270
244
|
# zope-sqlalchemy
|
|
271
245
|
zope-sqlalchemy==3.1
|
|
272
|
-
# via -r
|
|
246
|
+
# via -r constraints.in
|
|
273
247
|
|
|
274
248
|
# The following packages are considered to be unsafe in a requirements file:
|
|
275
249
|
# setuptools
|
|
@@ -119,7 +119,7 @@ Get started!
|
|
|
119
119
|
|
|
120
120
|
git clone git@github.com:your_name_here/kinto.git
|
|
121
121
|
|
|
122
|
-
3.
|
|
122
|
+
3. Run ``make test-deps``, or setup a local PostgreSQL database (:ref:`more details <postgresql-install>`)::
|
|
123
123
|
|
|
124
124
|
sudo apt-get install postgresql
|
|
125
125
|
sudo -n -u postgres -s -- psql -c "ALTER USER postgres WITH PASSWORD 'postgres';" -U postgres
|
|
@@ -235,16 +235,7 @@ In another terminal, run the end-to-end tests with:
|
|
|
235
235
|
|
|
236
236
|
Browser Tests
|
|
237
237
|
-------------
|
|
238
|
-
|
|
239
|
-
Make sure the `geckodriver <https://github.com/mozilla/geckodriver/releases>`_ binary is available in your path.
|
|
240
|
-
|
|
241
|
-
.. note::
|
|
242
|
-
|
|
243
|
-
If your installation of *Firefox* is custom, specify the path of its binary using an alias:
|
|
244
|
-
|
|
245
|
-
::
|
|
246
|
-
|
|
247
|
-
alias geckodriver="geckodriver --binary /path/to/firefox"
|
|
238
|
+
We use `playwright <https://playwright.dev/>`_ for browser testing. The tests included in this repo are very simple and verify the admin UI can at least authenticate with the current kinto back-end. Comprehensive unit tests are maintained in the kinto-admin repo.
|
|
248
239
|
|
|
249
240
|
|
|
250
241
|
In a terminal, run an instance with the provided ``browser.ini`` configuration:
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
Sphinx==7.
|
|
1
|
+
Sphinx==7.3.7
|
|
2
2
|
sphinx_rtd_theme==2.0.0
|
|
3
3
|
docutils==0.20.1
|
|
4
4
|
sphinxcontrib-httpdomain==1.8.1
|
|
5
|
-
sphinx-github-changelog==1.
|
|
5
|
+
sphinx-github-changelog==1.3.0
|
|
6
6
|
kinto
|
|
7
7
|
mock==5.1.0
|
|
8
8
|
webtest==3.0.0
|
|
9
|
-
cornice==6.0
|
|
9
|
+
cornice==6.1.0
|
|
10
10
|
pyramid==2.0.2
|
|
11
|
-
python-rapidjson==1.
|
|
12
|
-
SQLAlchemy==2.0.
|
|
11
|
+
python-rapidjson==1.17
|
|
12
|
+
SQLAlchemy==2.0.30
|
|
@@ -316,9 +316,9 @@ Kinto Admin
|
|
|
316
316
|
-----------
|
|
317
317
|
|
|
318
318
|
In order to run a local `Kinto Admin UI <https://github.com/Kinto/kinto-admin>`_ from a cloned
|
|
319
|
-
repo,
|
|
319
|
+
repo, run ::
|
|
320
320
|
|
|
321
|
-
make
|
|
321
|
+
make pull-kinto-admin
|
|
322
322
|
|
|
323
323
|
|
|
324
324
|
Go further
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""Main entry point
|
|
2
|
-
|
|
1
|
+
"""Main entry point"""
|
|
2
|
+
|
|
3
3
|
import logging
|
|
4
4
|
import tempfile
|
|
5
5
|
|
|
@@ -54,6 +54,7 @@ DEFAULT_SETTINGS = {
|
|
|
54
54
|
"initialization_sequence": (
|
|
55
55
|
"kinto.core.initialization.setup_request_bound_data",
|
|
56
56
|
"kinto.core.initialization.setup_json_serializer",
|
|
57
|
+
"kinto.core.initialization.restrict_http_methods_if_readonly",
|
|
57
58
|
"kinto.core.initialization.setup_csp_headers",
|
|
58
59
|
"kinto.core.initialization.setup_logging",
|
|
59
60
|
"kinto.core.initialization.setup_storage",
|
|
@@ -8,7 +8,12 @@ from secrets import token_hex
|
|
|
8
8
|
from dateutil import parser as dateparser
|
|
9
9
|
from pyramid.events import ApplicationCreated, NewRequest, NewResponse
|
|
10
10
|
from pyramid.exceptions import ConfigurationError
|
|
11
|
-
from pyramid.httpexceptions import
|
|
11
|
+
from pyramid.httpexceptions import (
|
|
12
|
+
HTTPBadRequest,
|
|
13
|
+
HTTPGone,
|
|
14
|
+
HTTPMethodNotAllowed,
|
|
15
|
+
HTTPTemporaryRedirect,
|
|
16
|
+
)
|
|
12
17
|
from pyramid.interfaces import IAuthenticationPolicy
|
|
13
18
|
from pyramid.renderers import JSON as JSONRenderer
|
|
14
19
|
from pyramid.response import Response
|
|
@@ -78,6 +83,24 @@ def setup_csp_headers(config):
|
|
|
78
83
|
config.add_subscriber(on_new_response, NewResponse)
|
|
79
84
|
|
|
80
85
|
|
|
86
|
+
def restrict_http_methods_if_readonly(config):
|
|
87
|
+
"""Prevent write operations if server is configured as read-only.
|
|
88
|
+
|
|
89
|
+
This is an additional layer of security on top of the verifications done
|
|
90
|
+
in :method:`kinto.core.Resource.register_service`, in case an installed
|
|
91
|
+
plugin does not take this setting into account in the definition of its
|
|
92
|
+
ad-hoc Pyramid views.
|
|
93
|
+
"""
|
|
94
|
+
settings = config.get_settings()
|
|
95
|
+
|
|
96
|
+
def on_new_request(event):
|
|
97
|
+
if event.request.method.lower() not in ("get", "head", "options"):
|
|
98
|
+
raise HTTPMethodNotAllowed()
|
|
99
|
+
|
|
100
|
+
if asbool(settings["readonly"]):
|
|
101
|
+
config.add_subscriber(on_new_request, NewRequest)
|
|
102
|
+
|
|
103
|
+
|
|
81
104
|
def setup_version_redirection(config):
|
|
82
105
|
"""Add a view which redirects to the current version of the API."""
|
|
83
106
|
settings = config.get_settings()
|
|
@@ -1058,6 +1058,10 @@ class Resource:
|
|
|
1058
1058
|
|
|
1059
1059
|
def _extract_filters(self):
|
|
1060
1060
|
"""Extracts filters from QueryString parameters."""
|
|
1061
|
+
|
|
1062
|
+
def is_valid_timestamp(value):
|
|
1063
|
+
return isinstance(value, int) or re.match(r'^"?\d+"?$', str(value))
|
|
1064
|
+
|
|
1061
1065
|
queryparams = self.request.validated["querystring"]
|
|
1062
1066
|
|
|
1063
1067
|
filters = []
|
|
@@ -1090,7 +1094,7 @@ class Resource:
|
|
|
1090
1094
|
send_alert(self.request, message, url)
|
|
1091
1095
|
operator = COMPARISON.LT
|
|
1092
1096
|
|
|
1093
|
-
if value
|
|
1097
|
+
if value is not None and not is_valid_timestamp(value):
|
|
1094
1098
|
raise_invalid(self.request, **error_details)
|
|
1095
1099
|
|
|
1096
1100
|
filters.append(Filter(self.model.modified_field, value, operator))
|
|
@@ -1127,7 +1131,7 @@ class Resource:
|
|
|
1127
1131
|
error_details["description"] = "Invalid character 0x00"
|
|
1128
1132
|
raise_invalid(self.request, **error_details)
|
|
1129
1133
|
|
|
1130
|
-
if field == self.model.modified_field and value
|
|
1134
|
+
if field == self.model.modified_field and not is_valid_timestamp(value):
|
|
1131
1135
|
raise_invalid(self.request, **error_details)
|
|
1132
1136
|
|
|
1133
1137
|
filters.append(Filter(field, value, operator))
|