Remove inherited config and file-type-specific code.

This functionality needs to fleshed out a bit more. This commit can be
reverted after the initial refactor PR.
This commit is contained in:
Tony S Yu
2013-12-06 22:40:25 -06:00
parent e59daf474c
commit 0f88bed41d
4 changed files with 6 additions and 191 deletions
+1 -9
View File
@@ -1,4 +1,3 @@
import os
from io import BytesIO
import numpy as np
@@ -95,14 +94,7 @@ def imread(fname, as_grey=False, plugin=None, flatten=None,
as_grey = flatten
with file_or_url_context(fname) as fname:
function = 'imread'
# TODO: This should probably use imghdr to get the image format.
try:
_, extension = os.path.splitext(fname)
function = function + extension.lower()
except AttributeError: # Buffers don't work with splitext
pass
img = call_plugin(function, fname, plugin=plugin, **plugin_args)
img = call_plugin('imread', fname, plugin=plugin, **plugin_args)
if as_grey and getattr(img, 'ndim', 0) >= 3:
img = rgb2grey(img)
-127
View File
@@ -1,127 +0,0 @@
class InheritedConfig(dict):
"""Configuration dictionary where non-existent keys can inherit values.
This class allows you to define parameter names that can match exactly, but
if it doesn't, parameter names will be searched based on key inheritance.
For example, the key 'size.text' will default to 'size'.
Note that indexing into the dictionary will raise an error if it doesn't
match exactly, while `InheritedConfig.get` will look up values based on
inheritance.
Parameters
----------
config_values : dict or list of (key, value) pairs
Default values for a configuration, where keys are the parameter names
and values are the associated value.
cascade_map : dict
Dictionary defining cascading defaults. If a parameter name is not
found, indexing `cascade_map` with the parameter name will return
the parameter to look for.
kwargs : dict
Keyword arguments for initializing dict.
"""
_separator = '.'
def __init__(self, config_values=None, **kwargs):
assert 'config_values' not in kwargs
if config_values is None:
config_values = {}
super(InheritedConfig, self).__init__(config_values, **kwargs)
def __getitem__(self, key):
return self.get(key, _raise=True)
def get(self, key, default=None, _raise=False):
"""Return best matching config value for `key`.
Get value from configuration. The search for `key` is in the following
order:
- `self` (Value in global configuration)
- `default`
- Alternate key specified by `self.cascade_map`
This method supports the pattern commonly used for optional keyword
arguments to a function. For example::
>>> def print_value(key, **kwargs):
... print kwargs.get(key, 0)
>>> print_value('size')
0
>>> print_value('size', size=1)
1
Instead, you would create a config class and write::
>>> config = InheritedConfig(size=0)
>>> def print_value(key, **kwargs):
... print kwargs.get(key, config.get(key))
>>> print_value('size')
0
>>> print_value('size', size=1)
1
>>> print_value('non-existent')
None
>>> print_value('size.text')
0
See examples below for a demonstration of the cascading of
configuration names.
Parameters
----------
key : str
Name of config value you want.
default : object
Default value if `key` doesn't exist in instance.
Examples
--------
>>> config = InheritedConfig(size=0)
>>> config.get('size')
0
>>> top_choice={'size': 1}
>>> top_choice.get('size', config.get('size'))
1
>>> config.get('non-existent', 'unknown')
'unknown'
>>> config.get('size.text')
0
>>> config.get('size.text', 2)
2
>>> top_choice.get('size', config.get('size.text'))
1
"""
if key in self.keys():
return super(InheritedConfig, self).__getitem__(key)
elif default is not None:
return default
elif self._separator in key:
return self.get(self._parent(key))
elif _raise:
raise KeyError('%r not in %s' % (key, self.__class__.__name__))
else:
return None
def _parent(self, key):
"""Return parent key."""
parts = key.split(self._separator)
return self._separator.join(parts[:-1])
def __contains__(self, key):
if key in self.keys():
return True
elif self._separator in key:
return self.__contains__(self._parent(key))
else:
return False
if __name__ == '__main__':
import doctest
doctest.testmod()
+5 -8
View File
@@ -10,8 +10,6 @@ except ImportError:
import os.path
from glob import glob
from skimage.io.inherited_config import InheritedConfig
__all__ = ['use_plugin', 'call_plugin', 'plugin_info', 'plugin_order',
'reset_plugins', 'find_available_plugins', 'available_plugins']
@@ -31,7 +29,6 @@ preferred_plugins = {
# Use PIL as the default imread plugin, since matplotlib (1.2.x)
# is buggy (flips PNGs around, returns bytes as floats, etc.)
'imread': ['pil'],
'imread.tiff': ['tifffile'],
}
@@ -40,11 +37,11 @@ def _clear_plugins():
"""
global plugin_store
plugin_store = InheritedConfig({'imread': [],
'imsave': [],
'imshow': [],
'imread_collection': [],
'_app_show': []})
plugin_store = {'imread': [],
'imsave': [],
'imshow': [],
'imread_collection': [],
'_app_show': []}
_clear_plugins()
-47
View File
@@ -1,47 +0,0 @@
from skimage.io.inherited_config import InheritedConfig
def test_get_non_existent():
config = InheritedConfig()
assert config.get('size') is None
def test_get_simple():
config = InheritedConfig({'imread': 'matplotlib'})
assert config.get('imread') == 'matplotlib'
def test_get_default():
config = InheritedConfig()
assert config.get('size', 10) == 10
def test_get_best():
config = InheritedConfig({'size': 0, 'size.text': 1})
assert config.get('size.text') == 1
def test_get_multi_level():
config = InheritedConfig({'size': 0})
assert config.get('size.text.title') == 0
config['size.text'] = 1
assert config.get('size.text.title') == 1
config['size.text.title'] = 2
assert config.get('size.text.title') == 2
def test_contains():
config = InheritedConfig({'imread': 'matplotlib'})
assert 'imread' in config
assert 'imread.jpg' in config
def test_getitem():
config = InheritedConfig({'imread': 'a'})
assert config['imread'] == 'a'
assert config['imread.png'] == 'a'
if __name__ == '__main__':
from numpy import testing
testing.run_module_suite()