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.
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/PKG-INFO +3 -3
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/models/image_item.py +68 -22
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/large_image_resource.py +5 -2
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/CompositeLayers.vue +2 -2
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/components.py +15 -6
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/PKG-INFO +3 -3
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/requires.txt +2 -2
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_large_image.py +4 -1
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_tiles_rest.py +7 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/LICENSE +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/README.rst +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/__init__.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/constants.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/girder_tilesource.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/loadmodelcache.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/models/__init__.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/__init__.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/item_meta.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/tiles.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/eventStream.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/extra/.gitignore +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/index.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/main.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/package.json +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/routes.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/fileList.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/imageViewerSelectWidget.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemList.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemView.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/itemViewCodemirror.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/largeImageConfig.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/stylesheets/metadataWidget.styl +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/imageViewerSelectWidget.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemList.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemView.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/itemViewCodemirror.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/largeImageConfig.pug +0 -0
- {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
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/metadataWidget.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/templates/metadatumEditWidget.pug +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/configView.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/fileList.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/imageViewerSelectWidget.js +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/index.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemList.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemView.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemViewCodemirror.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/itemViewWidget.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/views/metadataWidget.js +0 -0
- {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
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/webpack.helper.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/DualInput.vue +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/FrameSelector.vue +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/HistogramEditor.vue +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/web_client/widgets/colors.json +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/SOURCES.txt +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/dependency_links.txt +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/entry_points.txt +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/not-zip-safe +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image.egg-info/top_level.txt +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/pyproject.toml +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/setup.cfg +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/setup.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/__init__.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/conftest.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/girder_utilities.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_web_client.py +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/.eslintrc +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/imageViewerSpec.js +0 -0
- {girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/web_client_specs/largeImageSpec.js +0 -0
- {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.
|
|
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.
|
|
24
|
+
Requires-Dist: large_image>=1.32.3.dev3
|
|
25
25
|
Provides-Extra: tasks
|
|
26
|
-
Requires-Dist: large-image-tasks[girder]>=1.32.
|
|
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
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
-
|
|
478
|
-
self._getAndCacheImageOrDataLock['
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
10
|
-
with open(colors_file) as f:
|
|
9
|
+
with open(parent / 'colors.json') as f:
|
|
11
10
|
colors_data = json.load(f)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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.
|
|
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.
|
|
24
|
+
Requires-Dist: large_image>=1.32.3.dev3
|
|
25
25
|
Provides-Extra: tasks
|
|
26
|
-
Requires-Dist: large-image-tasks[girder]>=1.32.
|
|
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
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_large_image.py
RENAMED
|
@@ -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
|
-
|
|
466
|
+
ImageItem().cacheSaveDataManagement(None)
|
|
467
|
+
assert ImageItem().getAndCacheImageOrDataRun.call_count >= lastCount + 1
|
|
465
468
|
ImageItem().getAndCacheImageOrDataRun = orig
|
|
466
469
|
|
|
467
470
|
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_tiles_rest.py
RENAMED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/__init__.py
RENAMED
|
File without changes
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/girder_large_image/rest/tiles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/girder_utilities.py
RENAMED
|
File without changes
|
{girder_large_image-1.32.2.dev10 → girder_large_image-1.32.3.dev3}/test_girder/test_web_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|