girder 5.0.19.dev26__tar.gz → 5.0.19.dev42__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 (266) hide show
  1. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.pre-commit-config.yaml +2 -2
  2. {girder-5.0.19.dev26/girder.egg-info → girder-5.0.19.dev42}/PKG-INFO +1 -1
  3. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/__init__.py +6 -7
  4. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/notification.py +1 -1
  5. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/playwright.config.ts +10 -7
  6. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/server.ts +63 -26
  7. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/admin.spec.ts +9 -11
  8. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/collection.spec.ts +88 -86
  9. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/customWidgets.spec.ts +27 -27
  10. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data.spec.ts +55 -56
  11. girder-5.0.19.dev42/girder/web/tests/spec/emptyLayout.spec.ts +153 -0
  12. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_container_view.spec.ts +3 -3
  13. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_item_selector.spec.ts +1 -1
  14. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/util.ts +34 -11
  15. {girder-5.0.19.dev26 → girder-5.0.19.dev42/girder.egg-info}/PKG-INFO +1 -1
  16. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/SOURCES.txt +1 -0
  17. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/scm_file_list.json +1 -0
  18. girder-5.0.19.dev42/girder.egg-info/scm_version.json +8 -0
  19. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/plugin_registry.py +26 -26
  20. girder-5.0.19.dev26/girder.egg-info/scm_version.json +0 -8
  21. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/Dockerfile +0 -0
  22. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/build_plugins.py +0 -0
  23. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/config.yml +0 -0
  24. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/generatePyEnvChecksum.sh +0 -0
  25. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/publish_npm.sh +0 -0
  26. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/publish_pypi.sh +0 -0
  27. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/rabbitmq.conf +0 -0
  28. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.codecov.yml +0 -0
  29. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.dockerignore +0 -0
  30. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.editorconfig +0 -0
  31. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.git-blame-ignore-revs +0 -0
  32. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.github/workflows/codespell.yml +0 -0
  33. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.gitignore +0 -0
  34. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.readthedocs.yml +0 -0
  35. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CHANGELOG.rst +0 -0
  36. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CMakeLists.txt +0 -0
  37. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CONTRIBUTING.rst +0 -0
  38. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/Dockerfile +0 -0
  39. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/LICENSE +0 -0
  40. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/MANIFEST.in +0 -0
  41. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/README.rst +0 -0
  42. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/README.rst +0 -0
  43. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/__init__.py +0 -0
  44. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/_jsonemitter.py +0 -0
  45. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/cli.py +0 -0
  46. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/pyproject.toml +0 -0
  47. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/setup.py +0 -0
  48. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docker-compose.yml +0 -0
  49. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/admin-docs.rst +0 -0
  50. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/api-docs.rst +0 -0
  51. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/build-docs.rst +0 -0
  52. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/conf.py +0 -0
  53. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/configuration.rst +0 -0
  54. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/dependencies.rst +0 -0
  55. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/deployment.rst +0 -0
  56. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/dev-installation.rst +0 -0
  57. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/developer-cookbook.rst +0 -0
  58. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/developer-docs.rst +0 -0
  59. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/development.rst +0 -0
  60. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/favicon.ico +0 -0
  61. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/images/dicom-viewer.png +0 -0
  62. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/index.rst +0 -0
  63. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/license.png +0 -0
  64. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/list_env_settings.py +0 -0
  65. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/list_env_settings.yaml +0 -0
  66. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/migration-guide.rst +0 -0
  67. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/mount.rst +0 -0
  68. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/plugin-development.rst +0 -0
  69. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/plugins.rst +0 -0
  70. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/python-client.rst +0 -0
  71. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/requirements-docs.txt +0 -0
  72. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/security.rst +0 -0
  73. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/sftp.rst +0 -0
  74. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/static/custom.css +0 -0
  75. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/user-docs.rst +0 -0
  76. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/user-guide.rst +0 -0
  77. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/__init__.py +0 -0
  78. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/__init__.py +0 -0
  79. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/access.py +0 -0
  80. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/api_docs.mako +0 -0
  81. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/api_main.py +0 -0
  82. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/describe.py +0 -0
  83. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/docs.py +0 -0
  84. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/filter_logging.py +0 -0
  85. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/rest.py +0 -0
  86. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/sftp.py +0 -0
  87. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/__init__.py +0 -0
  88. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/api_key.py +0 -0
  89. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/assetstore.py +0 -0
  90. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/collection.py +0 -0
  91. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/file.py +0 -0
  92. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/folder.py +0 -0
  93. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/group.py +0 -0
  94. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/item.py +0 -0
  95. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/resource.py +0 -0
  96. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/system.py +0 -0
  97. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/token.py +0 -0
  98. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/user.py +0 -0
  99. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/asgi.py +0 -0
  100. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/__init__.py +0 -0
  101. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/mount.py +0 -0
  102. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/serve.py +0 -0
  103. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/sftpd.py +0 -0
  104. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/shell.py +0 -0
  105. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/constants.py +0 -0
  106. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/events.py +0 -0
  107. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/exceptions.py +0 -0
  108. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/_footer.mako +0 -0
  109. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/_header.mako +0 -0
  110. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/accountApproval.mako +0 -0
  111. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/accountApproved.mako +0 -0
  112. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/emailVerification.mako +0 -0
  113. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/groupInvite.mako +0 -0
  114. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/temporaryAccess.mako +0 -0
  115. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/api_key.py +0 -0
  116. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/assetstore.py +0 -0
  117. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/collection.py +0 -0
  118. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/file.py +0 -0
  119. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/folder.py +0 -0
  120. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/group.py +0 -0
  121. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/item.py +0 -0
  122. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/model_base.py +0 -0
  123. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/setting.py +0 -0
  124. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/token.py +0 -0
  125. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/upload.py +0 -0
  126. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/user.py +0 -0
  127. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/plugin.py +0 -0
  128. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/settings.py +0 -0
  129. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/tasks.py +0 -0
  130. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/__init__.py +0 -0
  131. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/_cache.py +0 -0
  132. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/_hash_state.py +0 -0
  133. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/abstract_assetstore_adapter.py +0 -0
  134. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/acl_mixin.py +0 -0
  135. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/assetstore_utilities.py +0 -0
  136. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/config.py +0 -0
  137. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/error.mako +0 -0
  138. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/filesystem_assetstore_adapter.py +0 -0
  139. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/mail_utils.py +0 -0
  140. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/model_importer.py +0 -0
  141. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/path.py +0 -0
  142. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/progress.py +0 -0
  143. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/s3_assetstore_adapter.py +0 -0
  144. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/search.py +0 -0
  145. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/server.py +0 -0
  146. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/setting_utilities.py +0 -0
  147. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/system.py +0 -0
  148. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/webroot.py +0 -0
  149. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/ziputil.py +0 -0
  150. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.env.development +0 -0
  151. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.gitignore +0 -0
  152. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.prettierrc.json +0 -0
  153. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/README.rst +0 -0
  154. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/Girder_Favicon.png +0 -0
  155. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/Girder_Mark.png +0 -0
  156. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-BGLM866c.svg +0 -0
  157. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-CMxI46LA.eot +0 -0
  158. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-Ddaw8Z2O.woff2 +0 -0
  159. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-KuItqCW9.ttf +0 -0
  160. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-_lT35XxX.woff +0 -0
  161. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-BKjkU69z.woff +0 -0
  162. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-BUJKDMgK.eot +0 -0
  163. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-CSehLiBc.svg +0 -0
  164. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-DrwTMapi.ttf +0 -0
  165. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-DzqM6ju8.woff2 +0 -0
  166. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-BW_NAGe6.js +0 -0
  167. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-BW_NAGe6.js.map +0 -0
  168. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-DFhDyJFH.css +0 -0
  169. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/jsoneditor-icons-CIlYC0TY.svg +0 -0
  170. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300-B6tDWRxp.woff2 +0 -0
  171. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300-DZbNTRe6.woff +0 -0
  172. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300italic-DLsXqxhU.woff2 +0 -0
  173. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300italic-Dfz31Up5.woff +0 -0
  174. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400-D5zbb_EN.woff +0 -0
  175. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400-DLgeRt71.woff2 +0 -0
  176. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400italic-DpGQ6Ktj.woff2 +0 -0
  177. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400italic-UJbezL8h.woff +0 -0
  178. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600-CCvT4JHQ.woff2 +0 -0
  179. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600-DHWfDY-G.woff +0 -0
  180. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600italic-X8kCjSq_.woff +0 -0
  181. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600italic-slqXzGub.woff2 +0 -0
  182. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700-CsbQbrjx.woff2 +0 -0
  183. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700-DNl7WOH5.woff +0 -0
  184. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700italic-BtE7VvhE.woff2 +0 -0
  185. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700italic-hc2P_kZo.woff +0 -0
  186. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800-CbJOM4_m.woff2 +0 -0
  187. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800-XaYTAPrv.woff +0 -0
  188. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800italic-DqvYew-K.woff +0 -0
  189. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800italic-JIGkTxpX.woff2 +0 -0
  190. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/index.html +0 -0
  191. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/auth.js +0 -0
  192. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/constants.js +0 -0
  193. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/dialog.js +0 -0
  194. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/events.js +0 -0
  195. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/index.ts +0 -0
  196. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/main.ts +0 -0
  197. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/misc.js +0 -0
  198. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/pluginUtils.js +0 -0
  199. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/rest.js +0 -0
  200. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/router.js +0 -0
  201. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/routes.js +0 -0
  202. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/version.js +0 -0
  203. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/vite-env.d.ts +0 -0
  204. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/env.d.ts +0 -0
  205. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/coverage.ts +0 -0
  206. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/playwright-setup.ts +0 -0
  207. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/playwright-teardown.ts +0 -0
  208. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/browser.spec.ts +0 -0
  209. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/collectionBaseClass.spec.ts +0 -0
  210. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/README.md +0 -0
  211. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/nomime.dat +0 -0
  212. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/slicer_cli_web_multiple_test.xml +0 -0
  213. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/slicer_cli_web_test.xml +0 -0
  214. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/ten_byte_file.txt +0 -0
  215. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/testFile.txt +0 -0
  216. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/testFile2 +0 -0
  217. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/file_upload.spec.ts +0 -0
  218. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_authorized_upload.spec.ts +0 -0
  219. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_hashsum_download.spec.ts +0 -0
  220. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_homepage.spec.ts +0 -0
  221. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_item_licenses.spec.ts +0 -0
  222. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_readme.spec.ts +0 -0
  223. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web.spec.ts +0 -0
  224. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_config_view.spec.ts +0 -0
  225. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_panel_group.spec.ts +0 -0
  226. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_parser.spec.ts +0 -0
  227. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_task.spec.ts +0 -0
  228. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_widget_model.spec.ts +0 -0
  229. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_widget_view.spec.ts +0 -0
  230. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_terms.spec.ts +0 -0
  231. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_thumbnails.spec.ts +0 -0
  232. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_user_quota.spec.ts +0 -0
  233. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/setting_show_download.spec.ts +0 -0
  234. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/worker_plugin.py +0 -0
  235. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/wsgi.py +0 -0
  236. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/dependency_links.txt +0 -0
  237. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/entry_points.txt +0 -0
  238. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/not-zip-safe +0 -0
  239. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/requires.txt +0 -0
  240. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/top_level.txt +0 -0
  241. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/jsdoc.json +0 -0
  242. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/package-lock.json +0 -0
  243. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/package.json +0 -0
  244. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pyproject.toml +0 -0
  245. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/LICENSE +0 -0
  246. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/MANIFEST.in +0 -0
  247. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pyproject.toml +0 -0
  248. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/__init__.py +0 -0
  249. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/assertions.py +0 -0
  250. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/fixtures.py +0 -0
  251. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/plugin.py +0 -0
  252. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/utils.py +0 -0
  253. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/web_client.py +0 -0
  254. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/setup.py +0 -0
  255. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/requirements-dev.txt +0 -0
  256. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/README.rst +0 -0
  257. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/migrate.py +0 -0
  258. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/requirements.txt +0 -0
  259. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/walk_girder.py +0 -0
  260. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/walk_midas.py +0 -0
  261. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/publicNames.py +0 -0
  262. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/publicNames.txt +0 -0
  263. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/test_names.sh +0 -0
  264. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/setup.cfg +0 -0
  265. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/setup.py +0 -0
  266. {girder-5.0.19.dev26 → girder-5.0.19.dev42}/tox.ini +0 -0
@@ -69,8 +69,8 @@ repos:
69
69
  args:
70
70
  - --py310-plus
71
71
  - --keep-percent-format
72
- - repo: https://github.com/pre-commit/mirrors-autopep8
73
- rev: v2.0.4
72
+ - repo: https://github.com/hhatto/autopep8
73
+ rev: v2.3.2
74
74
  hooks:
75
75
  - id: autopep8
76
76
  - repo: https://github.com/PyCQA/flake8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder
3
- Version: 5.0.19.dev26
3
+ Version: 5.0.19.dev42
4
4
  Summary: Web-based data management platform
5
5
  Home-page: https://girder.readthedocs.org
6
6
  Author: Kitware, Inc.
@@ -10,15 +10,14 @@ _dbClients = {}
10
10
  logger = logging.getLogger(__name__)
11
11
 
12
12
 
13
+ # pymongo 4 removed ``Cursor.count``. Girder intentionally keeps a ``count`` method on
14
+ # cursors, because endpoints return cursors and report a total count (for example via the
15
+ # ``Girder-Total-Count`` header) alongside the requested records. Rather than thread an
16
+ # out-of-band count through every such call site, the shim reimplements the pymongo 3
17
+ # behavior using ``count_documents``, which is the non-deprecated API. Because this is the
18
+ # sanctioned way to count a cursor here, it must not emit a deprecation warning.
13
19
  if not hasattr(pymongo.cursor.Cursor, 'count'):
14
- import warnings
15
-
16
20
  def _cursorCount(self, with_limit_and_skip=False):
17
- warnings.warn(
18
- 'count is deprecated. Use Collection.count_documents instead.',
19
- DeprecationWarning,
20
- stacklevel=2,
21
- )
22
21
  params = {}
23
22
  if with_limit_and_skip and getattr(self, '_limit', getattr(self, '_Cursor__limit', None)):
24
23
  params['limit'] = getattr(self, '_limit', getattr(self, '_Cursor__limit', None))
@@ -81,7 +81,7 @@ class UserNotificationsSocket(WebSocketEndpoint):
81
81
  pass
82
82
  finally:
83
83
  await self.pubsub.unsubscribe()
84
- await self.pubsub.close()
84
+ await self.pubsub.aclose()
85
85
 
86
86
  async def on_disconnect(self, websocket, close_code):
87
87
  if hasattr(self, 'listen_task'):
@@ -7,6 +7,16 @@ import { defineConfig, devices } from '@playwright/test';
7
7
  */
8
8
  export default defineConfig({
9
9
  testDir: './tests',
10
+ /* Test (and hook) timeout. This is intentionally larger than the expect
11
+ * timeout so that a slow assertion failure or a slow server startup under
12
+ * load does not consume the entire budget. */
13
+ timeout: 60000,
14
+ /* Default timeout for expect() assertions and web-first assertions. Tests
15
+ * should rely on this value rather than passing explicit timeouts, so that
16
+ * slower machines and CI runners do not cause flaky failures. */
17
+ expect: {
18
+ timeout: 20000,
19
+ },
10
20
  /* Run tests in files in parallel */
11
21
  fullyParallel: false,
12
22
  /* Fail the build on CI if test.only is in the source code. */
@@ -57,11 +67,4 @@ export default defineConfig({
57
67
  use: { ...devices['Desktop Firefox'] },
58
68
  },
59
69
  ],
60
- webServer: {
61
- command: 'npx vite dev --port 5173',
62
- port: 5173,
63
- reuseExistingServer: false,
64
- // Disable Vite HMR when running tests so it doesn't consume inotify resources
65
- env: { PLAYWRIGHT_TESTING: 'true' },
66
- },
67
70
  });
@@ -1,4 +1,5 @@
1
1
  import { spawn, ChildProcessWithoutNullStreams } from 'child_process';
2
+ import { randomBytes } from 'crypto';
2
3
 
3
4
  import getPort from 'get-port';
4
5
 
@@ -9,13 +10,64 @@ import { outputCoverageReport, startCoverage } from './coverage';
9
10
  const mongoUri = process.env.GIRDER_CLIENT_TESTING_MONGO_URI ?? 'mongodb://localhost:27017';
10
11
  const girderExecutable = process.env.GIRDER_CLIENT_TESTING_GIRDER_EXECUTABLE ?? 'girder';
11
12
 
13
+ /**
14
+ * Build a database name that is unique to this test server instance.
15
+ *
16
+ * This deliberately does not derive the database name from the port alone.
17
+ * Ports are recycled by the OS, so an interrupted prior run could leave a
18
+ * database behind that a later run would then reuse, leaking state (for
19
+ * example, a user registered by a previous run would cause "login already
20
+ * exists" failures). Combining the pid, a timestamp, and random bytes makes
21
+ * collisions effectively impossible.
22
+ */
23
+ const createDatabaseName = () =>
24
+ `girder-${process.pid}-${Date.now()}-${randomBytes(4).toString('hex')}`;
25
+
26
+ /**
27
+ * Drop a database, waiting for mongosh to finish. Failures are reported but
28
+ * never thrown, so that a cleanup problem cannot mask the actual test result.
29
+ */
30
+ const dropDatabase = async (database: string) => {
31
+ const mongoshProcess = spawn('mongosh', [`${mongoUri}/${database}`, '--eval', 'db.dropDatabase();']);
12
32
 
13
- const startServer = async (port: number) => {
33
+ await new Promise<void>((resolve) => {
34
+ mongoshProcess?.on('close', (code) => {
35
+ if (code !== 0) {
36
+ console.error(`mongo database ${database} cleanup failed with code`, code);
37
+ }
38
+ resolve();
39
+ });
40
+
41
+ mongoshProcess?.on('error', (err) => {
42
+ console.error(`mongosh process error -- database ${database} not cleaned up`, err);
43
+ resolve();
44
+ });
45
+ });
46
+ };
47
+
48
+ /**
49
+ * Wait for a server process to exit, but do not wait forever if it hangs.
50
+ */
51
+ const killServer = async (serverProcess?: ChildProcessWithoutNullStreams) => {
52
+ if (!serverProcess) {
53
+ return;
54
+ }
55
+
56
+ await new Promise<void>((resolve) => {
57
+ const timeout = setTimeout(resolve, 5000);
58
+ serverProcess.once('close', () => {
59
+ clearTimeout(timeout);
60
+ resolve();
61
+ });
62
+ serverProcess.kill();
63
+ });
64
+ };
65
+
66
+ const startServer = async (port: number, database: string) => {
14
67
  const serverLogs: string[] = [];
15
- const database = `${mongoUri}/girder-${port}`;
16
68
  const serverProcess = spawn(girderExecutable, [
17
69
  'serve',
18
- '--database', database,
70
+ '--database', `${mongoUri}/${database}`,
19
71
  '--port', `${port}`,
20
72
  '--with-temp-assetstore',
21
73
  ], {
@@ -45,11 +97,13 @@ const startServer = async (port: number) => {
45
97
 
46
98
  export const setupServer = () => {
47
99
  let serverProcess: ChildProcessWithoutNullStreams;
100
+ let database: string;
48
101
  let port: number;
49
102
 
50
103
  test.beforeAll(async () => {
51
104
  port = await getPort();
52
- serverProcess = await startServer(port);
105
+ database = createDatabaseName();
106
+ serverProcess = await startServer(port, database);
53
107
  });
54
108
 
55
109
  test.afterAll(async () => {
@@ -57,32 +111,15 @@ export const setupServer = () => {
57
111
  if (serverProcess) {
58
112
  console.log('WARNING: Girder server is being kept alive after test ends. Use the following to kill it:');
59
113
  console.log(`kill ${serverProcess?.pid}`);
114
+ console.log(`Its database is: ${database}`);
60
115
  }
61
116
  return;
62
117
  }
63
118
 
64
- serverProcess?.kill();
65
-
66
- const mongoshProcess = spawn('mongosh', [`${mongoUri}/girder-${port}`, '--eval', 'db.dropDatabase();']);
67
-
68
- await new Promise<void>((resolve) => {
69
- mongoshProcess?.on('close', (code) => {
70
- if (code === 0) {
71
- if (serverProcess) {
72
- serverProcess.serverLogs.push('mongo database cleaned up');
73
- }
74
- } else {
75
- console.error('mongo database cleanup failed with code', code);
76
- }
77
-
78
- resolve();
79
- });
80
-
81
- mongoshProcess?.on('error', (err) => {
82
- console.error('mongosh process error -- database not cleaned up', err);
83
- resolve();
84
- });
85
- });
119
+ // Wait for the server to exit before dropping the database, so it cannot
120
+ // recreate collections after the drop.
121
+ await killServer(serverProcess);
122
+ await dropDatabase(database);
86
123
  });
87
124
 
88
125
  test.beforeEach(async ({ page }) => {
@@ -33,8 +33,8 @@ test.describe('Create an admin and non-admin user', () => {
33
33
  await page.getByRole('button', { name: ' Create Group' }).click();
34
34
  await waitForDialog(page);
35
35
  await page.getByText('Public — Anyone can see this group').click();
36
- await page.getByLabel('Name').fill('pubGroup', { timeout: 1000 });
37
- await page.getByLabel('Description (optional)').fill('public group', { timeout: 1000 });
36
+ await page.getByLabel('Name').fill('pubGroup');
37
+ await page.getByLabel('Description (optional)').fill('public group');
38
38
  await page.getByRole('button', { name: ' Create', exact: true }).click();
39
39
  });
40
40
  });
@@ -62,16 +62,14 @@ test.describe('Test the assetstore page', () => {
62
62
  await createUser(page, 'admin', 'admin@girder.test', 'Admin', 'Admin', 'adminpassword!');
63
63
  // Navigate to assetstores page via Admin console
64
64
  await page.getByRole('link', { name: 'Admin console' }).click();
65
- await expect(page.locator('.g-assetstore-config')).toBeVisible({ timeout: 10000 });
65
+ await expect(page.locator('.g-assetstore-config')).toBeVisible();
66
66
  await page.locator('.g-assetstore-config').click();
67
67
  // Wait for assetstores to load and render
68
- await expect(page.locator('.g-assetstore-container').first()).toBeVisible({ timeout: 10000 });
68
+ await expect(page.locator('.g-assetstore-container').first()).toBeVisible();
69
69
  const testAssetstoreName = 'Test Filesystem Assetstore';
70
70
  // Open the filesystem tab and click create
71
71
  await page.locator('[data-target="#g-create-fs-tab"]').click();
72
- await expect(page.locator('#g-create-fs-tab .g-new-assetstore-submit:visible')).toBeVisible({
73
- timeout: 10000
74
- });
72
+ await expect(page.locator('#g-create-fs-tab .g-new-assetstore-submit:visible')).toBeVisible();
75
73
  await page.locator('#g-create-fs-tab .g-new-assetstore-submit').click();
76
74
  // Wait for validation message to appear (empty required fields)
77
75
  const validationResult = page.locator('#g-create-fs-tab .g-validation-failed-message:visible');
@@ -93,7 +91,7 @@ test.describe('Test the assetstore page', () => {
93
91
  await waitForIdlePage(page);
94
92
  // Navigate away and back to verify assetstore persists
95
93
  await page.getByRole('link', { name: 'Admin console' }).click();
96
- await expect(page.locator('.g-assetstore-config')).toBeVisible({ timeout: 10000 });
94
+ await expect(page.locator('.g-assetstore-config')).toBeVisible();
97
95
  await page.locator('.g-assetstore-config').click();
98
96
  await expect(page.locator('.g-assetstore-container').first()).toBeVisible();
99
97
  // Verify the assetstore is still current (should have "is current" label)
@@ -125,10 +123,10 @@ test.describe('Test the settings page', () => {
125
123
  await createUser(page, 'admin', 'admin@girder.test', 'Admin', 'Admin', 'adminpassword!');
126
124
  // Navigate to settings page via Admin console
127
125
  await page.getByRole('link', { name: 'Admin console' }).click();
128
- await expect(page.locator('.g-server-config')).toBeVisible({ timeout: 10000 });
126
+ await expect(page.locator('.g-server-config')).toBeVisible();
129
127
  await page.locator('.g-server-config').click();
130
128
  // Wait for settings page to load - title section and form should appear
131
- await expect(page.getByText('System configuration')).toBeVisible({ timeout: 10000 });
129
+ await expect(page.getByText('System configuration')).toBeVisible();
132
130
  // Verify main sections exist on the settings page (read-only in Girder 5.x)
133
131
  await expect(page.getByText('Instance Branding')).toBeVisible();
134
132
  await expect(page.getByText('Administrative Policy')).toBeVisible();
@@ -167,7 +165,7 @@ test.describe('Test the plugins page', () => {
167
165
  await page.getByRole('link', { name: ' Admin console' }).click();
168
166
  await page.getByRole('link', { name: ' Plugins' }).click();
169
167
  // Wait for the plugin list to load - at least core plugins should be present
170
- await expect(page.locator('.g-plugin-list-container')).toBeVisible({ timeout: 10000 });
168
+ await expect(page.locator('.g-plugin-list-container')).toBeVisible();
171
169
  // Check that there is at least one plugin (core plugins should always be present)
172
170
  const pluginCount = await page.locator('.g-plugin-list-item').count();
173
171
  expect(pluginCount).toBeGreaterThanOrEqual(1);