large-image 1.27.1.dev30__tar.gz → 1.27.1.dev34__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.
- {large-image-1.27.1.dev30/large_image.egg-info → large-image-1.27.1.dev34}/PKG-INFO +1 -1
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/cache_util/cache.py +17 -11
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/config.py +4 -2
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/base.py +187 -127
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/utilities.py +27 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34/large_image.egg-info}/PKG-INFO +1 -1
- large-image-1.27.1.dev34/large_image.egg-info/requires.txt +145 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/setup.py +1 -0
- large-image-1.27.1.dev30/large_image.egg-info/requires.txt +0 -144
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/LICENSE +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/NOTICE +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/README.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/annotations.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/caching.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/conf.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/config_options.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/development.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/example_usage.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/girder_annotation_config_options.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/girder_config_options.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/image_conversion.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/index.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/large_image_examples.ipynb +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/make_docs.sh +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/multi_source_specification.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/notebooks.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/static/custom.css +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/tilesource_options.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/docs/upgrade.rst +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/__init__.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/cache_util/__init__.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/cache_util/base.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/cache_util/cachefactory.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/cache_util/memcache.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/constants.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/exceptions.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/__init__.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/geo.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/jupyter.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/stylefuncs.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image/tilesource/tiledict.py +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image.egg-info/SOURCES.txt +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image.egg-info/dependency_links.txt +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image.egg-info/not-zip-safe +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/large_image.egg-info/top_level.txt +0 -0
- {large-image-1.27.1.dev30 → large-image-1.27.1.dev34}/setup.cfg +0 -0
|
@@ -2,26 +2,32 @@ import functools
|
|
|
2
2
|
import pickle
|
|
3
3
|
import threading
|
|
4
4
|
import uuid
|
|
5
|
+
from typing import Any, Callable, Dict, Optional, TypeVar
|
|
6
|
+
|
|
7
|
+
from typing_extensions import ParamSpec
|
|
5
8
|
|
|
6
9
|
try:
|
|
7
10
|
import resource
|
|
11
|
+
HAS_RESOURCE = True
|
|
8
12
|
except ImportError:
|
|
9
|
-
|
|
13
|
+
HAS_RESOURCE = False
|
|
10
14
|
|
|
11
15
|
from .. import config
|
|
12
16
|
from .cachefactory import CacheFactory, pickAvailableCache
|
|
13
17
|
|
|
18
|
+
P = ParamSpec('P')
|
|
19
|
+
T = TypeVar('T')
|
|
20
|
+
|
|
14
21
|
_tileCache = None
|
|
15
22
|
_tileLock = None
|
|
16
23
|
|
|
17
24
|
_cacheLockKeyToken = '_cacheLock_key'
|
|
18
25
|
|
|
19
|
-
|
|
20
26
|
# If we have a resource module, ask to use as many file handles as the hard
|
|
21
27
|
# limit allows, then calculate how may tile sources we can have open based on
|
|
22
28
|
# the actual limit.
|
|
23
29
|
MaximumTileSources = 10
|
|
24
|
-
if
|
|
30
|
+
if HAS_RESOURCE:
|
|
25
31
|
try:
|
|
26
32
|
SoftNoFile, HardNoFile = resource.getrlimit(resource.RLIMIT_NOFILE)
|
|
27
33
|
resource.setrlimit(resource.RLIMIT_NOFILE, (HardNoFile, HardNoFile))
|
|
@@ -29,7 +35,7 @@ if resource:
|
|
|
29
35
|
# Reserve some file handles for general use, and expect that tile
|
|
30
36
|
# sources could use many handles each. This is conservative, since
|
|
31
37
|
# running out of file handles breaks the program in general.
|
|
32
|
-
MaximumTileSources = max(3, (SoftNoFile - 10)
|
|
38
|
+
MaximumTileSources = max(3, (SoftNoFile - 10) // 20)
|
|
33
39
|
except Exception:
|
|
34
40
|
pass
|
|
35
41
|
|
|
@@ -47,7 +53,7 @@ CacheProperties = {
|
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
|
|
50
|
-
def strhash(*args, **kwargs):
|
|
56
|
+
def strhash(*args, **kwargs) -> str:
|
|
51
57
|
"""
|
|
52
58
|
Generate a string hash value for an arbitrary set of args and kwargs. This
|
|
53
59
|
relies on the repr of each element.
|
|
@@ -61,7 +67,7 @@ def strhash(*args, **kwargs):
|
|
|
61
67
|
return '%r' % (args, )
|
|
62
68
|
|
|
63
69
|
|
|
64
|
-
def methodcache(key=None): # noqa
|
|
70
|
+
def methodcache(key: Optional[Callable] = None) -> Callable: # noqa
|
|
65
71
|
"""
|
|
66
72
|
Decorator to wrap a function with a memoizing callable that saves results
|
|
67
73
|
in self.cache. This is largely taken from cachetools, but uses a cache
|
|
@@ -70,9 +76,9 @@ def methodcache(key=None): # noqa
|
|
|
70
76
|
|
|
71
77
|
:param key: if a function, use that for the key, otherwise use self.wrapKey.
|
|
72
78
|
"""
|
|
73
|
-
def decorator(func):
|
|
79
|
+
def decorator(func: Callable[P, T]) -> Callable[..., T]:
|
|
74
80
|
@functools.wraps(func)
|
|
75
|
-
def wrapper(self, *args, **kwargs):
|
|
81
|
+
def wrapper(self, *args: P.args, **kwargs: P.kwargs) -> T:
|
|
76
82
|
k = key(*args, **kwargs) if key else self.wrapKey(*args, **kwargs)
|
|
77
83
|
lock = getattr(self, 'cache_lock', None)
|
|
78
84
|
ck = getattr(self, '_classkey', None)
|
|
@@ -115,8 +121,8 @@ def methodcache(key=None): # noqa
|
|
|
115
121
|
|
|
116
122
|
|
|
117
123
|
class LruCacheMetaclass(type):
|
|
118
|
-
namedCaches = {}
|
|
119
|
-
classCaches = {}
|
|
124
|
+
namedCaches: Dict[str, Any] = {}
|
|
125
|
+
classCaches: Dict[type, Any] = {}
|
|
120
126
|
|
|
121
127
|
def __new__(metacls, name, bases, namespace, **kwargs):
|
|
122
128
|
# Get metaclass parameters by finding and removing them from the class
|
|
@@ -267,7 +273,7 @@ def getTileCache():
|
|
|
267
273
|
return _tileCache, _tileLock
|
|
268
274
|
|
|
269
275
|
|
|
270
|
-
def isTileCacheSetup():
|
|
276
|
+
def isTileCacheSetup() -> bool:
|
|
271
277
|
"""
|
|
272
278
|
Return True if the tile cache has been created.
|
|
273
279
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
+
import pathlib
|
|
4
5
|
import re
|
|
5
6
|
from typing import Any, Optional, Union, cast
|
|
6
7
|
|
|
@@ -111,7 +112,8 @@ def setConfig(key: str, value: Optional[Union[str, bool, int, logging.Logger]])
|
|
|
111
112
|
curConfig[key] = value
|
|
112
113
|
|
|
113
114
|
|
|
114
|
-
def _ignoreSourceNames(
|
|
115
|
+
def _ignoreSourceNames(
|
|
116
|
+
configKey: str, path: Union[str, pathlib.Path], default: Optional[str] = None) -> None:
|
|
115
117
|
"""
|
|
116
118
|
Given a path, if it is an actual file and there is a setting
|
|
117
119
|
"source_<configKey>_ignored_names", raise a TileSourceError if the path
|
|
@@ -123,6 +125,6 @@ def _ignoreSourceNames(configKey, path, default=None):
|
|
|
123
125
|
"""
|
|
124
126
|
ignored_names = getConfig('source_%s_ignored_names' % configKey) or default
|
|
125
127
|
if not ignored_names or not os.path.isfile(path):
|
|
126
|
-
return
|
|
128
|
+
return None
|
|
127
129
|
if re.search(ignored_names, os.path.basename(path), flags=re.IGNORECASE):
|
|
128
130
|
raise exceptions.TileSourceError('File will not be opened by %s reader' % configKey)
|