kinto 23.0.3__tar.gz → 23.1.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.

Potentially problematic release.


This version of kinto might be problematic. Click here for more details.

Files changed (398) hide show
  1. {kinto-23.0.3 → kinto-23.1.0}/CONTRIBUTORS.rst +1 -0
  2. {kinto-23.0.3 → kinto-23.1.0}/PKG-INFO +2 -1
  3. {kinto-23.0.3 → kinto-23.1.0}/docs/core/cache.rst +6 -0
  4. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/__init__.py +35 -0
  5. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/memcached.py +2 -0
  6. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/memory.py +6 -1
  7. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/postgresql/__init__.py +3 -0
  8. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/initialization.py +11 -3
  9. kinto-23.1.0/kinto/plugins/admin/VERSION +1 -0
  10. kinto-23.1.0/kinto/plugins/admin/build/VERSION +1 -0
  11. kinto-23.0.3/kinto/plugins/admin/build/assets/index-DnaKeFLX.css → kinto-23.1.0/kinto/plugins/admin/build/assets/index-B_zMxEpZ.css +1 -1
  12. kinto-23.1.0/kinto/plugins/admin/build/assets/index-DBxDgrMX.js +154 -0
  13. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/index.html +2 -2
  14. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/history/__init__.py +24 -0
  15. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/PKG-INFO +2 -1
  16. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/SOURCES.txt +3 -2
  17. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_initialization.py +10 -0
  18. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_history.py +15 -1
  19. kinto-23.1.0/tests/test_cache_metrics.py +70 -0
  20. kinto-23.0.3/kinto/plugins/admin/VERSION +0 -1
  21. kinto-23.0.3/kinto/plugins/admin/build/VERSION +0 -1
  22. kinto-23.0.3/kinto/plugins/admin/build/assets/index-Dt2_17Gx.js +0 -145
  23. {kinto-23.0.3 → kinto-23.1.0}/.dockerignore +0 -0
  24. {kinto-23.0.3 → kinto-23.1.0}/.github/CODE_OF_CONDUCT.md +0 -0
  25. {kinto-23.0.3 → kinto-23.1.0}/.github/CONTRIBUTING.md +0 -0
  26. {kinto-23.0.3 → kinto-23.1.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {kinto-23.0.3 → kinto-23.1.0}/.github/dependabot.yml +0 -0
  28. {kinto-23.0.3 → kinto-23.1.0}/.github/release.yml +0 -0
  29. {kinto-23.0.3 → kinto-23.1.0}/.github/workflows/labels.yaml +0 -0
  30. {kinto-23.0.3 → kinto-23.1.0}/.github/workflows/publish.yml +0 -0
  31. {kinto-23.0.3 → kinto-23.1.0}/.github/workflows/scheduled.yml +0 -0
  32. {kinto-23.0.3 → kinto-23.1.0}/.github/workflows/test.yml +0 -0
  33. {kinto-23.0.3 → kinto-23.1.0}/.gitignore +0 -0
  34. {kinto-23.0.3 → kinto-23.1.0}/.readthedocs.yaml +0 -0
  35. {kinto-23.0.3 → kinto-23.1.0}/CHANGELOG.rst +0 -0
  36. {kinto-23.0.3 → kinto-23.1.0}/Dockerfile +0 -0
  37. {kinto-23.0.3 → kinto-23.1.0}/LICENSE +0 -0
  38. {kinto-23.0.3 → kinto-23.1.0}/Makefile +0 -0
  39. {kinto-23.0.3 → kinto-23.1.0}/README.rst +0 -0
  40. {kinto-23.0.3 → kinto-23.1.0}/SECURITY.md +0 -0
  41. {kinto-23.0.3 → kinto-23.1.0}/SUPPORT.md +0 -0
  42. {kinto-23.0.3 → kinto-23.1.0}/app.wsgi +0 -0
  43. {kinto-23.0.3 → kinto-23.1.0}/constraints.in +0 -0
  44. {kinto-23.0.3 → kinto-23.1.0}/constraints.txt +0 -0
  45. {kinto-23.0.3 → kinto-23.1.0}/docker-compose.yml +0 -0
  46. {kinto-23.0.3 → kinto-23.1.0}/docs/_static/piwik.js +0 -0
  47. {kinto-23.0.3 → kinto-23.1.0}/docs/_static/theme_overrides.css +0 -0
  48. {kinto-23.0.3 → kinto-23.1.0}/docs/_templates/footer.html +0 -0
  49. {kinto-23.0.3 → kinto-23.1.0}/docs/_templates/indexcontent.html +0 -0
  50. {kinto-23.0.3 → kinto-23.1.0}/docs/_templates/layout.html +0 -0
  51. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-delete-list.rst +0 -0
  52. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-delete-object.rst +0 -0
  53. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-get-list.rst +0 -0
  54. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-get-object.rst +0 -0
  55. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-head-list.rst +0 -0
  56. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-patch-object.rst +0 -0
  57. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-post-list.rst +0 -0
  58. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_details-put-object.rst +0 -0
  59. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-delete-list.rst +0 -0
  60. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-delete-object.rst +0 -0
  61. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-get-list.rst +0 -0
  62. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-get-object.rst +0 -0
  63. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-patch-object.rst +0 -0
  64. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-post-list.rst +0 -0
  65. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/_status-put-object.rst +0 -0
  66. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/accounts.rst +0 -0
  67. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/admin.rst +0 -0
  68. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/authentication.rst +0 -0
  69. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/backoff.rst +0 -0
  70. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/batch.rst +0 -0
  71. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/buckets.rst +0 -0
  72. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/collections.rst +0 -0
  73. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/deprecation.rst +0 -0
  74. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/errors.rst +0 -0
  75. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/filtering.rst +0 -0
  76. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/flush.rst +0 -0
  77. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/groups.rst +0 -0
  78. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/history.rst +0 -0
  79. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/index.rst +0 -0
  80. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/openapi.rst +0 -0
  81. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/openid.rst +0 -0
  82. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/pagination.rst +0 -0
  83. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/permissions.rst +0 -0
  84. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/records.rst +0 -0
  85. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/selecting_fields.rst +0 -0
  86. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/sorting.rst +0 -0
  87. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/timestamps.rst +0 -0
  88. {kinto-23.0.3 → kinto-23.1.0}/docs/api/1.x/utilities.rst +0 -0
  89. {kinto-23.0.3 → kinto-23.1.0}/docs/api/index.rst +0 -0
  90. {kinto-23.0.3 → kinto-23.1.0}/docs/api/versioning.rst +0 -0
  91. {kinto-23.0.3 → kinto-23.1.0}/docs/changelog.rst +0 -0
  92. {kinto-23.0.3 → kinto-23.1.0}/docs/commandline.rst +0 -0
  93. {kinto-23.0.3 → kinto-23.1.0}/docs/community.rst +0 -0
  94. {kinto-23.0.3 → kinto-23.1.0}/docs/concepts.rst +0 -0
  95. {kinto-23.0.3 → kinto-23.1.0}/docs/conf.py +0 -0
  96. {kinto-23.0.3 → kinto-23.1.0}/docs/configuration/good-practices.rst +0 -0
  97. {kinto-23.0.3 → kinto-23.1.0}/docs/configuration/index.rst +0 -0
  98. {kinto-23.0.3 → kinto-23.1.0}/docs/configuration/production.rst +0 -0
  99. {kinto-23.0.3 → kinto-23.1.0}/docs/configuration/settings.rst +0 -0
  100. {kinto-23.0.3 → kinto-23.1.0}/docs/core/_static/theme_overrides.css +0 -0
  101. {kinto-23.0.3 → kinto-23.1.0}/docs/core/api.rst +0 -0
  102. {kinto-23.0.3 → kinto-23.1.0}/docs/core/decorators.rst +0 -0
  103. {kinto-23.0.3 → kinto-23.1.0}/docs/core/errors.rst +0 -0
  104. {kinto-23.0.3 → kinto-23.1.0}/docs/core/glossary.rst +0 -0
  105. {kinto-23.0.3 → kinto-23.1.0}/docs/core/images/cliquet-base.png +0 -0
  106. {kinto-23.0.3 → kinto-23.1.0}/docs/core/images/cliquet-mozilla.png +0 -0
  107. {kinto-23.0.3 → kinto-23.1.0}/docs/core/index.rst +0 -0
  108. {kinto-23.0.3 → kinto-23.1.0}/docs/core/notifications.rst +0 -0
  109. {kinto-23.0.3 → kinto-23.1.0}/docs/core/permission.rst +0 -0
  110. {kinto-23.0.3 → kinto-23.1.0}/docs/core/quickstart.rst +0 -0
  111. {kinto-23.0.3 → kinto-23.1.0}/docs/core/rationale.rst +0 -0
  112. {kinto-23.0.3 → kinto-23.1.0}/docs/core/resource.rst +0 -0
  113. {kinto-23.0.3 → kinto-23.1.0}/docs/core/storage.rst +0 -0
  114. {kinto-23.0.3 → kinto-23.1.0}/docs/core/testing.rst +0 -0
  115. {kinto-23.0.3 → kinto-23.1.0}/docs/core/utils.rst +0 -0
  116. {kinto-23.0.3 → kinto-23.1.0}/docs/core/viewsets.rst +0 -0
  117. {kinto-23.0.3 → kinto-23.1.0}/docs/faq.rst +0 -0
  118. {kinto-23.0.3 → kinto-23.1.0}/docs/images/alwaysdata-button.svg +0 -0
  119. {kinto-23.0.3 → kinto-23.1.0}/docs/images/architecture.svg +0 -0
  120. {kinto-23.0.3 → kinto-23.1.0}/docs/images/color-formatter.png +0 -0
  121. {kinto-23.0.3 → kinto-23.1.0}/docs/images/concepts-general.png +0 -0
  122. {kinto-23.0.3 → kinto-23.1.0}/docs/images/concepts-permissions.png +0 -0
  123. {kinto-23.0.3 → kinto-23.1.0}/docs/images/heroku-button.png +0 -0
  124. {kinto-23.0.3 → kinto-23.1.0}/docs/images/kinto-logo.png +0 -0
  125. {kinto-23.0.3 → kinto-23.1.0}/docs/images/kinto-logo.svg +0 -0
  126. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-admin.svg +0 -0
  127. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-attachment.svg +0 -0
  128. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-community.svg +0 -0
  129. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-history.svg +0 -0
  130. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-javascript.svg +0 -0
  131. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-jsonschema.svg +0 -0
  132. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-multiapps.svg +0 -0
  133. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-permissions.svg +0 -0
  134. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-python.svg +0 -0
  135. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-selfhostable.svg +0 -0
  136. {kinto-23.0.3 → kinto-23.1.0}/docs/images/logo-synchronisation.svg +0 -0
  137. {kinto-23.0.3 → kinto-23.1.0}/docs/images/overview-deployonce-selfhost.png +0 -0
  138. {kinto-23.0.3 → kinto-23.1.0}/docs/images/overview-features.png +0 -0
  139. {kinto-23.0.3 → kinto-23.1.0}/docs/images/overview-synchronisation.png +0 -0
  140. {kinto-23.0.3 → kinto-23.1.0}/docs/images/overview-use-cases.png +0 -0
  141. {kinto-23.0.3 → kinto-23.1.0}/docs/images/scalingo-button.svg +0 -0
  142. {kinto-23.0.3 → kinto-23.1.0}/docs/images/screenshot-kinto-admin-1.png +0 -0
  143. {kinto-23.0.3 → kinto-23.1.0}/docs/images/screenshot-kinto-admin-2.png +0 -0
  144. {kinto-23.0.3 → kinto-23.1.0}/docs/images/screenshot-kinto-admin-3.png +0 -0
  145. {kinto-23.0.3 → kinto-23.1.0}/docs/images/screenshot-kinto-admin-4.png +0 -0
  146. {kinto-23.0.3 → kinto-23.1.0}/docs/images/sequence-storage.png +0 -0
  147. {kinto-23.0.3 → kinto-23.1.0}/docs/images/sync-both.svg +0 -0
  148. {kinto-23.0.3 → kinto-23.1.0}/docs/images/sync-newest.svg +0 -0
  149. {kinto-23.0.3 → kinto-23.1.0}/docs/images/sync-oldest.svg +0 -0
  150. {kinto-23.0.3 → kinto-23.1.0}/docs/index.rst +0 -0
  151. {kinto-23.0.3 → kinto-23.1.0}/docs/kinto-admin.rst +0 -0
  152. {kinto-23.0.3 → kinto-23.1.0}/docs/overview.rst +0 -0
  153. {kinto-23.0.3 → kinto-23.1.0}/docs/requirements.txt +0 -0
  154. {kinto-23.0.3 → kinto-23.1.0}/docs/troubleshooting.rst +0 -0
  155. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/custom-id-generator.rst +0 -0
  156. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/first-steps.rst +0 -0
  157. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/index.rst +0 -0
  158. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/install.rst +0 -0
  159. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/notifications-custom.rst +0 -0
  160. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/permission-setups.rst +0 -0
  161. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/permissions.rst +0 -0
  162. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/synchronisation.rst +0 -0
  163. {kinto-23.0.3 → kinto-23.1.0}/docs/tutorials/write-plugin.rst +0 -0
  164. {kinto-23.0.3 → kinto-23.1.0}/kinto/__init__.py +0 -0
  165. {kinto-23.0.3 → kinto-23.1.0}/kinto/__main__.py +0 -0
  166. {kinto-23.0.3 → kinto-23.1.0}/kinto/authorization.py +0 -0
  167. {kinto-23.0.3 → kinto-23.1.0}/kinto/config/__init__.py +0 -0
  168. {kinto-23.0.3 → kinto-23.1.0}/kinto/config/kinto.tpl +0 -0
  169. {kinto-23.0.3 → kinto-23.1.0}/kinto/contribute.json +0 -0
  170. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/__init__.py +0 -0
  171. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/authentication.py +0 -0
  172. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/authorization.py +0 -0
  173. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/postgresql/schema.sql +0 -0
  174. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cache/testing.py +0 -0
  175. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/__init__.py +0 -0
  176. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/cors.py +0 -0
  177. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/errors.py +0 -0
  178. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/pyramidhook.py +0 -0
  179. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/renderer.py +0 -0
  180. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/resource.py +0 -0
  181. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/service.py +0 -0
  182. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/util.py +0 -0
  183. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/validators/__init__.py +0 -0
  184. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/validators/_colander.py +0 -0
  185. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice/validators/_marshmallow.py +0 -0
  186. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/__init__.py +0 -0
  187. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/converters/__init__.py +0 -0
  188. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/converters/exceptions.py +0 -0
  189. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/converters/parameters.py +0 -0
  190. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/converters/schema.py +0 -0
  191. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/swagger.py +0 -0
  192. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/templates/index.html +0 -0
  193. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/templates/index_script_template.html +0 -0
  194. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/util.py +0 -0
  195. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/cornice_swagger/views.py +0 -0
  196. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/decorators.py +0 -0
  197. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/errors.py +0 -0
  198. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/events.py +0 -0
  199. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/listeners/__init__.py +0 -0
  200. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/metrics.py +0 -0
  201. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/openapi.py +0 -0
  202. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/__init__.py +0 -0
  203. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/memory.py +0 -0
  204. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/postgresql/__init__.py +0 -0
  205. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/postgresql/migrations/migration_001_002.sql +0 -0
  206. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/postgresql/schema.sql +0 -0
  207. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/permission/testing.py +0 -0
  208. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/resource/__init__.py +0 -0
  209. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/resource/model.py +0 -0
  210. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/resource/schema.py +0 -0
  211. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/resource/viewset.py +0 -0
  212. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/schema.py +0 -0
  213. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/scripts.py +0 -0
  214. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/statsd.py +0 -0
  215. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/__init__.py +0 -0
  216. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/exceptions.py +0 -0
  217. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/generators.py +0 -0
  218. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/memory.py +0 -0
  219. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/__init__.py +0 -0
  220. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/client.py +0 -0
  221. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_001_002.sql +0 -0
  222. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_002_003.sql +0 -0
  223. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_003_004.sql +0 -0
  224. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_004_005.sql +0 -0
  225. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_005_006.sql +0 -0
  226. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_006_007.sql +0 -0
  227. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_007_008.sql +0 -0
  228. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_008_009.sql +0 -0
  229. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_009_010.sql +0 -0
  230. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_010_011.sql +0 -0
  231. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_011_012.sql +0 -0
  232. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_012_013.sql +0 -0
  233. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_013_014.sql +0 -0
  234. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_014_015.sql +0 -0
  235. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_015_016.sql +0 -0
  236. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_016_017.sql +0 -0
  237. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_017_018.sql +0 -0
  238. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_018_019.sql +0 -0
  239. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_019_020.sql +0 -0
  240. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_020_021.sql +0 -0
  241. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_021_022.sql +0 -0
  242. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrations/migration_022_023.sql +0 -0
  243. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/migrator.py +0 -0
  244. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/pool.py +0 -0
  245. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/postgresql/schema.sql +0 -0
  246. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/testing.py +0 -0
  247. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/storage/utils.py +0 -0
  248. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/testing.py +0 -0
  249. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/utils.py +0 -0
  250. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/__init__.py +0 -0
  251. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/batch.py +0 -0
  252. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/errors.py +0 -0
  253. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/heartbeat.py +0 -0
  254. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/hello.py +0 -0
  255. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/openapi.py +0 -0
  256. {kinto-23.0.3 → kinto-23.1.0}/kinto/core/views/version.py +0 -0
  257. {kinto-23.0.3 → kinto-23.1.0}/kinto/events.py +0 -0
  258. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/__init__.py +0 -0
  259. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/accounts/__init__.py +0 -0
  260. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/accounts/authentication.py +0 -0
  261. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/accounts/scripts.py +0 -0
  262. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/accounts/utils.py +0 -0
  263. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/accounts/views.py +0 -0
  264. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/README.md +0 -0
  265. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/__init__.py +0 -0
  266. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/asn1-EdZsLKOL.js +0 -0
  267. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/clojure-BMjYHr_A.js +0 -0
  268. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/css-BnMrqG3P.js +0 -0
  269. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/javascript-qCveANmP.js +0 -0
  270. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/logo-VBRiKSPX.png +0 -0
  271. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/mllike-CXdrOF99.js +0 -0
  272. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/python-BuPzkPfP.js +0 -0
  273. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/rpm-CTu-6PCP.js +0 -0
  274. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/sql-D0XecflT.js +0 -0
  275. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/build/assets/ttcn-cfg-B9xdYoR4.js +0 -0
  276. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/public/help.html +0 -0
  277. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/admin/views.py +0 -0
  278. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/default_bucket/__init__.py +0 -0
  279. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/flush.py +0 -0
  280. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/history/listener.py +0 -0
  281. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/history/views.py +0 -0
  282. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/openid/__init__.py +0 -0
  283. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/openid/utils.py +0 -0
  284. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/openid/views.py +0 -0
  285. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/prometheus.py +0 -0
  286. {kinto-23.0.3 → kinto-23.1.0}/kinto/plugins/statsd.py +0 -0
  287. {kinto-23.0.3 → kinto-23.1.0}/kinto/schema_validation.py +0 -0
  288. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/__init__.py +0 -0
  289. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/admin.py +0 -0
  290. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/buckets.py +0 -0
  291. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/collections.py +0 -0
  292. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/contribute.py +0 -0
  293. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/groups.py +0 -0
  294. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/permissions.py +0 -0
  295. {kinto-23.0.3 → kinto-23.1.0}/kinto/views/records.py +0 -0
  296. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/dependency_links.txt +0 -0
  297. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/entry_points.txt +0 -0
  298. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/requires.txt +0 -0
  299. {kinto-23.0.3 → kinto-23.1.0}/kinto.egg-info/top_level.txt +0 -0
  300. {kinto-23.0.3 → kinto-23.1.0}/pyproject.toml +0 -0
  301. {kinto-23.0.3 → kinto-23.1.0}/scripts/pull-kinto-admin.sh +0 -0
  302. {kinto-23.0.3 → kinto-23.1.0}/setup.cfg +0 -0
  303. {kinto-23.0.3 → kinto-23.1.0}/tests/__init__.py +0 -0
  304. {kinto-23.0.3 → kinto-23.1.0}/tests/browser.ini +0 -0
  305. {kinto-23.0.3 → kinto-23.1.0}/tests/browser.py +0 -0
  306. {kinto-23.0.3 → kinto-23.1.0}/tests/core/__init__.py +0 -0
  307. {kinto-23.0.3 → kinto-23.1.0}/tests/core/listeners.py +0 -0
  308. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/__init__.py +0 -0
  309. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_base.py +0 -0
  310. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_cache_expires.py +0 -0
  311. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_events.py +0 -0
  312. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_filter.py +0 -0
  313. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_model.py +0 -0
  314. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_object.py +0 -0
  315. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_object_permissions.py +0 -0
  316. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_pagination.py +0 -0
  317. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_partial_response.py +0 -0
  318. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_preconditions.py +0 -0
  319. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_schema.py +0 -0
  320. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_sort.py +0 -0
  321. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_sync.py +0 -0
  322. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_views.py +0 -0
  323. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_views_cors.py +0 -0
  324. {kinto-23.0.3 → kinto-23.1.0}/tests/core/resource/test_viewset.py +0 -0
  325. {kinto-23.0.3 → kinto-23.1.0}/tests/core/schema/postgresql-permission-1.sql +0 -0
  326. {kinto-23.0.3 → kinto-23.1.0}/tests/core/schema/postgresql-storage-1.6.sql +0 -0
  327. {kinto-23.0.3 → kinto-23.1.0}/tests/core/schema/postgresql-storage-11.sql +0 -0
  328. {kinto-23.0.3 → kinto-23.1.0}/tests/core/support.py +0 -0
  329. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_authentication.py +0 -0
  330. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_authorization.py +0 -0
  331. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_cache.py +0 -0
  332. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_decorators.py +0 -0
  333. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_deprecation.py +0 -0
  334. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_errors.py +0 -0
  335. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_listeners.py +0 -0
  336. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_logging.py +0 -0
  337. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_metrics.py +0 -0
  338. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_openapi.py +0 -0
  339. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_permission.py +0 -0
  340. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_schema.py +0 -0
  341. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_scripts.py +0 -0
  342. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_storage.py +0 -0
  343. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_storage_migrations.py +0 -0
  344. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_storage_pool.py +0 -0
  345. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_utils.py +0 -0
  346. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_batch.py +0 -0
  347. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_errors.py +0 -0
  348. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_heartbeat.py +0 -0
  349. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_hello.py +0 -0
  350. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_openapi.py +0 -0
  351. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_postgresql.py +0 -0
  352. {kinto-23.0.3 → kinto-23.1.0}/tests/core/test_views_transaction.py +0 -0
  353. {kinto-23.0.3 → kinto-23.1.0}/tests/core/testapp/__init__.py +0 -0
  354. {kinto-23.0.3 → kinto-23.1.0}/tests/core/testapp/static/index.html +0 -0
  355. {kinto-23.0.3 → kinto-23.1.0}/tests/core/testapp/views.py +0 -0
  356. {kinto-23.0.3 → kinto-23.1.0}/tests/core/testplugin/__init__.py +0 -0
  357. {kinto-23.0.3 → kinto-23.1.0}/tests/functional.ini +0 -0
  358. {kinto-23.0.3 → kinto-23.1.0}/tests/functional.py +0 -0
  359. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/__init__.py +0 -0
  360. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/support.py +0 -0
  361. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_plugins.py +0 -0
  362. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_resources.py +0 -0
  363. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_responses_buckets.py +0 -0
  364. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_responses_collections.py +0 -0
  365. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_responses_errors.py +0 -0
  366. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_responses_groups.py +0 -0
  367. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_responses_records.py +0 -0
  368. {kinto-23.0.3 → kinto-23.1.0}/tests/openapi/test_validation.py +0 -0
  369. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/__init__.py +0 -0
  370. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_accounts.py +0 -0
  371. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_admin.py +0 -0
  372. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_default_bucket.py +0 -0
  373. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_flush.py +0 -0
  374. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_openid.py +0 -0
  375. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_prometheus.py +0 -0
  376. {kinto-23.0.3 → kinto-23.1.0}/tests/plugins/test_statsd.py +0 -0
  377. {kinto-23.0.3 → kinto-23.1.0}/tests/support.py +0 -0
  378. {kinto-23.0.3 → kinto-23.1.0}/tests/test_authorization.py +0 -0
  379. {kinto-23.0.3 → kinto-23.1.0}/tests/test_config.py +0 -0
  380. {kinto-23.0.3 → kinto-23.1.0}/tests/test_configuration/test.ini +0 -0
  381. {kinto-23.0.3 → kinto-23.1.0}/tests/test_init.py +0 -0
  382. {kinto-23.0.3 → kinto-23.1.0}/tests/test_main.py +0 -0
  383. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_admin.py +0 -0
  384. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_buckets.py +0 -0
  385. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_collections.py +0 -0
  386. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_collections_cache.py +0 -0
  387. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_contribute.py +0 -0
  388. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_disable_default.py +0 -0
  389. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_groups.py +0 -0
  390. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_hello.py +0 -0
  391. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_metrics.py +0 -0
  392. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_objects_permissions.py +0 -0
  393. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_permissions.py +0 -0
  394. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_records.py +0 -0
  395. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_schema_collection.py +0 -0
  396. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_schema_group.py +0 -0
  397. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_schema_record.py +0 -0
  398. {kinto-23.0.3 → kinto-23.1.0}/tests/test_views_version.py +0 -0
@@ -112,3 +112,4 @@ Contributors
112
112
  * Dan Milgram <danm@intervivo.com>
113
113
  * Dex Devlon <@bxff>
114
114
  * Varun Koranne <@varun-dhruv>
115
+ * Robin Sharma <robinrythm123@gmail.com>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinto
3
- Version: 23.0.3
3
+ Version: 23.1.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
@@ -229,3 +229,4 @@ Contributors
229
229
  * Dan Milgram <danm@intervivo.com>
230
230
  * Dex Devlon <@bxff>
231
231
  * Varun Koranne <@varun-dhruv>
232
+ * Robin Sharma <robinrythm123@gmail.com>
@@ -36,3 +36,9 @@ interface:
36
36
 
37
37
  .. autoclass:: kinto.core.cache.CacheBase
38
38
  :members:
39
+
40
+ Cache Metrics Adapter
41
+ =====================
42
+
43
+ .. autoclass:: kinto.core.cache.CacheMetricsBackend
44
+ :members:
@@ -10,10 +10,15 @@ _HEARTBEAT_KEY = "__heartbeat__"
10
10
  _HEARTBEAT_TTL_SECONDS = 3600
11
11
 
12
12
 
13
+ _CACHE_HIT_METRIC_KEY = "cache_hits"
14
+ _CACHE_MISS_METRIC_KEY = "cache_misses"
15
+
16
+
13
17
  class CacheBase:
14
18
  def __init__(self, *args, **kwargs):
15
19
  self.prefix = kwargs["cache_prefix"]
16
20
  self.max_size_bytes = kwargs.get("cache_max_size_bytes")
21
+ self.set_metrics_backend(kwargs.get("metrics_backend"))
17
22
 
18
23
  def initialize_schema(self, dry_run=False):
19
24
  """Create every necessary objects (like tables or indices) in the
@@ -71,6 +76,36 @@ class CacheBase:
71
76
  """
72
77
  raise NotImplementedError
73
78
 
79
+ def set_metrics_backend(self, metrics_backend):
80
+ """Set a metrics backend via the `CacheMetricsBackend` adapter.
81
+
82
+ :param metrics_backend: A metrics backend implementing the IMetricsService interface.
83
+ """
84
+ self.metrics_backend = CacheMetricsBackend(metrics_backend)
85
+
86
+
87
+ class CacheMetricsBackend:
88
+ """
89
+ A simple adapter for tracking cache-related metrics.
90
+ """
91
+
92
+ def __init__(self, metrics_backend, *args, **kwargs):
93
+ """Initialize with a given metrics backend.
94
+
95
+ :param metrics_backend: A metrics backend implementing the IMetricsService interface.
96
+ """
97
+ self._backend = metrics_backend
98
+
99
+ def count_hit(self):
100
+ """Increment the cache hit counter."""
101
+ if self._backend:
102
+ self._backend.count(key=_CACHE_HIT_METRIC_KEY)
103
+
104
+ def count_miss(self):
105
+ """Increment the cache miss counter."""
106
+ if self._backend:
107
+ self._backend.count(key=_CACHE_MISS_METRIC_KEY)
108
+
74
109
 
75
110
  def heartbeat(backend):
76
111
  def ping(request):
@@ -68,7 +68,9 @@ class Cache(CacheBase):
68
68
  def _get(self, key):
69
69
  value = self._client.get(self.prefix + key)
70
70
  if not value:
71
+ self.metrics_backend.count_miss()
71
72
  return None, 0
73
+ self.metrics_backend.count_hit()
72
74
  data = json.loads(value)
73
75
  return data["value"], data["ttl"]
74
76
 
@@ -73,7 +73,12 @@ class Cache(CacheBase):
73
73
  @synchronized
74
74
  def get(self, key):
75
75
  self._clean_expired()
76
- return self._store.get(self.prefix + key)
76
+ value = self._store.get(self.prefix + key)
77
+ if value is None:
78
+ self.metrics_backend.count_miss()
79
+ return None
80
+ self.metrics_backend.count_hit()
81
+ return value
77
82
 
78
83
  @synchronized
79
84
  def delete(self, key):
@@ -156,8 +156,11 @@ class Cache(CacheBase):
156
156
  conn.execute(sa.text(purge))
157
157
  result = conn.execute(sa.text(query), dict(key=self.prefix + key))
158
158
  if result.rowcount > 0:
159
+ self.metrics_backend.count_hit()
159
160
  value = result.fetchone().value
160
161
  return json.loads(value)
162
+ self.metrics_backend.count_miss()
163
+ return None
161
164
 
162
165
  def delete(self, key):
163
166
  query = "DELETE FROM cache WHERE key = :key RETURNING value;"
@@ -228,7 +228,9 @@ def _end_of_life_tween_factory(handler, registry):
228
228
  else:
229
229
  code = "hard-eol"
230
230
  request.response = errors.http_error(
231
- HTTPGone(), errno=errors.ERRORS.SERVICE_DEPRECATED, message=deprecation_msg
231
+ HTTPGone(),
232
+ errno=errors.ERRORS.SERVICE_DEPRECATED,
233
+ message=deprecation_msg,
232
234
  )
233
235
 
234
236
  errors.send_alert(request, eos_message, url=eos_url, code=code)
@@ -459,6 +461,11 @@ def setup_metrics(config):
459
461
  else:
460
462
  metrics.watch_execution_time(metrics_service, policy, prefix="authentication")
461
463
 
464
+ # Set cache metrics backend
465
+ cache_backend = config.registry.cache
466
+ if isinstance(cache_backend, cache.CacheBase):
467
+ cache_backend.set_metrics_backend(metrics_service)
468
+
462
469
  config.add_subscriber(on_app_created, ApplicationCreated)
463
470
 
464
471
  def on_new_response(event):
@@ -468,8 +475,9 @@ def setup_metrics(config):
468
475
  # Count unique users.
469
476
  user_id = request.prefixed_userid
470
477
  if user_id:
471
- # Get rid of colons in metric packet (see #1282).
472
- auth, user_id = user_id.split(":")
478
+ auth, user_id = user_id.split(":", 1)
479
+ # Get rid of colons in metric packet (see #1282 and #3571).
480
+ user_id = user_id.replace(":", ".")
473
481
  metrics_service.count("users", unique=[("auth", auth), ("userid", user_id)])
474
482
 
475
483
  status = event.response.status_code
@@ -0,0 +1 @@
1
+ 4.3.0
@@ -0,0 +1 @@
1
+ 4.3.0
@@ -1,4 +1,4 @@
1
- html,body{background:#fafbfc}h1{font-family:Ubuntu,Calibri,Arial,sans-serif;font-size:2.2em}.icon{vertical-align:-.125em;margin-bottom:-.0625em}.iconLarge{width:50px;height:50px;color:#000;display:block}.main{padding-top:2.8em}.sidebar{padding-top:1em}.sidebar .card{margin-bottom:20px}.card.panel-info .card-header{background-color:#cce5ff;border-color:#b8daff}.card-header span{margin-right:1em;max-width:26em;display:inline-block;height:1.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card-header span label{font-weight:700}.card>.card-body{position:relative}.sidebar-filters>.card-body{padding:15px 15px 0}.sidebar-filters a.clear{color:#777}.list-group-item .glyphicon.glyphicon-lock{color:#888}.content .list-actions{margin-bottom:.4em}.content .list-actions a{margin-right:.5em}.content .list-actions a>.glyphicon{margin-right:.3em}.content .edit-coll-props .btn{margin-right:0;margin-left:.3em}.kinto-admin-title{display:inline-block;font-size:2em;margin-top:0;margin-bottom:0;padding-left:100px;background:transparent url(/v1/admin/assets/logo-VBRiKSPX.png) no-repeat left;background-size:contain}.user-info{float:right;padding-top:.3em;font-size:14px}.user-info a.spaced{margin-left:1em}.server-url input:invalid,.server-url input:focus:invalid{box-shadow:0 0 5px 1px red}.session-info-bar{position:fixed;top:0;left:0;right:0;background:#24292e;color:#fff;padding:.2em 1.15em;z-index:999}.session-info-bar>a{margin-left:.5em}.server-info-panel table{margin:0}.server-info-panel .table-condensed>tbody>tr>th,.server-info-panel .table-condensed>tbody>tr>td{padding:.3em;overflow:hidden;text-overflow:ellipsis;max-width:300px}.server-info-panel tr:first-child th,.server-info-panel tr:first-child td{border:none}.alert h4 small{margin-left:.5em}.list-page .alert{margin-top:1.5em;margin-right:.5em}.tabs-container .panel-default{border-top:none}.tabs-container .panel-danger{margin-top:2em}table.record-list{margin-top:1em}table.record-list th{background:#00000014}table.record-list tbody.loading td{background:#dcdcdc26;color:#777}table.record-list td:not(.actions){max-width:8vw;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:.8em .5em}table.record-list td.lastmod{white-space:nowrap;width:120px}table.record-list td.status{white-space:nowrap;width:80px}table.record-list td.actions{min-width:150px;width:150px;padding:.5em 0;white-space:nowrap;text-align:center}table.record-list td.actions .btn-group{margin:0 .5em}table.record-list>tbody+tbody{border-top:none}.load-more>a{display:block;width:100%}table.record-list td.load-more{padding:0;line-height:2.5em}.load-more>a:hover,.load-more>a:active{background:#d9edf7;text-decoration:none}.card-body>.spinner{position:absolute;inset:0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.load-more .spinner{margin-top:.25em}.history-row-details{display:table-row}.table>tbody>tr.history-row-details>td{padding:0;margin:0}.history-row-details td pre{border:none;margin:0}.history-row-details .alert{margin:0;border-radius:0}.sort-link{float:right;margin-top:.1em;color:#444}.sort-link.active{color:#fff}.json-record>div{padding:1px 0 1px 4px}.json-record>div.added{background:#cbeecb;color:green}.json-record>div.removed{background:#f0c9c9;color:red}.json-record-simple-review{white-space:pre-wrap}.card-header>.icon,.list-group-item .icon,.nav-tabs li .icon{margin-right:.5em}.nav-tabs.nav-justified>li>a{color:#333}.collections-menu-entry{display:flex}.collections-menu-entry a:first-child{display:inline-block;width:95%;color:#555;text-decoration:none}.collections-menu-entry.active>a{color:#fff}.home-menu i,.home-menu .icon{float:right;margin:.15em -.5em 0 0}.bucket-menu-entry-edit{float:right;color:#555;text-decoration:none}.bucket-menu-entry-edit:hover{color:inherit}.collections-menu-entry-edit{position:absolute;margin-right:-.5em;color:#888}.collections-menu-entry-edit:hover{color:inherit}.CodeMirror{border:1px solid #ccc;height:auto;border-radius:.3em}.attachment-icon{width:16px}.attachment-action{margin:0;padding:0}.attachment-info .attachment-attributes{display:flex;align-content:stretch;align-items:end}.attachment-info table{margin-bottom:0;flex-grow:1;display:block}.attachment-info .table-condensed>tbody>tr>td{overflow:hidden;text-overflow:ellipsis}.attachment-img{display:flex;align-items:center;justify-content:center;max-width:150px;max-height:150px;text-align:center;background:#fff;border:1px solid #ddd;margin:10px}.attachment-img img{max-width:100%;max-height:100%}form button[type=submit].btn-primary{font-size:1.2em;padding:12px;box-shadow:inset 0 0 0 1px #fff}.record-form-buttons .delete{margin-top:12px}.permissions-form .array-item:not(:last-child) fieldset{border-bottom:1px solid #eee}.permissions-form .field-principal{float:left;width:60%;padding-right:1em}.permissions-form .field-permissions{float:left;width:30%;padding-left:1em}.permissions-form .field-anonymous,.permissions-form .field-authenticated{width:100%;float:left;clear:both}.permissions-form .field-anonymous{border-bottom:1px solid #eee}.permissions-form .field-anonymous p,.permissions-form .field-authenticated p{width:50%}.permissions-form .field-anonymous .checkboxes,.permissions-form .field-authenticated .checkboxes{float:right;width:50%;padding-left:1em;margin-top:-60px}.permissions-form .field-groups fieldset{clear:left}.permissions-form .field-groups .checkboxes{float:right;width:50%;padding-left:1em;margin-top:-60px}.permissions-form .field-groups fieldset>.field.field-array{clear:right}.permissions-form .field-principals .checkboxes{margin-top:-35px}.permissions-form .field-principal>label{display:none}.quickFilter{margin-bottom:-.5em}.spinner{margin:30px auto 0;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:#337ab7;border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.notifications>div{top:3em}i.fa{position:relative;top:1px;display:inline-block;font-style:normal;font-weight:400;line-height:1}i.fa:before{display:inline-block;content:"";background-repeat:no-repeat;background-size:24px 24px;width:24px;height:24px}.fa.fa-check:before{background-image:url(~bootstrap-icons/icons/check.svg)}.fa-exclamation-circle:before{background-image:url(~bootstrap-icons/icons/exclamation-circle-fill.svg)}.fa-info:before{background-image:url(~bootstrap-icons/icons/info-circle-fill.svg)}.fa-warning:before{background-image:url(~bootstrap-icons/icons/exclamation-triangle-fill.svg)}.rjsf{margin-bottom:1.25rem}.rjsf pre{padding:9.5px;margin:0 0 10px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.rjsf input[type=radio],.rjsf input[type=checkbox]{margin-right:10px}.rjsf .form-label{font-weight:700}.rjsf h5{font-size:18pt;margin:0 0 0 1pt}.rjsf hr{margin:1px 0 .5em;background-color:#ccc!important}.rjsf .row .align-items-center{align-items:flex-start!important;border-bottom:1px solid #eee}.rjsf .align-items-center button.btn{font-size:14pt}.rjsf .input-group-append button.dropdown-toggle{font-size:12pt}.rjsf .b64-thumb{display:block;max-width:250px;max-height:250px;min-width:50px;min-height:50px}.formWrapper{position:relative}.formWrapper>.spinner{position:absolute;inset:-1.5em -1.25em -2.5em;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.interactive>.spinner{position:absolute;inset:-.5em -1.25em 0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.modal{background-color:#0000004d}.modal-dialog>.spinner{position:absolute;inset:0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.informative{filter:grayscale(.8)}.interactive{position:relative}.bs-wizard{margin-top:40px}.progress-steps .row.bs-wizard{border-bottom:0}.bs-wizard{border-bottom:solid 1px #e0e0e0;padding:0 0 10px}.bs-wizard>.bs-wizard-step{padding:0;position:relative}.bs-wizard>.bs-wizard-step .bs-wizard-stepnum{color:#595959;font-size:16px;margin-bottom:5px}.bs-wizard>.bs-wizard-step .bs-wizard-info{color:#999;font-size:14px}.bs-wizard>.bs-wizard-step>.bs-wizard-dot{position:absolute;width:30px;height:30px;display:block;background:#fbe8aa;top:45px;left:50%;margin-top:-15px;margin-left:-15px;border-radius:50%}.bs-wizard>.bs-wizard-step>.bs-wizard-dot:after{content:" ";width:14px;height:14px;background:#fbbd19;border-radius:50px;position:absolute;top:8px;left:8px}.bs-wizard>.bs-wizard-step>.progress{position:relative;border-radius:0;height:8px;box-shadow:none;margin:20px 0}.bs-wizard>.bs-wizard-step>.progress>.progress-bar{width:0px;box-shadow:none;background:#fbe8aa}.bs-wizard>.bs-wizard-step.complete>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.active>.progress>.progress-bar{width:50%}.bs-wizard>.bs-wizard-step:first-child.active>.progress>.progress-bar{width:0%}.bs-wizard>.bs-wizard-step:last-child.active>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot{background-color:#f5f5f5}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot:after{opacity:0}.bs-wizard>.bs-wizard-step:first-child>.progress{left:50%;width:50%}.bs-wizard>.bs-wizard-step:last-child>.progress{width:50%}.bs-wizard>.bs-wizard-step.disabled a.bs-wizard-dot{pointer-events:none}.bs-wizard>.bs-wizard-step .bs-wizard-info li{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:250px;text-align:left}.diffstats{font-weight:600}.diffstats .text-green{color:#55a532}.diffstats .text-red{color:#bd2c00;padding-left:4px;padding-right:4px}.signoff-comment{display:block;overflow:auto;max-height:4em;white-space:pre-line}.rollback-changes{position:absolute;top:152px;right:30px}.breadcrumbs{padding-top:.5em;font-size:1.2em;text-transform:lowercase}/*!
1
+ html,body{background:#fafbfc}h1{font-family:Ubuntu,Calibri,Arial,sans-serif;font-size:2.2em}.icon{vertical-align:-.125em;margin-bottom:-.0625em}.iconLarge{width:50px;height:50px;color:#000;display:block}.main{padding-top:2.8em}.sidebar{padding-top:1em}.sidebar .card{margin-bottom:20px}.btn.toggle-sidebar{padding-left:0;padding-top:0;padding-right:.2rem;vertical-align:unset;font-size:1.4em}.btn.toggle-sidebar:focus{box-shadow:none}nav.breadcrumbs{display:inline-block}.card.panel-info .card-header{background-color:#cce5ff;border-color:#b8daff}.card-header span{margin-right:1em;max-width:26em;display:inline-block;height:1.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card-header span label{font-weight:700}.card>.card-body{position:relative}.sidebar-filters>.card-body{padding:15px 15px 0}.sidebar-filters a.clear{color:#777}.list-group-item .glyphicon.glyphicon-lock{color:#888}.content .list-actions{margin-bottom:.4em}.content .list-actions a{margin-right:.5em}.content .list-actions a>.glyphicon{margin-right:.3em}.content .edit-coll-props .btn{margin-right:0;margin-left:.3em}.kinto-admin-title{margin:0;font-size:2em;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;background:transparent url(/v1/admin/assets/logo-VBRiKSPX.png) no-repeat left center;background-size:contain;padding-left:3.5em;min-width:0}.user-info{display:flex;align-items:center;gap:.5em;flex:0 1 auto;overflow:hidden;min-width:0;font-size:14px}.user-info>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.user-info a{flex-shrink:0}.server-url input:invalid,.server-url input:focus:invalid{box-shadow:0 0 5px 1px red}.info-actions{display:flex;align-items:center;gap:.5em;flex-shrink:0}.top-info-bar{position:fixed;top:0;left:0;right:0;background:#24292e;color:#fff;padding:.2em 1.15em;z-index:999;display:flex;align-items:center;gap:1em;white-space:nowrap;overflow:hidden}.server-info-panel table{margin:0}.server-info-panel .table-condensed>tbody>tr>th,.server-info-panel .table-condensed>tbody>tr>td{padding:.3em;overflow:hidden;text-overflow:ellipsis;max-width:300px}.server-info-panel tr:first-child th,.server-info-panel tr:first-child td{border:none}.alert h4 small{margin-left:.5em}.list-page .alert{margin-top:1.5em;margin-right:.5em}.tabs-container .panel-default{border-top:none}.tabs-container .panel-danger{margin-top:2em}.table-wrapper{overflow-x:auto;width:100%}table.record-list{margin-top:1em;border-collapse:collapse;table-layout:auto;width:max-content;min-width:100%}table.record-list th{background:#00000014;position:sticky;top:0;z-index:2;white-space:nowrap;padding:.8em .5em}table.record-list tbody.loading td{background:#dcdcdc26;color:#777}table.record-list th,table.record-list td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:.8em .5em;max-width:300px}table.record-list td.lastmod{width:120px;max-width:120px}table.record-list td.actions{min-width:110px;width:110px;padding:.5em 0;text-align:center;overflow:visible}table.record-list td.actions .btn-group{margin:0 .5em}table.record-list>tbody+tbody{border-top:none}.load-more>a{display:block;width:100%}table.record-list td.load-more{padding:0;line-height:2.5em}.load-more>a:hover,.load-more>a:active{background:#d9edf7;text-decoration:none}.card-body>.spinner{position:absolute;inset:0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.load-more .spinner{margin-top:.25em}.history-row-details{display:table-row}.table>tbody>tr.history-row-details>td{padding:0;margin:0}.history-row-details td pre{border:none;margin:0}.history-row-details .alert{margin:0;border-radius:0}.sort-link{margin-top:.1em;margin-left:.5em;color:#444}.sort-link.active{color:#fff}.json-record>div{padding:1px 0 1px 4px}.json-record>div.added{background:#cbeecb;color:green}.json-record>div.removed{background:#f0c9c9;color:red}.json-record-simple-review{white-space:pre-wrap}.card-header>.icon,.list-group-item .icon,.nav-tabs li .icon{margin-right:.5em}.nav-tabs.nav-justified>li>a{color:#333}.collections-menu-entry{display:flex}.collections-menu-entry a:first-child{display:inline-block;width:95%;color:#555;text-decoration:none}.collections-menu-entry.active>a{color:#fff}.home-menu i,.home-menu .icon{float:right;margin:.15em -.5em 0 0}.bucket-menu-entry-edit{float:right;color:#555;text-decoration:none}.bucket-menu-entry-edit:hover{color:inherit}.collections-menu-entry-edit{position:absolute;margin-right:-.5em;color:#888}.collections-menu-entry-edit:hover{color:inherit}.CodeMirror{border:1px solid #ccc;height:auto;border-radius:.3em}.attachment-icon{width:16px}.attachment-action{margin:0;padding:0}.attachment-info .attachment-attributes{display:flex;align-content:stretch;align-items:end}.attachment-info table{margin-bottom:0;flex-grow:1;display:block}.attachment-info .table-condensed>tbody>tr>td{overflow:hidden;text-overflow:ellipsis}.attachment-img{display:flex;align-items:center;justify-content:center;max-width:150px;max-height:150px;text-align:center;background:#fff;border:1px solid #ddd;margin:10px}.attachment-img img{max-width:100%;max-height:100%}form button[type=submit].btn-primary{font-size:1.2em;padding:12px;box-shadow:inset 0 0 0 1px #fff}.record-form-buttons .delete{margin-top:12px}.permissions-form .array-item:not(:last-child) fieldset{border-bottom:1px solid #eee}.permissions-form .field-principal{float:left;width:60%;padding-right:1em}.permissions-form .field-permissions{float:left;width:30%;padding-left:1em}.permissions-form .field-anonymous,.permissions-form .field-authenticated{width:100%;float:left;clear:both}.permissions-form .field-anonymous{border-bottom:1px solid #eee}.permissions-form .field-anonymous p,.permissions-form .field-authenticated p{width:50%}.permissions-form .field-anonymous .checkboxes,.permissions-form .field-authenticated .checkboxes{float:right;width:50%;padding-left:1em;margin-top:-60px}.permissions-form .form-group.field-groups .container-fluid{min-height:150px;height:50vh;max-height:max-content;overflow-y:scroll;overflow-x:hidden}.permissions-form .field-groups fieldset{clear:left}.permissions-form .field-groups .checkboxes{float:right;width:50%;padding-left:1em;margin-top:-60px}.permissions-form .field-groups fieldset>.field.field-array{clear:right}.permissions-form .field-principals .checkboxes{margin-top:-35px}.permissions-form .field-principal>label{display:none}.quickFilter{margin-bottom:-.5em}.spinner{margin:30px auto 0;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:#337ab7;border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.notifications>div{top:3em}i.fa{position:relative;top:1px;display:inline-block;font-style:normal;font-weight:400;line-height:1}i.fa:before{display:inline-block;content:"";background-repeat:no-repeat;background-size:24px 24px;width:24px;height:24px}.fa.fa-check:before{background-image:url(~bootstrap-icons/icons/check.svg)}.fa-exclamation-circle:before{background-image:url(~bootstrap-icons/icons/exclamation-circle-fill.svg)}.fa-info:before{background-image:url(~bootstrap-icons/icons/info-circle-fill.svg)}.fa-warning:before{background-image:url(~bootstrap-icons/icons/exclamation-triangle-fill.svg)}.rjsf{margin-bottom:1.25rem}.rjsf pre{padding:9.5px;margin:0 0 10px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.rjsf input[type=radio],.rjsf input[type=checkbox]{margin-right:10px}.rjsf .form-label{font-weight:700}.rjsf h5{font-size:18pt;margin:0 0 0 1pt}.rjsf hr{margin:1px 0 .5em;background-color:#ccc!important}.rjsf .row .align-items-center{align-items:flex-start!important;border-bottom:1px solid #eee}.rjsf .align-items-center button.btn{font-size:14pt}.rjsf .input-group-append button.dropdown-toggle{font-size:12pt}.rjsf .b64-thumb{display:block;max-width:250px;max-height:250px;min-width:50px;min-height:50px}.formWrapper{position:relative}.formWrapper>.spinner{position:absolute;inset:-1.5em -1.25em -2.5em;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.interactive>.spinner{position:absolute;inset:-.5em -1.25em 0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.modal{background-color:#0000004d}.modal-dialog>.spinner{position:absolute;inset:0;background-color:#0003;z-index:1;display:flex;justify-content:center;align-items:center;width:auto;margin:0;border-radius:3px}.informative{filter:grayscale(.8)}.interactive{position:relative}.bs-wizard{margin-top:40px}.progress-steps .row.bs-wizard{border-bottom:0}.bs-wizard{border-bottom:solid 1px #e0e0e0;padding:0 0 10px}.bs-wizard>.bs-wizard-step{padding:0;position:relative}.bs-wizard>.bs-wizard-step .bs-wizard-stepnum{color:#595959;font-size:16px;margin-bottom:5px}.bs-wizard>.bs-wizard-step .bs-wizard-info{color:#999;font-size:14px}.bs-wizard>.bs-wizard-step>.bs-wizard-dot{position:absolute;width:30px;height:30px;display:block;background:#fbe8aa;top:45px;left:50%;margin-top:-15px;margin-left:-15px;border-radius:50%}.bs-wizard>.bs-wizard-step>.bs-wizard-dot:after{content:" ";width:14px;height:14px;background:#fbbd19;border-radius:50px;position:absolute;top:8px;left:8px}.bs-wizard>.bs-wizard-step>.progress{position:relative;border-radius:0;height:8px;box-shadow:none;margin:20px 0}.bs-wizard>.bs-wizard-step>.progress>.progress-bar{width:0px;box-shadow:none;background:#fbe8aa}.bs-wizard>.bs-wizard-step.complete>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.active>.progress>.progress-bar{width:50%}.bs-wizard>.bs-wizard-step:first-child.active>.progress>.progress-bar{width:0%}.bs-wizard>.bs-wizard-step:last-child.active>.progress>.progress-bar{width:100%}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot{background-color:#f5f5f5}.bs-wizard>.bs-wizard-step.disabled>.bs-wizard-dot:after{opacity:0}.bs-wizard>.bs-wizard-step:first-child>.progress{left:50%;width:50%}.bs-wizard>.bs-wizard-step:last-child>.progress{width:50%}.bs-wizard>.bs-wizard-step.disabled a.bs-wizard-dot{pointer-events:none}.bs-wizard>.bs-wizard-step .bs-wizard-info li{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:250px;text-align:left}.diffstats{font-weight:600}.diffstats .text-green{color:#55a532}.diffstats .text-red{color:#bd2c00;padding-left:4px;padding-right:4px}.signoff-comment{display:block;overflow:auto;max-height:4em;white-space:pre-line}.rollback-changes{position:absolute;top:152px;right:30px}.breadcrumbs{padding-top:.5em;font-size:1.2em;text-transform:lowercase}/*!
2
2
  * Bootstrap v4.6.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2022 The Bootstrap Authors
4
4
  * Copyright 2011-2022 Twitter, Inc.