a
    4ñ»j  ã                   @   sX   d Z ddlmZ ddlmZ dd„ Zdd„ Zdd	„ ZG d
d„ deƒZ	G dd„ de
ƒZdS )zG
Functionality to support user-specific configuration data (userdata).
é    )Úabsolute_import)ÚUnknownc                 C   s   ddl m} t|| ƒƒS )zðParses a boolean text and converts it into boolean value (if possible).
    Supported truth string values:

      * true:   "true", "yes", "on", "1"
      * false:  "false", "no", "off", "0"

    :raises: ValueError, if text is invalid
    r   )Ú	strtobool)Údistutils.utilr   Úbool)Útextr   © r   ú5E:\soccer\ml_env\Lib\site-packages\behave/userdata.pyÚ
parse_bool   s    	r
   c                 C   sN   |   ¡ } d| v r>t| ƒ} |  dd¡\}}|  ¡ }t|  ¡ ƒ}n| }d}||fS )a™  Parse "{name}={value}" text and return parts as tuple.
    Used for command-line definitions, like "... -D name=value".

    SUPPORTED SCHEMA:

      * "{name}={value}"
      * "{name}"                (boolean flag; value="true")
      * '"{name}={value}"'      (double-quoted name-value pair)
      * "'{name}={value}'"      (single-quoted name-value pair)
      * '{name}="{value}"'      (double-quoted value)
      * "{name}='{value}'"      (single-quoted value)
      * "  {name} = {value}  "  (whitespace padded)

    .. note:: Leading/trailing Quotes are stripped.

    :param text:    Text to parse (as string).
    :return: (name, value) pair as tuple.
    ú=é   Útrue)ÚstripÚunqoteÚsplit)r   ÚnameÚvaluer   r   r	   Úparse_user_define   s    r   c                 C   s8   |   d¡r|  d¡s(|   d¡r4|  d¡r4| dd… } | S )z4Strip pair of leading and trailing quotes from text.ú"ú'r   éÿÿÿÿ)Ú
startswithÚendswith)r   r   r   r	   r   :   s    ÿÿr   c                   @   sD   e Zd ZdZddd„Zddd„Zdd	d
„Zddd„Zedd„ ƒZ	dS )ÚUserDataz�Dictionary-like user-data with some additional features:

      * type-converter methods, similar to configparser.ConfigParser.getint()

    Nc                 C   sJ   |du r|}|   |t¡}|tu r$|S t||ƒr2|S t|ƒs>J ‚||ƒS dS )a  Converts the value of user-data parameter from a string into a
        specific value type.

        :param convert: Converter function to use (string to value-type).
        :param name:    Variable name to use.
        :param default: Default value, used if parameter is not found.
        :param valuetype: Value type(s), needed if convert != valuetype()
        :return: Converted textual value (type: valuetype)
        :return: Default value, if parameter is unknown.
        :raises ValueError: If type conversion fails.
        N)Úgetr   Ú
isinstanceÚcallable)ÚselfÚconvertr   ÚdefaultÚ	valuetyper   r   r   r	   ÚgetasL   s    
zUserData.getasr   c                 C   s   |   t||¡S )zºConvert parameter value (as string) into a integer value.
        :return: Parameter value as integer number (on success).
        :raises: ValueError, if type conversion fails.
        )r!   Úint©r   r   r   r   r   r	   Úgetinth   s    zUserData.getintç        c                 C   s   |   t||¡S )z¶Convert parameter value (as string) into a float value.
        :return: Parameter value as float number (on success).
        :raises: ValueError, if type conversion fails.
        )r!   Úfloatr#   r   r   r	   Úgetfloato   s    zUserData.getfloatFc                 C   s   | j t||td�S )a«  Converts user-data string-value into boolean value (if possible).
        Supported truth string values:

          * true:   "true", "yes", "on", "1"
          * false:  "false", "no", "off", "0"

        :param name: Parameter name (as string).
        :param default: Default value, if parameter is unknown (=False).
        :return: Boolean value of parameter
        :raises: ValueError, if type conversion fails.
        )r    )r!   r
   r   r#   r   r   r	   Úgetboolv   s    zUserData.getboolc                 C   s&   |d u r| ƒ }nt || ƒs"| |ƒ}|S ©N)r   )ÚclsÚdatar   r   r	   Úmake„   s
    
zUserData.make)NN)r   )r%   )F)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r$   r'   r(   Úclassmethodr,   r   r   r   r	   r   E   s   



r   c                   @   s˜   e Zd ZdZd$dd„Zedd„ ƒZd%dd„Zd&d	d
„Zd'dd„Z	d(dd„Z
d)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dS )*ÚUserDataNamespaceas  Provides a light-weight dictview to the user data that allows you
    to access all params in a namespace, that use "{namespace}.*" names.

    .. code-block:: python

        my_config = UserDataNamespace("my.config", userdata)
        value1 = my_config.getint("value1")  # USE: my.config.value1
        value2 = my_config.get("value2")     # USE: my.config.value2
    Nc                 C   s   |pd| _ t |¡| _d S )NÚ )Ú	namespacer   r,   r+   )r   r4   r+   r   r   r	   Ú__init__˜   s    
zUserDataNamespace.__init__c                 C   s   | s|S d| |f S )z%Creates a scoped-name from its parts.z%s.%sr   )r4   r   r   r   r	   Úmake_scopedœ   s    zUserDataNamespace.make_scopedc                 C   s   |   | j|¡}| j ||¡S r)   )r6   r4   r+   r   ©r   r   r   Úscoped_namer   r   r	   r   ¤   s    zUserDataNamespace.getc                 C   s"   |   | j|¡}| jj||||d�S )N)r   r    )r6   r4   r+   r!   )r   r   r   r   r    r8   r   r   r	   r!   ¨   s    ÿzUserDataNamespace.getasr   c                 C   s   |   | j|¡}| jj||d�S ©N)r   )r6   r4   r+   r$   r7   r   r   r	   r$   ­   s    zUserDataNamespace.getintr%   c                 C   s   |   | j|¡}| jj||d�S r9   )r6   r4   r+   r'   r7   r   r   r	   r'   ±   s    zUserDataNamespace.getfloatFc                 C   s   |   | j|¡}| jj||d�S r9   )r6   r4   r+   r(   r7   r   r   r	   r(   µ   s    zUserDataNamespace.getboolc                 C   s   |   | j|¡}|| jv S r)   ©r6   r4   r+   ©r   r   r8   r   r   r	   Ú__contains__¹   s    zUserDataNamespace.__contains__c                 C   s   |   | j|¡}| j| S r)   r:   r;   r   r   r	   Ú__getitem__½   s    zUserDataNamespace.__getitem__c                 C   s   |   | j|¡}|| j|< d S r)   r:   )r   r   r   r8   r   r   r	   Ú__setitem__Á   s    zUserDataNamespace.__setitem__c                 C   s   t |  ¡ ƒS r)   )ÚlenÚscoped_keys©r   r   r   r	   Ú__len__Å   s    zUserDataNamespace.__len__c                    s2   | j s| j ¡ S d| j  ‰ ‡ fdd„| j ¡ D ƒS )Nú%s.c                    s   g | ]}|  ˆ ¡r|‘qS r   )r   )Ú.0Úkey©Úprefixr   r	   Ú
<listcomp>Ì   ó    z1UserDataNamespace.scoped_keys.<locals>.<listcomp>)r4   r+   ÚkeysrA   r   rF   r	   r@   È   s    

zUserDataNamespace.scoped_keysc                 c   s0   d| j  }|  ¡ D ]}| |dd¡}|V  qd S )NrC   r3   r   )r4   r@   Úreplace)r   rG   r8   r   r   r   r	   rJ   Î   s    
zUserDataNamespace.keysc                 c   s   |   ¡ D ]}| j| V  qd S r)   )r@   r+   )r   r8   r   r   r	   ÚvaluesÔ   s    zUserDataNamespace.valuesc                 c   s4   |   ¡ D ]&}|  | j|¡}| j| }||fV  qd S r)   )rJ   r6   r4   r+   )r   r   r8   r   r   r   r	   ÚitemsØ   s    
zUserDataNamespace.items)N)N)NN)r   )r%   )F)r-   r.   r/   r0   r5   Ústaticmethodr6   r   r!   r$   r'   r(   r<   r=   r>   rB   r@   rJ   rL   rM   r   r   r   r	   r2   �   s"   







r2   N)r0   Ú
__future__r   Zbehave._typesr   r
   r   r   Údictr   Úobjectr2   r   r   r   r	   Ú<module>   s    H