File: //usr/lib/python3/dist-packages/genshi/template/__pycache__/loader.cpython-310.pyc
o
    !�b�9  �                   @   s�   d Z ddlZzddlZW n
 ey   ddlZY nw ddlZddlmZ ddlm	Z	 g d�Z
dZG dd� de�ZG d	d
� d
e
�ZejZejZejZdS )zTemplate loading and caching.�    N)�
TemplateError)�LRUCache)�TemplateLoader�TemplateNotFound�	directory�package�prefixedzrestructuredtext enc                   @   s   e Zd ZdZdd� ZdS )r   zBException raised when a specific template file could not be found.c                 C   s   t �| d| � || _dS )z�Create the exception.
        
        :param name: the filename of the template
        :param search_path: the search path used to lookup the template
        zTemplate "%s" not foundN)r   �__init__�search_path)�self�namer
   � r
   �8/usr/lib/python3/dist-packages/genshi/template/loader.pyr	   #   s   
zTemplateNotFound.__init__N)�__name__�
__module__�__qualname__�__doc__r	   r
   r
   r
   r   r       s    r   c                   @   sh   e Zd ZdZ			ddd�Zd	d
� Zdd� Zdd
d�Zddd�Ze	dd� �Z
e	dd� �Ze	dd� �ZdS )r   a  Responsible for loading templates from files on the specified search
    path.
    
    >>> import tempfile
    >>> fd, path = tempfile.mkstemp(suffix='.html', prefix='template')
    >>> os.write(fd, u'<p>$var</p>'.encode('utf-8'))
    11
    >>> os.close(fd)
    
    The template loader accepts a list of directory paths that are then used
    when searching for template files, in the given order:
    
    >>> loader = TemplateLoader([os.path.dirname(path)])
    
    The `load()` method first checks the template cache whether the requested
    template has already been loaded. If not, it attempts to locate the
    template file, and returns the corresponding `Template` object:
    
    >>> from genshi.template import MarkupTemplate
    >>> template = loader.load(os.path.basename(path))
    >>> isinstance(template, MarkupTemplate)
    True
    
    Template instances are cached: requesting a template with the same name
    results in the same instance being returned:
    
    >>> loader.load(os.path.basename(path)) is template
    True
    
    The `auto_reload` option can be used to control whether a template should
    be automatically reloaded when the file it was loaded from has been
    changed. Disable this automatic reloading to improve performance.
    
    >>> os.remove(path)
    NF�   �strictTc	           
      C   s�   ddl m}	 || _| jdu rg | _n
t| jttf�s| jg| _|| _	 || _|p)|	| _|| _	|| _
|dur>t|d�s>td��|| _
t|�| _i | _t�� | _dS )a�  Create the template laoder.
        
        :param search_path: a list of absolute path names that should be
                            searched for template files, or a string containing
                            a single absolute path; alternatively, any item on
                            the list may be a ''load function'' that is passed
                            a filename and returns a file-like object and some
                            metadata
        :param auto_reload: whether to check the last modification time of
                            template files, and reload them if they have changed
        :param default_encoding: the default encoding to assume when loading
                                 templates; defaults to UTF-8
        :param max_cache_size: the maximum number of templates to keep in the
                               cache
        :param default_class: the default `Template` subclass to use when
                              instantiating templates
        :param variable_lookup: the variable lookup mechanism; either "strict"
                                (the default), "lenient", or a custom lookup
                                class
        :param allow_exec: whether to allow Python code blocks in templates
        :param callback: (optional) a callback function that is invoked after a
                         template was initialized by this loader; the function
                         is passed the template object as only argument. This
                         callback can be used for example to add any desired
                         filters to the template
        :see: `LenientLookup`, `StrictLookup`
        
        :note: Changed in 0.5: Added the `allow_exec` argument
        r   )�MarkupTemplateN�__call__z-The "callback" parameter needs to be callable)�genshi.template.markupr   r
   �
isinstance�list�tuple�auto_reload�default_encoding�
default_class�variable_lookup�
allow_exec�hasattr�	TypeError�callbackr   �_cache�	_uptodate�	threading�RLock�_lock)
r   r
   r   r   �max_cache_sizer   r   r   r"