histomicsui 1.7.2.dev2__tar.gz → 2.0.0a2__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 (194) hide show
  1. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/.circleci/config.yml +86 -4
  2. histomicsui-2.0.0a2/.circleci/get_version.py +19 -0
  3. histomicsui-2.0.0a2/.circleci/publish_pypi.sh +16 -0
  4. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/.git-blame-ignore-revs +4 -0
  5. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/.gitignore +1 -0
  6. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/.pre-commit-config.yaml +2 -1
  7. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/MANIFEST.in +3 -0
  8. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/PKG-INFO +12 -3
  9. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/README.rst +6 -0
  10. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/config_options.rst +0 -14
  11. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/__init__.py +36 -111
  12. histomicsui-2.0.0a2/histomicsui/girder_worker_plugin.py +14 -0
  13. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/handlers.py +10 -163
  14. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/hui_resource.py +4 -1
  15. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/system.py +26 -1
  16. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/tcga.py +2 -2
  17. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui.egg-info/PKG-INFO +12 -3
  18. histomicsui-2.0.0a2/histomicsui.egg-info/SOURCES.txt +81 -0
  19. histomicsui-2.0.0a2/histomicsui.egg-info/entry_points.txt +5 -0
  20. histomicsui-2.0.0a2/histomicsui.egg-info/requires.txt +9 -0
  21. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/requirements-dev.txt +2 -2
  22. histomicsui-2.0.0a2/requirements-girder5.txt +3 -0
  23. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/ruff.toml +3 -0
  24. histomicsui-2.0.0a2/sample_data/Easy1.png +0 -0
  25. histomicsui-2.0.0a2/sample_data/sample_svs_image.TCGA-DU-6399-01A-01-TS1.e8eb65de-d63e-42db-af6f-14fefbbdf7bd.svs +0 -0
  26. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/setup.py +10 -3
  27. histomicsui-2.0.0a2/tests/conftest.py +31 -0
  28. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_handlers.py +3 -25
  29. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_hui_rest.py +23 -19
  30. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tox.ini +27 -7
  31. histomicsui-1.7.2.dev2/histomicsui/web_client/app.js +0 -93
  32. histomicsui-1.7.2.dev2/histomicsui/web_client/collections/StyleCollection.js +0 -17
  33. histomicsui-1.7.2.dev2/histomicsui/web_client/collections/UserCollection.js +0 -12
  34. histomicsui-1.7.2.dev2/histomicsui/web_client/collections/index.js +0 -7
  35. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/confirmDialog.js +0 -53
  36. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/editElement.js +0 -137
  37. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -199
  38. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/editStyleGroups.js +0 -325
  39. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/index.js +0 -17
  40. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/metadataPlot.js +0 -61
  41. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -176
  42. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/openImage.js +0 -76
  43. histomicsui-1.7.2.dev2/histomicsui/web_client/dialogs/saveAnnotation.js +0 -545
  44. histomicsui-1.7.2.dev2/histomicsui/web_client/events.js +0 -3
  45. histomicsui-1.7.2.dev2/histomicsui/web_client/index.js +0 -20
  46. histomicsui-1.7.2.dev2/histomicsui/web_client/main.js +0 -28
  47. histomicsui-1.7.2.dev2/histomicsui/web_client/models/StyleModel.js +0 -38
  48. histomicsui-1.7.2.dev2/histomicsui/web_client/models/index.js +0 -5
  49. histomicsui-1.7.2.dev2/histomicsui/web_client/package.json +0 -118
  50. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/AnnotationSelector.js +0 -658
  51. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/DrawWidget.js +0 -1058
  52. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -86
  53. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/MetadataPlot.js +0 -688
  54. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/MetadataWidget.js +0 -118
  55. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/OverviewWidget.js +0 -197
  56. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/RegionSelector.js +0 -36
  57. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/ZoomWidget.js +0 -289
  58. histomicsui-1.7.2.dev2/histomicsui/web_client/panels/index.js +0 -7
  59. histomicsui-1.7.2.dev2/histomicsui/web_client/router.js +0 -50
  60. histomicsui-1.7.2.dev2/histomicsui/web_client/routes.js +0 -13
  61. histomicsui-1.7.2.dev2/histomicsui/web_client/static/favicon.png +0 -0
  62. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/body/configView.styl +0 -18
  63. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/body/image.styl +0 -79
  64. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -15
  65. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/dialogs/metadataPlot.styl +0 -16
  66. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -15
  67. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -45
  68. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/layout/header.styl +0 -57
  69. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -98
  70. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -8
  71. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/layout/layout.styl +0 -120
  72. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +0 -99
  73. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/drawWidget.styl +0 -154
  74. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -151
  75. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -35
  76. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -48
  77. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -5
  78. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -4
  79. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -52
  80. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -6
  81. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -79
  82. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/views/itemList.styl +0 -11
  83. histomicsui-1.7.2.dev2/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -5
  84. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/body/configView.pug +0 -106
  85. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/body/image.pug +0 -21
  86. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -15
  87. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -14
  88. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/editElement.pug +0 -45
  89. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -40
  90. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -64
  91. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/metadataPlot.pug +0 -51
  92. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -20
  93. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/openImage.pug +0 -10
  94. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +0 -109
  95. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/layout/header.pug +0 -23
  96. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -95
  97. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/layout/headerImage.pug +0 -40
  98. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/layout/headerUser.pug +0 -24
  99. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/layout/layout.pug +0 -7
  100. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/annotationSelector.pug +0 -80
  101. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/drawWidget.pug +0 -110
  102. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/drawWidgetElement.pug +0 -63
  103. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -8
  104. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -13
  105. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -16
  106. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -7
  107. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/panel.pug +0 -18
  108. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/regionSelector.pug +0 -9
  109. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -32
  110. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -16
  111. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -49
  112. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -13
  113. histomicsui-1.7.2.dev2/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -6
  114. histomicsui-1.7.2.dev2/histomicsui/web_client/views/HierarchyWidget.js +0 -13
  115. histomicsui-1.7.2.dev2/histomicsui/web_client/views/JobDetailsWidget.js +0 -18
  116. histomicsui-1.7.2.dev2/histomicsui/web_client/views/View.js +0 -48
  117. histomicsui-1.7.2.dev2/histomicsui/web_client/views/body/ConfigView.js +0 -190
  118. histomicsui-1.7.2.dev2/histomicsui/web_client/views/body/ImageView.js +0 -1799
  119. histomicsui-1.7.2.dev2/histomicsui/web_client/views/body/index.js +0 -7
  120. histomicsui-1.7.2.dev2/histomicsui/web_client/views/index.js +0 -11
  121. histomicsui-1.7.2.dev2/histomicsui/web_client/views/itemList.js +0 -106
  122. histomicsui-1.7.2.dev2/histomicsui/web_client/views/itemPage.js +0 -57
  123. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -56
  124. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/HeaderImageView.js +0 -83
  125. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/HeaderUserView.js +0 -15
  126. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/HeaderView.js +0 -56
  127. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/LoginView.js +0 -15
  128. histomicsui-1.7.2.dev2/histomicsui/web_client/views/layout/index.js +0 -9
  129. histomicsui-1.7.2.dev2/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -124
  130. histomicsui-1.7.2.dev2/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -355
  131. histomicsui-1.7.2.dev2/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -45
  132. histomicsui-1.7.2.dev2/histomicsui/web_client/views/popover/index.js +0 -7
  133. histomicsui-1.7.2.dev2/histomicsui/web_client/views/searchResultsView.js +0 -48
  134. histomicsui-1.7.2.dev2/histomicsui/web_client/views/utils.js +0 -82
  135. histomicsui-1.7.2.dev2/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -117
  136. histomicsui-1.7.2.dev2/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -358
  137. histomicsui-1.7.2.dev2/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -36
  138. histomicsui-1.7.2.dev2/histomicsui/web_client/webpack.helper.js +0 -45
  139. histomicsui-1.7.2.dev2/histomicsui.egg-info/SOURCES.txt +0 -183
  140. histomicsui-1.7.2.dev2/histomicsui.egg-info/entry_points.txt +0 -2
  141. histomicsui-1.7.2.dev2/histomicsui.egg-info/requires.txt +0 -6
  142. histomicsui-1.7.2.dev2/tests/test_web_client.py +0 -152
  143. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/.editorconfig +0 -0
  144. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/LICENSE +0 -0
  145. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/NOTICE +0 -0
  146. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/codecov.yml +0 -0
  147. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/controls.rst +0 -0
  148. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/images/difference.gif +0 -0
  149. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/images/intersect.gif +0 -0
  150. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/images/union.gif +0 -0
  151. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/images/xor.gif +0 -0
  152. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/docs/slicer_cli_plugins.rst +0 -0
  153. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/constants.py +0 -0
  154. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/__init__.py +0 -0
  155. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/aperio.py +0 -0
  156. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/case.py +0 -0
  157. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/cohort.py +0 -0
  158. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/image.py +0 -0
  159. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/meta.py +0 -0
  160. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/pathology.py +0 -0
  161. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/models/slide.py +0 -0
  162. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/__init__.py +0 -0
  163. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/aperio.py +0 -0
  164. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/rest/image_browse_resource.py +0 -0
  165. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui/webroot.mako +0 -0
  166. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui.egg-info/dependency_links.txt +0 -0
  167. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui.egg-info/not-zip-safe +0 -0
  168. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/histomicsui.egg-info/top_level.txt +0 -0
  169. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/pyproject.toml +0 -0
  170. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/setup.cfg +0 -0
  171. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/__init__.py +0 -0
  172. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/datastore.py +0 -0
  173. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/girder_utilities.py +0 -0
  174. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/.histomicsui_config.yaml +0 -0
  175. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/sample.anot +0 -0
  176. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/sample.meta +0 -0
  177. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/sample_girder_id.anot +0 -0
  178. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/test_analysis_detection.xml +0 -0
  179. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_files/test_analysis_features.xml +0 -0
  180. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_image_browse_endpoints.py +0 -0
  181. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_load.py +0 -0
  182. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/test_tcga.py +0 -0
  183. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/.eslintrc +0 -0
  184. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/analysisSpec.js +0 -0
  185. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/annotationSpec.js +0 -0
  186. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/girderUISpec.js +0 -0
  187. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/huiSpec.js +0 -0
  188. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/huiTest.js +0 -0
  189. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/itemSpec.js +0 -0
  190. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/metadataPanelSpec.js +0 -0
  191. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/metadataPlotSpec.js +0 -0
  192. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/overviewPanelSpec.js +0 -0
  193. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/panelLayoutSpec.js +0 -0
  194. {histomicsui-1.7.2.dev2 → histomicsui-2.0.0a2}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
@@ -9,15 +9,59 @@ executors:
9
9
  command: bash -c "mkdir /dev/shm/mongo && mongod --nojournal --dbpath=/dev/shm/mongo --noauth --bind_ip_all"
10
10
  - image: rabbitmq
11
11
  commands:
12
+ use_nvm:
13
+ description: "Use nvm"
14
+ parameters:
15
+ node:
16
+ type: string
17
+ default: v20
18
+ steps:
19
+ - run:
20
+ name: Use nvm
21
+ # see https://discuss.circleci.com/t/nvm-does-not-change-node-version-on-machine/28973/14
22
+ command: |
23
+ echo 'export NVM_DIR="/root/.nvm"' >> $BASH_ENV
24
+ echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $BASH_ENV
25
+ - restore_cache:
26
+ name: Restore nvm cache
27
+ key: v1-nvm-cache-<< parameters.node >>
28
+ - run:
29
+ name: Switch node versions
30
+ command: |
31
+ nvm install << parameters.node >>
32
+ nvm alias default << parameters.node >>
33
+ NODE_DIR=$(dirname $(which node))
34
+ echo "export PATH=$NODE_DIR:\$PATH" >> $BASH_ENV
35
+ - run:
36
+ name: Check node versions
37
+ command: |
38
+ node --version
39
+ npm --version
40
+ build_client:
41
+ description: "Build HistomicsUI client"
42
+ steps:
43
+ - run:
44
+ name: Build client
45
+ command: |
46
+ pushd histomicsui/web_client
47
+ npm ci
48
+ npm run build
49
+ popd
50
+ install_playwright:
51
+ description: "Install playwright"
52
+ steps:
53
+ - run:
54
+ name: Install playwright with dependencies
55
+ command: |
56
+ pushd histomicsui/web_client
57
+ npx playwright install --with-deps
58
+ popd
12
59
  tox:
13
60
  description: "Run tox"
14
61
  parameters:
15
62
  env:
16
63
  type: string
17
64
  steps:
18
- - run:
19
- name: Preinstall phantomjs to work around an npm permission issue
20
- command: npm install -g phantomjs-prebuilt --unsafe-perm
21
65
  - run:
22
66
  name: Run tests via tox
23
67
  # Piping through cat does less buffering of the output but can
@@ -41,6 +85,8 @@ jobs:
41
85
  executor: toxandnode
42
86
  steps:
43
87
  - checkout
88
+ - use_nvm
89
+ - build_client
44
90
  - tox:
45
91
  env: py38
46
92
  - coverage
@@ -48,6 +94,8 @@ jobs:
48
94
  executor: toxandnode
49
95
  steps:
50
96
  - checkout
97
+ - use_nvm
98
+ - build_client
51
99
  - tox:
52
100
  env: py39
53
101
  - coverage
@@ -55,6 +103,8 @@ jobs:
55
103
  executor: toxandnode
56
104
  steps:
57
105
  - checkout
106
+ - use_nvm
107
+ - build_client
58
108
  - tox:
59
109
  env: py310
60
110
  - coverage
@@ -62,6 +112,8 @@ jobs:
62
112
  executor: toxandnode
63
113
  steps:
64
114
  - checkout
115
+ - use_nvm
116
+ - build_client
65
117
  - tox:
66
118
  env: py311
67
119
  - coverage
@@ -69,6 +121,8 @@ jobs:
69
121
  executor: toxandnode
70
122
  steps:
71
123
  - checkout
124
+ - use_nvm
125
+ - build_client
72
126
  - tox:
73
127
  env: py312
74
128
  - coverage
@@ -76,13 +130,30 @@ jobs:
76
130
  executor: toxandnode
77
131
  steps:
78
132
  - checkout
133
+ - use_nvm
134
+ - build_client
79
135
  - tox:
80
136
  env: py313
81
137
  - coverage
138
+ web_client:
139
+ executor: toxandnode
140
+ environment:
141
+ CI: "true"
142
+ HEADLESS: "true"
143
+ GIRDER_CLIENT_TESTING_MONGO_URI: mongodb://localhost:27017
144
+ steps:
145
+ - checkout
146
+ - use_nvm
147
+ - build_client
148
+ - install_playwright
149
+ - tox:
150
+ env: webtest
82
151
  noanalysis:
83
152
  executor: toxandnode
84
153
  steps:
85
154
  - checkout
155
+ - use_nvm
156
+ - build_client
86
157
  - tox:
87
158
  env: noanalysis
88
159
  - coverage
@@ -97,6 +168,8 @@ jobs:
97
168
  - image: girder/tox-and-node
98
169
  steps:
99
170
  - checkout
171
+ - use_nvm
172
+ - build_client
100
173
  - deploy:
101
174
  name: Run tests via tox
102
175
  # Piping through cat does less buffering of the output but can
@@ -163,6 +236,13 @@ workflows:
163
236
  branches:
164
237
  ignore:
165
238
  - gh-pages
239
+ - web_client:
240
+ filters:
241
+ tags:
242
+ only: /^v.*/
243
+ branches:
244
+ ignore:
245
+ - gh-pages
166
246
  - release:
167
247
  requires:
168
248
  - py38
@@ -176,4 +256,6 @@ workflows:
176
256
  tags:
177
257
  only: /^v.*/
178
258
  branches:
179
- only: master
259
+ only:
260
+ - master
261
+ - 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.7.2.dev2
3
+ Version: 2.0.0a2
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -21,8 +21,11 @@ Requires-Python: >=3.8
21
21
  Description-Content-Type: text/x-rst
22
22
  License-File: LICENSE
23
23
  License-File: NOTICE
24
- Requires-Dist: girder-large-image-annotation>=1.31.0
25
- Requires-Dist: girder-slicer-cli-web[girder]>=1.4.0
24
+ Requires-Dist: girder>=5.0.0a2
25
+ Requires-Dist: girder-large-image==1.32.2a115
26
+ Requires-Dist: girder-large-image-annotation==1.32.2a115
27
+ Requires-Dist: large-image-tasks==1.32.2a115
28
+ Requires-Dist: large-image-converter==1.32.2a115
26
29
  Requires-Dist: cachetools
27
30
  Requires-Dist: orjson
28
31
  Provides-Extra: analysis
@@ -110,6 +113,12 @@ Now install the histomicsui package, have Girder build its UI, and start the Gir
110
113
  girder build
111
114
  girder serve
112
115
 
116
+ Note that ``girder serve`` should only be used in development. In production, use a WSGI server such as gunicorn, e.g.::
117
+
118
+ .. code-block:: bash
119
+
120
+ gunicorn girder.wsgi:app --bind=localhost:8080 --workers=4 --preload
121
+
113
122
  To use Girder Worker:
114
123
 
115
124
  .. 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
@@ -50,7 +50,6 @@ _________________
50
50
  fillColor: rgba(255, 0, 0, 0.25)
51
51
  lineColor: rgb(255, 0, 0)
52
52
  lineWidth: 2
53
- hotkey: r
54
53
  -
55
54
  id: Green
56
55
  fillColor: rgba(0, 128, 0, 0.25)
@@ -62,19 +61,6 @@ _________________
62
61
  lineColor: rgb(0, 0, 255)
63
62
  lineWidth: 2
64
63
 
65
- If a hotkey is specified for a group, it will only be active if the group was loaded from the config file. That is, moving to another folder where the config file does not apply will disable the hotkey. If you want hotkeys to have modifiers (e.g., require that alt, ctrl, or meta be pressed or explicitly NOT pressed), you can add a hotkey section:
66
-
67
- ::
68
-
69
- ---
70
- hotkeys:
71
- -
72
- key: r
73
- ctrl: true
74
- alt: false
75
- action: group
76
- param: Red
77
-
78
64
  UI Settings
79
65
  ___________
80
66
 
@@ -19,10 +19,10 @@ import logging
19
19
  import os
20
20
  import re
21
21
  from functools import wraps
22
+ from pathlib import Path
22
23
 
23
- import cherrypy
24
24
  from bson import json_util
25
- from girder import events, logger, plugin
25
+ from girder import events, plugin
26
26
  from girder.api import access
27
27
  from girder.api.rest import getCurrentToken
28
28
  from girder.constants import AssetstoreType
@@ -32,13 +32,11 @@ from girder.models.file import File
32
32
  from girder.models.folder import Folder
33
33
  from girder.models.item import Item
34
34
  from girder.models.setting import Setting
35
- from girder.models.token import Token
36
- from girder.settings import SettingDefault, SettingKey
35
+ from girder.settings import SettingDefault
37
36
  from girder.utility import config
38
37
  from girder.utility import path as path_util
39
38
  from girder.utility import setting_utilities
40
39
  from girder.utility.model_importer import ModelImporter
41
- from girder.utility.webroot import Webroot
42
40
  from pkg_resources import DistributionNotFound, get_distribution
43
41
 
44
42
  from . import handlers, rest
@@ -56,16 +54,7 @@ except DistributionNotFound:
56
54
  # package is not installed
57
55
  pass
58
56
 
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
- )
57
+ logger = logging.getLogger(__name__)
69
58
 
70
59
 
71
60
  def patchCookieParsing():
@@ -99,42 +88,6 @@ def patchCookieParsing():
99
88
  pass
100
89
 
101
90
 
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
91
  @setting_utilities.validator({
139
92
  PluginSettings.HUI_DEFAULT_DRAW_STYLES,
140
93
  PluginSettings.HUI_PANEL_LAYOUT,
@@ -276,37 +229,6 @@ def _saveJob(event):
276
229
  pass
277
230
 
278
231
 
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
232
  def restrict_downloads(info):
311
233
  """
312
234
  If restrict_downloads is configured, modify endpoints to do that.
@@ -397,7 +319,6 @@ def cleanupFSAssetstores():
397
319
 
398
320
  class GirderPlugin(plugin.GirderPlugin):
399
321
  DISPLAY_NAME = 'HistomicsUI'
400
- CLIENT_SOURCE_PATH = 'web_client'
401
322
 
402
323
  def load(self, info): # noqa
403
324
  plugin.getPlugin('jobs').load(info)
@@ -422,8 +343,8 @@ class GirderPlugin(plugin.GirderPlugin):
422
343
  ModelImporter.registerModel('slide', Slide, 'histomicsui')
423
344
 
424
345
  rest.addEndpoints(info['apiRoot'])
425
- info['serverRoot'].updateHtmlVars({
426
- 'brandName': Setting().get(SettingKey.BRAND_NAME)})
346
+ # info['serverRoot'].updateHtmlVars({
347
+ # 'brandName': Setting().get(SettingKey.BRAND_NAME)})
427
348
  # Better virtual folder support
428
349
  if not getattr(Folder, '_childItemsBeforeHUI', None):
429
350
  Folder._childItemsBeforeHUI = Folder.childItems
@@ -443,24 +364,39 @@ class GirderPlugin(plugin.GirderPlugin):
443
364
 
444
365
  path_util.lookUpToken = lookUpToken
445
366
 
446
- girderRoot = info['serverRoot']
447
- huiRoot = WebrootHistomicsUI(_template)
448
- huiRoot.updateHtmlVars(girderRoot.vars)
449
-
450
- betterInvalidateJSandCSSCaches(girderRoot)
451
- betterInvalidateJSandCSSCaches(huiRoot)
367
+ plugin.registerPluginStaticContent(
368
+ 'histomicsui',
369
+ css=['/style.css'],
370
+ js=[
371
+ '/girder-plugin-histomics-ui.umd.cjs',
372
+ '/extra/plotly.js',
373
+ ],
374
+ staticDir=Path(__file__).parent / 'web_client' / 'dist',
375
+ tree=info['serverRoot'],
376
+ )
377
+
378
+ webroot = os.getenv('HUI_WEBROOT_PATH', False)
379
+ if webroot:
380
+ Setting().set(PluginSettings.HUI_WEBROOT_PATH, webroot)
381
+ info['serverRoot'].mount(None, f'/{Setting().get(PluginSettings.HUI_WEBROOT_PATH)}', {
382
+ '/': {
383
+ 'tools.staticdir.on': True,
384
+ 'tools.staticdir.dir': Path(__file__).parent / 'web_client' / 'dist-app',
385
+ 'tools.staticdir.index': 'index.html',
386
+ },
387
+ })
452
388
 
453
389
  # The interface is always available under hui and also available
454
390
  # 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
391
+ # TODO is something using the "hui" path?
392
+ # info['serverRoot'].hui = huiRoot
393
+ # TODO these settings are not honored at this point
394
+ # setattr(info['serverRoot'], webrootPath, huiRoot)
395
+ # if alternateWebrootPath:
396
+ # for alt_webroot_path in alternateWebrootPath.split(','):
397
+ # if alt_webroot_path:
398
+ # setattr(info['serverRoot'], alt_webroot_path, huiRoot)
399
+ # info['serverRoot'].girder = girderRoot
464
400
 
465
401
  # Auto-ingest annotations into database when a file with an identifier
466
402
  # ending in 'AnnotationFile' is uploaded (usually .anot files).
@@ -473,16 +409,5 @@ class GirderPlugin(plugin.GirderPlugin):
473
409
 
474
410
  handlers.json_nans_as_nulls()
475
411
 
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
412
  restrict_downloads(info)
488
413
  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']