"""Utility functions for finding modules

Utility functions for finding modules on sys.path.

`find_mod` finds named module on sys.path.

`get_init` helper function that finds __init__ file in a directory.

`find_module` variant of imp.find_module in std_lib that only returns
path to module and not an open file object as well.



"""
#-----------------------------------------------------------------------------
# Copyright (c) 2011, the IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
from __future__ import print_function

# Stdlib imports
import imp
import os

# Third-party imports

# Our own imports


#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Local utilities
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Classes and functions
#-----------------------------------------------------------------------------
def find_module(name, path=None):
    """imp.find_module variant that only return path of module.
    
    The `imp.find_module` returns a filehandle that we are not interested in.
    Also we ignore any bytecode files that `imp.find_module` finds.

    Parameters
    ----------
    name : str
        name of module to locate
    path : list of str
        list of paths to search for `name`. If path=None then search sys.path

    Returns
    -------
    filename : str
        Return full path of module or None if module is missing or does not have
        .py or .pyw extension
    """
    if name is None:
        return None
    try:
        file, filename, _ = imp.find_module(name, path)
    except ImportError:
        return None
    if file is None:
        return filename
    else:
        file.close()
    if os.path.splitext(filename)[1] in [".py", "pyc"]:
        return filename
    else:
        return None

def get_init(dirname):
    """Get __init__ file path for module directory
    
    Parameters
    ----------
    dirname : str
        Find the __init__ file in directory `dirname`

    Returns
    -------
    init_path : str
        Path to __init__ file
    """
    fbase =  os.path.join(dirname, "__init__")
    for ext in [".py", ".pyw"]:
        fname = fbase + ext
        if os.path.isfile(fname):
            return fname


def find_mod(module_name):
    """Find module `module_name` on sys.path
    
    Return the path to module `module_name`. If `module_name` refers to
    a module directory then return path to __init__ file. Return full 
    path of module or None if module is missing or does not have .py or .pyw
    extension. We are not interested in running bytecode.
    
    Parameters
    ----------
    module_name : str
    
    Returns
    -------
    modulepath : str
        Path to module `module_name`.
    """
    parts = module_name.split(".")
    basepath = find_module(parts[0])
    for submodname in parts[1:]:
        basepath = find_module(submodname, [basepath])
    if basepath and os.path.isdir(basepath):
        basepath = get_init(basepath)
    return basepath
