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

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

import imp
from distutils.version import StrictVersion


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

_PLY_MIN_VERSION = StrictVersion('3.9')

# Update this to prevent Astropy from using its bundled copy of ply
# (but only if some other version of at least _PLY_MIN_VERSION can
# be provided)
_PLY_SEARCH_PATH = ['ply']


for mod_name in _PLY_SEARCH_PATH:
    try:
        mod_info = _find_module(mod_name)
        #mod_lex_info = _find_module(mod_name + '.lex')
    except ImportError:
        continue

    mod = imp.load_module(__name__, *mod_info)
    #mod_lex = imp.load_module(__name__ + '.lex', *mod_lex_info)

    try:
    #    if StrictVersion(mod_lex.__version__) >= _PLY_MIN_VERSION:
    #        break
        break
    except (AttributeError, ValueError):
        # Attribute error if the ply 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(
        "Astropy requires the 'ply' module of minimum version {0}; "
        "normally this is bundled with the astropy package so if you get "
        "this warning consult the packager of your Astropy "
        "distribution.".format(_PLY_MIN_VERSION))