##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Provide configuration object name resolution

$Id: name.py 26937 2004-08-06 16:33:35Z fdrake $
"""

import os
from types import ModuleType

def resolve(name, package='zopeproducts', _silly=('__doc__',), _globals={}):
    name = name.strip()

    if name.startswith('.'):
        name=package+name

    if name.endswith('.') or name.endswith('+'):
        name = name[:-1]
        repeat = 1
    else:
        repeat = 0

    names=name.split('.')
    last=names[-1]
    mod='.'.join(names[:-1])

    if not mod:
        return __import__(name, _globals, _globals, _silly)

    while 1:
        m=__import__(mod, _globals, _globals, _silly)
        try:
            a=getattr(m, last)
        except AttributeError:
            if not repeat:
                return __import__(name, _globals, _globals, _silly)

        else:
            if not repeat or (not isinstance(a, ModuleType)):
                return a
        mod += '.' + last


def getNormalizedName(name, package):
    name=name.strip()
    if name.startswith('.'):
        name=package+name

    if name.endswith('.') or name.endswith('+'):
        name = name[:-1]
        repeat = 1
    else:
        repeat = 0
    name=name.split(".")
    while len(name)>1 and name[-1]==name[-2]:
        name.pop()
        repeat=1
    name=".".join(name)
    if repeat:
        name+="+"
    return name

def path(file='', package = 'zopeproducts', _silly=('__doc__',), _globals={}):
    try: package = __import__(package, _globals, _globals, _silly)
    except ImportError:
        if file and os.path.abspath(file) == file:
            # The package didn't matter
            return file
        raise

    path = os.path.dirname(package.__file__)
    if file:
        path = os.path.join(path, file)
    return path
