a
    |f(                     @   sf   d Z ddlZddlZddlZddlmZ ddlmZ G dd deZdd	d
Z	dddZ
dddZdS )a-  
Sphinx directive integration
============================

We usually need to document the life-cycle of functions and classes:
when they are created, modified or deprecated.

To do that, `Sphinx <http://www.sphinx-doc.org>`_ has a set
of `Paragraph-level markups <http://www.sphinx-doc.org/en/stable/markup/para.html>`_:

- ``versionadded``: to document the version of the project which added the described feature to the library,
- ``versionchanged``: to document changes of a feature,
- ``deprecated``: to document a deprecated feature.

The purpose of this module is to defined decorators which adds this Sphinx directives
to the docstring of your function and classes.

Of course, the ``@deprecated`` decorator will emit a deprecation warning
when the function/method is called or the class is constructed.
    N)ClassicAdapter)
deprecatedc                       sD   e Zd ZdZdddedf fdd	Z fddZ fd	d
Z  ZS )SphinxAdaptera  
    Sphinx adapter -- *for advanced usage only*

    This adapter override the :class:`~deprecated.classic.ClassicAdapter`
    in order to add the Sphinx directives to the end of the function/class docstring.
    Such a directive is a `Paragraph-level markup <http://www.sphinx-doc.org/en/stable/markup/para.html>`_

    - The directive can be one of "versionadded", "versionchanged" or "deprecated".
    - The version number is added if provided.
    - The reason message is obviously added in the directive block if not empty.
     NF   c                    s4   |st d|| _|| _tt| j||||d dS )a  
        Construct a wrapper adapter.

        :type  directive: str
        :param directive:
            Sphinx directive: can be one of "versionadded", "versionchanged" or "deprecated".

        :type  reason: str
        :param reason:
            Reason message which documents the deprecation in your library (can be omitted).

        :type  version: str
        :param version:
            Version of your project which deprecates this feature.
            If you follow the `Semantic Versioning <https://semver.org/>`_,
            the version number has the format "MAJOR.MINOR.PATCH".

        :type  action: str
        :param action:
            A warning filter used to activate or not the deprecation warning.
            Can be one of "error", "ignore", "always", "default", "module", or "once".
            If ``None`` or empty, the the global filtering mechanism is used.
            See: `The Warnings Filter`_ in the Python documentation.

        :type  category: type
        :param category:
            The warning category to use for the deprecation warning.
            By default, the category class is :class:`~DeprecationWarning`,
            you can inherit this class to define your own deprecation warning category.

        :type  line_length: int
        :param line_length:
            Max line length of the directive text. If non nul, a long text is wrapped in several lines.
        z3'version' argument is required in Sphinx directives)reasonversionactioncategoryN)
ValueError	directiveline_lengthsuperr   __init__)selfr   r   r   r	   r
   r   	__class__ KD:\Projects\storyit_web\backend\venv\Lib\site-packages\deprecated/sphinx.pyr   ,   s
    +zSphinxAdapter.__init__c           	   	      s4  | j r
dnd}|j| j| j dg}| jdkr6| jd nd}t| j }| D ]0}|rx|	tj
||ddd  qR|d qR|jpd}|jd	d
pdg}t|dkrtd|dd nd}|d | }|rtjdd|tjdd }nd}|ddd |D 7 }||_| jdv r$|S tt| |S )z
        Add the Sphinx directive to your class or function.

        :param wrapped: Wrapped class or function.

        :return: the decorated class or function.
        z.. {directive}:: {version}z.. {directive}::)r   r      i   z   )widthinitial_indentsubsequent_indentr   T)keepends   Nr   z\n+$flagsz


c                 s   s   | ]}d  |V  qdS )z{}
N)format).0liner   r   r   	<genexpr>       z)SphinxAdapter.__call__.<locals>.<genexpr>>   versionaddedversionchanged)r   r   r   r   textwrapdedentr   strip
splitlinesextendfillappend__doc__lenjoinresubDOTALLr   r   __call__)	r   wrappedfmtZ	div_linesr   r   Z	paragraph	docstringlinesr   r   r   r2   ^   s6    		
(zSphinxAdapter.__call__c                    s*   t t| ||}tjdd|tjd}|S )a  
        Get the deprecation warning message (without Sphinx cross-referencing syntax) for the user.

        :param wrapped: Wrapped class or function.

        :param instance: The object to which the wrapped function was bound when it was called.

        :return: The warning message.

        .. versionadded:: 1.2.12
           Strip Sphinx cross-referencing syntax from warning message.

        z*(?: : [a-zA-Z]+ )? : [a-zA-Z]+ : (`[^`]*`)z\1r   )r   r   get_deprecated_msgr/   r0   X)r   r3   instancemsgr   r   r   r7      s    z SphinxAdapter.get_deprecated_msg)	__name__
__module____qualname__r,   DeprecationWarningr   r2   r7   __classcell__r   r   r   r   r      s   2/r   r   r   c                 C   s   t d| ||d}|S )a2  
    This decorator can be used to insert a "versionadded" directive
    in your function/class docstring in order to documents the
    version of the project which adds this new functionality in your library.

    :param str reason:
        Reason message which documents the addition in your library (can be omitted).

    :param str version:
        Version of your project which adds this feature.
        If you follow the `Semantic Versioning <https://semver.org/>`_,
        the version number has the format "MAJOR.MINOR.PATCH", and,
        in the case of a new functionality, the "PATCH" component should be "0".

    :type  line_length: int
    :param line_length:
        Max line length of the directive text. If non nul, a long text is wrapped in several lines.

    :return: the decorated function.
    r#   r   r   r   r   r   r   r   adapterr   r   r   r#      s    r#   c                 C   s   t d| ||d}|S )a  
    This decorator can be used to insert a "versionchanged" directive
    in your function/class docstring in order to documents the
    version of the project which modifies this functionality in your library.

    :param str reason:
        Reason message which documents the modification in your library (can be omitted).

    :param str version:
        Version of your project which modifies this feature.
        If you follow the `Semantic Versioning <https://semver.org/>`_,
        the version number has the format "MAJOR.MINOR.PATCH".

    :type  line_length: int
    :param line_length:
        Max line length of the directive text. If non nul, a long text is wrapped in several lines.

    :return: the decorated function.
    r$   r@   rA   rB   r   r   r   r$      s    r$   c                 K   sD   | dd}| dt}| |d< ||d< ||d< tf ||d|S )ax  
    This decorator can be used to insert a "deprecated" directive
    in your function/class docstring in order to documents the
    version of the project which deprecates this functionality in your library.

    :param str reason:
        Reason message which documents the deprecation in your library (can be omitted).

    :param str version:
        Version of your project which deprecates this feature.
        If you follow the `Semantic Versioning <https://semver.org/>`_,
        the version number has the format "MAJOR.MINOR.PATCH".

    :type  line_length: int
    :param line_length:
        Max line length of the directive text. If non nul, a long text is wrapped in several lines.

    Keyword arguments can be:

    -   "action":
        A warning filter used to activate or not the deprecation warning.
        Can be one of "error", "ignore", "always", "default", "module", or "once".
        If ``None``, empty or missing, the the global filtering mechanism is used.

    -   "category":
        The warning category to use for the deprecation warning.
        By default, the category class is :class:`~DeprecationWarning`,
        you can inherit this class to define your own deprecation warning category.

    :return: a decorator used to deprecate a function.

    .. versionchanged:: 1.2.13
       Change the signature of the decorator to reflect the valid use cases.
    r   r   adapter_clsr   r   r   )r   rD   )popr   _classic_deprecated)r   r   r   kwargsr   rD   r   r   r   r      s    #r   )r   r   r   )r   r   r   )r   r   r   )r,   r/   r%   ZwraptZdeprecated.classicr   r   rF   r   r#   r$   r   r   r   r   <module>   s    

