a
    4ñ»j@  ã                   @   sX   d Z ddlmZ ddlZddlmZ dd„ Zdd„ ZG d	d
„ d
eƒZ	G dd„ de
ƒZdS )z|
Importer module for lazy-loading/importing modules and objects.

REQUIRES: importlib (provided in Python2.7, Python3.2...)
é    )Úabsolute_importN)ÚUnknownc                 C   s4   |   ¡ } d| v r|  dd¡} |  dd¡\}}||fS )zg
    SCHEMA: my.module_name:MyClassName
    EXAMPLE:
        behave.formatter.plain:PlainFormatter
    z::ú:é   )ÚstripÚreplaceÚrsplit)Zscoped_nameÚmodule_nameÚobject_name© r   ú5E:\soccer\ml_env\Lib\site-packages\behave/importer.pyÚparse_scoped_name   s
    r   c                 C   s
   t  | ¡S ©N)Ú	importlibÚimport_module)r	   r   r   r   Úload_module   s    r   c                   @   s4   e Zd ZdZddd„Zddd„Zdd„ Zd	d
„ ZdS )Ú
LazyObjectzL
    Provides a placeholder for an object that should be loaded lazily.
    Nc                 C   s:   d|v r|st |ƒ\}}d|vs$J ‚|| _|| _d | _d S )Nr   )r   r	   r
   Úresolved_object)Úselfr	   r
   r   r   r   Ú__init__"   s    zLazyObject.__init__c                 C   sP   d}d}| j sLt| jƒ}t|| jtƒ}|tu rFd| j| jf }t|ƒ‚|| _ |S )zà
        Implement descriptor protocol,
        useful if this class is used as attribute.
        :return: Real object (lazy-loaded if necessary).
        :raise ImportError: If module or object cannot be imported.
        zunusednames=obj,typeNz%s: %s is Unknown)r   r   r	   Úgetattrr
   r   ÚImportError)r   ÚobjÚtypeÚ__pychecker__r   ÚmoduleÚmsgr   r   r   Ú__get__*   s    
zLazyObject.__get__c                 C   s   d}|| _ dS )zImplement descriptor protocol.zunusednames=objN)r   )r   r   Úvaluer   r   r   r   Ú__set__=   s    zLazyObject.__set__c                 C   s   |   ¡ S r   )r   )r   r   r   r   ÚgetB   s    zLazyObject.get)N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r   r   r   r   r      s
   

r   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )	ÚLazyDictzš
    Provides a dict that supports lazy loading of objects.
    A LazyObject is provided as placeholder for a value that should be
    loaded lazily.
    c                 C   s*   t  | |¡}t|tƒr&| ¡ }|| |< |S )a®  
        Provides access to stored dict values.
        Implements lazy loading of item value (if necessary).
        When lazy object is loaded, its value with the dict is replaced
        with the real value.

        :param key:  Key to access the value of an item in the dict.
        :return: value
        :raises: KeyError if item is not found
        :raises: ImportError for a LazyObject that cannot be imported.
        )ÚdictÚ__getitem__Ú
isinstancer   r   )r   Úkeyr   r   r   r   r'   M   s
    
zLazyDict.__getitem__Fc              	   C   s:   |   ¡ D ],}z|  |¡ W q ty2   |r.‚ Y q0 qd S r   )Úkeysr'   r   )r   Ústrictr)   r   r   r   Úload_all`   s    zLazyDict.load_allN)F)r!   r"   r#   r$   r'   r,   r   r   r   r   r%   F   s   r%   )r$   Ú
__future__r   r   Zbehave._typesr   r   r   Úobjectr   r&   r%   r   r   r   r   Ú<module>   s   )