girder-large-image 1.35.7.dev4__tar.gz → 1.35.7.dev8__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 (80) hide show
  1. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/PKG-INFO +3 -3
  2. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/__init__.py +50 -0
  3. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/PKG-INFO +3 -3
  4. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/requires.txt +2 -2
  5. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/test_tiles_rest.py +56 -0
  6. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/LICENSE +0 -0
  7. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/README.rst +0 -0
  8. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/constants.py +0 -0
  9. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/girder_tilesource.py +0 -0
  10. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/loadmodelcache.py +0 -0
  11. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/models/__init__.py +0 -0
  12. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/models/image_item.py +0 -0
  13. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/rest/__init__.py +0 -0
  14. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/rest/item_meta.py +0 -0
  15. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/rest/large_image_resource.py +0 -0
  16. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/rest/tiles.py +0 -0
  17. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/eventStream.js +0 -0
  18. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/extra/.gitignore +0 -0
  19. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/index.js +0 -0
  20. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/main.js +0 -0
  21. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/package.json +0 -0
  22. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/routes.js +0 -0
  23. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/fileList.styl +0 -0
  24. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/imageViewerSelectWidget.styl +0 -0
  25. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/itemList.styl +0 -0
  26. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/itemView.styl +0 -0
  27. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/itemViewCodemirror.styl +0 -0
  28. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/largeImageConfig.styl +0 -0
  29. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/stylesheets/metadataWidget.styl +0 -0
  30. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/imageViewerSelectWidget.pug +0 -0
  31. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/itemList.pug +0 -0
  32. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/itemView.pug +0 -0
  33. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/itemViewCodemirror.pug +0 -0
  34. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/largeImageConfig.pug +0 -0
  35. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/largeImage_fileAction.pug +0 -0
  36. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/metadataWidget.pug +0 -0
  37. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/templates/metadatumEditWidget.pug +0 -0
  38. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/configView.js +0 -0
  39. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/fileList.js +0 -0
  40. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerSelectWidget.js +0 -0
  41. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/base.js +0 -0
  42. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/geojs.js +0 -0
  43. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/index.js +0 -0
  44. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/leaflet.js +0 -0
  45. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/openlayers.js +0 -0
  46. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/openseadragon.js +0 -0
  47. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/setFrameQuad.js +0 -0
  48. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/imageViewerWidget/slideatlas.js +0 -0
  49. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/index.js +0 -0
  50. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/itemList.js +0 -0
  51. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/itemView.js +0 -0
  52. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/itemViewCodemirror.js +0 -0
  53. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/itemViewWidget.js +0 -0
  54. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/views/metadataWidget.js +0 -0
  55. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/vue/components/PresetsMenu.vue +0 -0
  56. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/webpack.helper.js +0 -0
  57. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/CompositeLayers.vue +0 -0
  58. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/DualInput.vue +0 -0
  59. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/FrameSelector.vue +0 -0
  60. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/HistogramEditor.vue +0 -0
  61. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/colors.json +0 -0
  62. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image/web_client/widgets/components.py +0 -0
  63. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/SOURCES.txt +0 -0
  64. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/dependency_links.txt +0 -0
  65. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/entry_points.txt +0 -0
  66. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/not-zip-safe +0 -0
  67. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/scm_file_list.json +0 -0
  68. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/girder_large_image.egg-info/top_level.txt +0 -0
  69. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/pyproject.toml +0 -0
  70. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/setup.cfg +0 -0
  71. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/setup.py +0 -0
  72. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/__init__.py +0 -0
  73. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/conftest.py +0 -0
  74. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/girder_utilities.py +0 -0
  75. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/test_large_image.py +0 -0
  76. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/test_web_client.py +0 -0
  77. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/web_client_specs/.eslintrc +0 -0
  78. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/web_client_specs/imageViewerSpec.js +0 -0
  79. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/web_client_specs/largeImageSpec.js +0 -0
  80. {girder_large_image-1.35.7.dev4 → girder_large_image-1.35.7.dev8}/test_girder/web_client_specs/otherFeatures.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder-large-image
3
- Version: 1.35.7.dev4
3
+ Version: 1.35.7.dev8
4
4
  Summary: A Girder plugin to work with large, multiresolution images.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -20,9 +20,9 @@ Description-Content-Type: text/x-rst
20
20
  License-File: LICENSE
21
21
  Requires-Dist: girder<5,>=3.1.18
22
22
  Requires-Dist: girder-jobs<5,>=3.0.3
23
- Requires-Dist: large_image>=1.35.7.dev4
23
+ Requires-Dist: large_image>=1.35.7.dev8
24
24
  Provides-Extra: tasks
25
- Requires-Dist: large-image-tasks[girder]>=1.35.7.dev4; extra == "tasks"
25
+ Requires-Dist: large-image-tasks[girder]>=1.35.7.dev8; extra == "tasks"
26
26
  Requires-Dist: girder-worker[girder]<5,>=0.6.0; extra == "tasks"
27
27
  Dynamic: author
28
28
  Dynamic: author-email
@@ -207,6 +207,45 @@ def checkForMergeDicom(item):
207
207
  Item().remove(item)
208
208
 
209
209
 
210
+ def checkForFlatLargeImage(item, imagePattern):
211
+ """
212
+ Check if an item that contains a companion file of a folder/image style
213
+ image is adjacent to the image file itself ("flat" layout). The image
214
+ file can be another file in the same item or the sole file of another item
215
+ in the same folder. If found, try to make it a large image.
216
+
217
+ :param item: the item containing the companion file.
218
+ :param imagePattern: a regex that matches the name of the image file.
219
+ :returns: True if a large image was created.
220
+ """
221
+ # A failed createImageItem can leave a partial largeImage record on the
222
+ # in-memory item, so always use a fresh copy
223
+ item = Item().load(item['_id'], force=True)
224
+ if not item.get('largeImage'):
225
+ for imageFile in File().find({'itemId': item['_id']}):
226
+ if not re.search(imagePattern, imageFile['name']):
227
+ continue
228
+ try:
229
+ ImageItem().createImageItem(item, imageFile, createJob=False)
230
+ return True
231
+ except Exception:
232
+ item = Item().load(item['_id'], force=True)
233
+ for imageItem in Item().find({
234
+ 'folderId': item['folderId'], '_id': {'$ne': item['_id']},
235
+ 'name': {'$regex': imagePattern}}):
236
+ if imageItem.get('largeImage'):
237
+ continue
238
+ files = list(Item().childFiles(item=imageItem, limit=2))
239
+ if len(files) != 1:
240
+ continue
241
+ try:
242
+ ImageItem().createImageItem(imageItem, files[0], createJob=False)
243
+ return True
244
+ except Exception:
245
+ pass
246
+ return False
247
+
248
+
210
249
  def checkForLargeImageFiles(event): # noqa
211
250
  file = event.info
212
251
  if 'file.save' in event.name and 's3FinalizeRequest' in file:
@@ -245,6 +284,11 @@ def checkForLargeImageFiles(event): # noqa
245
284
  'up': 1,
246
285
  'folder': r'^(.*)$',
247
286
  'image': '\\1.mrxs',
287
+ # Some openslide builds can read "flat" mirax files where the
288
+ # companion files are adjacent to the .mrxs file rather than in a
289
+ # subfolder. The companion files can be sibling items in the same
290
+ # folder or sibling files in the same item.
291
+ 'flat': r'\.mrxs$',
248
292
  },
249
293
  'vsi': {
250
294
  'match': r'^.*\.ets$',
@@ -255,6 +299,12 @@ def checkForLargeImageFiles(event): # noqa
255
299
  }
256
300
  for check in imageFolderRecords.values():
257
301
  if re.match(check['match'], file['name']):
302
+ if check.get('flat'):
303
+ try:
304
+ if checkForFlatLargeImage(item, check['flat']):
305
+ return
306
+ except Exception:
307
+ pass
258
308
  try:
259
309
  folderId = item['folderId']
260
310
  folder = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder-large-image
3
- Version: 1.35.7.dev4
3
+ Version: 1.35.7.dev8
4
4
  Summary: A Girder plugin to work with large, multiresolution images.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -20,9 +20,9 @@ Description-Content-Type: text/x-rst
20
20
  License-File: LICENSE
21
21
  Requires-Dist: girder<5,>=3.1.18
22
22
  Requires-Dist: girder-jobs<5,>=3.0.3
23
- Requires-Dist: large_image>=1.35.7.dev4
23
+ Requires-Dist: large_image>=1.35.7.dev8
24
24
  Provides-Extra: tasks
25
- Requires-Dist: large-image-tasks[girder]>=1.35.7.dev4; extra == "tasks"
25
+ Requires-Dist: large-image-tasks[girder]>=1.35.7.dev8; extra == "tasks"
26
26
  Requires-Dist: girder-worker[girder]<5,>=0.6.0; extra == "tasks"
27
27
  Dynamic: author
28
28
  Dynamic: author-email
@@ -1,7 +1,7 @@
1
1
  girder<5,>=3.1.18
2
2
  girder-jobs<5,>=3.0.3
3
- large_image>=1.35.7.dev4
3
+ large_image>=1.35.7.dev8
4
4
 
5
5
  [tasks]
6
- large-image-tasks[girder]>=1.35.7.dev4
6
+ large-image-tasks[girder]>=1.35.7.dev8
7
7
  girder-worker[girder]<5,>=0.6.0
@@ -1142,6 +1142,62 @@ def testTilesAutoSetOption(server, admin, fsAssetstore):
1142
1142
  assert utilities.respStatus(resp) == 200
1143
1143
 
1144
1144
 
1145
+ @pytest.mark.usefixtures('unbindLargeImage')
1146
+ @pytest.mark.plugin('large_image')
1147
+ def testTilesAutoSetMiraxCompanionFiles(server, admin, fsAssetstore, tmp_path):
1148
+ # Mirax images are a small .mrxs file plus companion files, normally in a
1149
+ # subfolder named after the image. Some openslide builds can also read a
1150
+ # "flat" layout where the companion files are adjacent to the .mrxs file.
1151
+ # Adding the .mrxs file by itself can't make a large image, but adding the
1152
+ # companion files afterwards should. Files are imported rather than
1153
+ # uploaded so that openslide can find the companion files on disk.
1154
+ import zipfile
1155
+
1156
+ from girder.models.folder import Folder
1157
+ from girder.utility import assetstore_utilities
1158
+
1159
+ name = 'Mirax2-Fluorescence-1'
1160
+ with zipfile.ZipFile(utilities.datastore.fetch(name + '.mrxs.zip')) as archive:
1161
+ archive.extractall(tmp_path / 'src')
1162
+ srcMrxs = tmp_path / 'src' / (name + '.mrxs')
1163
+ srcCompanions = tmp_path / 'src' / name
1164
+ adapter = assetstore_utilities.getAssetstoreAdapter(fsAssetstore)
1165
+ public = utilities.namedFolder(admin)
1166
+
1167
+ for layout in ('nested', 'flat', 'item'):
1168
+ dest = tmp_path / layout
1169
+ dest.mkdir()
1170
+ shutil.copy(srcMrxs, dest)
1171
+ folder = Folder().createFolder(public, layout, creator=admin)
1172
+ item = Item().createItem(name + '.mrxs', admin, folder)
1173
+ mrxsFile = adapter.importFile(item, str(dest / (name + '.mrxs')), admin)
1174
+ # Without the companion files, this isn't a large image
1175
+ assert 'largeImage' not in Item().load(item['_id'], force=True)
1176
+ if layout == 'nested':
1177
+ companionDir = dest / name
1178
+ companionFolder = Folder().createFolder(folder, name, creator=admin)
1179
+ else:
1180
+ companionDir = dest
1181
+ companionFolder = folder
1182
+ shutil.copytree(srcCompanions, companionDir, dirs_exist_ok=True)
1183
+ # Slidedat.ini is what triggers rechecking the .mrxs file, so add it
1184
+ # last
1185
+ paths = sorted(path for path in companionDir.iterdir() if path.suffix == '.dat')
1186
+ paths.append(companionDir / 'Slidedat.ini')
1187
+ for path in paths:
1188
+ if layout == 'item':
1189
+ companionItem = item
1190
+ else:
1191
+ companionItem = Item().createItem(path.name, admin, companionFolder)
1192
+ adapter.importFile(companionItem, str(path), admin)
1193
+ item = Item().load(item['_id'], force=True)
1194
+ assert item.get('largeImage', {}).get('fileId') == mrxsFile['_id'], layout
1195
+ resp = server.request(path='/item/%s/tiles' % item['_id'], user=admin)
1196
+ assert utilities.respStatus(resp) == 200
1197
+ assert resp.json['sizeX'] == 10487
1198
+ assert resp.json['sizeY'] == 13350
1199
+
1200
+
1145
1201
  @pytest.mark.usefixtures('unbindLargeImage')
1146
1202
  @pytest.mark.plugin('large_image')
1147
1203
  def testTilesAssociatedImages(server, admin, fsAssetstore):