kinto 19.2.0__tar.gz → 19.3.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.
Files changed (393) hide show
  1. {kinto-19.2.0 → kinto-19.3.1}/.github/workflows/test.yml +1 -3
  2. {kinto-19.2.0 → kinto-19.3.1}/Dockerfile +2 -2
  3. {kinto-19.2.0/kinto.egg-info → kinto-19.3.1}/PKG-INFO +3 -3
  4. {kinto-19.2.0 → kinto-19.3.1}/README.rst +1 -1
  5. {kinto-19.2.0 → kinto-19.3.1}/constraints.txt +17 -15
  6. {kinto-19.2.0 → kinto-19.3.1}/docs/conf.py +0 -3
  7. {kinto-19.2.0 → kinto-19.3.1}/docs/requirements.txt +4 -4
  8. {kinto-19.2.0 → kinto-19.3.1}/kinto/__init__.py +1 -0
  9. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/__init__.py +1 -0
  10. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/initialization.py +59 -7
  11. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/metrics.py +37 -1
  12. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/resource/__init__.py +3 -2
  13. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/utils.py +8 -0
  14. kinto-19.3.1/kinto/plugins/admin/VERSION +1 -0
  15. kinto-19.3.1/kinto/plugins/admin/build/VERSION +1 -0
  16. kinto-19.3.1/kinto/plugins/admin/build/assets/index-BKIg2XW8.js +165 -0
  17. kinto-19.2.0/kinto/plugins/admin/build/assets/index-vylaZGUr.css → kinto-19.3.1/kinto/plugins/admin/build/assets/index-D8oiN37x.css +1 -1
  18. kinto-19.2.0/kinto/plugins/admin/build/assets/javascript-upQ8KtFH.js → kinto-19.3.1/kinto/plugins/admin/build/assets/javascript-iSgyE4tI.js +1 -1
  19. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/admin/build/index.html +2 -2
  20. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/prometheus.py +56 -20
  21. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/statsd.py +21 -1
  22. {kinto-19.2.0 → kinto-19.3.1/kinto.egg-info}/PKG-INFO +3 -3
  23. {kinto-19.2.0 → kinto-19.3.1}/kinto.egg-info/SOURCES.txt +13 -12
  24. {kinto-19.2.0 → kinto-19.3.1}/pyproject.toml +1 -1
  25. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_filter.py +4 -0
  26. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_views.py +4 -5
  27. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_initialization.py +72 -13
  28. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_prometheus.py +31 -9
  29. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_statsd.py +20 -0
  30. kinto-19.3.1/tests/test_views_metrics.py +45 -0
  31. kinto-19.2.0/kinto/plugins/admin/VERSION +0 -1
  32. kinto-19.2.0/kinto/plugins/admin/build/VERSION +0 -1
  33. kinto-19.2.0/kinto/plugins/admin/build/assets/index-iVTdxamX.js +0 -175
  34. {kinto-19.2.0 → kinto-19.3.1}/.dockerignore +0 -0
  35. {kinto-19.2.0 → kinto-19.3.1}/.github/CODE_OF_CONDUCT.md +0 -0
  36. {kinto-19.2.0 → kinto-19.3.1}/.github/CONTRIBUTING.md +0 -0
  37. {kinto-19.2.0 → kinto-19.3.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  38. {kinto-19.2.0 → kinto-19.3.1}/.github/dependabot.yml +0 -0
  39. {kinto-19.2.0 → kinto-19.3.1}/.github/release.yml +0 -0
  40. {kinto-19.2.0 → kinto-19.3.1}/.github/workflows/labels.yaml +0 -0
  41. {kinto-19.2.0 → kinto-19.3.1}/.github/workflows/publish.yml +0 -0
  42. {kinto-19.2.0 → kinto-19.3.1}/.gitignore +0 -0
  43. {kinto-19.2.0 → kinto-19.3.1}/CHANGELOG.rst +0 -0
  44. {kinto-19.2.0 → kinto-19.3.1}/CONTRIBUTORS.rst +0 -0
  45. {kinto-19.2.0 → kinto-19.3.1}/LICENSE +0 -0
  46. {kinto-19.2.0 → kinto-19.3.1}/Makefile +0 -0
  47. {kinto-19.2.0 → kinto-19.3.1}/SECURITY.md +0 -0
  48. {kinto-19.2.0 → kinto-19.3.1}/SUPPORT.md +0 -0
  49. {kinto-19.2.0 → kinto-19.3.1}/app.wsgi +0 -0
  50. {kinto-19.2.0 → kinto-19.3.1}/constraints.in +0 -0
  51. {kinto-19.2.0 → kinto-19.3.1}/contribute.json +0 -0
  52. {kinto-19.2.0 → kinto-19.3.1}/docker-compose.yml +0 -0
  53. {kinto-19.2.0 → kinto-19.3.1}/docs/_static/piwik.js +0 -0
  54. {kinto-19.2.0 → kinto-19.3.1}/docs/_static/theme_overrides.css +0 -0
  55. {kinto-19.2.0 → kinto-19.3.1}/docs/_templates/footer.html +0 -0
  56. {kinto-19.2.0 → kinto-19.3.1}/docs/_templates/indexcontent.html +0 -0
  57. {kinto-19.2.0 → kinto-19.3.1}/docs/_templates/layout.html +0 -0
  58. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-delete-list.rst +0 -0
  59. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-delete-object.rst +0 -0
  60. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-get-list.rst +0 -0
  61. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-get-object.rst +0 -0
  62. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-head-list.rst +0 -0
  63. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-patch-object.rst +0 -0
  64. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-post-list.rst +0 -0
  65. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_details-put-object.rst +0 -0
  66. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-delete-list.rst +0 -0
  67. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-delete-object.rst +0 -0
  68. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-get-list.rst +0 -0
  69. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-get-object.rst +0 -0
  70. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-patch-object.rst +0 -0
  71. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-post-list.rst +0 -0
  72. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/_status-put-object.rst +0 -0
  73. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/accounts.rst +0 -0
  74. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/admin.rst +0 -0
  75. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/authentication.rst +0 -0
  76. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/backoff.rst +0 -0
  77. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/batch.rst +0 -0
  78. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/buckets.rst +0 -0
  79. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/collections.rst +0 -0
  80. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/deprecation.rst +0 -0
  81. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/errors.rst +0 -0
  82. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/filtering.rst +0 -0
  83. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/flush.rst +0 -0
  84. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/groups.rst +0 -0
  85. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/history.rst +0 -0
  86. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/index.rst +0 -0
  87. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/openapi.rst +0 -0
  88. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/openid.rst +0 -0
  89. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/pagination.rst +0 -0
  90. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/permissions.rst +0 -0
  91. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/quotas.rst +0 -0
  92. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/records.rst +0 -0
  93. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/selecting_fields.rst +0 -0
  94. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/sorting.rst +0 -0
  95. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/timestamps.rst +0 -0
  96. {kinto-19.2.0 → kinto-19.3.1}/docs/api/1.x/utilities.rst +0 -0
  97. {kinto-19.2.0 → kinto-19.3.1}/docs/api/index.rst +0 -0
  98. {kinto-19.2.0 → kinto-19.3.1}/docs/api/versioning.rst +0 -0
  99. {kinto-19.2.0 → kinto-19.3.1}/docs/changelog.rst +0 -0
  100. {kinto-19.2.0 → kinto-19.3.1}/docs/commandline.rst +0 -0
  101. {kinto-19.2.0 → kinto-19.3.1}/docs/community.rst +0 -0
  102. {kinto-19.2.0 → kinto-19.3.1}/docs/concepts.rst +0 -0
  103. {kinto-19.2.0 → kinto-19.3.1}/docs/configuration/good-practices.rst +0 -0
  104. {kinto-19.2.0 → kinto-19.3.1}/docs/configuration/index.rst +0 -0
  105. {kinto-19.2.0 → kinto-19.3.1}/docs/configuration/production.rst +0 -0
  106. {kinto-19.2.0 → kinto-19.3.1}/docs/configuration/settings.rst +0 -0
  107. {kinto-19.2.0 → kinto-19.3.1}/docs/core/_static/theme_overrides.css +0 -0
  108. {kinto-19.2.0 → kinto-19.3.1}/docs/core/api.rst +0 -0
  109. {kinto-19.2.0 → kinto-19.3.1}/docs/core/cache.rst +0 -0
  110. {kinto-19.2.0 → kinto-19.3.1}/docs/core/decorators.rst +0 -0
  111. {kinto-19.2.0 → kinto-19.3.1}/docs/core/errors.rst +0 -0
  112. {kinto-19.2.0 → kinto-19.3.1}/docs/core/glossary.rst +0 -0
  113. {kinto-19.2.0 → kinto-19.3.1}/docs/core/images/cliquet-base.png +0 -0
  114. {kinto-19.2.0 → kinto-19.3.1}/docs/core/images/cliquet-mozilla.png +0 -0
  115. {kinto-19.2.0 → kinto-19.3.1}/docs/core/index.rst +0 -0
  116. {kinto-19.2.0 → kinto-19.3.1}/docs/core/notifications.rst +0 -0
  117. {kinto-19.2.0 → kinto-19.3.1}/docs/core/permission.rst +0 -0
  118. {kinto-19.2.0 → kinto-19.3.1}/docs/core/quickstart.rst +0 -0
  119. {kinto-19.2.0 → kinto-19.3.1}/docs/core/rationale.rst +0 -0
  120. {kinto-19.2.0 → kinto-19.3.1}/docs/core/resource.rst +0 -0
  121. {kinto-19.2.0 → kinto-19.3.1}/docs/core/storage.rst +0 -0
  122. {kinto-19.2.0 → kinto-19.3.1}/docs/core/testing.rst +0 -0
  123. {kinto-19.2.0 → kinto-19.3.1}/docs/core/utils.rst +0 -0
  124. {kinto-19.2.0 → kinto-19.3.1}/docs/core/viewsets.rst +0 -0
  125. {kinto-19.2.0 → kinto-19.3.1}/docs/faq.rst +0 -0
  126. {kinto-19.2.0 → kinto-19.3.1}/docs/images/alwaysdata-button.svg +0 -0
  127. {kinto-19.2.0 → kinto-19.3.1}/docs/images/architecture.svg +0 -0
  128. {kinto-19.2.0 → kinto-19.3.1}/docs/images/color-formatter.png +0 -0
  129. {kinto-19.2.0 → kinto-19.3.1}/docs/images/concepts-general.png +0 -0
  130. {kinto-19.2.0 → kinto-19.3.1}/docs/images/concepts-permissions.png +0 -0
  131. {kinto-19.2.0 → kinto-19.3.1}/docs/images/heroku-button.png +0 -0
  132. {kinto-19.2.0 → kinto-19.3.1}/docs/images/kinto-logo.png +0 -0
  133. {kinto-19.2.0 → kinto-19.3.1}/docs/images/kinto-logo.svg +0 -0
  134. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-admin.svg +0 -0
  135. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-attachment.svg +0 -0
  136. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-community.svg +0 -0
  137. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-demos.svg +0 -0
  138. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-history.svg +0 -0
  139. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-indexing.svg +0 -0
  140. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-javascript.svg +0 -0
  141. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-jsonschema.svg +0 -0
  142. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-livesync.svg +0 -0
  143. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-multiapps.svg +0 -0
  144. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-offline.svg +0 -0
  145. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-permissions.svg +0 -0
  146. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-python.svg +0 -0
  147. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-quotas.svg +0 -0
  148. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-selfhostable.svg +0 -0
  149. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-signature.svg +0 -0
  150. {kinto-19.2.0 → kinto-19.3.1}/docs/images/logo-synchronisation.svg +0 -0
  151. {kinto-19.2.0 → kinto-19.3.1}/docs/images/overview-deployonce-selfhost.png +0 -0
  152. {kinto-19.2.0 → kinto-19.3.1}/docs/images/overview-features.png +0 -0
  153. {kinto-19.2.0 → kinto-19.3.1}/docs/images/overview-synchronisation.png +0 -0
  154. {kinto-19.2.0 → kinto-19.3.1}/docs/images/overview-use-cases.png +0 -0
  155. {kinto-19.2.0 → kinto-19.3.1}/docs/images/scalingo-button.svg +0 -0
  156. {kinto-19.2.0 → kinto-19.3.1}/docs/images/screenshot-kinto-admin-1.png +0 -0
  157. {kinto-19.2.0 → kinto-19.3.1}/docs/images/screenshot-kinto-admin-2.png +0 -0
  158. {kinto-19.2.0 → kinto-19.3.1}/docs/images/screenshot-kinto-admin-3.png +0 -0
  159. {kinto-19.2.0 → kinto-19.3.1}/docs/images/screenshot-kinto-admin-4.png +0 -0
  160. {kinto-19.2.0 → kinto-19.3.1}/docs/images/sequence-storage.png +0 -0
  161. {kinto-19.2.0 → kinto-19.3.1}/docs/images/sync-both.svg +0 -0
  162. {kinto-19.2.0 → kinto-19.3.1}/docs/images/sync-newest.svg +0 -0
  163. {kinto-19.2.0 → kinto-19.3.1}/docs/images/sync-oldest.svg +0 -0
  164. {kinto-19.2.0 → kinto-19.3.1}/docs/index.rst +0 -0
  165. {kinto-19.2.0 → kinto-19.3.1}/docs/kinto-admin.rst +0 -0
  166. {kinto-19.2.0 → kinto-19.3.1}/docs/overview.rst +0 -0
  167. {kinto-19.2.0 → kinto-19.3.1}/docs/troubleshooting.rst +0 -0
  168. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/app-examples.rst +0 -0
  169. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/authentication-github.rst +0 -0
  170. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/client-side-encryption.rst +0 -0
  171. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/custom-id-generator.rst +0 -0
  172. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/first-steps.rst +0 -0
  173. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/index.rst +0 -0
  174. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/install.rst +0 -0
  175. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/notifications-custom.rst +0 -0
  176. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/notifications-websockets.rst +0 -0
  177. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/permission-setups.rst +0 -0
  178. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/permissions.rst +0 -0
  179. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/synchronisation.rst +0 -0
  180. {kinto-19.2.0 → kinto-19.3.1}/docs/tutorials/write-plugin.rst +0 -0
  181. {kinto-19.2.0 → kinto-19.3.1}/kinto/__main__.py +0 -0
  182. {kinto-19.2.0 → kinto-19.3.1}/kinto/authorization.py +0 -0
  183. {kinto-19.2.0 → kinto-19.3.1}/kinto/config/__init__.py +0 -0
  184. {kinto-19.2.0 → kinto-19.3.1}/kinto/config/kinto.tpl +0 -0
  185. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/authentication.py +0 -0
  186. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/authorization.py +0 -0
  187. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/__init__.py +0 -0
  188. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/memcached.py +0 -0
  189. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/memory.py +0 -0
  190. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/postgresql/__init__.py +0 -0
  191. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/postgresql/schema.sql +0 -0
  192. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/cache/testing.py +0 -0
  193. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/decorators.py +0 -0
  194. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/errors.py +0 -0
  195. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/events.py +0 -0
  196. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/listeners/__init__.py +0 -0
  197. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/openapi.py +0 -0
  198. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/__init__.py +0 -0
  199. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/memory.py +0 -0
  200. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/postgresql/__init__.py +0 -0
  201. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/postgresql/migrations/migration_001_002.sql +0 -0
  202. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/postgresql/schema.sql +0 -0
  203. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/permission/testing.py +0 -0
  204. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/resource/model.py +0 -0
  205. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/resource/schema.py +0 -0
  206. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/resource/viewset.py +0 -0
  207. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/schema.py +0 -0
  208. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/scripts.py +0 -0
  209. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/statsd.py +0 -0
  210. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/__init__.py +0 -0
  211. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/exceptions.py +0 -0
  212. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/generators.py +0 -0
  213. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/memory.py +0 -0
  214. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/__init__.py +0 -0
  215. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/client.py +0 -0
  216. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_001_002.sql +0 -0
  217. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_002_003.sql +0 -0
  218. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_003_004.sql +0 -0
  219. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_004_005.sql +0 -0
  220. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_005_006.sql +0 -0
  221. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_006_007.sql +0 -0
  222. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_007_008.sql +0 -0
  223. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_008_009.sql +0 -0
  224. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_009_010.sql +0 -0
  225. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_010_011.sql +0 -0
  226. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_011_012.sql +0 -0
  227. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_012_013.sql +0 -0
  228. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_013_014.sql +0 -0
  229. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_014_015.sql +0 -0
  230. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_015_016.sql +0 -0
  231. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_016_017.sql +0 -0
  232. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_017_018.sql +0 -0
  233. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_018_019.sql +0 -0
  234. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_019_020.sql +0 -0
  235. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_020_021.sql +0 -0
  236. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrations/migration_021_022.sql +0 -0
  237. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/migrator.py +0 -0
  238. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/pool.py +0 -0
  239. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/postgresql/schema.sql +0 -0
  240. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/testing.py +0 -0
  241. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/storage/utils.py +0 -0
  242. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/testing.py +0 -0
  243. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/__init__.py +0 -0
  244. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/batch.py +0 -0
  245. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/errors.py +0 -0
  246. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/heartbeat.py +0 -0
  247. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/hello.py +0 -0
  248. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/openapi.py +0 -0
  249. {kinto-19.2.0 → kinto-19.3.1}/kinto/core/views/version.py +0 -0
  250. {kinto-19.2.0 → kinto-19.3.1}/kinto/events.py +0 -0
  251. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/__init__.py +0 -0
  252. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/__init__.py +0 -0
  253. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/authentication.py +0 -0
  254. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/mails.py +0 -0
  255. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/scripts.py +0 -0
  256. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/utils.py +0 -0
  257. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/views/__init__.py +0 -0
  258. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/accounts/views/validation.py +0 -0
  259. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/admin/README.md +0 -0
  260. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/admin/__init__.py +0 -0
  261. /kinto-19.2.0/kinto/plugins/admin/build/assets/asn1-8gHclKtu.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/asn1-CGOzndHr.js +0 -0
  262. /kinto-19.2.0/kinto/plugins/admin/build/assets/clojure-plf_rynZ.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/clojure-BMjYHr_A.js +0 -0
  263. /kinto-19.2.0/kinto/plugins/admin/build/assets/css-tpsEXL3H.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/css-BnMrqG3P.js +0 -0
  264. /kinto-19.2.0/kinto/plugins/admin/build/assets/logo-FQUYikj1.png → /kinto-19.3.1/kinto/plugins/admin/build/assets/logo-VBRiKSPX.png +0 -0
  265. /kinto-19.2.0/kinto/plugins/admin/build/assets/mllike-ilm95jrV.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/mllike-C_8OmSiT.js +0 -0
  266. /kinto-19.2.0/kinto/plugins/admin/build/assets/python-xljIYvii.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/python-BuPzkPfP.js +0 -0
  267. /kinto-19.2.0/kinto/plugins/admin/build/assets/rpm-cddeyEgF.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/rpm-CTu-6PCP.js +0 -0
  268. /kinto-19.2.0/kinto/plugins/admin/build/assets/sql-3IaSLchm.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/sql-C4g8LzGK.js +0 -0
  269. /kinto-19.2.0/kinto/plugins/admin/build/assets/ttcn-cfg-9oMIyPXS.js → /kinto-19.3.1/kinto/plugins/admin/build/assets/ttcn-cfg-BIkV9KBc.js +0 -0
  270. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/admin/public/help.html +0 -0
  271. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/admin/views.py +0 -0
  272. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/default_bucket/__init__.py +0 -0
  273. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/flush.py +0 -0
  274. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/history/__init__.py +0 -0
  275. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/history/listener.py +0 -0
  276. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/history/views.py +0 -0
  277. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/openid/__init__.py +0 -0
  278. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/openid/utils.py +0 -0
  279. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/openid/views.py +0 -0
  280. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/quotas/__init__.py +0 -0
  281. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/quotas/listener.py +0 -0
  282. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/quotas/scripts.py +0 -0
  283. {kinto-19.2.0 → kinto-19.3.1}/kinto/plugins/quotas/utils.py +0 -0
  284. {kinto-19.2.0 → kinto-19.3.1}/kinto/schema_validation.py +0 -0
  285. {kinto-19.2.0 → kinto-19.3.1}/kinto/scripts.py +0 -0
  286. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/__init__.py +0 -0
  287. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/admin.py +0 -0
  288. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/buckets.py +0 -0
  289. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/collections.py +0 -0
  290. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/contribute.py +0 -0
  291. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/groups.py +0 -0
  292. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/permissions.py +0 -0
  293. {kinto-19.2.0 → kinto-19.3.1}/kinto/views/records.py +0 -0
  294. {kinto-19.2.0 → kinto-19.3.1}/kinto.egg-info/dependency_links.txt +0 -0
  295. {kinto-19.2.0 → kinto-19.3.1}/kinto.egg-info/entry_points.txt +0 -0
  296. {kinto-19.2.0 → kinto-19.3.1}/kinto.egg-info/requires.txt +0 -0
  297. {kinto-19.2.0 → kinto-19.3.1}/kinto.egg-info/top_level.txt +0 -0
  298. {kinto-19.2.0 → kinto-19.3.1}/scripts/pull-kinto-admin.sh +0 -0
  299. {kinto-19.2.0 → kinto-19.3.1}/setup.cfg +0 -0
  300. {kinto-19.2.0 → kinto-19.3.1}/tests/__init__.py +0 -0
  301. {kinto-19.2.0 → kinto-19.3.1}/tests/browser.ini +0 -0
  302. {kinto-19.2.0 → kinto-19.3.1}/tests/browser.py +0 -0
  303. {kinto-19.2.0 → kinto-19.3.1}/tests/core/__init__.py +0 -0
  304. {kinto-19.2.0 → kinto-19.3.1}/tests/core/listeners.py +0 -0
  305. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/__init__.py +0 -0
  306. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_base.py +0 -0
  307. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_cache_expires.py +0 -0
  308. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_events.py +0 -0
  309. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_model.py +0 -0
  310. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_object.py +0 -0
  311. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_object_permissions.py +0 -0
  312. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_pagination.py +0 -0
  313. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_partial_response.py +0 -0
  314. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_preconditions.py +0 -0
  315. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_schema.py +0 -0
  316. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_sort.py +0 -0
  317. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_sync.py +0 -0
  318. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_views_cors.py +0 -0
  319. {kinto-19.2.0 → kinto-19.3.1}/tests/core/resource/test_viewset.py +0 -0
  320. {kinto-19.2.0 → kinto-19.3.1}/tests/core/schema/postgresql-permission-1.sql +0 -0
  321. {kinto-19.2.0 → kinto-19.3.1}/tests/core/schema/postgresql-storage-1.6.sql +0 -0
  322. {kinto-19.2.0 → kinto-19.3.1}/tests/core/schema/postgresql-storage-11.sql +0 -0
  323. {kinto-19.2.0 → kinto-19.3.1}/tests/core/support.py +0 -0
  324. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_authentication.py +0 -0
  325. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_authorization.py +0 -0
  326. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_cache.py +0 -0
  327. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_decorators.py +0 -0
  328. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_deprecation.py +0 -0
  329. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_errors.py +0 -0
  330. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_listeners.py +0 -0
  331. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_logging.py +0 -0
  332. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_metrics.py +0 -0
  333. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_openapi.py +0 -0
  334. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_permission.py +0 -0
  335. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_schema.py +0 -0
  336. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_scripts.py +0 -0
  337. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_storage.py +0 -0
  338. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_storage_migrations.py +0 -0
  339. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_storage_pool.py +0 -0
  340. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_utils.py +0 -0
  341. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_batch.py +0 -0
  342. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_errors.py +0 -0
  343. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_heartbeat.py +0 -0
  344. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_hello.py +0 -0
  345. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_openapi.py +0 -0
  346. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_postgresql.py +0 -0
  347. {kinto-19.2.0 → kinto-19.3.1}/tests/core/test_views_transaction.py +0 -0
  348. {kinto-19.2.0 → kinto-19.3.1}/tests/core/testapp/__init__.py +0 -0
  349. {kinto-19.2.0 → kinto-19.3.1}/tests/core/testapp/static/index.html +0 -0
  350. {kinto-19.2.0 → kinto-19.3.1}/tests/core/testapp/views.py +0 -0
  351. {kinto-19.2.0 → kinto-19.3.1}/tests/core/testplugin/__init__.py +0 -0
  352. {kinto-19.2.0 → kinto-19.3.1}/tests/functional.ini +0 -0
  353. {kinto-19.2.0 → kinto-19.3.1}/tests/functional.py +0 -0
  354. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/__init__.py +0 -0
  355. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/support.py +0 -0
  356. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_plugins.py +0 -0
  357. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_resources.py +0 -0
  358. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_responses_buckets.py +0 -0
  359. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_responses_collections.py +0 -0
  360. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_responses_errors.py +0 -0
  361. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_responses_groups.py +0 -0
  362. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_responses_records.py +0 -0
  363. {kinto-19.2.0 → kinto-19.3.1}/tests/openapi/test_validation.py +0 -0
  364. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/__init__.py +0 -0
  365. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_accounts.py +0 -0
  366. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_admin.py +0 -0
  367. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_default_bucket.py +0 -0
  368. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_flush.py +0 -0
  369. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_history.py +0 -0
  370. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_openid.py +0 -0
  371. {kinto-19.2.0 → kinto-19.3.1}/tests/plugins/test_quotas.py +0 -0
  372. {kinto-19.2.0 → kinto-19.3.1}/tests/support.py +0 -0
  373. {kinto-19.2.0 → kinto-19.3.1}/tests/test_authorization.py +0 -0
  374. {kinto-19.2.0 → kinto-19.3.1}/tests/test_config.py +0 -0
  375. {kinto-19.2.0 → kinto-19.3.1}/tests/test_configuration/test.ini +0 -0
  376. {kinto-19.2.0 → kinto-19.3.1}/tests/test_init.py +0 -0
  377. {kinto-19.2.0 → kinto-19.3.1}/tests/test_main.py +0 -0
  378. {kinto-19.2.0 → kinto-19.3.1}/tests/test_scripts.py +0 -0
  379. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_admin.py +0 -0
  380. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_buckets.py +0 -0
  381. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_collections.py +0 -0
  382. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_collections_cache.py +0 -0
  383. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_contribute.py +0 -0
  384. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_disable_default.py +0 -0
  385. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_groups.py +0 -0
  386. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_hello.py +0 -0
  387. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_objects_permissions.py +0 -0
  388. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_permissions.py +0 -0
  389. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_records.py +0 -0
  390. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_schema_collection.py +0 -0
  391. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_schema_group.py +0 -0
  392. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_schema_record.py +0 -0
  393. {kinto-19.2.0 → kinto-19.3.1}/tests/test_views_version.py +0 -0
@@ -32,10 +32,8 @@ jobs:
32
32
  runs-on: ubuntu-latest
33
33
  strategy:
34
34
  matrix:
35
- pyenv: [py38, py39, py310, py311, py312, py312-raw]
35
+ pyenv: [py39, py310, py311, py312, py312-raw]
36
36
  include:
37
- - pyenv: py38
38
- python-version: "3.8"
39
37
  - pyenv: py39
40
38
  python-version: "3.9"
41
39
  - pyenv: py310
@@ -1,5 +1,5 @@
1
1
  # Mozilla Kinto server
2
- FROM python:3.10-bullseye as python-builder
2
+ FROM python:3.10-bullseye AS python-builder
3
3
  RUN python -m venv /opt/venv
4
4
  ARG KINTO_VERSION=1
5
5
  ENV SETUPTOOLS_SCM_PRETEND_VERSION_FOR_KINTO=${KINTO_VERSION} \
@@ -36,4 +36,4 @@ WORKDIR /app
36
36
  USER app
37
37
 
38
38
  # Run database migrations and start the kinto server
39
- CMD kinto migrate --ini $KINTO_INI && kinto start --ini $KINTO_INI --port $PORT
39
+ CMD ["sh", "-c", "kinto migrate --ini $KINTO_INI && kinto start --ini $KINTO_INI --port $PORT"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kinto
3
- Version: 19.2.0
3
+ Version: 19.3.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
@@ -21,10 +21,10 @@ Project-URL: Repository, https://github.com/Kinto/kinto
21
21
  Keywords: web,sync,json,storage,services
22
22
  Classifier: Programming Language :: Python
23
23
  Classifier: Programming Language :: Python :: 3
24
- Classifier: Programming Language :: Python :: 3.8
25
24
  Classifier: Programming Language :: Python :: 3.9
26
25
  Classifier: Programming Language :: Python :: 3.10
27
26
  Classifier: Programming Language :: Python :: 3.11
27
+ Classifier: Programming Language :: Python :: 3.12
28
28
  Classifier: Programming Language :: Python :: Implementation :: CPython
29
29
  Classifier: Topic :: Internet :: WWW/HTTP
30
30
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
@@ -114,7 +114,7 @@ Kinto is a minimalist JSON storage service with synchronisation and sharing abil
114
114
  Requirements
115
115
  ------------
116
116
 
117
- * **Python**: 3.8+
117
+ * **Python**: 3.9+
118
118
  * **Backends**: In-memory (development), PostgreSQL 9.5+ (production)
119
119
 
120
120
  Contributors
@@ -38,5 +38,5 @@ Kinto is a minimalist JSON storage service with synchronisation and sharing abil
38
38
  Requirements
39
39
  ------------
40
40
 
41
- * **Python**: 3.8+
41
+ * **Python**: 3.9+
42
42
  * **Backends**: In-memory (development), PostgreSQL 9.5+ (production)
@@ -10,7 +10,7 @@ attrs==23.2.0
10
10
  # via
11
11
  # jsonschema
12
12
  # referencing
13
- bcrypt==4.2.0
13
+ bcrypt==4.2.1
14
14
  # via -r constraints.in
15
15
  beautifulsoup4==4.12.3
16
16
  # via webtest
@@ -36,7 +36,7 @@ cornice==6.0.1
36
36
  # cornice-swagger
37
37
  cornice-swagger==1.0.1
38
38
  # via -r constraints.in
39
- coverage==7.4.0
39
+ coverage==7.6.4
40
40
  # via pytest-cov
41
41
  dockerflow==2024.4.2
42
42
  # via -r constraints.in
@@ -44,8 +44,10 @@ execnet==2.0.2
44
44
  # via pytest-cache
45
45
  fqdn==1.5.1
46
46
  # via jsonschema
47
- greenlet==3.0.3
48
- # via playwright
47
+ greenlet==3.1.1
48
+ # via
49
+ # playwright
50
+ # sqlalchemy
49
51
  hupper==1.12
50
52
  # via pyramid
51
53
  idna==3.7
@@ -79,7 +81,7 @@ markupsafe==2.1.4
79
81
  # via werkzeug
80
82
  msgpack==1.0.7
81
83
  # via bravado-core
82
- newrelic==10.1.0
84
+ newrelic==10.3.1
83
85
  # via -r constraints.in
84
86
  packaging==23.2
85
87
  # via
@@ -94,13 +96,13 @@ plaster==1.1.2
94
96
  # pyramid
95
97
  plaster-pastedeploy==1.0.1
96
98
  # via pyramid
97
- playwright==1.47.0
99
+ playwright==1.49.0
98
100
  # via -r constraints.in
99
101
  pluggy==1.5.0
100
102
  # via pytest
101
- prometheus-client==0.21.0
103
+ prometheus-client==0.21.1
102
104
  # via -r constraints.in
103
- psycopg2==2.9.9
105
+ psycopg2==2.9.10
104
106
  # via -r constraints.in
105
107
  pyee==12.0.0
106
108
  # via playwright
@@ -117,16 +119,16 @@ pyramid-mailer==0.15.1
117
119
  # via -r constraints.in
118
120
  pyramid-multiauth==1.0.2
119
121
  # via -r constraints.in
120
- pyramid-tm==2.5
122
+ pyramid-tm==2.6
121
123
  # via -r constraints.in
122
- pytest==8.3.3
124
+ pytest==8.3.4
123
125
  # via
124
126
  # -r constraints.in
125
127
  # pytest-cache
126
128
  # pytest-cov
127
129
  pytest-cache==1.0
128
130
  # via -r constraints.in
129
- pytest-cov==5.0.0
131
+ pytest-cov==6.0.0
130
132
  # via -r constraints.in
131
133
  python-dateutil==2.9.0.post0
132
134
  # via
@@ -161,7 +163,7 @@ rpds-py==0.17.1
161
163
  # via
162
164
  # jsonschema
163
165
  # referencing
164
- ruff==0.6.9
166
+ ruff==0.8.2
165
167
  # via -r constraints.in
166
168
  sentry-sdk==2.8.0
167
169
  # via -r constraints.in
@@ -175,7 +177,7 @@ six==1.16.0
175
177
  # rfc3339-validator
176
178
  soupsieve==2.5
177
179
  # via beautifulsoup4
178
- sqlalchemy==2.0.35
180
+ sqlalchemy==2.0.36
179
181
  # via
180
182
  # -r constraints.in
181
183
  # sentry-sdk
@@ -212,7 +214,7 @@ venusian==3.1.0
212
214
  # via
213
215
  # cornice
214
216
  # pyramid
215
- waitress==3.0.0
217
+ waitress==3.0.2
216
218
  # via
217
219
  # -r constraints.in
218
220
  # webtest
@@ -224,7 +226,7 @@ webob==1.8.8
224
226
  # webtest
225
227
  webtest==3.0.0
226
228
  # via -r constraints.in
227
- werkzeug==3.0.4
229
+ werkzeug==3.1.3
228
230
  # via -r constraints.in
229
231
  zope-deprecation==5.0
230
232
  # via pyramid
@@ -24,10 +24,7 @@ __HERE__ = os.path.dirname(os.path.abspath(__file__))
24
24
  on_rtd = os.environ.get("READTHEDOCS", None) == "True"
25
25
 
26
26
  if not on_rtd: # only import and set the theme if we're building docs locally
27
- import sphinx_rtd_theme
28
-
29
27
  html_theme = "sphinx_rtd_theme"
30
- html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
31
28
 
32
29
  # otherwise, readthedocs.io uses their theme by default, so no need to specify
33
30
  # it
@@ -1,12 +1,12 @@
1
- Sphinx==7.4.4
2
- sphinx_rtd_theme==2.0.0
1
+ Sphinx==8.1.3
2
+ sphinx_rtd_theme==3.0.2
3
3
  docutils==0.20.1
4
4
  sphinxcontrib-httpdomain==1.8.1
5
5
  sphinx-github-changelog==1.4.0
6
6
  kinto
7
7
  mock==5.1.0
8
- webtest==3.0.1
8
+ webtest==3.0.2
9
9
  cornice==6.1.0
10
10
  pyramid==2.0.2
11
11
  python-rapidjson==1.20
12
- SQLAlchemy==2.0.35
12
+ SQLAlchemy==2.0.36
@@ -38,6 +38,7 @@ DEFAULT_SETTINGS = {
38
38
  "record_id_generator": "kinto.views.RelaxedUUID",
39
39
  "project_name": "kinto",
40
40
  "admin_assets_path": None,
41
+ "metrics_matchdict_fields": ["bucket_id", "collection_id", "group_id", "record_id"],
41
42
  }
42
43
 
43
44
 
@@ -96,6 +96,7 @@ DEFAULT_SETTINGS = {
96
96
  "statsd_backend": "kinto.core.statsd",
97
97
  "statsd_prefix": "kinto.core",
98
98
  "statsd_url": None,
99
+ "metrics_matchdict_fields": [],
99
100
  "storage_backend": "",
100
101
  "storage_url": "",
101
102
  "storage_max_fetch_size": 10000,
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import random
3
3
  import re
4
+ import urllib.parse
4
5
  import warnings
5
6
  from datetime import datetime
6
7
  from secrets import token_hex
@@ -431,6 +432,9 @@ def setup_logging(config):
431
432
  def setup_metrics(config):
432
433
  settings = config.get_settings()
433
434
 
435
+ # Register a no-op metrics service by default.
436
+ config.registry.registerUtility(metrics.NoOpMetricsService(), metrics.IMetricsService)
437
+
434
438
  # This does not fully respect the Pyramid/ZCA patterns, but the rest of Kinto uses
435
439
  # `registry.storage`, `registry.cache`, etc. Consistency seems more important.
436
440
  config.registry.__class__.metrics = property(
@@ -449,9 +453,6 @@ def setup_metrics(config):
449
453
  def on_app_created(event):
450
454
  config = event.app
451
455
  metrics_service = config.registry.metrics
452
- if not metrics_service:
453
- logger.warning("No metrics service registered.")
454
- return
455
456
 
456
457
  metrics.watch_execution_time(metrics_service, config.registry.cache, prefix="backend")
457
458
  metrics.watch_execution_time(metrics_service, config.registry.storage, prefix="backend")
@@ -471,15 +472,66 @@ def setup_metrics(config):
471
472
  def on_new_response(event):
472
473
  request = event.request
473
474
  metrics_service = config.registry.metrics
474
- if not metrics_service:
475
- return
475
+
476
+ try:
477
+ endpoint = utils.strip_uri_prefix(request.path)
478
+ endpoint = urllib.parse.quote_plus(endpoint, safe="/?&=-_")
479
+ except UnicodeDecodeError as e:
480
+ # This `on_new_response` callback is also called when a HTTP 400
481
+ # is returned because of an invalid UTF-8 path. We still want metrics.
482
+ endpoint = str(e)
476
483
 
477
484
  # Count unique users.
478
485
  user_id = request.prefixed_userid
479
486
  if user_id:
480
487
  # Get rid of colons in metric packet (see #1282).
481
- user_id = user_id.replace(":", ".")
482
- metrics_service.count("users", unique=user_id)
488
+ auth, user_id = user_id.split(":")
489
+ metrics_service.count("users", unique=[("auth", auth), ("userid", user_id)])
490
+
491
+ # Add extra labels to metrics, based on fields extracted from the request matchdict.
492
+ metrics_matchdict_fields = aslist(settings["metrics_matchdict_fields"])
493
+ # Turn the `id` field of object endpoints into `{resource}_id` (eg. `mushroom_id`, `bucket_id`)
494
+ enhanced_matchdict = dict(request.matchdict or {})
495
+ try:
496
+ enhanced_matchdict[request.current_resource_name + "_id"] = enhanced_matchdict.get(
497
+ "id", ""
498
+ )
499
+ except AttributeError:
500
+ # Not on a resource.
501
+ pass
502
+ metrics_matchdict_labels = [
503
+ (field, enhanced_matchdict.get(field, "")) for field in metrics_matchdict_fields
504
+ ]
505
+
506
+ # Count served requests.
507
+ metrics_service.count(
508
+ "request_summary",
509
+ unique=[
510
+ ("method", request.method.lower()),
511
+ ("endpoint", endpoint),
512
+ ("status", str(event.response.status_code)),
513
+ ]
514
+ + metrics_matchdict_labels,
515
+ )
516
+
517
+ try:
518
+ current = utils.msec_time()
519
+ duration = current - request._received_at
520
+ metrics_service.observe(
521
+ "request_duration",
522
+ duration,
523
+ labels=[("endpoint", endpoint)] + metrics_matchdict_labels,
524
+ )
525
+ except AttributeError: # pragma: no cover
526
+ # Logging was not setup in this Kinto app (unlikely but possible)
527
+ pass
528
+
529
+ # Observe response size.
530
+ metrics_service.observe(
531
+ "request_size",
532
+ len(event.response.body or b""),
533
+ labels=[("endpoint", endpoint)] + metrics_matchdict_labels,
534
+ )
483
535
 
484
536
  # Count authentication verifications.
485
537
  if hasattr(request, "authn_type"):
@@ -1,6 +1,6 @@
1
1
  import types
2
2
 
3
- from zope.interface import Interface
3
+ from zope.interface import Interface, implementer
4
4
 
5
5
  from kinto.core import utils
6
6
 
@@ -16,13 +16,47 @@ class IMetricsService(Interface):
16
16
  Watch execution time.
17
17
  """
18
18
 
19
+ def observe(self, key, value, labels=[]):
20
+ """
21
+ Observe a give `value` for the specified `key`.
22
+ """
23
+
19
24
  def count(key, count=1, unique=None):
20
25
  """
21
26
  Count occurrences. If `unique` is set, overwrites the counter value
22
27
  on each call.
28
+
29
+ `unique` should be of type ``list[tuple[str,str]]``.
23
30
  """
24
31
 
25
32
 
33
+ class NoOpTimer:
34
+ def __call__(self, f):
35
+ @utils.safe_wraps(f)
36
+ def _wrapped(*args, **kwargs):
37
+ return f(*args, **kwargs)
38
+
39
+ return _wrapped
40
+
41
+ def __enter__(self):
42
+ pass
43
+
44
+ def __exit__(self, *args, **kwargs):
45
+ pass
46
+
47
+
48
+ @implementer(IMetricsService)
49
+ class NoOpMetricsService:
50
+ def timer(self, key):
51
+ return NoOpTimer()
52
+
53
+ def observe(self, key, value, labels=[]):
54
+ pass
55
+
56
+ def count(self, key, count=1, unique=None):
57
+ pass
58
+
59
+
26
60
  def watch_execution_time(metrics_service, obj, prefix="", classname=None):
27
61
  """
28
62
  Decorate all methods of an object in order to watch their execution time.
@@ -49,6 +83,8 @@ def listener_with_timer(config, key, func):
49
83
  def wrapped(*args, **kwargs):
50
84
  metrics_service = config.registry.metrics
51
85
  if not metrics_service:
86
+ # This only happens if `kinto.core.initialization.setup_metrics` is
87
+ # not listed in the `initialization_sequence` setting.
52
88
  return func(*args, **kwargs)
53
89
  # If metrics are enabled, monitor execution time of listeners.
54
90
  with metrics_service.timer(key):
@@ -665,7 +665,7 @@ class Resource:
665
665
  obj = self._get_object_or_404(self.object_id)
666
666
  self._raise_412_if_modified(obj)
667
667
 
668
- # Retreive the last_modified information from a querystring if present.
668
+ # Retrieve the last_modified information from a querystring if present.
669
669
  last_modified = self.request.validated["querystring"].get("last_modified")
670
670
 
671
671
  # If less or equal than current object. Ignore it.
@@ -1060,7 +1060,8 @@ class Resource:
1060
1060
  """Extracts filters from QueryString parameters."""
1061
1061
 
1062
1062
  def is_valid_timestamp(value):
1063
- return isinstance(value, int) or re.match(r'^"?\d+"?$', str(value))
1063
+ # Is either integer, or integer as string, or integer between 2 quotes.
1064
+ return isinstance(value, int) or re.match(r'^(\d+)$|^("\d+")$', str(value))
1064
1065
 
1065
1066
  queryparams = self.request.validated["querystring"]
1066
1067
 
@@ -1,4 +1,5 @@
1
1
  import collections.abc as collections_abc
2
+ import functools
2
3
  import hashlib
3
4
  import hmac
4
5
  import os
@@ -541,3 +542,10 @@ def apply_json_patch(obj, ops):
541
542
  raise ValueError(e)
542
543
 
543
544
  return result
545
+
546
+
547
+ def safe_wraps(wrapper, *args, **kwargs):
548
+ """Safely wraps partial functions."""
549
+ while isinstance(wrapper, functools.partial):
550
+ wrapper = wrapper.func
551
+ return functools.wraps(wrapper, *args, **kwargs)
@@ -0,0 +1 @@
1
+ 3.4.1
@@ -0,0 +1 @@
1
+ 3.4.1