# -*- coding: utf-8 -*-
# pylint: disable=I0011,C0103
""" Python Utility Functions.
Copyright (c) 2009, 2010 The PyroScope Project <pyroscope.project@gmail.com>
"""
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from __future__ import absolute_import
import json
import logging
import pkg_resources
from peak.util.proxies import LazyProxy
# Create aliases to make pydev / pylint happy
resource_isdir = pkg_resources.resource_isdir # @UndefinedVariable pylint: disable=E1101
resource_listdir = pkg_resources.resource_listdir # @UndefinedVariable pylint: disable=E1101
resource_string = pkg_resources.resource_string # @UndefinedVariable pylint: disable=E1101
[docs]def import_name(module_spec, name=None):
""" Import identifier C{name} from module C{module_spec}.
If name is omitted, C{module_spec} must contain the name after the
module path, delimited by a colon (like a setuptools entry-point).
@param module_spec: Fully qualified module name, e.g. C{x.y.z}.
@param name: Name to import from C{module_spec}.
@return: Requested object.
@rtype: object
"""
# Load module
module_name = module_spec
if name is None:
try:
module_name, name = module_spec.split(':', 1)
except ValueError:
raise ValueError("Missing object specifier in %r (syntax: 'package.module:object.attr')" % (module_spec,))
try:
module = __import__(module_name, globals(), {}, [name])
except ImportError as exc:
raise ImportError("Bad module name in %r (%s)" % (module_spec, exc))
# Resolve the requested name
result = module
for attr in name.split('.'):
result = getattr(result, attr)
return result
[docs]def get_class_logger(obj):
""" Get a logger specific for the given object's class.
"""
return logging.getLogger(obj.__class__.__module__ + '.' + obj.__class__.__name__)
[docs]def get_lazy_logger(name):
""" Return a logger proxy that is lazily initialized.
This avoids the problems associated with module-level loggers being created
early (on import), *before* the logging system is properly initialized.
"""
return LazyProxy(lambda n=name: logging.getLogger(n))
[docs]class JSONEncoder(json.JSONEncoder):
"""Custon JSON encoder."""
[docs] def default(self, o): # pylint: disable=method-hidden
"""Support more object types."""
if isinstance(o, set):
return list(sorted(o))
elif hasattr(o, 'as_dict'):
return o.as_dict()
else:
return super(JSONEncoder, self).default(o)