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.
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.pre-commit-config.yaml +2 -2
- {girder-5.0.19.dev26/girder.egg-info → girder-5.0.19.dev42}/PKG-INFO +1 -1
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/__init__.py +6 -7
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/notification.py +1 -1
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/playwright.config.ts +10 -7
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/server.ts +63 -26
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/admin.spec.ts +9 -11
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/collection.spec.ts +88 -86
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/customWidgets.spec.ts +27 -27
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data.spec.ts +55 -56
- girder-5.0.19.dev42/girder/web/tests/spec/emptyLayout.spec.ts +153 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_container_view.spec.ts +3 -3
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_item_selector.spec.ts +1 -1
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/util.ts +34 -11
- {girder-5.0.19.dev26 → girder-5.0.19.dev42/girder.egg-info}/PKG-INFO +1 -1
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/SOURCES.txt +1 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/scm_file_list.json +1 -0
- girder-5.0.19.dev42/girder.egg-info/scm_version.json +8 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/plugin_registry.py +26 -26
- girder-5.0.19.dev26/girder.egg-info/scm_version.json +0 -8
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/Dockerfile +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/build_plugins.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/config.yml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/generatePyEnvChecksum.sh +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/publish_npm.sh +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/publish_pypi.sh +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.circleci/rabbitmq.conf +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.codecov.yml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.dockerignore +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.editorconfig +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.git-blame-ignore-revs +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.github/workflows/codespell.yml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.gitignore +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/.readthedocs.yml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CHANGELOG.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CMakeLists.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/CONTRIBUTING.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/Dockerfile +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/LICENSE +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/MANIFEST.in +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/README.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/README.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/_jsonemitter.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/girder_client/cli.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/pyproject.toml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/clients/python/setup.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docker-compose.yml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/admin-docs.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/api-docs.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/build-docs.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/conf.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/configuration.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/dependencies.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/deployment.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/dev-installation.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/developer-cookbook.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/developer-docs.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/development.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/favicon.ico +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/images/dicom-viewer.png +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/index.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/license.png +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/list_env_settings.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/list_env_settings.yaml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/migration-guide.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/mount.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/plugin-development.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/plugins.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/python-client.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/requirements-docs.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/security.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/sftp.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/static/custom.css +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/user-docs.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/docs/user-guide.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/access.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/api_docs.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/api_main.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/describe.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/docs.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/filter_logging.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/rest.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/sftp.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/api_key.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/assetstore.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/collection.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/file.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/folder.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/group.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/item.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/resource.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/system.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/token.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/api/v1/user.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/asgi.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/mount.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/serve.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/sftpd.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/cli/shell.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/constants.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/events.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/exceptions.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/_footer.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/_header.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/accountApproval.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/accountApproved.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/emailVerification.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/groupInvite.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/mail_templates/temporaryAccess.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/api_key.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/assetstore.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/collection.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/file.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/folder.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/group.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/item.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/model_base.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/setting.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/token.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/upload.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/models/user.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/plugin.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/settings.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/tasks.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/_cache.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/_hash_state.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/abstract_assetstore_adapter.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/acl_mixin.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/assetstore_utilities.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/config.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/error.mako +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/filesystem_assetstore_adapter.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/mail_utils.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/model_importer.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/path.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/progress.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/s3_assetstore_adapter.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/search.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/server.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/setting_utilities.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/system.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/webroot.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/utility/ziputil.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.env.development +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.gitignore +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/.prettierrc.json +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/README.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/Girder_Favicon.png +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/Girder_Mark.png +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-BGLM866c.svg +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-CMxI46LA.eot +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-Ddaw8Z2O.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-KuItqCW9.ttf +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/fontello-_lT35XxX.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-BKjkU69z.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-BUJKDMgK.eot +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-CSehLiBc.svg +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-DrwTMapi.ttf +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/glyphicons-halflings-regular-DzqM6ju8.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-BW_NAGe6.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-BW_NAGe6.js.map +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/index-DFhDyJFH.css +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/jsoneditor-icons-CIlYC0TY.svg +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300-B6tDWRxp.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300-DZbNTRe6.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300italic-DLsXqxhU.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-300italic-Dfz31Up5.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400-D5zbb_EN.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400-DLgeRt71.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400italic-DpGQ6Ktj.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-400italic-UJbezL8h.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600-CCvT4JHQ.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600-DHWfDY-G.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600italic-X8kCjSq_.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-600italic-slqXzGub.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700-CsbQbrjx.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700-DNl7WOH5.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700italic-BtE7VvhE.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-700italic-hc2P_kZo.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800-CbJOM4_m.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800-XaYTAPrv.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800italic-DqvYew-K.woff +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/assets/open-sans-latin-800italic-JIGkTxpX.woff2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/index.html +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/auth.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/constants.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/dialog.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/events.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/index.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/main.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/misc.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/pluginUtils.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/rest.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/router.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/routes.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/version.js +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/dist/src/src/vite-env.d.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/env.d.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/coverage.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/playwright-setup.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/playwright-teardown.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/browser.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/collectionBaseClass.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/README.md +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/nomime.dat +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/slicer_cli_web_multiple_test.xml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/slicer_cli_web_test.xml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/ten_byte_file.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/testFile.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/data/testFile2 +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/file_upload.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_authorized_upload.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_hashsum_download.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_homepage.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_item_licenses.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_readme.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_config_view.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_panel_group.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_parser.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_task.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_widget_model.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_slicer_cli_web_widget_view.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_terms.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_thumbnails.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/plugin_user_quota.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/web/tests/spec/setting_show_download.spec.ts +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/worker_plugin.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder/wsgi.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/dependency_links.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/entry_points.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/not-zip-safe +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/requires.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/girder.egg-info/top_level.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/jsdoc.json +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/package-lock.json +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/package.json +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pyproject.toml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/LICENSE +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/MANIFEST.in +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pyproject.toml +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/__init__.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/assertions.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/fixtures.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/plugin.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/utils.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/pytest_girder/web_client.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/pytest_girder/setup.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/requirements-dev.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/README.rst +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/migrate.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/requirements.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/walk_girder.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/midas/walk_midas.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/publicNames.py +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/publicNames.txt +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/scripts/test_names.sh +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/setup.cfg +0 -0
- {girder-5.0.19.dev26 → girder-5.0.19.dev42}/setup.py +0 -0
- {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/
|
|
73
|
-
rev: v2.
|
|
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
|
|
@@ -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))
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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'
|
|
37
|
-
await page.getByLabel('Description (optional)').fill('public group'
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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);
|