Skip to content

Commit

Permalink
refactor: move general utility function .backend.base.mk_opt_args to …
Browse files Browse the repository at this point in the history
….utils.filter_options
  • Loading branch information
ssato committed Mar 7, 2017
1 parent 372ec25 commit d06dbd1
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 30 deletions.
31 changes: 9 additions & 22 deletions anyconfig/backend/base.py
Expand Up @@ -43,21 +43,6 @@
LOGGER = logging.getLogger(__name__)


def mk_opt_args(keys, kwargs):
"""
Make optional kwargs valid and optimized for each backend.
:param keys: optional argument names
:param kwargs: keyword arguements to process
>>> mk_opt_args(("aaa", ), dict(aaa=1, bbb=2))
{'aaa': 1}
>>> mk_opt_args(("aaa", ), dict(bbb=2))
{}
"""
return dict((k, kwargs[k]) for k in keys if k in kwargs)


def ensure_outdir_exists(filepath):
"""
Make dir to dump `filepath` if that dir does not exist.
Expand Down Expand Up @@ -177,7 +162,7 @@ def _load_options(self, container, **options):
for opt in self.dict_options():
options.setdefault(opt, container)

return mk_opt_args(self._load_opts, options)
return anyconfig.utils.filter_options(self._load_opts, options)

def _container_factory(self, **options):
"""
Expand Down Expand Up @@ -243,8 +228,9 @@ def loads(self, content, **options):
:param content: Config file content
:param options:
options will be passed to backend specific loading functions.
please note that options have to be sanitized w/ mk_opt_args later
to filter out options not in _load_opts.
please note that options have to be sanitized w/
:func:`~anyconfig.utils.filter_options` later to filter out options
not in _load_opts.
:return: dict or dict-like object holding configurations
"""
Expand All @@ -267,8 +253,9 @@ def load(self, path_or_stream, ignore_missing=False, **options):
exist in actual.
:param options:
options will be passed to backend specific loading functions.
please note that options have to be sanitized w/ mk_opt_args later
to filter out options not in _load_opts.
please note that options have to be sanitized w/
:func:`~anyconfig.utils.filter_options` later to filter out options
not in _load_opts.
:return: dict or dict-like object holding configurations
"""
Expand Down Expand Up @@ -327,7 +314,7 @@ def dumps(self, cnf, **kwargs):
:return: string represents the configuration
"""
kwargs = mk_opt_args(self._dump_opts, kwargs)
kwargs = anyconfig.utils.filter_options(self._dump_opts, kwargs)
return self.dump_to_string(cnf, **kwargs)

def dump(self, cnf, path_or_stream, **kwargs):
Expand All @@ -340,7 +327,7 @@ def dump(self, cnf, path_or_stream, **kwargs):
:param kwargs: optional keyword parameters to be sanitized :: dict
:raises IOError, OSError, AttributeError: When dump failed.
"""
kwargs = mk_opt_args(self._dump_opts, kwargs)
kwargs = anyconfig.utils.filter_options(self._dump_opts, kwargs)

if isinstance(path_or_stream, anyconfig.compat.STR_TYPES):
ensure_outdir_exists(path_or_stream)
Expand Down
5 changes: 3 additions & 2 deletions anyconfig/backend/bson.py
Expand Up @@ -42,6 +42,7 @@

import bson
import anyconfig.backend.base
import anyconfig.utils


_CO_OPTIONS = ("document_class", "tz_aware", "uuid_representation",
Expand All @@ -54,7 +55,7 @@ def _codec_options(**options):
:return: :class:`~bson.CodecOptions`
"""
opts = anyconfig.backend.base.mk_opt_args(_CO_OPTIONS, options)
opts = anyconfig.utils.filter_options(_CO_OPTIONS, options)
return bson.CodecOptions(**opts)


Expand All @@ -79,7 +80,7 @@ def _load_options(self, container, **options):
if any(k in options for k in _CO_OPTIONS):
options["codec_options"] = _codec_options(**options)

return anyconfig.backend.base.mk_opt_args(self._load_opts, options)
return anyconfig.utils.filter_options(self._load_opts, options)

def load_from_string(self, content, container, **kwargs):
"""
Expand Down
9 changes: 5 additions & 4 deletions anyconfig/backend/ini.py
Expand Up @@ -37,7 +37,7 @@
import anyconfig.utils

from anyconfig.compat import configparser, iteritems
from anyconfig.backend.base import mk_opt_args
from anyconfig.utils import filter_options


_SEP = ','
Expand Down Expand Up @@ -112,16 +112,17 @@ def _make_parser(**kwargs):
:return: (keyword args to be used, parser object)
"""
# Optional arguements for configparser.SafeConfigParser{,readfp}
kwargs_0 = mk_opt_args(("defaults", "dict_type", "allow_no_value"), kwargs)
kwargs_1 = mk_opt_args(("filename", ), kwargs)
kwargs_0 = filter_options(("defaults", "dict_type", "allow_no_value"),
kwargs)
kwargs_1 = filter_options(("filename", ), kwargs)

try:
parser = configparser.SafeConfigParser(**kwargs_0)
except TypeError:
# .. note::
# It seems ConfigParser.*ConfigParser in python 2.6 does not support
# 'allow_no_value' option parameter, and TypeError will be thrown.
kwargs_0 = mk_opt_args(("defaults", "dict_type"), kwargs)
kwargs_0 = filter_options(("defaults", "dict_type"), kwargs)
parser = configparser.SafeConfigParser(**kwargs_0)

return (kwargs_1, parser)
Expand Down
5 changes: 3 additions & 2 deletions anyconfig/backend/yaml.py
Expand Up @@ -34,6 +34,7 @@
from yaml import SafeLoader as Loader, SafeDumper as Dumper

import anyconfig.backend.base
import anyconfig.utils


def _setup_loader_and_dumper(container, loader=Loader, dumper=Dumper):
Expand Down Expand Up @@ -93,8 +94,8 @@ def _yml_fnc(fname, *args, **kwargs):
"""
key = "ac_safe"
fnc = getattr(yaml, kwargs.get(key, False) and r"safe_" + fname or fname)
kwargs = anyconfig.backend.base.mk_opt_args([k for k in kwargs.keys()
if k != key], kwargs)
kwargs = anyconfig.utils.filter_options([k for k in kwargs.keys()
if k != key], kwargs)
return fnc(*args, **kwargs)


Expand Down
15 changes: 15 additions & 0 deletions anyconfig/utils.py
Expand Up @@ -276,4 +276,19 @@ def is_list_like(obj):
return isinstance(obj, _LIST_LIKE_TYPES) and \
not (isinstance(obj, anyconfig.compat.STR_TYPES) or is_dict_like(obj))


def filter_options(keys, options):
"""
Filter `options` with given `keys`.
:param keys: key names of optional keyword arguments
:param options: optional keyword arguments to filter with `keys`
>>> filter_options(("aaa", ), dict(aaa=1, bbb=2))
{'aaa': 1}
>>> filter_options(("aaa", ), dict(bbb=2))
{}
"""
return dict((k, options[k]) for k in keys if k in options)

# vim:sw=4:ts=4:et:

0 comments on commit d06dbd1

Please sign in to comment.