U
    ¸~Hj  ã                   @   s^   d Z ddlZddlmZ ddlmZmZmZmZ dddd	gZ	d
d„ Z
edfdd„Zdd	„ ZdS )z
Commonly useful converters.
é    Né   )Ú_AnnotationExtractor)ÚNOTHINGÚ	ConverterÚFactoryÚpipeÚdefault_if_noneÚoptionalr   Úto_boolc                    s€   t ˆ tƒr‡ fdd„}n‡ fdd„}tˆ ƒ}| ¡ }|rHtj| |jd< | ¡ }|rdtj| |jd< t ˆ tƒr|t|ddd�S |S )a_  
    A converter that allows an attribute to be optional. An optional attribute
    is one which can be set to `None`.

    Type annotations will be inferred from the wrapped converter's, if it has
    any.

    Args:
        converter (typing.Callable):
            the converter that is used for non-`None` values.

    .. versionadded:: 17.1.0
    c                    s   | d krd S ˆ | ||ƒS ©N© )ÚvalÚinstÚfield©Ú	converterr   ú3/tmp/pip-unpacked-wheel-ibi72vmz/attr/converters.pyÚoptional_converter&   s    z$optional.<locals>.optional_converterc                    s   | d krd S ˆ | ƒS r   r   ©r   r   r   r   r   -   s    r   ÚreturnT)Ú
takes_selfZtakes_field)Ú
isinstancer   r   Zget_first_param_typeÚtypingÚOptionalÚ__annotations__Zget_return_type)r   r   ZxtrÚtÚrtr   r   r   r	      s    

c                    s‚   ˆ t kr|dkrd}t|ƒ‚ˆ t k	r8|dk	r8d}t|ƒ‚|dk	rHt|ƒ‰ tˆ tƒrrˆ jrdd}t|ƒ‚‡ fdd„}n‡ fdd„}|S )aÞ  
    A converter that allows to replace `None` values by *default* or the result
    of *factory*.

    Args:
        default:
            Value to be used if `None` is passed. Passing an instance of
            `attrs.Factory` is supported, however the ``takes_self`` option is
            *not*.

        factory (typing.Callable):
            A callable that takes no parameters whose result is used if `None`
            is passed.

    Raises:
        TypeError: If **neither** *default* or *factory* is passed.

        TypeError: If **both** *default* and *factory* are passed.

        ValueError:
            If an instance of `attrs.Factory` is passed with
            ``takes_self=True``.

    .. versionadded:: 18.2.0
    Nz(Must pass either `default` or `factory`.z5Must pass either `default` or `factory` but not both.z1`takes_self` is not supported by default_if_none.c                    s   | d k	r| S ˆ   ¡ S r   )Úfactoryr   ©Údefaultr   r   Údefault_if_none_converterl   s    z2default_if_none.<locals>.default_if_none_converterc                    s   | d k	r| S ˆ S r   r   r   r   r   r   r    t   s    )r   Ú	TypeErrorr   r   r   Ú
ValueError)r   r   Úmsgr    r   r   r   r   B   s    
c                 C   s@   t | tƒr|  ¡ } | dkrdS | dkr*dS d| ›�}t|ƒ‚dS )aÔ  
    Convert "boolean" strings (for example, from environment variables) to real
    booleans.

    Values mapping to `True`:

    - ``True``
    - ``"true"`` / ``"t"``
    - ``"yes"`` / ``"y"``
    - ``"on"``
    - ``"1"``
    - ``1``

    Values mapping to `False`:

    - ``False``
    - ``"false"`` / ``"f"``
    - ``"no"`` / ``"n"``
    - ``"off"``
    - ``"0"``
    - ``0``

    Raises:
        ValueError: For any other value.

    .. versionadded:: 21.3.0
    )TÚtruer   ÚyesÚyÚonÚ1r   T)FÚfalseÚfÚnoÚnÚoffÚ0r   FzCannot convert value to bool: N)r   ÚstrÚlowerr"   )r   r#   r   r   r   r
   }   s    

)Ú__doc__r   Ú_compatr   Ú_maker   r   r   r   Ú__all__r	   r   r
   r   r   r   r   Ú<module>   s   ü-;