girder-large-image 1.32.2.dev10__tar.gz → 1.32.3.dev3__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 (79) hide show
  1. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/PKG-INFO +3 -3
  2. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/models/image_item.py +68 -22
  3. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/large_image_resource.py +5 -2
  4. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/CompositeLayers.vue +2 -2
  5. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/components.py +15 -6
  6. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/PKG-INFO +3 -3
  7. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/requires.txt +2 -2
  8. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_large_image.py +4 -1
  9. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_tiles_rest.py +7 -0
  10. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/LICENSE +0 -0
  11. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/README.rst +0 -0
  12. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/__init__.py +0 -0
  13. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/constants.py +0 -0
  14. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/girder_tilesource.py +0 -0
  15. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/loadmodelcache.py +0 -0
  16. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/models/__init__.py +0 -0
  17. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/__init__.py +0 -0
  18. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/item_meta.py +0 -0
  19. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/tiles.py +0 -0
  20. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/eventStream.js +0 -0
  21. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/extra/.gitignore +0 -0
  22. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/index.js +0 -0
  23. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/main.js +0 -0
  24. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/package.json +0 -0
  25. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/routes.js +0 -0
  26. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/fileList.styl +0 -0
  27. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/imageViewerSelectWidget.styl +0 -0
  28. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemList.styl +0 -0
  29. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemView.styl +0 -0
  30. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemViewCodemirror.styl +0 -0
  31. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/largeImageConfig.styl +0 -0
  32. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/metadataWidget.styl +0 -0
  33. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/imageViewerSelectWidget.pug +0 -0
  34. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemList.pug +0 -0
  35. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemView.pug +0 -0
  36. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemViewCodemirror.pug +0 -0
  37. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/largeImageConfig.pug +0 -0
  38. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/largeImage_fileAction.pug +0 -0
  39. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/metadataWidget.pug +0 -0
  40. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/metadatumEditWidget.pug +0 -0
  41. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/configView.js +0 -0
  42. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/fileList.js +0 -0
  43. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerSelectWidget.js +0 -0
  44. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/base.js +0 -0
  45. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/geojs.js +0 -0
  46. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/index.js +0 -0
  47. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/leaflet.js +0 -0
  48. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/openlayers.js +0 -0
  49. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/openseadragon.js +0 -0
  50. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/setFrameQuad.js +0 -0
  51. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerWidget/slideatlas.js +0 -0
  52. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/index.js +0 -0
  53. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemList.js +0 -0
  54. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemView.js +0 -0
  55. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemViewCodemirror.js +0 -0
  56. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemViewWidget.js +0 -0
  57. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/metadataWidget.js +0 -0
  58. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/vue/components/PresetsMenu.vue +0 -0
  59. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/webpack.helper.js +0 -0
  60. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/DualInput.vue +0 -0
  61. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/FrameSelector.vue +0 -0
  62. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/HistogramEditor.vue +0 -0
  63. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/colors.json +0 -0
  64. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/SOURCES.txt +0 -0
  65. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/dependency_links.txt +0 -0
  66. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/entry_points.txt +0 -0
  67. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/not-zip-safe +0 -0
  68. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/top_level.txt +0 -0
  69. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/pyproject.toml +0 -0
  70. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/setup.cfg +0 -0
  71. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/setup.py +0 -0
  72. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/__init__.py +0 -0
  73. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/conftest.py +0 -0
  74. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/girder_utilities.py +0 -0
  75. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_web_client.py +0 -0
  76. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/.eslintrc +0 -0
  77. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/imageViewerSpec.js +0 -0
  78. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/largeImageSpec.js +0 -0
  79. {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/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.32.2.dev10
3
+ Version: 1.32.3.dev3
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.
@@ -21,9 +21,9 @@ Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
22
  Requires-Dist: girder>=3.1.18
23
23
  Requires-Dist: girder-jobs>=3.0.3
24
- Requires-Dist: large_image>=1.32.2.dev10
24
+ Requires-Dist: large_image>=1.32.3.dev3
25
25
  Provides-Extra: tasks
26
- Requires-Dist: large-image-tasks[girder]>=1.32.2.dev10; extra == "tasks"
26
+ Requires-Dist: large-image-tasks[girder]>=1.32.3.dev3; extra == "tasks"
27
27
  Requires-Dist: girder-worker[girder]>=0.6.0; extra == "tasks"
28
28
  Dynamic: author
29
29
  Dynamic: author-email
@@ -39,6 +39,9 @@ from .. import constants, girder_tilesource
39
39
 
40
40
 
41
41
  class ImageItem(Item):
42
+ _cacheSaveDataLock = threading.RLock()
43
+ _cacheSaveDataThreads = []
44
+
42
45
  # We try these sources in this order. The first entry is the fallback for
43
46
  # items that antedate there being multiple options.
44
47
  def initialize(self):
@@ -419,6 +422,58 @@ class ImageItem(Item):
419
422
  return self.getAndCacheImageOrDataRun(
420
423
  checkAndCreate, imageFunc, item, key, keydict, pickleCache, lockkey, **kwargs)
421
424
 
425
+ def _saveDataFile(self, item, imageMime, dataStored, key, pickleCache, keylock, lockkey):
426
+ with keylock:
427
+ # Save the data as a file
428
+ try:
429
+ datafile = Upload().uploadFromFile(
430
+ io.BytesIO(dataStored), size=len(dataStored),
431
+ name='_largeImageThumbnail', parentType='item', parent=item,
432
+ user=None, mimeType=imageMime, attachParent=True)
433
+ if not len(dataStored) and 'received' in datafile:
434
+ datafile = Upload().finalizeUpload(
435
+ datafile, Assetstore().load(datafile['assetstoreId']))
436
+ datafile.update({
437
+ 'isLargeImageThumbnail' if not pickleCache else
438
+ 'isLargeImageData': True,
439
+ 'thumbnailKey': key,
440
+ })
441
+ # Ideally, we would check that the file is still wanted before
442
+ # we save it. This is probably impossible without true
443
+ # transactions in Mongo.
444
+ File().save(datafile)
445
+ except (GirderException, PermissionError, FileNotFoundError):
446
+ logger.warning('Could not cache data for large image')
447
+ finally:
448
+ with self._getAndCacheImageOrDataLock['lock']:
449
+ self._getAndCacheImageOrDataLock['keys'].pop(lockkey, None)
450
+
451
+ def cacheSaveDataManagement(self, timeout=0.0):
452
+ """
453
+ Check any of the threads used for caching data from slow functions and
454
+ join those that are finished.
455
+
456
+ :param timeout: 0 to return without blocking, just harvesting the
457
+ finished threads. None to block until all are finished. Since all
458
+ threads will be checked, specifying a positive timeout will
459
+ possibly take that long times the number of threads.
460
+ :returns: the number of active threads
461
+ """
462
+ with self._cacheSaveDataLock:
463
+ numthreads = len(self._cacheSaveDataThreads)
464
+ for idx in range(numthreads - 1, -1, -1):
465
+ with self._cacheSaveDataLock:
466
+ if idx >= len(self._cacheSaveDataThreads):
467
+ continue
468
+ t = self._cacheSaveDataThreads[idx]
469
+ t.join(timeout)
470
+ if not t.is_alive():
471
+ with self._cacheSaveDataLock:
472
+ self._cacheSaveDataThreads.remove(t)
473
+ with self._cacheSaveDataLock:
474
+ numthreads = len(self._cacheSaveDataThreads)
475
+ return numthreads
476
+
422
477
  def getAndCacheImageOrDataRun(
423
478
  self, checkAndCreate, imageFunc, item, key, keydict, pickleCache, lockkey, **kwargs):
424
479
  """
@@ -428,6 +483,7 @@ class ImageItem(Item):
428
483
  if lockkey not in self._getAndCacheImageOrDataLock['keys']:
429
484
  self._getAndCacheImageOrDataLock['keys'][lockkey] = threading.Lock()
430
485
  keylock = self._getAndCacheImageOrDataLock['keys'][lockkey]
486
+ nounlock = False
431
487
  with keylock:
432
488
  logger.debug('Computing %r', (lockkey, ))
433
489
  try:
@@ -452,30 +508,20 @@ class ImageItem(Item):
452
508
  pickleCache or isinstance(imageData, bytes))):
453
509
  dataStored = imageData if not pickleCache else pickle.dumps(
454
510
  imageData, protocol=4)
455
- # Save the data as a file
456
- try:
457
- datafile = Upload().uploadFromFile(
458
- io.BytesIO(dataStored), size=len(dataStored),
459
- name='_largeImageThumbnail', parentType='item', parent=item,
460
- user=None, mimeType=imageMime, attachParent=True)
461
- if not len(dataStored) and 'received' in datafile:
462
- datafile = Upload().finalizeUpload(
463
- datafile, Assetstore().load(datafile['assetstoreId']))
464
- datafile.update({
465
- 'isLargeImageThumbnail' if not pickleCache else
466
- 'isLargeImageData': True,
467
- 'thumbnailKey': key,
468
- })
469
- # Ideally, we would check that the file is still wanted before
470
- # we save it. This is probably impossible without true
471
- # transactions in Mongo.
472
- File().save(datafile)
473
- except (GirderException, PermissionError):
474
- logger.warning('Could not cache data for large image')
511
+ self.cacheSaveDataManagement()
512
+ with self._cacheSaveDataLock:
513
+ t = threading.Thread(
514
+ target=self._saveDataFile,
515
+ args=(item, imageMime, dataStored, key, pickleCache, keylock, lockkey),
516
+ daemon=True)
517
+ t.start()
518
+ self._cacheSaveDataThreads.append(t)
519
+ nounlock = True
475
520
  return imageData, imageMime
476
521
  finally:
477
- with self._getAndCacheImageOrDataLock['lock']:
478
- self._getAndCacheImageOrDataLock['keys'].pop(lockkey, None)
522
+ if not nounlock:
523
+ with self._getAndCacheImageOrDataLock['lock']:
524
+ self._getAndCacheImageOrDataLock['keys'].pop(lockkey, None)
479
525
 
480
526
  def removeThumbnailFiles(self, item, keep=0, sort=None, imageKey=None,
481
527
  onlyList=False, **kwargs):
@@ -102,7 +102,10 @@ def createThumbnailsJobLog(job, info, prefix='', status=None):
102
102
  msg += 'Failed on %d thumbnail file%s (last failure on item %s)\n' % (
103
103
  info['failed'],
104
104
  's' if info['failed'] != 1 else '', info['lastFailed'])
105
- job = Job().updateJob(job, log=msg, status=status)
105
+ try:
106
+ job = Job().updateJob(job, log=msg, status=status)
107
+ except TypeError:
108
+ pass
106
109
  return job, msg
107
110
 
108
111
 
@@ -115,7 +118,7 @@ def cursorNextOrNone(cursor):
115
118
  :returns: the next value or None.
116
119
  """
117
120
  try:
118
- return cursor.next()
121
+ return cursor.next() # B305
119
122
  except StopIteration:
120
123
  return None
121
124
 
@@ -504,14 +504,14 @@ module.exports = {
504
504
  cursor: pointer;
505
505
  }
506
506
  .picker{
507
- background-color: white;
507
+ background-color: transparent;
508
508
  border: none;
509
509
  width: 100%
510
510
  }
511
511
  .table-header {
512
512
  position: sticky;
513
513
  top: 0px;
514
- background-color: white;
514
+ background-color: transparent;
515
515
  z-index: 2;
516
516
  border-bottom: 3px solid !important;
517
517
  }
@@ -6,13 +6,14 @@ import ipyvue
6
6
  import traitlets
7
7
 
8
8
  parent = Path(__file__).parent
9
- colors_file = parent / 'colors.json'
10
- with open(colors_file) as f:
9
+ with open(parent / 'colors.json') as f:
11
10
  colors_data = json.load(f)
12
-
13
- ipyvue.register_component_from_file(None, 'dual-input', parent / 'DualInput.vue')
14
- ipyvue.register_component_from_file(None, 'composite-layers', parent / 'CompositeLayers.vue')
15
- ipyvue.register_component_from_file(None, 'histogram-editor', parent / 'HistogramEditor.vue')
11
+ with open(parent / 'DualInput.vue') as f:
12
+ dual_input = f.read()
13
+ with open(parent / 'CompositeLayers.vue') as f:
14
+ composite_layers = f.read()
15
+ with open(parent / 'HistogramEditor.vue') as f:
16
+ histogram_editor = f.read()
16
17
 
17
18
 
18
19
  class FrameSelector(ipyvue.VueTemplate): # type: ignore
@@ -27,6 +28,14 @@ class FrameSelector(ipyvue.VueTemplate): # type: ignore
27
28
  updateFrameCallback: Union[Callable, None] = None
28
29
  getFrameHistogram: Union[Callable, None] = None
29
30
 
31
+ # register_component_from_file function does not work in Google Colab;
32
+ # register child components from strings instead
33
+ components = traitlets.Dict({
34
+ 'dual-input': dual_input,
35
+ 'composite-layers': composite_layers,
36
+ 'histogram-editor': histogram_editor,
37
+ }).tag(sync=True)
38
+
30
39
  def vue_frameUpdate(self, data=None):
31
40
  frame = int(data.get('frame', 0))
32
41
  style = data.get('style', {})
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder-large-image
3
- Version: 1.32.2.dev10
3
+ Version: 1.32.3.dev3
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.
@@ -21,9 +21,9 @@ Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
22
  Requires-Dist: girder>=3.1.18
23
23
  Requires-Dist: girder-jobs>=3.0.3
24
- Requires-Dist: large_image>=1.32.2.dev10
24
+ Requires-Dist: large_image>=1.32.3.dev3
25
25
  Provides-Extra: tasks
26
- Requires-Dist: large-image-tasks[girder]>=1.32.2.dev10; extra == "tasks"
26
+ Requires-Dist: large-image-tasks[girder]>=1.32.3.dev3; extra == "tasks"
27
27
  Requires-Dist: girder-worker[girder]>=0.6.0; extra == "tasks"
28
28
  Dynamic: author
29
29
  Dynamic: author-email
@@ -1,7 +1,7 @@
1
1
  girder>=3.1.18
2
2
  girder-jobs>=3.0.3
3
- large_image>=1.32.2.dev10
3
+ large_image>=1.32.3.dev3
4
4
 
5
5
  [tasks]
6
- large-image-tasks[girder]>=1.32.2.dev10
6
+ large-image-tasks[girder]>=1.32.3.dev3
7
7
  girder-worker[girder]>=0.6.0
@@ -350,6 +350,7 @@ def testAssociateImageCaching(server, admin, user, fsAssetstore):
350
350
  # Test GET associated_images
351
351
  resp = server.request(path='/large_image/associated_images', user=user)
352
352
  assert utilities.respStatus(resp) == 403
353
+ ImageItem().cacheSaveDataManagement(None)
353
354
  resp = server.request(path='/large_image/associated_images', user=admin)
354
355
  assert utilities.respStatus(resp) == 200
355
356
  assert resp.json == 1
@@ -423,6 +424,7 @@ def testHistogramCaching(server, admin, user, fsAssetstore):
423
424
  # Test GET histograms
424
425
  resp = server.request(path='/large_image/histograms', user=user)
425
426
  assert utilities.respStatus(resp) == 403
427
+ ImageItem().cacheSaveDataManagement(None)
426
428
  resp = server.request(path='/large_image/histograms', user=admin)
427
429
  assert utilities.respStatus(resp) == 200
428
430
  assert resp.json == 1
@@ -461,7 +463,8 @@ def testHistogramConcurrentCaching(server, admin, user, fsAssetstore):
461
463
  t2.start()
462
464
  t1.join()
463
465
  t2.join()
464
- assert ImageItem().getAndCacheImageOrDataRun.call_count == lastCount + 1
466
+ ImageItem().cacheSaveDataManagement(None)
467
+ assert ImageItem().getAndCacheImageOrDataRun.call_count >= lastCount + 1
465
468
  ImageItem().getAndCacheImageOrDataRun = orig
466
469
 
467
470
 
@@ -719,6 +719,7 @@ def testContentDisposition(server, admin, fsAssetstore):
719
719
  assert (
720
720
  resp.headers.get('Content-Disposition') is None or
721
721
  'largeImageThumbnail' in resp.headers['Content-Disposition'])
722
+ ImageItem().cacheSaveDataManagement(None)
722
723
 
723
724
 
724
725
  @pytest.mark.usefixtures('unbindLargeImage')
@@ -736,6 +737,7 @@ def testContentDispositionFilename(server, admin, fsAssetstore):
736
737
  assert utilities.respStatus(resp) == 200
737
738
  assert resp.headers['Content-Disposition'].startswith('attachment')
738
739
  assert resp.headers['Content-Disposition'].endswith('.jpg')
740
+ ImageItem().cacheSaveDataManagement(None)
739
741
 
740
742
 
741
743
  @pytest.mark.usefixtures('unbindLargeImage')
@@ -1169,6 +1171,7 @@ def testTilesAssociatedImages(server, admin, fsAssetstore):
1169
1171
  assert utilities.respStatus(resp) == 200
1170
1172
  image = utilities.getBody(resp, text=False)
1171
1173
  assert image == b''
1174
+ ImageItem().cacheSaveDataManagement(None)
1172
1175
 
1173
1176
 
1174
1177
  @pytest.mark.usefixtures('unbindLargeImage')
@@ -1234,6 +1237,7 @@ def testTilesHistogram(server, admin, fsAssetstore):
1234
1237
  'roundRange': True, 'bins': 512})
1235
1238
  assert len(resp.json) == 3
1236
1239
  assert len(resp.json[0]['hist']) == 256
1240
+ ImageItem().cacheSaveDataManagement(None)
1237
1241
 
1238
1242
 
1239
1243
  @pytest.mark.usefixtures('unbindLargeImage')
@@ -1507,6 +1511,7 @@ def testThumbnailMaintenance(server, admin, fsAssetstore):
1507
1511
  resp = server.request(path='/item/%s/tiles/thumbnail' % itemId,
1508
1512
  user=admin, isJson=False)
1509
1513
  assert utilities.respStatus(resp) == 200
1514
+ ImageItem().cacheSaveDataManagement(None)
1510
1515
 
1511
1516
  # Check that we list a thumbnail
1512
1517
  resp = server.request(path='/item/%s/tiles/thumbnails' % itemId, user=admin)
@@ -1533,6 +1538,7 @@ def testThumbnailMaintenance(server, admin, fsAssetstore):
1533
1538
  resp = server.request(path='/item/%s/tiles/thumbnail' % itemId,
1534
1539
  user=admin, isJson=False)
1535
1540
  assert utilities.respStatus(resp) == 200
1541
+ ImageItem().cacheSaveDataManagement(None)
1536
1542
  thumb = utilities.getBody(resp, text=False)
1537
1543
  resp = server.request(path='/item/%s/tiles/thumbnails' % itemId, user=admin)
1538
1544
  assert utilities.respStatus(resp) == 200
@@ -1552,6 +1558,7 @@ def testThumbnailMaintenance(server, admin, fsAssetstore):
1552
1558
  path='/item/%s/tiles/thumbnails' % itemId, method='POST', user=admin,
1553
1559
  params={'key': key}, body=thumb, type='application/octet-stream')
1554
1560
 
1561
+ ImageItem().cacheSaveDataManagement(None)
1555
1562
  resp = server.request(path='/item/%s/tiles/thumbnails' % itemId, user=admin)
1556
1563
  assert utilities.respStatus(resp) == 200
1557
1564
  assert len(resp.json) == 1