B
    `6                 @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ G dd dejZeeG d	d
 d
ZG dd dZG dd dZG dd dZG dd dZG dd dZdS )    N)implementer)action_method)ConfigurationError)PHASE1_CONFIGIPackageOverrides)get_current_registryc               @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )OverrideProviderc             C   s   t j| | |j| _d S )N)pkg_resourcesDefaultProvider__init____name__module_name)selfmodule r   ]/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/pyramid/config/assets.pyr      s    zOverrideProvider.__init__c             C   s   t  }|t| j}|S )N)r   queryUtilityr   r   )r   reg	overridesr   r   r   _get_overrides   s    zOverrideProvider._get_overridesc             C   s6   |   }|dk	r&||}|dk	r&|S tj| ||S )zReturn a true filesystem path for resource_name,
        co-ordinating the extraction with manager, if the resource
        must be unpacked to the filesystem.
        N)r   get_filenamer	   r
   get_resource_filename)r   managerresource_namer   filenamer   r   r   r      s    
z&OverrideProvider.get_resource_filenamec             C   s6   |   }|dk	r&||}|dk	r&|S tj| ||S )z6 Return a readable file-like object for resource_name.N)r   
get_streamr	   r
   get_resource_stream)r   r   r   r   streamr   r   r   r   $   s    
z$OverrideProvider.get_resource_streamc             C   s6   |   }|dk	r&||}|dk	r&|S tj| ||S )z: Return a string containing the contents of resource_name.N)r   
get_stringr	   r
   get_resource_string)r   r   r   r   stringr   r   r   r   /   s    
z$OverrideProvider.get_resource_stringc             C   s4   |   }|d k	r&||}|d k	r&|S tj| |S )N)r   has_resourcer	   r
   )r   r   r   resultr   r   r   r!   :   s    
zOverrideProvider.has_resourcec             C   s4   |   }|d k	r&||}|d k	r&|S tj| |S )N)r   isdirr	   r
   resource_isdir)r   r   r   r"   r   r   r   r$   B   s    
zOverrideProvider.resource_isdirc             C   s4   |   }|d k	r&||}|d k	r&|S tj| |S )N)r   listdirr	   r
   resource_listdir)r   r   r   r"   r   r   r   r&   L   s    
z!OverrideProvider.resource_listdirN)r   
__module____qualname__r   r   r   r   r   r!   r$   r&   r   r   r   r   r      s   
r   c               @   s   e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zedd Zdd Zdd Zdd Zdd ZdS )PackageOverridesc             C   sJ   t |dd  }| _t|| jr$d | _| |_|| jt g | _|j| _	d S )N
__loader__)
getattr_real_loader
isinstance	__class__r*   register_loader_typer   r   r   Zoverridden_package_name)r   packager	   loaderr   r   r   r   Z   s    zPackageOverrides.__init__c             C   s6   |r| drt||}n
t||}| jd| |S )N/r   )endswithDirectoryOverrideFileOverrider   insert)r   pathsourceoverrider   r   r   r6   o   s
    
zPackageOverrides.insertc             c   s*   x$| j D ]}||}|d k	r|V  qW d S )N)r   )r   r   r9   or   r   r   filtered_sourcesw   s    z!PackageOverrides.filtered_sourcesc             C   s2   x,|  |D ]\}}||}|d k	r|S qW d S )N)r;   r   )r   r   r8   r7   r"   r   r   r   r   }   s    
zPackageOverrides.get_filenamec             C   s2   x,|  |D ]\}}||}|d k	r|S qW d S )N)r;   r   )r   r   r8   r7   r"   r   r   r   r      s    
zPackageOverrides.get_streamc             C   s2   x,|  |D ]\}}||}|d k	r|S qW d S )N)r;   r   )r   r   r8   r7   r"   r   r   r   r      s    
zPackageOverrides.get_stringc             C   s*   x$|  |D ]\}}||rdS qW d S )NT)r;   exists)r   r   r8   r7   r   r   r   r!      s    
zPackageOverrides.has_resourcec             C   s2   x,|  |D ]\}}||}|d k	r|S qW d S )N)r;   r#   )r   r   r8   r7   r"   r   r   r   r#      s    
zPackageOverrides.isdirc             C   s2   x,|  |D ]\}}||}|d k	r|S qW d S )N)r;   r%   )r   r   r8   r7   r"   r   r   r   r%      s    
zPackageOverrides.listdirc             C   s   | j d krt | j S )N)r,   NotImplementedError)r   r   r   r   real_loader   s    
zPackageOverrides.real_loaderc             C   s   | j |S )zSee IPEP302Loader.)r>   get_data)r   r7   r   r   r   r?      s    zPackageOverrides.get_datac             C   s   | j |S )zSee IPEP302Loader.)r>   
is_package)r   fullnamer   r   r   r@      s    zPackageOverrides.is_packagec             C   s   | j |S )zSee IPEP302Loader.)r>   get_code)r   rA   r   r   r   rB      s    zPackageOverrides.get_codec             C   s   | j |S )zSee IPEP302Loader.)r>   
get_source)r   rA   r   r   r   rC      s    zPackageOverrides.get_sourceN)r   r'   r(   r	   r   r6   r;   r   r   r   r!   r#   r%   propertyr>   r?   r@   rB   rC   r   r   r   r   r)   W   s   r)   c               @   s   e Zd Zdd Zdd ZdS )r4   c             C   s   || _ t| j | _|| _d S )N)r7   lenpathlenr8   )r   r7   r8   r   r   r   r      s    zDirectoryOverride.__init__c             C   s(   | | jr$|| jd  }| j|fS d S )N)
startswithr7   rF   r8   )r   r   new_pathr   r   r   __call__   s    zDirectoryOverride.__call__N)r   r'   r(   r   rI   r   r   r   r   r4      s   r4   c               @   s   e Zd Zdd Zdd ZdS )r5   c             C   s   || _ || _d S )N)r7   r8   )r   r7   r8   r   r   r   r      s    zFileOverride.__init__c             C   s   || j kr| jdfS d S )N )r7   r8   )r   r   r   r   r   rI      s    
zFileOverride.__call__N)r   r'   r(   r   rI   r   r   r   r   r5      s   r5   c               @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )PackageAssetSourcea  
    An asset source relative to a package.

    If this asset source is a file, then we expect the ``prefix`` to point
    to the new name of the file, and the incoming ``resource_name`` will be
    the empty string, as returned by the ``FileOverride``.

    c             C   s*   || _ t|dr|j| _n|| _|| _d S )Nr   )r0   hasattrr   pkg_nameprefix)r   r0   rN   r   r   r   r      s
    

zPackageAssetSource.__init__c             C   s   d| j |f S )Nz%s%s)rN   )r   r   r   r   r   get_path   s    zPackageAssetSource.get_pathc             C   s*   |  |}t| j|r&t| j|S d S )N)rO   r	   resource_existsrM   resource_filename)r   r   r7   r   r   r   r      s    
zPackageAssetSource.get_filenamec             C   s*   |  |}t| j|r&t| j|S d S )N)rO   r	   rP   rM   resource_stream)r   r   r7   r   r   r   r      s    
zPackageAssetSource.get_streamc             C   s*   |  |}t| j|r&t| j|S d S )N)rO   r	   rP   rM   resource_string)r   r   r7   r   r   r   r      s    
zPackageAssetSource.get_stringc             C   s    |  |}t| j|rdS d S )NT)rO   r	   rP   rM   )r   r   r7   r   r   r   r<      s    
zPackageAssetSource.existsc             C   s*   |  |}t| j|r&t| j|S d S )N)rO   r	   rP   rM   r$   )r   r   r7   r   r   r   r#      s    
zPackageAssetSource.isdirc             C   s*   |  |}t| j|r&t| j|S d S )N)rO   r	   rP   rM   r&   )r   r   r7   r   r   r   r%      s    
zPackageAssetSource.listdirN)r   r'   r(   __doc__r   rO   r   r   r   r<   r#   r%   r   r   r   r   rK      s   rK   c               @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )FSAssetSourcez@
    An asset source relative to a path in the filesystem.

    c             C   s
   || _ d S )N)rN   )r   rN   r   r   r   r     s    zFSAssetSource.__init__c             C   s    |rt j| j|}n| j}|S )N)osr7   joinrN   )r   r   r7   r   r   r   rO   
  s    zFSAssetSource.get_pathc             C   s   |  |}tj|r|S d S )N)rO   rV   r7   r<   )r   r   r7   r   r   r   r     s    
zFSAssetSource.get_filenamec             C   s    |  |}|d k	rt|dS d S )Nrb)r   open)r   r   r7   r   r   r   r     s    
zFSAssetSource.get_streamc          	   C   s*   |  |}|d k	r&|
 | S Q R X d S )N)r   read)r   r   r   r   r   r   r     s    
zFSAssetSource.get_stringc             C   s   |  |}|d k	rdS d S )NT)r   )r   r   r7   r   r   r   r<   !  s    
zFSAssetSource.existsc             C   s"   |  |}|d k	rtj|S d S )N)r   rV   r7   r#   )r   r   r7   r   r   r   r#   &  s    
zFSAssetSource.isdirc             C   s    |  |}|d k	rt|S d S )N)r   rV   r%   )r   r   r7   r   r   r   r%   +  s    
zFSAssetSource.listdirN)r   r'   r(   rT   r   rO   r   r   r   r<   r#   r%   r   r   r   r   rU     s   rU   c               @   s*   e Zd ZefddZedddZeZdS )AssetsConfiguratorMixinc             C   sH   |j }| jjt|d}|d kr8||}| jj|t|d ||| d S )N)name)r   registryr   r   ZregisterUtilityr6   )r   r0   r7   override_sourcer)   rM   r9   r   r   r   	_override2  s    z!AssetsConfiguratorMixin._overrideNc                sR  ||krt d|dd|kr0|dd\dkp@d}tj|rt|tj|sjt dtj|}d}|}nN|}d}d|kr|dd\}}t	| t
j| }t|||dkp|d}|r|st d|s|rt d	|p| j  fd
d}	| d||fd||f d}
||
d< ||
d< | jd|	|
ftd dS )a  Add a :app:`Pyramid` asset override to the current
        configuration state.

        ``to_override`` is an :term:`asset specification` to the
        asset being overridden.

        ``override_with`` is an :term:`asset specification` to the
        asset that is performing the override. This may also be an absolute
        path.

        See :ref:`assets_chapter` for more
        information about asset overrides.z(You cannot override an asset with itselfrJ   :   r2   z?Cannot override asset with an absolute path that does not existNzcA directory cannot be overridden with a file (put a slash at the end of override_with if necessary)zaA file cannot be overridden with a directory (put a slash at the end of to_override if necessary)c                 s"   t  tj }  |  d S )N)
__import__sysmodules)Zfrom_package)r9   r^   r0   r7   r   r   register  s    
z8AssetsConfiguratorMixin.override_asset.<locals>.registerzasset overridesz%s -> %szasset overrideto_overrideoverride_with)Zintrospectablesorder)r   splitr3   rV   r7   isabsrU   r<   r#   rb   rc   rd   rK   r_   Zintrospectableactionr   )r   rf   rg   r_   Zoverridden_isdirZoverride_isdirZoverride_packageZoverride_prefixZ
to_packagere   Zintrr   )r9   r^   r0   r7   r   override_asset>  sT    




z&AssetsConfiguratorMixin.override_asset)N)r   r'   r(   r)   r_   r   rl   Zoverride_resourcer   r   r   r   r[   1  s   Qr[   )rV   r	   rc   Zzope.interfacer   Zpyramid.config.actionsr   Zpyramid.exceptionsr   Zpyramid.interfacesr   r   Zpyramid.threadlocalr   r
   r   r)   r4   r5   rK   rU   r[   r   r   r   r   <module>   s   K`
40