kinto 19.5.0__tar.gz → 19.6.0__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.
- kinto-19.6.0/.readthedocs.yaml +12 -0
- {kinto-19.5.0 → kinto-19.6.0}/Dockerfile +0 -1
- {kinto-19.5.0 → kinto-19.6.0}/Makefile +1 -1
- {kinto-19.5.0/kinto.egg-info → kinto-19.6.0}/PKG-INFO +2 -4
- {kinto-19.5.0 → kinto-19.6.0}/constraints.in +1 -3
- {kinto-19.5.0 → kinto-19.6.0}/constraints.txt +5 -19
- {kinto-19.5.0 → kinto-19.6.0}/docs/conf.py +1 -2
- {kinto-19.5.0 → kinto-19.6.0}/docs/requirements.txt +0 -1
- {kinto-19.5.0 → kinto-19.6.0}/docs/troubleshooting.rst +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/__init__.py +3 -3
- kinto-19.6.0/kinto/core/cornice/__init__.py +93 -0
- kinto-19.6.0/kinto/core/cornice/cors.py +144 -0
- kinto-19.6.0/kinto/core/cornice/errors.py +40 -0
- kinto-19.6.0/kinto/core/cornice/pyramidhook.py +373 -0
- kinto-19.6.0/kinto/core/cornice/renderer.py +89 -0
- kinto-19.6.0/kinto/core/cornice/resource.py +205 -0
- kinto-19.6.0/kinto/core/cornice/service.py +641 -0
- kinto-19.6.0/kinto/core/cornice/util.py +138 -0
- kinto-19.6.0/kinto/core/cornice/validators/__init__.py +94 -0
- kinto-19.6.0/kinto/core/cornice/validators/_colander.py +142 -0
- kinto-19.6.0/kinto/core/cornice/validators/_marshmallow.py +182 -0
- kinto-19.6.0/kinto/core/cornice_swagger/__init__.py +92 -0
- kinto-19.6.0/kinto/core/cornice_swagger/converters/__init__.py +21 -0
- kinto-19.6.0/kinto/core/cornice_swagger/converters/exceptions.py +6 -0
- kinto-19.6.0/kinto/core/cornice_swagger/converters/parameters.py +90 -0
- kinto-19.6.0/kinto/core/cornice_swagger/converters/schema.py +249 -0
- kinto-19.6.0/kinto/core/cornice_swagger/swagger.py +725 -0
- kinto-19.6.0/kinto/core/cornice_swagger/templates/index.html +73 -0
- kinto-19.6.0/kinto/core/cornice_swagger/templates/index_script_template.html +21 -0
- kinto-19.6.0/kinto/core/cornice_swagger/util.py +42 -0
- kinto-19.6.0/kinto/core/cornice_swagger/views.py +78 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/openapi.py +2 -3
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/resource/viewset.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/testing.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/utils.py +3 -2
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/batch.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/openapi.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/flush.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/openid/views.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/contribute.py +2 -1
- {kinto-19.5.0 → kinto-19.6.0/kinto.egg-info}/PKG-INFO +2 -4
- {kinto-19.5.0 → kinto-19.6.0}/kinto.egg-info/SOURCES.txt +22 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto.egg-info/requires.txt +1 -3
- {kinto-19.5.0 → kinto-19.6.0}/pyproject.toml +5 -3
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_viewset.py +1 -1
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_openapi.py +1 -2
- {kinto-19.5.0 → kinto-19.6.0}/.dockerignore +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/CONTRIBUTING.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/dependabot.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/release.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/workflows/labels.yaml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/workflows/publish.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/workflows/scheduled.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.github/workflows/test.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/.gitignore +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/CHANGELOG.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/CONTRIBUTORS.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/LICENSE +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/README.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/SECURITY.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/SUPPORT.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/app.wsgi +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/contribute.json +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docker-compose.yml +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/_static/piwik.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/_static/theme_overrides.css +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/_templates/footer.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/_templates/indexcontent.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/_templates/layout.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-delete-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-delete-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-get-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-get-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-head-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-patch-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-post-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_details-put-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-delete-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-delete-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-get-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-get-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-patch-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-post-list.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/_status-put-object.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/accounts.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/admin.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/authentication.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/backoff.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/batch.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/buckets.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/collections.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/deprecation.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/errors.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/filtering.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/flush.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/groups.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/history.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/openapi.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/openid.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/pagination.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/permissions.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/quotas.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/records.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/selecting_fields.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/sorting.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/timestamps.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/1.x/utilities.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/api/versioning.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/changelog.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/commandline.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/community.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/concepts.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/configuration/good-practices.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/configuration/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/configuration/production.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/configuration/settings.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/_static/theme_overrides.css +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/api.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/cache.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/decorators.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/errors.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/glossary.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/images/cliquet-base.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/images/cliquet-mozilla.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/notifications.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/permission.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/quickstart.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/rationale.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/resource.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/storage.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/testing.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/utils.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/core/viewsets.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/faq.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/alwaysdata-button.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/architecture.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/color-formatter.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/concepts-general.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/concepts-permissions.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/heroku-button.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/kinto-logo.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/kinto-logo.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-admin.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-attachment.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-community.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-demos.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-history.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-indexing.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-javascript.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-jsonschema.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-livesync.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-multiapps.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-offline.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-permissions.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-python.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-quotas.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-selfhostable.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-signature.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/logo-synchronisation.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/overview-deployonce-selfhost.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/overview-features.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/overview-synchronisation.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/overview-use-cases.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/scalingo-button.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/screenshot-kinto-admin-1.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/screenshot-kinto-admin-2.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/screenshot-kinto-admin-3.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/screenshot-kinto-admin-4.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/sequence-storage.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/sync-both.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/sync-newest.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/images/sync-oldest.svg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/kinto-admin.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/overview.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/app-examples.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/authentication-github.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/client-side-encryption.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/custom-id-generator.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/first-steps.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/index.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/install.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/notifications-custom.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/notifications-websockets.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/permission-setups.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/permissions.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/synchronisation.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/docs/tutorials/write-plugin.rst +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/__main__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/authorization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/config/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/config/kinto.tpl +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/authentication.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/authorization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/memcached.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/memory.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/postgresql/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/postgresql/schema.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/cache/testing.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/decorators.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/errors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/events.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/initialization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/listeners/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/metrics.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/memory.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/postgresql/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/postgresql/migrations/migration_001_002.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/postgresql/schema.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/permission/testing.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/resource/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/resource/model.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/resource/schema.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/schema.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/statsd.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/exceptions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/generators.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/memory.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/client.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_001_002.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_002_003.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_003_004.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_004_005.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_005_006.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_006_007.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_007_008.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_008_009.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_009_010.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_010_011.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_011_012.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_012_013.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_013_014.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_014_015.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_015_016.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_016_017.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_017_018.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_018_019.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_019_020.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_020_021.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrations/migration_021_022.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/migrator.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/pool.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/postgresql/schema.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/testing.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/storage/utils.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/errors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/heartbeat.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/hello.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/core/views/version.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/events.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/authentication.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/mails.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/utils.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/views/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/accounts/views/validation.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/README.md +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/VERSION +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/VERSION +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/asn1-CGOzndHr.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/clojure-BMjYHr_A.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/css-BnMrqG3P.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/index-BdpYyatM.css +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/index-n-QM_iZE.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/javascript-iSgyE4tI.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/logo-VBRiKSPX.png +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/mllike-C_8OmSiT.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/python-BuPzkPfP.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/rpm-CTu-6PCP.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/sql-C4g8LzGK.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/assets/ttcn-cfg-BIkV9KBc.js +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/build/index.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/public/help.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/admin/views.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/default_bucket/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/history/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/history/listener.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/history/views.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/openid/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/openid/utils.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/prometheus.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/quotas/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/quotas/listener.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/quotas/scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/quotas/utils.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/plugins/statsd.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/schema_validation.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/admin.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/buckets.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/collections.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/groups.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/permissions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto/views/records.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto.egg-info/dependency_links.txt +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto.egg-info/entry_points.txt +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/kinto.egg-info/top_level.txt +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/scripts/pull-kinto-admin.sh +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/setup.cfg +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/browser.ini +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/browser.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/listeners.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_base.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_cache_expires.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_events.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_filter.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_model.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_object.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_object_permissions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_pagination.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_partial_response.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_preconditions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_schema.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_sort.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_sync.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_views.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/resource/test_views_cors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/schema/postgresql-permission-1.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/schema/postgresql-storage-1.6.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/schema/postgresql-storage-11.sql +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/support.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_authentication.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_authorization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_cache.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_decorators.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_deprecation.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_errors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_initialization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_listeners.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_logging.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_metrics.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_permission.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_schema.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_storage.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_storage_migrations.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_storage_pool.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_utils.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_batch.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_errors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_heartbeat.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_hello.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_openapi.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_postgresql.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/test_views_transaction.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/testapp/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/testapp/static/index.html +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/testapp/views.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/core/testplugin/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/functional.ini +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/functional.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/support.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_plugins.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_resources.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_responses_buckets.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_responses_collections.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_responses_errors.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_responses_groups.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_responses_records.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/openapi/test_validation.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/__init__.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_accounts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_admin.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_default_bucket.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_flush.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_history.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_openid.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_prometheus.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_quotas.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/plugins/test_statsd.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/support.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_authorization.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_config.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_configuration/test.ini +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_init.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_main.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_scripts.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_admin.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_buckets.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_collections.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_collections_cache.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_contribute.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_disable_default.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_groups.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_hello.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_metrics.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_objects_permissions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_permissions.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_records.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_schema_collection.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_schema_group.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_schema_record.py +0 -0
- {kinto-19.5.0 → kinto-19.6.0}/tests/test_views_version.py +0 -0
|
@@ -20,7 +20,6 @@ RUN cp -r /kinto-admin/kinto/plugins/admin/build kinto/plugins/admin/
|
|
|
20
20
|
RUN pip install ".[postgresql,memcached,monitoring]" -c constraints.txt && pip install kinto-attachment kinto-emailer httpie
|
|
21
21
|
|
|
22
22
|
FROM python:3.10-slim-bullseye
|
|
23
|
-
RUN apt-get update && apt-get install -y --no-install-recommends libpq-dev
|
|
24
23
|
RUN groupadd --gid 10001 app && \
|
|
25
24
|
useradd --uid 10001 --gid 10001 --home /app --create-home app
|
|
26
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: kinto
|
|
3
|
-
Version: 19.
|
|
3
|
+
Version: 19.6.0
|
|
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
|
|
@@ -33,8 +33,6 @@ Description-Content-Type: text/x-rst
|
|
|
33
33
|
License-File: LICENSE
|
|
34
34
|
Requires-Dist: bcrypt
|
|
35
35
|
Requires-Dist: colander
|
|
36
|
-
Requires-Dist: cornice
|
|
37
|
-
Requires-Dist: cornice_swagger
|
|
38
36
|
Requires-Dist: dockerflow
|
|
39
37
|
Requires-Dist: jsonschema
|
|
40
38
|
Requires-Dist: jsonpatch
|
|
@@ -54,7 +52,7 @@ Provides-Extra: memcached
|
|
|
54
52
|
Requires-Dist: python-memcached; extra == "memcached"
|
|
55
53
|
Provides-Extra: postgresql
|
|
56
54
|
Requires-Dist: SQLAlchemy<3; extra == "postgresql"
|
|
57
|
-
Requires-Dist: psycopg2; extra == "postgresql"
|
|
55
|
+
Requires-Dist: psycopg2-binary; extra == "postgresql"
|
|
58
56
|
Requires-Dist: zope.sqlalchemy; extra == "postgresql"
|
|
59
57
|
Provides-Extra: monitoring
|
|
60
58
|
Requires-Dist: newrelic; extra == "monitoring"
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# main dependencies
|
|
2
2
|
bcrypt
|
|
3
3
|
colander
|
|
4
|
-
cornice
|
|
5
|
-
cornice_swagger
|
|
6
4
|
dockerflow
|
|
7
5
|
jsonschema
|
|
8
6
|
jsonpatch
|
|
@@ -21,7 +19,7 @@ python-rapidjson
|
|
|
21
19
|
python-memcached
|
|
22
20
|
# postgresql
|
|
23
21
|
SQLAlchemy < 3
|
|
24
|
-
psycopg2
|
|
22
|
+
psycopg2-binary
|
|
25
23
|
zope.sqlalchemy
|
|
26
24
|
# monitoring
|
|
27
25
|
newrelic
|
|
@@ -25,17 +25,9 @@ certifi==2024.7.4
|
|
|
25
25
|
charset-normalizer==3.3.2
|
|
26
26
|
# via requests
|
|
27
27
|
colander==2.0
|
|
28
|
-
# via
|
|
29
|
-
# -r constraints.in
|
|
30
|
-
# cornice-swagger
|
|
28
|
+
# via -r constraints.in
|
|
31
29
|
colorama==0.4.6
|
|
32
30
|
# via logging-color-formatter
|
|
33
|
-
cornice==6.0.1
|
|
34
|
-
# via
|
|
35
|
-
# -r constraints.in
|
|
36
|
-
# cornice-swagger
|
|
37
|
-
cornice-swagger==1.0.1
|
|
38
|
-
# via -r constraints.in
|
|
39
31
|
coverage==7.6.4
|
|
40
32
|
# via pytest-cov
|
|
41
33
|
dockerflow==2024.4.2
|
|
@@ -45,9 +37,7 @@ execnet==2.0.2
|
|
|
45
37
|
fqdn==1.5.1
|
|
46
38
|
# via jsonschema
|
|
47
39
|
greenlet==3.1.1
|
|
48
|
-
# via
|
|
49
|
-
# playwright
|
|
50
|
-
# sqlalchemy
|
|
40
|
+
# via playwright
|
|
51
41
|
hupper==1.12
|
|
52
42
|
# via pyramid
|
|
53
43
|
idna==3.7
|
|
@@ -102,7 +92,7 @@ pluggy==1.5.0
|
|
|
102
92
|
# via pytest
|
|
103
93
|
prometheus-client==0.21.1
|
|
104
94
|
# via -r constraints.in
|
|
105
|
-
psycopg2==2.9.10
|
|
95
|
+
psycopg2-binary==2.9.10
|
|
106
96
|
# via -r constraints.in
|
|
107
97
|
pyee==12.0.0
|
|
108
98
|
# via playwright
|
|
@@ -111,7 +101,6 @@ pyproject-hooks==1.0.0
|
|
|
111
101
|
pyramid==2.0.2
|
|
112
102
|
# via
|
|
113
103
|
# -r constraints.in
|
|
114
|
-
# cornice
|
|
115
104
|
# pyramid-mailer
|
|
116
105
|
# pyramid-multiauth
|
|
117
106
|
# pyramid-tm
|
|
@@ -172,12 +161,11 @@ simplejson==3.19.2
|
|
|
172
161
|
six==1.16.0
|
|
173
162
|
# via
|
|
174
163
|
# bravado-core
|
|
175
|
-
# cornice-swagger
|
|
176
164
|
# python-dateutil
|
|
177
165
|
# rfc3339-validator
|
|
178
166
|
soupsieve==2.5
|
|
179
167
|
# via beautifulsoup4
|
|
180
|
-
sqlalchemy==2.0.
|
|
168
|
+
sqlalchemy==2.0.38
|
|
181
169
|
# via
|
|
182
170
|
# -r constraints.in
|
|
183
171
|
# sentry-sdk
|
|
@@ -211,9 +199,7 @@ urllib3==2.2.2
|
|
|
211
199
|
# requests
|
|
212
200
|
# sentry-sdk
|
|
213
201
|
venusian==3.1.0
|
|
214
|
-
# via
|
|
215
|
-
# cornice
|
|
216
|
-
# pyramid
|
|
202
|
+
# via pyramid
|
|
217
203
|
waitress==3.0.2
|
|
218
204
|
# via
|
|
219
205
|
# -r constraints.in
|
|
@@ -109,7 +109,7 @@ nitpick_ignore = [
|
|
|
109
109
|
("py:class", "str"),
|
|
110
110
|
("py:class", "tuple"),
|
|
111
111
|
("py:class", "Exception"),
|
|
112
|
-
("py:class", "cornice.Service"),
|
|
112
|
+
("py:class", "kinto.core.cornice.Service"),
|
|
113
113
|
# Member autodoc fails with those:
|
|
114
114
|
# kinto.core.resource.schema
|
|
115
115
|
("py:class", "Integer"),
|
|
@@ -163,7 +163,6 @@ def setup(app):
|
|
|
163
163
|
|
|
164
164
|
intersphinx_mapping = {
|
|
165
165
|
"colander": ("https://colander.readthedocs.io/en/latest/", None),
|
|
166
|
-
"cornice": ("https://cornice.readthedocs.io/en/latest/", None),
|
|
167
166
|
"pyramid": ("https://pyramid.readthedocs.io/en/latest/", None),
|
|
168
167
|
}
|
|
169
168
|
|
|
@@ -104,7 +104,7 @@ You might get some error like::
|
|
|
104
104
|
File "./kinto/__init__.py", line 4, in <module>
|
|
105
105
|
import kinto.core
|
|
106
106
|
File "./kinto/core/__init__.py", line 5, in <module>
|
|
107
|
-
from cornice import Service as CorniceService
|
|
107
|
+
from kinto.core.cornice import Service as CorniceService
|
|
108
108
|
ImportError: No module named cornice
|
|
109
109
|
unable to load app 0 (mountpoint='') (callable not found or import error)
|
|
110
110
|
|
|
@@ -4,11 +4,11 @@ import logging
|
|
|
4
4
|
import tempfile
|
|
5
5
|
|
|
6
6
|
import pkg_resources
|
|
7
|
-
from cornice import Service as CorniceService
|
|
8
7
|
from dockerflow import logging as dockerflow_logging
|
|
9
8
|
from pyramid.settings import aslist
|
|
10
9
|
|
|
11
10
|
from kinto.core import errors, events
|
|
11
|
+
from kinto.core.cornice import Service as CorniceService
|
|
12
12
|
from kinto.core.initialization import ( # NOQA
|
|
13
13
|
initialize,
|
|
14
14
|
install_middlewares,
|
|
@@ -186,10 +186,10 @@ def includeme(config):
|
|
|
186
186
|
config.add_request_method(events.notify_resource_event, name="notify_resource_event")
|
|
187
187
|
|
|
188
188
|
# Setup cornice.
|
|
189
|
-
config.include("cornice")
|
|
189
|
+
config.include("kinto.core.cornice")
|
|
190
190
|
|
|
191
191
|
# Setup cornice api documentation
|
|
192
|
-
config.include("cornice_swagger")
|
|
192
|
+
config.include("kinto.core.cornice_swagger")
|
|
193
193
|
|
|
194
194
|
# Per-request transaction.
|
|
195
195
|
config.include("pyramid_tm")
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
3
|
+
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
4
|
+
import logging
|
|
5
|
+
from functools import partial
|
|
6
|
+
|
|
7
|
+
from pyramid.events import NewRequest
|
|
8
|
+
from pyramid.httpexceptions import HTTPForbidden, HTTPNotFound
|
|
9
|
+
from pyramid.security import NO_PERMISSION_REQUIRED
|
|
10
|
+
from pyramid.settings import asbool, aslist
|
|
11
|
+
|
|
12
|
+
from kinto.core.cornice.errors import Errors # NOQA
|
|
13
|
+
from kinto.core.cornice.pyramidhook import (
|
|
14
|
+
handle_exceptions,
|
|
15
|
+
register_resource_views,
|
|
16
|
+
register_service_views,
|
|
17
|
+
wrap_request,
|
|
18
|
+
)
|
|
19
|
+
from kinto.core.cornice.renderer import CorniceRenderer
|
|
20
|
+
from kinto.core.cornice.service import Service # NOQA
|
|
21
|
+
from kinto.core.cornice.util import ContentTypePredicate, current_service
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger("cornice")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def set_localizer_for_languages(event, available_languages, default_locale_name):
|
|
28
|
+
"""
|
|
29
|
+
Sets the current locale based on the incoming Accept-Language header, if
|
|
30
|
+
present, and sets a localizer attribute on the request object based on
|
|
31
|
+
the current locale.
|
|
32
|
+
|
|
33
|
+
To be used as an event handler, this function needs to be partially applied
|
|
34
|
+
with the available_languages and default_locale_name arguments. The
|
|
35
|
+
resulting function will be an event handler which takes an event object as
|
|
36
|
+
its only argument.
|
|
37
|
+
"""
|
|
38
|
+
request = event.request
|
|
39
|
+
if request.accept_language:
|
|
40
|
+
accepted = request.accept_language.lookup(available_languages, default=default_locale_name)
|
|
41
|
+
request._LOCALE_ = accepted
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def setup_localization(config):
|
|
45
|
+
"""
|
|
46
|
+
Setup localization based on the available_languages and
|
|
47
|
+
pyramid.default_locale_name settings.
|
|
48
|
+
|
|
49
|
+
These settings are named after suggestions from the "Internationalization
|
|
50
|
+
and Localization" section of the Pyramid documentation.
|
|
51
|
+
"""
|
|
52
|
+
try:
|
|
53
|
+
config.add_translation_dirs("colander:locale/")
|
|
54
|
+
settings = config.get_settings()
|
|
55
|
+
available_languages = aslist(settings["available_languages"])
|
|
56
|
+
default_locale_name = settings.get("pyramid.default_locale_name", "en")
|
|
57
|
+
set_localizer = partial(
|
|
58
|
+
set_localizer_for_languages,
|
|
59
|
+
available_languages=available_languages,
|
|
60
|
+
default_locale_name=default_locale_name,
|
|
61
|
+
)
|
|
62
|
+
config.add_subscriber(set_localizer, NewRequest)
|
|
63
|
+
except ImportError: # pragma: no cover
|
|
64
|
+
# add_translation_dirs raises an ImportError if colander is not
|
|
65
|
+
# installed
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def includeme(config):
|
|
70
|
+
"""Include the Cornice definitions"""
|
|
71
|
+
# attributes required to maintain services
|
|
72
|
+
config.registry.cornice_services = {}
|
|
73
|
+
|
|
74
|
+
settings = config.get_settings()
|
|
75
|
+
|
|
76
|
+
# localization request subscriber must be set before first call
|
|
77
|
+
# for request.localizer (in wrap_request)
|
|
78
|
+
if settings.get("available_languages"):
|
|
79
|
+
setup_localization(config)
|
|
80
|
+
|
|
81
|
+
config.add_directive("add_cornice_service", register_service_views)
|
|
82
|
+
config.add_directive("add_cornice_resource", register_resource_views)
|
|
83
|
+
config.add_subscriber(wrap_request, NewRequest)
|
|
84
|
+
config.add_renderer("cornicejson", CorniceRenderer())
|
|
85
|
+
config.add_view_predicate("content_type", ContentTypePredicate)
|
|
86
|
+
config.add_request_method(current_service, reify=True)
|
|
87
|
+
|
|
88
|
+
if asbool(settings.get("handle_exceptions", True)):
|
|
89
|
+
config.add_view(handle_exceptions, context=Exception, permission=NO_PERMISSION_REQUIRED)
|
|
90
|
+
config.add_view(handle_exceptions, context=HTTPNotFound, permission=NO_PERMISSION_REQUIRED)
|
|
91
|
+
config.add_view(
|
|
92
|
+
handle_exceptions, context=HTTPForbidden, permission=NO_PERMISSION_REQUIRED
|
|
93
|
+
)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
3
|
+
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
4
|
+
import fnmatch
|
|
5
|
+
import functools
|
|
6
|
+
|
|
7
|
+
from pyramid.settings import asbool
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
CORS_PARAMETERS = (
|
|
11
|
+
"cors_headers",
|
|
12
|
+
"cors_enabled",
|
|
13
|
+
"cors_origins",
|
|
14
|
+
"cors_credentials",
|
|
15
|
+
"cors_max_age",
|
|
16
|
+
"cors_expose_all_headers",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_cors_preflight_view(service):
|
|
21
|
+
"""Return a view for the OPTION method.
|
|
22
|
+
|
|
23
|
+
Checks that the User-Agent is authorized to do a request to the server, and
|
|
24
|
+
to this particular service, and add the various checks that are specified
|
|
25
|
+
in http://www.w3.org/TR/cors/#resource-processing-model.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def _preflight_view(request):
|
|
29
|
+
response = request.response
|
|
30
|
+
origin = request.headers.get("Origin")
|
|
31
|
+
supported_headers = service.cors_supported_headers_for()
|
|
32
|
+
|
|
33
|
+
if not origin:
|
|
34
|
+
request.errors.add("header", "Origin", "this header is mandatory")
|
|
35
|
+
|
|
36
|
+
requested_method = request.headers.get("Access-Control-Request-Method")
|
|
37
|
+
if not requested_method:
|
|
38
|
+
request.errors.add(
|
|
39
|
+
"header", "Access-Control-Request-Method", "this header is mandatory"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
if not (requested_method and origin):
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
requested_headers = request.headers.get("Access-Control-Request-Headers", ())
|
|
46
|
+
|
|
47
|
+
if requested_headers:
|
|
48
|
+
requested_headers = map(str.strip, requested_headers.split(","))
|
|
49
|
+
|
|
50
|
+
if requested_method not in service.cors_supported_methods:
|
|
51
|
+
request.errors.add("header", "Access-Control-Request-Method", "Method not allowed")
|
|
52
|
+
|
|
53
|
+
if not service.cors_expose_all_headers:
|
|
54
|
+
for h in requested_headers:
|
|
55
|
+
if h.lower() not in [s.lower() for s in supported_headers]:
|
|
56
|
+
request.errors.add(
|
|
57
|
+
"header", "Access-Control-Request-Headers", 'Header "%s" not allowed' % h
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
supported_headers = set(supported_headers) | set(requested_headers)
|
|
61
|
+
|
|
62
|
+
response.headers["Access-Control-Allow-Headers"] = ",".join(supported_headers)
|
|
63
|
+
|
|
64
|
+
response.headers["Access-Control-Allow-Methods"] = ",".join(service.cors_supported_methods)
|
|
65
|
+
|
|
66
|
+
max_age = service.cors_max_age_for(requested_method)
|
|
67
|
+
if max_age is not None:
|
|
68
|
+
response.headers["Access-Control-Max-Age"] = str(max_age)
|
|
69
|
+
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
return _preflight_view
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _get_method(request):
|
|
76
|
+
"""Return what's supposed to be the method for CORS operations.
|
|
77
|
+
(e.g if the verb is options, look at the A-C-Request-Method header,
|
|
78
|
+
otherwise return the HTTP verb).
|
|
79
|
+
"""
|
|
80
|
+
if request.method == "OPTIONS":
|
|
81
|
+
method = request.headers.get("Access-Control-Request-Method", request.method)
|
|
82
|
+
else:
|
|
83
|
+
method = request.method
|
|
84
|
+
return method
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def ensure_origin(service, request, response=None, **kwargs):
|
|
88
|
+
"""Ensure that the origin header is set and allowed."""
|
|
89
|
+
response = response or request.response
|
|
90
|
+
|
|
91
|
+
# Don't check this twice.
|
|
92
|
+
if not request.info.get("cors_checked", False):
|
|
93
|
+
method = _get_method(request)
|
|
94
|
+
|
|
95
|
+
origin = request.headers.get("Origin")
|
|
96
|
+
|
|
97
|
+
if not origin:
|
|
98
|
+
always_cors = asbool(request.registry.settings.get("cornice.always_cors"))
|
|
99
|
+
# With this setting, if the service origins has "*", then
|
|
100
|
+
# always return CORS headers.
|
|
101
|
+
origins = getattr(service, "cors_origins", [])
|
|
102
|
+
if always_cors and "*" in origins:
|
|
103
|
+
origin = "*"
|
|
104
|
+
|
|
105
|
+
if origin:
|
|
106
|
+
if not any([fnmatch.fnmatchcase(origin, o) for o in service.cors_origins_for(method)]):
|
|
107
|
+
request.errors.add("header", "Origin", "%s not allowed" % origin)
|
|
108
|
+
elif service.cors_support_credentials_for(method):
|
|
109
|
+
response.headers["Access-Control-Allow-Origin"] = origin
|
|
110
|
+
else:
|
|
111
|
+
if any([o == "*" for o in service.cors_origins_for(method)]):
|
|
112
|
+
response.headers["Access-Control-Allow-Origin"] = "*"
|
|
113
|
+
else:
|
|
114
|
+
response.headers["Access-Control-Allow-Origin"] = origin
|
|
115
|
+
request.info["cors_checked"] = True
|
|
116
|
+
return response
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def get_cors_validator(service):
|
|
120
|
+
return functools.partial(ensure_origin, service)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def apply_cors_post_request(service, request, response):
|
|
124
|
+
"""Handles CORS-related post-request things.
|
|
125
|
+
|
|
126
|
+
Add some response headers, such as the Expose-Headers and the
|
|
127
|
+
Allow-Credentials ones.
|
|
128
|
+
"""
|
|
129
|
+
response = ensure_origin(service, request, response)
|
|
130
|
+
method = _get_method(request)
|
|
131
|
+
|
|
132
|
+
if (
|
|
133
|
+
service.cors_support_credentials_for(method)
|
|
134
|
+
and "Access-Control-Allow-Credentials" not in response.headers
|
|
135
|
+
):
|
|
136
|
+
response.headers["Access-Control-Allow-Credentials"] = "true"
|
|
137
|
+
|
|
138
|
+
if request.method != "OPTIONS":
|
|
139
|
+
# Which headers are exposed?
|
|
140
|
+
supported_headers = service.cors_supported_headers_for(request.method)
|
|
141
|
+
if supported_headers:
|
|
142
|
+
response.headers["Access-Control-Expose-Headers"] = ", ".join(supported_headers)
|
|
143
|
+
|
|
144
|
+
return response
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
3
|
+
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
from pyramid.i18n import TranslationString
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Errors(list):
|
|
10
|
+
"""Holds Request errors"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, status=400, localizer=None):
|
|
13
|
+
self.status = status
|
|
14
|
+
self.localizer = localizer
|
|
15
|
+
super(Errors, self).__init__()
|
|
16
|
+
|
|
17
|
+
def add(self, location, name=None, description=None, **kw):
|
|
18
|
+
"""Registers a new error."""
|
|
19
|
+
allowed = ("body", "querystring", "url", "header", "path", "cookies", "method")
|
|
20
|
+
if location != "" and location not in allowed:
|
|
21
|
+
raise ValueError("%r not in %s" % (location, allowed))
|
|
22
|
+
|
|
23
|
+
if isinstance(description, TranslationString) and self.localizer:
|
|
24
|
+
description = self.localizer.translate(description)
|
|
25
|
+
|
|
26
|
+
self.append(dict(location=location, name=name, description=description, **kw))
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def from_json(cls, string):
|
|
30
|
+
"""Transforms a json string into an `Errors` instance"""
|
|
31
|
+
obj = json.loads(string.decode())
|
|
32
|
+
return Errors.from_list(obj.get("errors", []))
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def from_list(cls, obj):
|
|
36
|
+
"""Transforms a python list into an `Errors` instance"""
|
|
37
|
+
errors = Errors()
|
|
38
|
+
for error in obj:
|
|
39
|
+
errors.add(**error)
|
|
40
|
+
return errors
|