
    gi5                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddl	mZ ddlmZ dZ ed          Z G d d          Z G d d          Z G d d          ZdS )    )annotationsN)OrderedDict)Random)AnyCallablePatternSequenceTypeVar   )DEFAULT_LOCALE)UniquenessException)Factory)	Generatorrandom)SeedType)choices_distributioni  RetTypec                      e Zd ZU dZ ej        d          Zded<   d  ee	          D             Z
	 	 	 	 	 d;d<dZ fdZd=dZd> fdZd>dZd Zd?dZed@d             ZedAd"            ZdBd%Zd& Zd' ZdCd)ZedDdEd,            ZdDdEd-ZdDdFd.ZedGd0            Zej        dHd2            ZedId4            ZedJd6            Z edKd8            Z!dLd:Z" xZ#S )MFakerz2Proxy class capable of supporting multiple localesz^_cached_\w*_mapping$r   cache_patternc                D    g | ]}|                     d           s|dv|S )__)seedseed_instancer   
startswith.0attrs     c/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/faker/proxy.py
<listcomp>zFaker.<listcomp>   s>       tt/D/DIMUxIxIxIxIxIx    NTlocale3str | Sequence[str] | dict[str, int | float] | None	providerslist[str] | None	generatorGenerator | Noneincludesuse_weightingboolconfigr   returnNonec                   t                      | _        d | _        t          |           | _        t          |           | _        t          |t                    r|	                    dd          g}njt          |t          t          t          f          rlg }|D ]f}t          |t                    s t          dt          |           d          |	                    dd          }	|	|vr|                    |	           gnt          |t           t          f          rt!          d |                                D                       sJ t                      }
|                                D ] \  }}|	                    dd          }||
|<   !t          |
                                          }t          |
                                          | _        nt(          g}t+          |          dk    r,t-          j        |d         |||fd|i|| j        |d         <   n|D ]}t1          ||||fd|i|| j        |<   || _        t          | j                                                  | _        d S )	N-_zThe locale "z" must be a string.c              3  N   K   | ] }t          |t          t          f          V  !d S N)
isinstanceintfloat)r   vs     r    	<genexpr>z!Faker.__init__.<locals>.<genexpr><   s0      LLqz!c5\22LLLLLLr"   r   r   r*   )r   _factory_map_weightsUniqueProxy_unique_proxyOptionalProxy_optional_proxyr4   strreplacelisttupleset	TypeErrorappenddictallvaluesitemskeysr   lenr   creater   _locales
_factories)selfr#   r%   r'   r)   r*   r,   localescodefinal_localeodictkr7   keys                 r    __init__zFaker.__init__   s    BM(..,T22fc"" 	'~~c3//0GG uc 233 	'G 1 1!$,, S#$Q3t99$Q$Q$QRRR#||C55w..NN<0001 d 344 
	'LLFMMOOLLLLLLLLMME  1iiS))c

5::<<((G 00DMM &&Gw<<1,3N
	- -
 ,- - -Dgaj)) "  ,1	- -
 #0- - -!&))  t07799::r"   c                    t          t                                                                }| j        D ]}|d t	          |          D             z  }t          |          S )Nc                <    h | ]}|                     d           |S )r1   r   r   s     r    	<setcomp>z Faker.__dir__.<locals>.<setcomp>a   s*    UUUDPS@T@TU4UUUr"   )rC   super__dir__	factoriesdirsorted)rO   
attributesfactory	__class__s      r    r[   zFaker.__dir__^   s`    **++
~ 	V 	VGUUCLLUUUUJJj!!!r"   r?   c                    |                     dd          | j        v rt          | j                  dk    r| S | j        |                     dd                   }t	          |t
                    sJ |S )Nr0   r1   r   )r@   rP   rK   r9   r4   r   )rO   r#   instances      r    __getitem__zFaker.__getitem__d   sl    >>#s##t|33DL8I8IQ8N8NK$V^^C%=%=>(E*****r"   r   c                t    |dk    rd}t          |          t                                          |          S )z
        Handles the "attribute resolution" behavior for declared members of this proxy class

        The class method `seed` cannot be called from an instance.

        :param attr: attribute name
        :return: the appropriate attribute
        r   zZCalling `.seed()` on instances is deprecated. Use the class method `Faker.seed()` instead.)rD   rZ   __getattribute__)rO   r   msgra   s      r    rf   zFaker.__getattribute__k   s7     6>>nCC.. 77++D111r"   c                H   t          | j                  dk    rt          | j        d         |          S || j        v rd|z  }t	          |          | j                            |          rd|z  }t          |          |                     |          }t          ||          S )z
        Handles cache access and proxying behavior

        :param attr: attribute name
        :return: the appropriate attribute
        r   r   zBProxying calls to `%s` is not implemented in multiple locale mode.z$Cached attribute `%s` does not exist)	rK   rN   getattrgenerator_attrsNotImplementedErrorr   matchAttributeError_select_factory)rO   r   rg   r`   s       r    __getattr__zFaker.__getattr__z   s     t1$$4?1-t444T)))VY]]C%c***%%d++ 	*84?C %%%**400G7D)))r"   c                   | j         }|                    |          t          j        | j                  _        t          j        | j                  _        t          j        | j                  _        t          j        | j                  _        t          |           _	        fd| j	        j
                                        D             j	        _
        S )Nc                ,    i | ]}|j         j        hS  )r<   	_sentinel)r   rT   results     r    
<dictcomp>z&Faker.__deepcopy__.<locals>.<dictcomp>   s$    %s%s%saa&*>*H)I%s%s%sr"   )ra   __new__copydeepcopyrM   rN   r9   r:   r;   r<   _seenrJ   )rO   memodictclsrt   s      @r    __deepcopy__zFaker.__deepcopy__   s    nS!!-66 M$/::"mD,=>>-66*400%s%s%s%sSWSeSkSpSpSrSr%s%s%s"r"   statec                :    | j                             |           d S r3   __dict__updaterO   r}   s     r    __setstate__zFaker.__setstate__       U#####r"   r;   c                    | j         S r3   )r<   rO   s    r    uniquezFaker.unique   s    !!r"   r=   c                    | j         S r3   )r>   r   s    r    optionalzFaker.optional   s    ##r"   method_namer   c                   |                      |          \  }}t          |          dk    rd|}t          |          t          |          dk    r|d         S |r|                     ||          }n|                     |          }|S )z
        Returns a random factory that supports the provider method

        :param method_name: Name of provider method
        :return: A factory that supports the provider method
        r   z"No generator object has attribute r   )_map_provider_methodrK   rm   _select_factory_distribution_select_factory_choice)rO   r   r\   weightsrg   r`   s         r    rn   zFaker._select_factory   s     "66{CC	7y>>QF{FFC %%%^^q  Q< 	=77	7KKGG11)<<Gr"   c                >    t          ||t          d          d         S )Nr   )lengthr   )r   r   )rO   r\   r   s      r    r   z"Faker._select_factory_distribution   s    #IwqIII!LLr"   c                *    t          j        |          S r3   )r   choice)rO   r\   s     r    r   zFaker._select_factory_choice   s    }Y'''r"   (tuple[list[Factory], list[float] | None]c                T   d d}t          | |          rt          | |          S | j        rQfdt          | j        | j                  D             }t          | \  }}t          |          t          |          f}nfd| j        D             }|df}t          | ||           |S )ad  
        Creates a 2-tuple of factories and weights for the given provider method name

        The first element of the tuple contains a list of compatible factories.
        The second element of the tuple contains a list of distribution weights.

        :param method_name: Name of provider method
        :return: 2-tuple (factories, weights)
        _cached__mappingc                >    g | ]\  }}t          |          ||fS rr   hasattr)r   r`   weightr   s      r    r!   z.Faker._map_provider_method.<locals>.<listcomp>   sB       #GV7K00&!  r"   c                4    g | ]}t          |          |S rr   r   )r   r`   r   s     r    r!   z.Faker._map_provider_method.<locals>.<listcomp>   s(    \\\gg{>[>[\W\\\r"   N)r   ri   r:   zipr\   rA   setattr)rO   r   r   valuer\   r   mappings    `     r    r   zFaker._map_provider_method   s     0+///4 	'4&&& = 
	"   '*4>4='I'I  E
 "%eIw9ootG}}4GG\\\\DN\\\ETkG 	dG$$$r"   r   SeedType | Nonec                .    t          j        |           dS )zs
        Hashables the shared `random.Random` object across all factories

        :param seed: seed value
        N)r   r   )r{   r   s     r    r   z
Faker.seed   s     	tr"   c                D    | j         D ]}|                    |           dS )zr
        Creates and seeds a new `random.Random` object for each factory

        :param seed: seed value
        N)rN   r   )rO   r   r`   s      r    r   zFaker.seed_instance   s6      	( 	(G!!$''''	( 	(r"   c                n    | j         |                    dd                                       |           dS )z
        Creates and seeds a new `random.Random` object for the factory of the specified locale

        :param locale: locale string
        :param seed: seed value
        r0   r1   N)r9   r@   r   )rO   r#   r   s      r    seed_localezFaker.seed_locale   s4     	&..c223AA$GGGGGr"   r   c                x    t          | j                  dk    r| j        d         j        S d}t          |          )a   
        Proxies `random` getter calls

        In single locale mode, this will be proxied to the `random` getter
        of the only internal `Generator` object. Subclasses will have to
        implement desired behavior in multiple locale mode.
        r   r   zJProxying `random` getter calls is not implemented in multiple locale mode.rK   rN   r   rk   )rO   rg   s     r    r   zFaker.random   s<     t1$$?1%,,^C%c***r"   r   c                |    t          | j                  dk    r|| j        d         _        dS d}t          |          )a   
        Proxies `random` setter calls

        In single locale mode, this will be proxied to the `random` setter
        of the only internal `Generator` object. Subclasses will have to
        implement desired behavior in multiple locale mode.
        r   r   zJProxying `random` setter calls is not implemented in multiple locale mode.Nr   )rO   r   rg   s      r    r   zFaker.random  sA     t1$$(-DOA%%%^C%c***r"   	list[str]c                *    t          | j                  S r3   )rA   rM   r   s    r    rP   zFaker.locales  s    DM"""r"   list[int | float] | Nonec                    | j         S r3   )r:   r   s    r    r   zFaker.weights  s
    }r"   list[Generator | Faker]c                    | j         S r3   )rN   r   s    r    r\   zFaker.factories#  s
    r"   #list[tuple[str, Generator | Faker]]c                N    t          | j                                                  S r3   )rA   r9   rI   r   s    r    rI   zFaker.items'  s    D%++--...r"   )NNNNT)r#   r$   r%   r&   r'   r(   r)   r&   r*   r+   r,   r   r-   r.   )r#   r?   r-   r   )r   r?   r-   r   )r}   r   r-   r.   )r-   r;   )r-   r=   )r   r?   r-   r   )r   r?   r-   r   r3   )r   r   r-   r.   )r#   r?   r   r   r-   r.   )r-   r   )r   r   r-   r.   )r-   r   )r-   r   )r-   r   )r-   r   )$__name__
__module____qualname____doc__recompiler   __annotations__r]   r   rj   rV   r[   rd   rf   ro   r|   r   propertyr   r   rn   r   r   r   classmethodr   r   r   r   setterrP   r   r\   rI   __classcell__)ra   s   @r    r   r      s        <<'RZ(@AAMAAAA Y  O GK&*&*%)"=; =; =; =; =;~" " " " "   2 2 2 2 2 2* * * *&	 	 	$ $ $ $ " " " X" $ $ $ X$   ,M M M( ( (   B     [( ( ( ( (H H H H H + + + X+ ]+ + + ]+ # # # X#    X    X/ / / / / / / /r"   r   c                  B    e Zd ZddZddZdd
Zd Zd ZddZddZ	dS )r;   proxyr   c                H    || _         i | _        t                      | _        d S r3   )_proxyry   objectrs   rO   r   s     r    rV   zUniqueProxy.__init__,  s    
r"   r-   r.   c                    i | _         d S r3   )ry   r   s    r    clearzUniqueProxy.clear1  s    


r"   namer?   r   c                    t          | j        |          }t          |          r|                     ||          S t	          d          )Nz9Accessing non-functions through .unique is not supported.ri   r   callable_wraprD   rO   r   objs      r    ro   zUniqueProxy.__getattr__4  sE    dk4((C== 	Y::dC(((WXXXr"   c                8    | j                                         }|S r3   r   rw   r   s     r    __getstate__zUniqueProxy.__getstate__;       ""$$r"   c                :    | j                             |           d S r3   r   r   s     r    r   zUniqueProxy.__setstate__B  r   r"   r   c                f    t          |t                    r:t          t           fd|                                D                                 S t          |t
                    rt           fd|D                       S t          |t                    rt           fd|D                       S |S )zCConvert unhashable types (e.g., dict) to a hashable representation.c              3  L   K   | ]\  }}|                     |          fV  d S r3   _make_hashable)r   rT   r7   rO   s      r    r8   z-UniqueProxy._make_hashable.<locals>.<genexpr>H  s:      VV1D$7$7$:$: ;VVVVVVr"   c              3  B   K   | ]}                     |          V  d S r3   r   r   r7   rO   s     r    r8   z-UniqueProxy._make_hashable.<locals>.<genexpr>J  s1      ??A,,Q//??????r"   c              3  B   K   | ]}                     |          V  d S r3   r   r   s     r    r8   z-UniqueProxy._make_hashable.<locals>.<genexpr>L  s1      CCT0033CCCCCCr"   )r4   rF   rB   r^   rI   rA   rC   	frozenset)rO   r   s   ` r    r   zUniqueProxy._make_hashableE  s    eT"" 	DVVVVVVVVVWWWt$$ 	D??????????s## 	DCCCCUCCCCCCr"   functionr   c                N     t          j                   fd            }|S )Nc                    | t          t          |                                                    f}	j                            |	j        h          }	j        }	                    |          }t          t                    D ]%}||vr n7 | i |}	                    |          }&t          dt          dd          |
                    |           |S )NzGot duplicated values after ,z iterations.)rB   r^   rI   ry   
setdefaultrs   r   range_UNIQUE_ATTEMPTSr   add)
argskwargsrU   	generatedretvalhashable_retvalir   r   rO   s
          r    wrapperz"UniqueProxy._wrap.<locals>.wrapperP  s    uVFLLNN%;%;<<=C
--cDN3CDDI ^F"11&99O+,, k k")33E!42622"&"5"5f"="=)*iIY*i*i*i*ijjjMM/***Mr"   	functoolswrapsrO   r   r   r   s   ``` r    r   zUniqueProxy._wrapO  sD    		"	"	 	 	 	 	 	 
#	"	, r"   Nr   r   )r-   r.   r   r?   r-   r   )r   r   r-   r   )r   r?   r   r   r-   r   )
r   r   r   rV   r   ro   r   r   r   r   rr   r"   r    r;   r;   +  s        " " " "
   Y Y Y Y  $ $ $        r"   r;   c                  6    e Zd ZdZddZdd	Zd
 Zd ZddZdS )r=   zN
    Return either a fake value or None, with a customizable probability.
    r   r   c                    || _         d S r3   )r   r   s     r    rV   zOptionalProxy.__init__o  s    r"   r   r?   r-   r   c                    t          | j        |          }t          |          r|                     ||          S t	          d          )Nz;Accessing non-functions through .optional is not supported.r   r   s      r    ro   zOptionalProxy.__getattr__r  sE    dk4((C== 	[::dC(((YZZZr"   c                8    | j                                         }|S r3   r   r   s     r    r   zOptionalProxy.__getstate__y  r   r"   c                :    | j                             |           d S r3   r   r   s     r    r   zOptionalProxy.__setstate__  r   r"   r   Callable[..., RetType]Callable[..., RetType | None]c                R     t          j                  ddd fd
            }|S )Ng      ?)probr   r   r   r6   r   r-   RetType | Nonec                    d| cxk     rdk    sn t          d          j                            t          | dz                      r |i |nd S )Nr   g      ?zprob must be between 0 and 1d   )chance_of_getting_true)
ValueErrorr   booleanr5   )r   r   r   r   rO   s      r    r   z$OptionalProxy._wrap.<locals>.wrapper  sl    t????s???? !?@@@040C0C[^_cfi_i[j[j0C0k0ku88T,V,,,quur"   )r   r   r   r6   r   r   r-   r   r   r   s   ` ` r    r   zOptionalProxy._wrap  sY    		"	".1 	v 	v 	v 	v 	v 	v 	v 	v 
#	"	v
 r"   Nr   r   )r   r?   r   r   r-   r   )	r   r   r   r   rV   ro   r   r   r   rr   r"   r    r=   r=   j  s|            [ [ [ [  $ $ $     r"   r=   )
__future__r   rw   r   r   collectionsr   r   r   typingr   r   r   r	   r
   r,   r   
exceptionsr   r`   r   r'   r   r   utils.distributionr   r   r   r   r;   r=   rr   r"   r    <module>r     s   " " " " " "      				 # # # # # #       < < < < < < < < < < < < < < " " " " " " + + + + + +       ( ( ( ( ( ( ( (       4 4 4 4 4 4 
')

Q/ Q/ Q/ Q/ Q/ Q/ Q/ Q/h< < < < < < < <~                   r"   