U
    #ö†iE  ã                   @   s&   d dl Z d dlmZ G dd„ dƒZdS )é    N)Úcrc32c                   @   sn   e Zd Ze 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d„ Zdd„ Zdd„ ZdS )Ú_NameManglerz ([A-Z]?[a-z]+)|([A-Z]+(?![a-z]))c                 c   s    dd„ | j  |¡D ƒE dH  dS )ah  
        Split a string into words. Should correctly handle splitting:
            camelCase
            PascalCase
            kebab-case
            snake_case
            MACRO_CASE
            camel_Snake_Case
            Pascal_Snake_Case
            COBOL-CASE
            Http-Header-Case

        It _does not_ handle splitting spongebob case.
        c                 s   s   | ]}|  d ¡V  qdS )r   N)Úgroup)Ú.0Úm© r   ú9/tmp/pip-unpacked-wheel-fy8tok6n/strenum/_name_mangler.pyÚ	<genexpr>   s     z%_NameMangler.words.<locals>.<genexpr>N)Ú_regexÚfinditer©ÚselfÚnamer   r   r   Úwords	   s    z_NameMangler.wordsc                 C   s   dd„ }d  ||  |¡ƒ¡S )z-
        Convert a name to camelCase
        c                 s   s(   t | dƒ ¡ V  dd„ | D ƒE d H  d S )NÚ c                 s   s   | ]}|  ¡ V  qd S ©N©Útitle©r   Úwr   r   r   r	   !   s     z:_NameMangler.camel.<locals>.cased_words.<locals>.<genexpr>©ÚnextÚlower©Z	word_iterr   r   r   Úcased_words   s    z'_NameMangler.camel.<locals>.cased_wordsr   ©Újoinr   ©r   r   r   r   r   r   Úcamel   s    z_NameMangler.camelc                 C   s   d  dd„ |  |¡D ƒ¡S )z.
        Convert a name to PascalCase
        r   c                 s   s   | ]}|  ¡ V  qd S r   r   r   r   r   r   r	   *   s     z&_NameMangler.pascal.<locals>.<genexpr>r   r   r   r   r   Úpascal%   s    z_NameMangler.pascalc                 C   s   d  dd„ |  |¡D ƒ¡S )z.
        Convert a name to kebab-case
        ú-c                 s   s   | ]}|  ¡ V  qd S r   ©r   r   r   r   r   r	   1   s     z%_NameMangler.kebab.<locals>.<genexpr>r   r   r   r   r   Úkebab,   s    z_NameMangler.kebabc                 C   s   d  dd„ |  |¡D ƒ¡S )z.
        Convert a name to snake_case
        Ú_c                 s   s   | ]}|  ¡ V  qd S r   r!   r   r   r   r   r	   8   s     z%_NameMangler.snake.<locals>.<genexpr>r   r   r   r   r   Úsnake3   s    z_NameMangler.snakec                 C   s   d  dd„ |  |¡D ƒ¡S )z.
        Convert a name to MACRO_CASE
        r#   c                 s   s   | ]}|  ¡ V  qd S r   ©Úupperr   r   r   r   r	   ?   s     z%_NameMangler.macro.<locals>.<genexpr>r   r   r   r   r   Úmacro:   s    z_NameMangler.macroc                 C   s   dd„ }d  ||  |¡ƒ¡S )z4
        Convert a name to camel_Snake_Case
        c                 s   s(   t | dƒ ¡ V  dd„ | D ƒE d H  d S )Nr   c                 s   s   | ]}|  ¡ V  qd S r   r   r   r   r   r   r	   L   s     z@_NameMangler.camel_snake.<locals>.cased_words.<locals>.<genexpr>r   r   r   r   r   r   J   s    z-_NameMangler.camel_snake.<locals>.cased_wordsr#   r   r   r   r   r   Úcamel_snakeE   s    z_NameMangler.camel_snakec                 C   s   d  dd„ |  |¡D ƒ¡S )z5
        Convert a name to Pascal_Snake_Case
        r#   c                 s   s   | ]}|  ¡ V  qd S r   r   r   r   r   r   r	   U   s     z,_NameMangler.pascal_snake.<locals>.<genexpr>r   r   r   r   r   Úpascal_snakeP   s    z_NameMangler.pascal_snakec                    s2   dd„ ‰ ‡ fdd„‰d  ‡fdd„|  |¡D ƒ¡S )a  
        Convert a name to SpOngEBOb_CASe

        The PRNG we use is seeded with the word to be scrambled. This produces
        stable output so the same input will always produce in the same output.
        It's not `truly` random, but your tests will thank me.
        c                 s   s\   dt |  d¡ƒB dB }dd„ }tdƒD ]}||ƒ\}}q&||ƒ\}}|rNtjntjV  q8d S )Nl        zutf-8é   c                 S   s0   | d? | d@ | d@ d? A d> B } | d@ }|| fS )Nr*   é   é   r   )ÚstateÚbitr   r   r   Ústepc   s     z2_NameMangler.spongebob.<locals>.prng.<locals>.stepéd   )r   ÚencodeÚrangeÚstrr&   r   )Z	seed_wordr-   r/   r#   r.   r   r   r   Úprng`   s    z$_NameMangler.spongebob.<locals>.prngc                    s   d  dd„ t| ˆ | ƒƒD ƒ¡S )Nr   c                 s   s   | ]\}}||ƒV  qd S r   r   )r   ÚchÚfr   r   r   r	   o   s     z;_NameMangler.spongebob.<locals>.scramble.<locals>.<genexpr>)r   Úzip)Úword)r4   r   r   Úscramblen   s    z(_NameMangler.spongebob.<locals>.scrambler#   c                 3   s   | ]}ˆ |ƒV  qd S r   r   r   )r9   r   r   r	   q   s     z)_NameMangler.spongebob.<locals>.<genexpr>r   r   r   )r4   r9   r   Ú	spongebobW   s    	z_NameMangler.spongebobc                 C   s   d  dd„ |  |¡D ƒ¡S )z.
        Convert a name to COBOL-CASE
        r    c                 s   s   | ]}|  ¡ V  qd S r   r%   r   r   r   r   r	   x   s     z%_NameMangler.cobol.<locals>.<genexpr>r   r   r   r   r   Úcobols   s    z_NameMangler.cobolc                 C   s   d  dd„ |  |¡D ƒ¡S )z4
        Convert a name to Http-Header-Case
        r    c                 s   s   | ]}|  ¡ V  qd S r   r   r   r   r   r   r	      s     z+_NameMangler.http_header.<locals>.<genexpr>r   r   r   r   r   Úhttp_headerz   s    z_NameMangler.http_headerN)Ú__name__Ú
__module__Ú__qualname__ÚreÚcompiler
   r   r   r   r"   r$   r'   r(   r)   r:   r;   r<   r   r   r   r   r      s   
r   )r@   Úzlibr   r   r   r   r   r   Ú<module>   s   