U
    ¾¸bî  ã                   @   sz   d Z ddlmZmZmZ ddlmZ ddlmZm	Z	m
Z
 esLddlZddl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.
é    )Úabsolute_importÚdivisionÚprint_functioné   )ÚPY2)ÚNOTHINGÚFactoryÚpipeNÚdefault_if_noneÚoptionalr	   Úto_boolc              	      sž   ‡ fdd„}t sšd}zt ˆ ¡}W n ttfk
r:   Y nX |ršt|j ¡ ƒ}|rz|d jtj	j
k	rztj|d j |jd< |jtjj
k	rštj|j |jd< |S )aO  
    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.

    :param callable converter: the converter that is used for non-``None``
        values.

    .. versionadded:: 17.1.0
    c                    s   | d krd S ˆ | ƒS ©N© ©Úval©Ú	converterr   ú3/tmp/pip-unpacked-wheel-9rkxrohn/attr/converters.pyÚoptional_converter(   s    z$optional.<locals>.optional_converterNr   r   Úreturn)r   ÚinspectÚ	signatureÚ
ValueErrorÚ	TypeErrorÚlistÚ
parametersÚvaluesÚ
annotationÚ	ParameterÚemptyÚtypingÚOptionalÚ__annotations__Úreturn_annotationÚ	Signature)r   r   ÚsigÚparamsr   r   r   r      s$    ÿ
ÿ
c                    sv   ˆ t kr|dkrtdƒ‚ˆ t k	r0|dk	r0tdƒ‚|dk	r@t|ƒ‰ tˆ tƒrfˆ jrXtdƒ‚‡ fdd„}n‡ fdd„}|S )aœ  
    A converter that allows to replace ``None`` values by *default* or the
    result of *factory*.

    :param default: Value to be used if ``None`` is passed. Passing an instance
       of `attrs.Factory` is supported, however the ``takes_self`` option
       is *not*.
    :param callable factory: A callable that takes no parameters whose result
       is used if ``None`` is passed.

    :raises TypeError: If **neither** *default* or *factory* is passed.
    :raises TypeError: If **both** *default* and *factory* are passed.
    :raises 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_converterd   s    z2default_if_none.<locals>.default_if_none_converterc                    s   | d k	r| S ˆ S r   r   r   r(   r   r   r*   l   s    )r   r   r   Ú
isinstanceZ
takes_selfr   )r)   r'   r*   r   r(   r   r
   A   s     ÿ
ÿc                 C   s‚   t | tƒr|  ¡ } ddddddddh}d	d
ddddddh}z | |krJW dS | |krXW d	S W n tk
rn   Y nX td | ¡ƒ‚dS )a  
    Convert "boolean" strings (e.g., from env. vars.) to real booleans.

    Values mapping to :code:`True`:

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

    Values mapping to :code:`False`:

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

    :raises ValueError: for any other value.

    .. versionadded:: 21.3.0
    TÚtrueÚtÚyesÚyÚonÚ1r   FÚfalseÚfÚnoÚnÚoffÚ0r   z Cannot convert value to bool: {}N)r+   ÚstrÚlowerr   r   Úformat)r   ZtruthyZfalsyr   r   r   r   u   s    

)Ú__doc__Ú
__future__r   r   r   Ú_compatr   Ú_maker   r   r	   r   r    Ú__all__r   r
   r   r   r   r   r   Ú<module>   s   ü'4