histomicsui 1.8.1.dev6__tar.gz → 1.8.1.dev145__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 (199) hide show
  1. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/.circleci/config.yml +82 -4
  2. histomicsui-1.8.1.dev145/.circleci/get_version.py +19 -0
  3. histomicsui-1.8.1.dev145/.circleci/publish_pypi.sh +16 -0
  4. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/.git-blame-ignore-revs +4 -0
  5. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/.gitignore +1 -0
  6. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/.pre-commit-config.yaml +2 -1
  7. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/MANIFEST.in +3 -0
  8. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/PKG-INFO +13 -6
  9. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/README.rst +6 -0
  10. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/__init__.py +49 -129
  11. histomicsui-1.8.1.dev145/histomicsui/girder_worker_plugin.py +14 -0
  12. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/handlers.py +10 -163
  13. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/hui_resource.py +4 -1
  14. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/system.py +26 -1
  15. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/tcga.py +2 -2
  16. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui.egg-info/PKG-INFO +13 -6
  17. histomicsui-1.8.1.dev145/histomicsui.egg-info/SOURCES.txt +81 -0
  18. histomicsui-1.8.1.dev145/histomicsui.egg-info/entry_points.txt +5 -0
  19. histomicsui-1.8.1.dev145/histomicsui.egg-info/requires.txt +8 -0
  20. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/requirements-dev.txt +2 -2
  21. histomicsui-1.8.1.dev145/requirements-girder5.txt +3 -0
  22. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/ruff.toml +3 -0
  23. histomicsui-1.8.1.dev145/sample_data/Easy1.png +0 -0
  24. histomicsui-1.8.1.dev145/sample_data/sample_svs_image.TCGA-DU-6399-01A-01-TS1.e8eb65de-d63e-42db-af6f-14fefbbdf7bd.svs +0 -0
  25. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/setup.py +10 -6
  26. histomicsui-1.8.1.dev145/tests/conftest.py +31 -0
  27. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_handlers.py +3 -25
  28. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_hui_rest.py +23 -19
  29. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tox.ini +27 -12
  30. histomicsui-1.8.1.dev6/histomicsui/web_client/app.js +0 -119
  31. histomicsui-1.8.1.dev6/histomicsui/web_client/collections/StyleCollection.js +0 -17
  32. histomicsui-1.8.1.dev6/histomicsui/web_client/collections/UserCollection.js +0 -12
  33. histomicsui-1.8.1.dev6/histomicsui/web_client/collections/index.js +0 -7
  34. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/confirmDialog.js +0 -53
  35. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/editElement.js +0 -141
  36. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -199
  37. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/editStyleGroups.js +0 -327
  38. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/index.js +0 -17
  39. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/metadataPlot.js +0 -64
  40. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -179
  41. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/openImage.js +0 -76
  42. histomicsui-1.8.1.dev6/histomicsui/web_client/dialogs/saveAnnotation.js +0 -573
  43. histomicsui-1.8.1.dev6/histomicsui/web_client/events.js +0 -3
  44. histomicsui-1.8.1.dev6/histomicsui/web_client/index.js +0 -20
  45. histomicsui-1.8.1.dev6/histomicsui/web_client/main.js +0 -28
  46. histomicsui-1.8.1.dev6/histomicsui/web_client/models/StyleModel.js +0 -38
  47. histomicsui-1.8.1.dev6/histomicsui/web_client/models/index.js +0 -5
  48. histomicsui-1.8.1.dev6/histomicsui/web_client/package.json +0 -118
  49. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/AnnotationSelector.js +0 -674
  50. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/DrawWidget.js +0 -1111
  51. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -86
  52. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/MetadataPlot.js +0 -748
  53. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/MetadataWidget.js +0 -118
  54. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/OverviewWidget.js +0 -197
  55. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/RegionSelector.js +0 -36
  56. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/ZoomWidget.js +0 -310
  57. histomicsui-1.8.1.dev6/histomicsui/web_client/panels/index.js +0 -7
  58. histomicsui-1.8.1.dev6/histomicsui/web_client/router.js +0 -50
  59. histomicsui-1.8.1.dev6/histomicsui/web_client/routes.js +0 -13
  60. histomicsui-1.8.1.dev6/histomicsui/web_client/static/favicon.png +0 -0
  61. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/body/configView.styl +0 -18
  62. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/body/image.styl +0 -79
  63. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -15
  64. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/dialogs/metadataPlot.styl +0 -26
  65. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -15
  66. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -45
  67. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/layout/header.styl +0 -57
  68. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -98
  69. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -8
  70. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/layout/layout.styl +0 -120
  71. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +0 -114
  72. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/drawWidget.styl +0 -176
  73. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -151
  74. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -35
  75. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -48
  76. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -5
  77. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -4
  78. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -54
  79. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -6
  80. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -81
  81. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/views/itemList.styl +0 -11
  82. histomicsui-1.8.1.dev6/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -5
  83. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/body/configView.pug +0 -106
  84. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/body/image.pug +0 -21
  85. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -15
  86. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -14
  87. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/editElement.pug +0 -24
  88. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -40
  89. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -44
  90. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/metadataPlot.pug +0 -58
  91. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -20
  92. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/openImage.pug +0 -10
  93. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +0 -110
  94. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/elementProps.pug +0 -44
  95. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/layout/header.pug +0 -23
  96. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -97
  97. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/layout/headerImage.pug +0 -40
  98. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/layout/headerUser.pug +0 -24
  99. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/layout/layout.pug +0 -7
  100. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/annotationSelector.pug +0 -104
  101. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/drawWidget.pug +0 -113
  102. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/drawWidgetElement.pug +0 -78
  103. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -8
  104. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -13
  105. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -16
  106. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -7
  107. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/panel.pug +0 -18
  108. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/regionSelector.pug +0 -9
  109. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -32
  110. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -16
  111. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -50
  112. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -13
  113. histomicsui-1.8.1.dev6/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -6
  114. histomicsui-1.8.1.dev6/histomicsui/web_client/views/HierarchyWidget.js +0 -13
  115. histomicsui-1.8.1.dev6/histomicsui/web_client/views/JobDetailsWidget.js +0 -18
  116. histomicsui-1.8.1.dev6/histomicsui/web_client/views/View.js +0 -48
  117. histomicsui-1.8.1.dev6/histomicsui/web_client/views/body/ConfigView.js +0 -190
  118. histomicsui-1.8.1.dev6/histomicsui/web_client/views/body/ImageView.js +0 -1820
  119. histomicsui-1.8.1.dev6/histomicsui/web_client/views/body/index.js +0 -7
  120. histomicsui-1.8.1.dev6/histomicsui/web_client/views/index.js +0 -11
  121. histomicsui-1.8.1.dev6/histomicsui/web_client/views/itemList.js +0 -106
  122. histomicsui-1.8.1.dev6/histomicsui/web_client/views/itemPage.js +0 -57
  123. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -67
  124. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/HeaderImageView.js +0 -83
  125. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/HeaderUserView.js +0 -15
  126. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/HeaderView.js +0 -56
  127. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/LoginView.js +0 -15
  128. histomicsui-1.8.1.dev6/histomicsui/web_client/views/layout/index.js +0 -9
  129. histomicsui-1.8.1.dev6/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -130
  130. histomicsui-1.8.1.dev6/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -370
  131. histomicsui-1.8.1.dev6/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -45
  132. histomicsui-1.8.1.dev6/histomicsui/web_client/views/popover/index.js +0 -7
  133. histomicsui-1.8.1.dev6/histomicsui/web_client/views/searchResultsView.js +0 -48
  134. histomicsui-1.8.1.dev6/histomicsui/web_client/views/utils.js +0 -82
  135. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/AnnotationHistoryBrowser.vue +0 -107
  136. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue +0 -162
  137. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/AnnotationHistoryGroup.vue +0 -128
  138. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -117
  139. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -358
  140. histomicsui-1.8.1.dev6/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -36
  141. histomicsui-1.8.1.dev6/histomicsui/web_client/webpack.helper.js +0 -45
  142. histomicsui-1.8.1.dev6/histomicsui/webroot.mako +0 -40
  143. histomicsui-1.8.1.dev6/histomicsui.egg-info/SOURCES.txt +0 -188
  144. histomicsui-1.8.1.dev6/histomicsui.egg-info/entry_points.txt +0 -2
  145. histomicsui-1.8.1.dev6/histomicsui.egg-info/requires.txt +0 -7
  146. histomicsui-1.8.1.dev6/tests/test_web_client.py +0 -152
  147. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/.editorconfig +0 -0
  148. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/LICENSE +0 -0
  149. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/NOTICE +0 -0
  150. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/codecov.yml +0 -0
  151. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/config_options.rst +0 -0
  152. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/controls.rst +0 -0
  153. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/images/cut.gif +0 -0
  154. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/images/difference.gif +0 -0
  155. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/images/intersect.gif +0 -0
  156. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/images/union.gif +0 -0
  157. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/images/xor.gif +0 -0
  158. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/docs/slicer_cli_plugins.rst +0 -0
  159. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/constants.py +0 -0
  160. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/__init__.py +0 -0
  161. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/aperio.py +0 -0
  162. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/case.py +0 -0
  163. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/cohort.py +0 -0
  164. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/image.py +0 -0
  165. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/meta.py +0 -0
  166. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/pathology.py +0 -0
  167. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/models/slide.py +0 -0
  168. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/__init__.py +0 -0
  169. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/aperio.py +0 -0
  170. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui/rest/image_browse_resource.py +0 -0
  171. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui.egg-info/dependency_links.txt +0 -0
  172. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui.egg-info/not-zip-safe +0 -0
  173. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/histomicsui.egg-info/top_level.txt +0 -0
  174. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/pyproject.toml +0 -0
  175. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/setup.cfg +0 -0
  176. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/__init__.py +0 -0
  177. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/datastore.py +0 -0
  178. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/girder_utilities.py +0 -0
  179. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/.histomicsui_config.yaml +0 -0
  180. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/sample.anot +0 -0
  181. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/sample.meta +0 -0
  182. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/sample_girder_id.anot +0 -0
  183. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/test_analysis_detection.xml +0 -0
  184. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_files/test_analysis_features.xml +0 -0
  185. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_image_browse_endpoints.py +0 -0
  186. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_load.py +0 -0
  187. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/test_tcga.py +0 -0
  188. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/.eslintrc +0 -0
  189. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/analysisSpec.js +0 -0
  190. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/annotationSpec.js +0 -0
  191. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/girderUISpec.js +0 -0
  192. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/huiSpec.js +0 -0
  193. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/huiTest.js +0 -0
  194. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/itemSpec.js +0 -0
  195. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/metadataPanelSpec.js +0 -0
  196. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/metadataPlotSpec.js +0 -0
  197. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/overviewPanelSpec.js +0 -0
  198. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/panelLayoutSpec.js +0 -0
  199. {histomicsui-1.8.1.dev6 → histomicsui-1.8.1.dev145}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
@@ -10,15 +10,59 @@ executors:
10
10
  - image: rabbitmq
11
11
  resource_class: large
12
12
  commands:
13
+ use_nvm:
14
+ description: "Use nvm"
15
+ parameters:
16
+ node:
17
+ type: string
18
+ default: v20
19
+ steps:
20
+ - run:
21
+ name: Use nvm
22
+ # see https://discuss.circleci.com/t/nvm-does-not-change-node-version-on-machine/28973/14
23
+ command: |
24
+ echo 'export NVM_DIR="/root/.nvm"' >> $BASH_ENV
25
+ echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $BASH_ENV
26
+ - restore_cache:
27
+ name: Restore nvm cache
28
+ key: v1-nvm-cache-<< parameters.node >>
29
+ - run:
30
+ name: Switch node versions
31
+ command: |
32
+ nvm install << parameters.node >>
33
+ nvm alias default << parameters.node >>
34
+ NODE_DIR=$(dirname $(which node))
35
+ echo "export PATH=$NODE_DIR:\$PATH" >> $BASH_ENV
36
+ - run:
37
+ name: Check node versions
38
+ command: |
39
+ node --version
40
+ npm --version
41
+ build_client:
42
+ description: "Build HistomicsUI client"
43
+ steps:
44
+ - run:
45
+ name: Build client
46
+ command: |
47
+ pushd histomicsui/web_client
48
+ npm ci
49
+ npm run build
50
+ popd
51
+ install_playwright:
52
+ description: "Install playwright"
53
+ steps:
54
+ - run:
55
+ name: Install playwright with dependencies
56
+ command: |
57
+ pushd histomicsui/web_client
58
+ npx playwright install --with-deps
59
+ popd
13
60
  tox:
14
61
  description: "Run tox"
15
62
  parameters:
16
63
  env:
17
64
  type: string
18
65
  steps:
19
- - run:
20
- name: Preinstall phantomjs to work around an npm permission issue
21
- command: npm install -g phantomjs-prebuilt --unsafe-perm
22
66
  - run:
23
67
  name: Run tests via tox
24
68
  # Piping through cat does less buffering of the output but can
@@ -42,6 +86,8 @@ jobs:
42
86
  executor: toxandnode
43
87
  steps:
44
88
  - checkout
89
+ - use_nvm
90
+ - build_client
45
91
  - tox:
46
92
  env: py310
47
93
  - coverage
@@ -49,6 +95,8 @@ jobs:
49
95
  executor: toxandnode
50
96
  steps:
51
97
  - checkout
98
+ - use_nvm
99
+ - build_client
52
100
  - tox:
53
101
  env: py311
54
102
  - coverage
@@ -56,6 +104,8 @@ jobs:
56
104
  executor: toxandnode
57
105
  steps:
58
106
  - checkout
107
+ - use_nvm
108
+ - build_client
59
109
  - tox:
60
110
  env: py312
61
111
  - coverage
@@ -63,13 +113,30 @@ jobs:
63
113
  executor: toxandnode
64
114
  steps:
65
115
  - checkout
116
+ - use_nvm
117
+ - build_client
66
118
  - tox:
67
119
  env: py313
68
120
  - coverage
121
+ web_client:
122
+ executor: toxandnode
123
+ environment:
124
+ CI: "true"
125
+ HEADLESS: "true"
126
+ GIRDER_CLIENT_TESTING_MONGO_URI: mongodb://localhost:27017
127
+ steps:
128
+ - checkout
129
+ - use_nvm
130
+ - build_client
131
+ - install_playwright
132
+ - tox:
133
+ env: webtest
69
134
  noanalysis:
70
135
  executor: toxandnode
71
136
  steps:
72
137
  - checkout
138
+ - use_nvm
139
+ - build_client
73
140
  - tox:
74
141
  env: noanalysis
75
142
  - coverage
@@ -84,6 +151,8 @@ jobs:
84
151
  - image: girder/tox-and-node
85
152
  steps:
86
153
  - checkout
154
+ - use_nvm
155
+ - build_client
87
156
  - deploy:
88
157
  name: Run tests via tox
89
158
  # Piping through cat does less buffering of the output but can
@@ -136,6 +205,13 @@ workflows:
136
205
  branches:
137
206
  ignore:
138
207
  - gh-pages
208
+ - web_client:
209
+ filters:
210
+ tags:
211
+ only: /^v.*/
212
+ branches:
213
+ ignore:
214
+ - gh-pages
139
215
  - release:
140
216
  requires:
141
217
  - py310
@@ -147,4 +223,6 @@ workflows:
147
223
  tags:
148
224
  only: /^v.*/
149
225
  branches:
150
- only: master
226
+ only:
227
+ - master
228
+ - girder-5
@@ -0,0 +1,19 @@
1
+ import re
2
+
3
+ import setuptools_scm
4
+
5
+
6
+ def main():
7
+ version = setuptools_scm.get_version()
8
+ expected_version_regex = r'(\d+\.\d+\.\d+)a(\d+).+$'
9
+ match = re.match(expected_version_regex, version)
10
+ if not match:
11
+ error_message = f'Version {version} does not match the expected format'
12
+ raise ValueError(error_message)
13
+ base_version = match.group(1)
14
+ alpha_version = match.group(2)
15
+ print(f'{base_version}a{alpha_version}')
16
+
17
+
18
+ if __name__ == '__main__':
19
+ main()
@@ -0,0 +1,16 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ export SETUPTOOLS_SCM_PRETEND_VERSION=`python -m setuptools_scm | sed "s/.* //"`
6
+ if [ "${CIRCLE_BRANCH-:}" = "master" ]; then
7
+ export SETUPTOOLS_SCM_PRETEND_VERSION=`echo $SETUPTOOLS_SCM_PRETEND_VERSION | sed "s/\+.*$//"`
8
+ elif [ "${CIRCLE_BRANCH-:}" = "girder-5" ]; then
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ pip install setuptools-scm
11
+ export SETUPTOOLS_SCM_PRETEND_VERSION=$(python "$SCRIPT_DIR/get_version.py")
12
+ fi
13
+
14
+ python -m build
15
+ twine check dist/*
16
+ twine upload --skip-existing dist/*
@@ -13,3 +13,7 @@ f1c2190ab04ab867c655b4217f807e9f567772c8
13
13
  9475b89640a6de84788b79ba68d5ed9aeb1a9ff4
14
14
  # PR 359: Apply ruff formatting and linting
15
15
  97b21f031e4769043b2c3a464ea4cf8e9a60c219
16
+ # PR 443: Format Girder 5
17
+ d184bf1c2d5c12e643f8e5536c7707744c72e7ba
18
+ 0e0e6009391bcbf9bde7be6ebbb121cf84ae1f32
19
+ cbc3c3952acef976b7b0be732e9ebb7686e98c8e
@@ -12,6 +12,7 @@ env/
12
12
  build/
13
13
  develop-eggs/
14
14
  dist/
15
+ dist-app/
15
16
  downloads/
16
17
  eggs/
17
18
  .eggs/
@@ -48,7 +48,8 @@ repos:
48
48
  - id: codespell
49
49
  args:
50
50
  - --ignore-words-list
51
- - "hist,indext,pixelx,thex,subtile"
51
+ - "hist,indext,pixelx,thex,subtile,afterAll"
52
+ - --exclude-file=histomicsui/web_client/package-lock.json
52
53
  - repo: https://github.com/syntaqx/git-hooks
53
54
  rev: v0.0.18
54
55
  hooks:
@@ -6,3 +6,6 @@ graft histomicsui
6
6
  graft docs
7
7
  prune test
8
8
  global-exclude *.py[co] *.cmake __pycache__ node_modules
9
+
10
+ prune histomicsui/web_client
11
+ recursive-include histomicsui/web_client/dist/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: histomicsui
3
- Version: 1.8.1.dev6
3
+ Version: 1.8.1.dev145
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -20,11 +20,12 @@ Requires-Python: >=3.10
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
22
  License-File: NOTICE
23
- Requires-Dist: girder<5
24
- Requires-Dist: girder-large-image-annotation>=1.33.5
25
- Requires-Dist: girder-slicer-cli-web[girder]>=1.4.0
26
- Requires-Dist: cachetools
27
- Requires-Dist: orjson
23
+ Requires-Dist: girder>=5.0.0a13
24
+ Requires-Dist: girder-jobs>=5.0.0a13
25
+ Requires-Dist: girder-large-image==1.33.6a155
26
+ Requires-Dist: girder-large-image-annotation==1.33.6a155
27
+ Requires-Dist: large-image-tasks==1.33.6a155
28
+ Requires-Dist: large-image-converter==1.33.6a155
28
29
  Provides-Extra: analysis
29
30
  Dynamic: author
30
31
  Dynamic: author-email
@@ -110,6 +111,12 @@ Now install the histomicsui package, have Girder build its UI, and start the Gir
110
111
  girder build
111
112
  girder serve
112
113
 
114
+ Note that ``girder serve`` should only be used in development. In production, use a WSGI server such as gunicorn, e.g.::
115
+
116
+ .. code-block:: bash
117
+
118
+ gunicorn girder.wsgi:app --bind=localhost:8080 --workers=4 --preload
119
+
113
120
  To use Girder Worker:
114
121
 
115
122
  .. code-block:: bash
@@ -68,6 +68,12 @@ Now install the histomicsui package, have Girder build its UI, and start the Gir
68
68
  girder build
69
69
  girder serve
70
70
 
71
+ Note that ``girder serve`` should only be used in development. In production, use a WSGI server such as gunicorn, e.g.::
72
+
73
+ .. code-block:: bash
74
+
75
+ gunicorn girder.wsgi:app --bind=localhost:8080 --workers=4 --preload
76
+
71
77
  To use Girder Worker:
72
78
 
73
79
  .. code-block:: bash
@@ -1,29 +1,14 @@
1
- #############################################################################
2
- # Copyright Kitware Inc.
3
- #
4
- # Licensed under the Apache License, Version 2.0 ( the "License" );
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #############################################################################
16
-
17
1
  import importlib.metadata
18
2
  import json
19
3
  import logging
20
4
  import os
21
5
  import re
22
6
  from functools import wraps
7
+ from pathlib import Path
23
8
 
24
9
  import cherrypy
25
10
  from bson import json_util
26
- from girder import events, logger, plugin
11
+ from girder import events, plugin
27
12
  from girder.api import access
28
13
  from girder.api.rest import getCurrentToken
29
14
  from girder.constants import AssetstoreType
@@ -33,13 +18,11 @@ from girder.models.file import File
33
18
  from girder.models.folder import Folder
34
19
  from girder.models.item import Item
35
20
  from girder.models.setting import Setting
36
- from girder.models.token import Token
37
- from girder.settings import SettingDefault, SettingKey
21
+ from girder.settings import SettingDefault
38
22
  from girder.utility import config
39
23
  from girder.utility import path as path_util
40
24
  from girder.utility import setting_utilities
41
25
  from girder.utility.model_importer import ModelImporter
42
- from girder.utility.webroot import Webroot
43
26
 
44
27
  from . import handlers, rest
45
28
  from .constants import PluginSettings
@@ -56,16 +39,7 @@ except importlib.metadata.PackageNotFoundError:
56
39
  # package is not installed
57
40
  pass
58
41
 
59
- # There are other packages that add to the root log handler; this makes the
60
- # system very noisy. Stop that.
61
- while logging.root.hasHandlers():
62
- logging.root.removeHandler(logging.root.handlers[0])
63
- logging.root.addHandler(logging.NullHandler())
64
-
65
- _template = os.path.join(
66
- os.path.dirname(__file__),
67
- 'webroot.mako',
68
- )
42
+ logger = logging.getLogger(__name__)
69
43
 
70
44
 
71
45
  def patchCookieParsing():
@@ -99,42 +73,6 @@ def patchCookieParsing():
99
73
  pass
100
74
 
101
75
 
102
- def betterInvalidateJSandCSSCaches(root):
103
- from girder import constants
104
-
105
- origRenderHTML = root._renderHTML
106
-
107
- def _renderHTML(self):
108
- topBuiltDir = os.path.join(constants.STATIC_ROOT_DIR, 'built')
109
- result = origRenderHTML()
110
- lastUpdate = 0
111
- for filename in {
112
- 'girder_lib.min.js', 'girder_app.min.js', 'girder_lib.min.css',
113
- 'Girder_Favicon.png'}:
114
- filepath = os.path.join(topBuiltDir, filename)
115
- if os.path.exists(filepath):
116
- lastUpdate = max(lastUpdate, os.path.getmtime(filepath))
117
- builtDir = os.path.join(constants.STATIC_ROOT_DIR, 'built', 'plugins')
118
- for pluginName in self.vars['plugins']:
119
- for filepath in [
120
- os.path.join(builtDir, pluginName, 'plugin.min.css'),
121
- os.path.join(builtDir, pluginName, 'plugin.min.js'),
122
- ]:
123
- if os.path.exists(filepath):
124
- lastUpdate = max(lastUpdate, os.path.getmtime(filepath))
125
- luParam = '?_=%d' % int(lastUpdate * 1000)
126
- while True:
127
- match = re.search(
128
- r'<(link rel="(icon|stylesheet)" [^>]*href="[^>?"]*\.(css|png)|'
129
- r'script src="[^>?"]*.js)">', result)
130
- if not match:
131
- break
132
- result = result[:match.span()[1] - 2] + luParam + result[match.span()[1] - 2:]
133
- return result
134
-
135
- root._renderHTML = _renderHTML.__get__(root)
136
-
137
-
138
76
  @setting_utilities.validator({
139
77
  PluginSettings.HUI_DEFAULT_DRAW_STYLES,
140
78
  PluginSettings.HUI_PANEL_LAYOUT,
@@ -276,37 +214,6 @@ def _saveJob(event):
276
214
  pass
277
215
 
278
216
 
279
- class WebrootHistomicsUI(Webroot):
280
- def _renderHTML(self):
281
- self.updateHtmlVars({
282
- 'title': Setting().get(PluginSettings.HUI_BRAND_NAME),
283
- 'huiBrandName': Setting().get(PluginSettings.HUI_BRAND_NAME),
284
- 'huiBrandColor': Setting().get(PluginSettings.HUI_BRAND_COLOR),
285
- 'huiBannerColor': Setting().get(PluginSettings.HUI_BANNER_COLOR),
286
- 'huiHelpURL': Setting().get(PluginSettings.HUI_HELP_URL),
287
- 'huiHelpTooltip': Setting().get(PluginSettings.HUI_HELP_TOOLTIP),
288
- 'huiHelpText': Setting().get(PluginSettings.HUI_HELP_TEXT),
289
- })
290
- return super()._renderHTML()
291
-
292
- def GET(self, **params):
293
- print(params)
294
- if params.get('token'):
295
- try:
296
- token = Token().load(params['token'], force=True, objectId=False)
297
- if token:
298
- cookie = cherrypy.response.cookie
299
- cookie['girderToken'] = str(token['_id'])
300
- cookie['girderToken']['path'] = '/'
301
- days = float(Setting().get(SettingKey.COOKIE_LIFETIME))
302
- cookie['girderToken']['expires'] = int(days * 3600 * 24)
303
- cookie['girderToken']['sameSite'] = 'None'
304
- cookie['girderToken']['secure'] = True
305
- except Exception:
306
- pass
307
- return self._renderHTML()
308
-
309
-
310
217
  def restrict_downloads(info):
311
218
  """
312
219
  If restrict_downloads is configured, modify endpoints to do that.
@@ -395,9 +302,18 @@ def cleanupFSAssetstores():
395
302
  assetstore['name'], count, fullcount, total)
396
303
 
397
304
 
305
+ class RootHandler:
306
+ @cherrypy.expose
307
+ def index(*args, **kwargs):
308
+ path = Path(__file__).parent / 'web_client' / 'dist-app' / 'index.html'
309
+ with open(path) as f:
310
+ content = f.read()
311
+ modified_content = content.replace('root=""', f'root="{os.getenv("GIRDER_URL_ROOT")}"')
312
+ return modified_content
313
+
314
+
398
315
  class GirderPlugin(plugin.GirderPlugin):
399
316
  DISPLAY_NAME = 'HistomicsUI'
400
- CLIENT_SOURCE_PATH = 'web_client'
401
317
 
402
318
  def load(self, info): # noqa
403
319
  plugin.getPlugin('jobs').load(info)
@@ -422,8 +338,8 @@ class GirderPlugin(plugin.GirderPlugin):
422
338
  ModelImporter.registerModel('slide', Slide, 'histomicsui')
423
339
 
424
340
  rest.addEndpoints(info['apiRoot'])
425
- info['serverRoot'].updateHtmlVars({
426
- 'brandName': Setting().get(SettingKey.BRAND_NAME)})
341
+ # info['serverRoot'].updateHtmlVars({
342
+ # 'brandName': Setting().get(SettingKey.BRAND_NAME)})
427
343
  # Better virtual folder support
428
344
  if not getattr(Folder, '_childItemsBeforeHUI', None):
429
345
  Folder._childItemsBeforeHUI = Folder.childItems
@@ -443,24 +359,39 @@ class GirderPlugin(plugin.GirderPlugin):
443
359
 
444
360
  path_util.lookUpToken = lookUpToken
445
361
 
446
- girderRoot = info['serverRoot']
447
- huiRoot = WebrootHistomicsUI(_template)
448
- huiRoot.updateHtmlVars(girderRoot.vars)
449
-
450
- betterInvalidateJSandCSSCaches(girderRoot)
451
- betterInvalidateJSandCSSCaches(huiRoot)
452
-
453
- # The interface is always available under hui and also available
454
- # under the specified path.
455
- info['serverRoot'].hui = huiRoot
456
- webrootPath = Setting().get(PluginSettings.HUI_WEBROOT_PATH)
457
- alternateWebrootPath = Setting().get(PluginSettings.HUI_ALTERNATE_WEBROOT_PATH)
458
- setattr(info['serverRoot'], webrootPath, huiRoot)
459
- if alternateWebrootPath:
460
- for alt_webroot_path in alternateWebrootPath.split(','):
461
- if alt_webroot_path:
462
- setattr(info['serverRoot'], alt_webroot_path, huiRoot)
463
- info['serverRoot'].girder = girderRoot
362
+ plugin.registerPluginStaticContent(
363
+ 'histomicsui',
364
+ css=['/style.css'],
365
+ js=[
366
+ '/girder-plugin-histomics-ui.umd.cjs',
367
+ '/extra/plotly.js',
368
+ ],
369
+ staticDir=Path(__file__).parent / 'web_client' / 'dist',
370
+ tree=info['serverRoot'],
371
+ )
372
+
373
+ webroot = os.getenv('HUI_WEBROOT_PATH', False)
374
+ if webroot:
375
+ Setting().set(PluginSettings.HUI_WEBROOT_PATH, webroot)
376
+ else:
377
+ webroot = Setting().get(PluginSettings.HUI_WEBROOT_PATH)
378
+ custom_api_root = os.getenv('GIRDER_URL_ROOT')
379
+ custom_api_root = None if not custom_api_root or custom_api_root == '/' else custom_api_root
380
+ static_opts = {
381
+ 'tools.staticdir.on': True,
382
+ 'tools.staticdir.dir': Path(__file__).parent / 'web_client' / 'dist-app',
383
+ }
384
+ if not custom_api_root:
385
+ static_opts['tools.staticdir.index'] = 'index.html'
386
+
387
+ info['serverRoot'].mount(RootHandler if custom_api_root else None, f'/{webroot}', {
388
+ '/': static_opts,
389
+ })
390
+ altroot = Setting().get(PluginSettings.HUI_ALTERNATE_WEBROOT_PATH)
391
+ if altroot and altroot != webroot:
392
+ info['serverRoot'].mount(RootHandler if custom_api_root else None, f'/{altroot}', {
393
+ '/': static_opts,
394
+ })
464
395
 
465
396
  # Auto-ingest annotations into database when a file with an identifier
466
397
  # ending in 'AnnotationFile' is uploaded (usually .anot files).
@@ -473,16 +404,5 @@ class GirderPlugin(plugin.GirderPlugin):
473
404
 
474
405
  handlers.json_nans_as_nulls()
475
406
 
476
- def updateWebroot(event):
477
- """
478
- If the webroot path setting is changed, bind the new path to the
479
- hui webroot resource. Note that a change to the alternate webroot
480
- requires a restart.
481
- """
482
- if event.info.get('key') == PluginSettings.HUI_WEBROOT_PATH:
483
- setattr(info['serverRoot'], event.info['value'], huiRoot)
484
-
485
- events.bind('model.setting.save.after', 'histomicsui', updateWebroot)
486
-
487
407
  restrict_downloads(info)
488
408
  cleanupFSAssetstores()
@@ -0,0 +1,14 @@
1
+ import os
2
+
3
+ from girder_worker import GirderWorkerPluginABC
4
+
5
+
6
+ class HistomicsUIWorkerPlugin(GirderWorkerPluginABC):
7
+ def __init__(self, app, *args, **kwargs):
8
+ if os.getenv('CELERY_TASK_ALWAYS_EAGER', False):
9
+ app.conf.task_always_eager = True
10
+ app.conf.task_eager_propagates = True
11
+ self.app = app
12
+
13
+ def task_imports(self):
14
+ return ['histomicsui.handlers']