U
    ˜ARdì  ã                   @   s    d Z ddlZdd„ Zdd„ ZdS )z!A bunch of useful code utilities.é    Nc                 C   sn   d}d}g }t | ƒD ]T\}}|dkr>|dkr4|d }|d7 }q|dkr|d8 }|dkr| | ||… ¡ q|S )aa  Parse argument strings from all outer parentheses in a line of code.

    Parameters
    ----------
    line : str
        A line of code

    Returns
    -------
    list of strings
        Contents of the outer parentheses

    Example
    -------
    >>> line = 'foo(bar, baz), "a", my(func)'
    >>> extract_args(line)
    ['bar, baz', 'func']

    r   Nú(é   ú))Ú	enumerateÚappend)ÚlineÚstackZ
startIndexÚresultsÚiÚc© r   ú7/tmp/pip-unpacked-wheel-b9et7o5g/streamlit/code_util.pyÚextract_args   s    
r   c                 C   sH   t |ƒd }t| ƒdkr>t d|¡}t|ƒt| ƒksDtdƒ‚n|g}|S )a  Parse arguments from a stringified arguments list inside parentheses

    Parameters
    ----------
    args : list
        A list where it's size matches the expected number of parsed arguments
    line : str
        Stringified line of code with method arguments inside parentheses

    Returns
    -------
    list of strings
        Parsed arguments

    Example
    -------
    >>> line = 'foo(bar, baz, my(func, tion))'
    >>>
    >>> get_method_args_from_code(range(0, 3), line)
    ['bar', 'baz', 'my(func, tion)']

    r   r   z,\s*(?![^(){}[\]]*\))zCould not split arguments)r   ÚlenÚreÚsplitÚAssertionError)Úargsr   Z	line_argsÚinputsr   r   r   Úget_method_args_from_code8   s    r   )Ú__doc__r   r   r   r   r   r   r   Ú<module>   s   $