Blob Blame History Raw
# Licensed under a 3-clause BSD style license - see README.rst

"""
Handle loading six package from system or from the bundled copy
"""

import imp
from distutils.version import StrictVersion


_SIX_MIN_VERSION = StrictVersion('1.5.0')

# Update this to prevent Astropy from using its bundled copy of six
# (but only if some other version of at least _SIX_MIN_VERSION can
# be provided)
_SIX_SEARCH_PATH = ['six', 'sklearn.externals.bundled.six']


def _find_module(name, path=None):
    """
    Alternative to `imp.find_module` that can also search in subpackages.
    """

    parts = name.split('.')

    for part in parts:
        if path is not None:
            path = [path]

        fh, path, descr = imp.find_module(part, path)

    return fh, path, descr


for mod_name in _SIX_SEARCH_PATH:
    try:
        mod_info = _find_module(mod_name)
    except ImportError:
        continue

    mod = imp.load_module(__name__, *mod_info)

    try:
        if StrictVersion(mod.__version__) >= _SIX_MIN_VERSION:
            break
    except (AttributeError, ValueError):
        # Attribute error if the six module isn't what it should be and doesn't
        # have a .__version__; ValueError if the version string exists but is
        # somehow bogus/unparseable
        continue
else:
    raise ImportError(
        "sklearn requires the 'six' module of minimum version {0}; "
        "normally this is bundled with the astropy package so if you get "
        "this warning consult the packager of your sklearn "
        "distribution.".format(_SIX_MIN_VERSION))