U
     WhD3                     @  s   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 dZG dd dZG dd dZdS )    )annotationsN)OrderedDict)Random)AnyCallablePatternSequenceTypeVar   )DEFAULT_LOCALE)UniquenessException)Factory)	Generatorrandom)SeedType)choices_distributioni  RetTypec                	      s  e Zd ZU dZedZded< dd ee	D Z
dNd	d
dd
ddddddZ fddZdd dddZddd fddZdddddZdd Zdddd d!Zed"d#d$d%Zed&d#d'd(Zdd)d*d+d,Zd-d. Zd/d0 Zdd1d*d2d3ZedOd4dd5d6d7ZdPd4dd5d8d9ZdQdd4dd:d;d<Zed=d#d>d?Zejd=dd@dAd?ZedBd#dCdDZedEd#dFdGZ edHd#dIdJZ!dKd#dLdMZ"  Z#S )RFakerz2Proxy class capable of supporting multiple localesz^_cached_\w*_mapping$r   cache_patternc                 C  s"   g | ]}| d s|dkr|qS )__)seedseed_instancer   
startswith.0attr r   M/var/www/html/arya_register/venvv2/lib/python3.8/site-packages/faker/proxy.py
<listcomp>   s    
  zFaker.<listcomp>NTz3str | Sequence[str] | dict[str, int | float] | Nonezlist[str] | NonezGenerator | Noneboolr   None)locale	providers	generatorincludesuse_weightingconfigreturnc                 K  s  t  | _d | _t| | _t| | _t|tr<|	ddg}nt|t
ttfrg }|D ]@}t|tsvtdt| d|	dd}	|	|krT||	 qTnxt|t tfr
tdd | D stt  }
| D ]\}}|	dd}||
|< qt
|
 }t
|
 | _ntg}t|dkrJtj|d |||fd	|i|| j|d < n,|D ]&}t||||fd	|i|| j|< qN|| _t
| j | _d S )
N-_zThe locale "z" must be a string.c                 s  s   | ]}t |ttfV  qd S N)
isinstanceintfloat)r   vr   r   r   	<genexpr><   s     z!Faker.__init__.<locals>.<genexpr>r
   r   r&   )r   _factory_map_weightsUniqueProxy_unique_proxyOptionalProxy_optional_proxyr,   strreplacelisttupleset	TypeErrorappenddictallvaluesAssertionErroritemskeysr   lenr   creater   _locales
_factories)selfr"   r#   r$   r%   r&   r'   localescodeZfinal_localeodictkr/   keyr   r   r   __init__   s^    	




		zFaker.__init__c                   s8   t t  }| jD ]}|dd t|D O }qt|S )Nc                 S  s   h | ]}| d s|qS )r*   r   r   r   r   r   	<setcomp>a   s     
 z Faker.__dir__.<locals>.<setcomp>)r;   super__dir__	factoriesdirsorted)rH   
attributesfactory	__class__r   r   rQ   ^   s    
zFaker.__dir__r7   )r"   r(   c                 C  sH   | dd| jkr$t| jdkr$| S | j| dd }t|tsDt|S )Nr)   r*   r
   )r8   rI   rD   r1   r,   r   rA   )rH   r"   instancer   r   r   __getitem__d   s
     zFaker.__getitem__)r   r(   c                   s&   |dkrd}t |nt |S d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.N)r<   rP   __getattribute__)rH   r   msgrW   r   r   r[   k   s    	
zFaker.__getattribute__c                 C  sp   t | jdkrt| jd |S || jkr:d| }t|n2| j|rXd| }t|n| |}t||S d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 existN)	rD   rG   getattrgenerator_attrsNotImplementedErrorr   matchAttributeError_select_factory)rH   r   r\   rV   r   r   r   __getattr__z   s    



zFaker.__getattr__c                   st   | j }|| t| j _t| j _t| j _t| j _t|  _	 fdd| j	j
 D  j	_
 S )Nc                   s   i | ]}| j jhqS r   )r4   	_sentinel)r   rL   resultr   r   
<dictcomp>   s      z&Faker.__deepcopy__.<locals>.<dictcomp>)rX   __new__copydeepcopyrF   rG   r1   r2   r3   r4   _seenrC   )rH   Zmemodictclsr   re   r   __deepcopy__   s    

zFaker.__deepcopy__)stater(   c                 C  s   | j | d S r+   __dict__updaterH   rn   r   r   r   __setstate__   s    zFaker.__setstate__r3   r(   c                 C  s   | j S r+   )r4   rH   r   r   r   unique   s    zFaker.uniquer5   c                 C  s   | j S r+   )r6   ru   r   r   r   optional   s    zFaker.optionalr   )method_namer(   c                 C  sb   |  |\}}t|dkr.d|}t|nt|dkrB|d S |rT| ||}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_methodrD   ra   _select_factory_distribution_select_factory_choice)rH   rx   rR   weightsr\   rV   r   r   r   rb      s    


zFaker._select_factoryc                 C  s   t ||tddd S )Nr
   )lengthr   )r   r   )rH   rR   r|   r   r   r   rz      s    z"Faker._select_factory_distributionc                 C  s
   t |S r+   )r   choice)rH   rR   r   r   r   r{      s    zFaker._select_factory_choicez(tuple[list[Factory], list[float] | None]c                   s   d  d}t | |r t| |S | jr` fddt| j| jD }t| \}}t|t|f}n fd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)
        Z_cached__mappingc                   s"   g | ]\}}t | r||fqS r   hasattr)r   rV   weightrx   r   r   r      s   
z.Faker._map_provider_method.<locals>.<listcomp>c                   s   g | ]}t | r|qS r   r   )r   rV   r   r   r   r      s     
 N)r   r]   r2   ziprR   r9   setattr)rH   rx   r   valuerR   r|   mappingr   r   r   ry      s    


zFaker._map_provider_methodzSeedType | None)r   r(   c                 C  s   t | dS )zs
        Hashables the shared `random.Random` object across all factories

        :param seed: seed value
        N)r   r   )rl   r   r   r   r   r      s    z
Faker.seedc                 C  s   | j D ]}|| qdS )zr
        Creates and seeds a new `random.Random` object for each factory

        :param seed: seed value
        N)rG   r   )rH   r   rV   r   r   r   r      s    
zFaker.seed_instance)r"   r   r(   c                 C  s   | 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
        r)   r*   N)r1   r8   r   )rH   r"   r   r   r   r   seed_locale   s    zFaker.seed_localer   c                 C  s*   t | jdkr| jd jS d}t|dS )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.NrD   rG   r   r_   )rH   r\   r   r   r   r      s    
zFaker.random)r   r(   c                 C  s,   t | jdkr|| jd _nd}t|dS )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   )rH   r   r\   r   r   r   r     s    
z	list[str]c                 C  s
   t | jS r+   )r9   rF   ru   r   r   r   rI     s    zFaker.localeszlist[int | float] | Nonec                 C  s   | j S r+   )r2   ru   r   r   r   r|     s    zFaker.weightszlist[Generator | Faker]c                 C  s   | j S r+   )rG   ru   r   r   r   rR   #  s    zFaker.factoriesz#list[tuple[str, Generator | Faker]]c                 C  s   t | j S r+   )r9   r1   rB   ru   r   r   r   rB   '  s    zFaker.items)NNNNT)N)N)N)$__name__
__module____qualname____doc__recompiler   __annotations__rS   r   r^   rN   rQ   rZ   r[   rc   rm   rs   propertyrv   rw   rb   rz   r{   ry   classmethodr   r   r   r   setterrI   r|   rR   rB   __classcell__r   r   rW   r   r      sP   
     ?!		r   c                   @  sZ   e Zd ZddddZddddZd	d
dddZdd Zdd Zd	dddddZdS )r3   r   proxyc                 C  s   || _ i | _t | _d S r+   )_proxyrk   objectrd   rH   r   r   r   r   rN   ,  s    zUniqueProxy.__init__r!   rt   c                 C  s
   i | _ d S r+   )rk   ru   r   r   r   clear1  s    zUniqueProxy.clearr7   r   namer(   c                 C  s,   t | j|}t|r | ||S tdd S )Nz9Accessing non-functions through .unique is not supported.r]   r   callable_wrapr<   rH   r   objr   r   r   rc   4  s    zUniqueProxy.__getattr__c                 C  s   | j  }|S r+   rp   ri   rr   r   r   r   __getstate__;  s    
zUniqueProxy.__getstate__c                 C  s   | j | d S r+   ro   rr   r   r   r   rs   B  s    zUniqueProxy.__setstate__r   r   functionr(   c                   s   t   fdd}|S )Nc                    sr   | t t| f}j|jh}j}ttD ]}||krF qd | |}q6tdtdd|	| |S )NzGot duplicated values after ,z iterations.)
r:   rT   rB   rk   
setdefaultrd   range_UNIQUE_ATTEMPTSr   add)argskwargsrM   Z	generatedretvalir   r   rH   r   r   wrapperF  s    
z"UniqueProxy._wrap.<locals>.wrapper	functoolswrapsrH   r   r   r   r   r   r   r   E  s    zUniqueProxy._wrapN)	r   r   r   rN   r   rc   r   rs   r   r   r   r   r   r3   +  s   r3   c                   @  sP   e Zd ZdZddddZdddd	d
Zdd Zdd ZddddddZdS )r5   zN
    Return either a fake value or None, with a customizable probability.
    r   r   c                 C  s
   || _ d S r+   )r   r   r   r   r   rN   c  s    zOptionalProxy.__init__r7   r   r   c                 C  s,   t | j|}t|r | ||S tdd S )Nz;Accessing non-functions through .optional is not supported.r   r   r   r   r   rc   f  s    zOptionalProxy.__getattr__c                 C  s   | j  }|S r+   r   rr   r   r   r   r   m  s    
zOptionalProxy.__getstate__c                 C  s   | j | d S r+   ro   rr   r   r   r   rs   t  s    zOptionalProxy.__setstate__zCallable[..., RetType]zCallable[..., RetType | None]r   c                   s.   t  ddddddd fdd}|S )	Ng      ?)probr   r.   zRetType | None)r   r   r   r(   c                   sB   d|   k rdksn t djjt| d dr> ||S d S )Nr   g      ?zprob must be between 0 and 1d   )chance_of_getting_true)
ValueErrorr   booleanr-   )r   r   r   r   rH   r   r   r   x  s    z$OptionalProxy._wrap.<locals>.wrapperr   r   r   r   r   r   w  s    "zOptionalProxy._wrapN)	r   r   r   r   rN   rc   r   rs   r   r   r   r   r   r5   ^  s   r5   )
__future__r   ri   r   r   collectionsr   r   r   typingr   r   r   r   r	   r'   r   
exceptionsr   rV   r   r$   r   r   Zutils.distributionr   r   r   r   r3   r5   r   r   r   r   <module>   s&     3