
    ii2                       d dl mZ d dlZd dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZ d dl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 d dlmZmZmZmZ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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@ d dlAmBZBmCZCmDZDmEZE d dlFmGZGmHZHmIZI d dlJmKZK d dlLmMZMmNZNmOZOmPZPmQZQ d dlRmSZS d dlTmUZU d dlVmWZWmXZXmYZYmZZZm[Z[ d dl\m]Z]m^Z^m_Z_ d dl`maZambZbmcZcmdZdmeZemfZfmgZg d dlhmiZi d dljmkZkmlZl d dlmmnZnmoZo d dlpmqZq d d lrmsZsmtZtmuZu d d!lvmwZw d d"lxmyZy d d#lzm{Z{ d d$l|m}Z} d d%l~mZmZmZ e)rd d&l<mZ d d'lJmZmZ d d(lmZmZ  e5d)          Z e5d*          Z e5d+d,-          Z G d. d/e4          Z G d0 d1ee.e                   Zd5d4Z e             dS )6    )annotationsN)ABCabstractmethod)Counterabcdeque)suppress)datedatetimetime	timedelta)Decimal)EnumMeta)partial)import_module)	IPv4AddressIPv4InterfaceIPv4NetworkIPv6AddressIPv6InterfaceIPv6Network
ip_addressip_interface
ip_network)realpath)Path)Random)TYPE_CHECKINGAnyCallableClassVar
CollectionGenericHashableIterableMappingSequenceType	TypedDictTypeVarcastoverload)UUID)Faker)Selfget_args
get_originget_original_bases)DEFAULT_RANDOMMAX_COLLECTION_LENGTHMIN_COLLECTION_LENGTHRANDOMIZE_COLLECTION_LENGTH)ConfigurationExceptionMissingBuildKwargExceptionParameterException)Null)FixtureIgnorePostGeneratedRequireUse)is_attribute_overridden)warn_deprecation)flatten_annotationget_collection_typeunwrap_annotationunwrap_argsunwrap_optional)CoverageContainerCoverageContainerCallableresolve_kwargs_coverage)get_type_originis_forward_ref
is_literalis_optionalis_safe_subclassis_type_varis_union)NoneType)handle_collection_typehandle_collection_type_coverage)handle_constrained_collectionhandle_constrained_mapping)handle_constrained_date)handle_constrained_decimalhandle_constrained_floathandle_constrained_int)handle_constrained_path)"handle_constrained_string_or_bytes)handle_constrained_url)handle_constrained_uuid)create_random_booleancreate_random_bytescreate_random_string)	TypeGuard)Constraints	FieldMeta)AsyncPersistenceProtocolSyncPersistenceProtocolTUFzBaseFactory[Any])boundc                      e Zd ZU ded<   dS )BuildContextz	set[type]seen_modelsN)__name__
__module____qualname____annotations__     r/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/polyfactory/factories/base.pyrk   rk   k   s         rr   rk   c                      e Zd ZU dZded<   	 dZded<   	 dZded	<   	 d
Zded<   	 d
Zded<   	 dZ		 dZ
ded<   	 d
Zded<   	  e            Zded<   	 eZded<   	 ded<   	 eZded<   	 eZded<   	 eZded<   	 dZded<   	 i Zded<   dZded <   	 d!ed"<   d#ed$<   d%ed&<   d'ed(<   	 d
Zd)ed*<   	 d fd0Zedd4            Zedd6            Zedd8            Zedd:            Ze	 ddd>            Z e	 	 ddd?            Z!eddA            Z"eddE            Z#eddG            Z$eddK            Z%eddM            Z&eddN            Z'eddR            Z(ee)ddU                        Z*eddX            Z+eddY            Z,edd[            Z-e.e	 	 ddd_                        Z/e.e	 ddd`                        Z/e	 	 dddc            Z/e	 	 dddd            Z0e	 	 ddde            Z1e	 	 dddg            Z2eddh            Z3eddi            Z4eddj            Z5eddk            Z6ee)ddl                        Z7eddn            Z8eddo            Z9eddp            Z:eddr            Z;eddu            Z<eddx            Z=eddz            Z>edd{            Z?edd|            Z@edd}            ZAedd~            ZB xZCS )BaseFactoryzCBase Factory class - this class holds the main logic of the libraryztype[T]	__model__Fbool__check_model__TzClassVar[bool]__allow_none_optionals__NzDtype[SyncPersistenceProtocol[T]] | SyncPersistenceProtocol[T] | None__sync_persistence__zFtype[AsyncPersistenceProtocol[T]] | AsyncPersistenceProtocol[T] | None__async_persistence____is_base_factory__z(dict[Any, type[BaseFactory[Any]]] | None__base_factory_overrides__zClassVar['Faker']	__faker__zClassVar['Random']
__random__zClassVar[int]__random_seed____randomize_collection_length____min_collection_length____max_collection_length____use_defaults__zClassVar[dict[str, Any]]__forward_references__)
rx   ry   #__set_as_default_factory_for_type__r~   r   r   r   r   r   r   ztuple[str, ...]__config_keys__list[FieldMeta]_fields_metadataz+ClassVar[dict[Any, type[BaseFactory[Any]]]]_factory_type_mappingz&ClassVar[list[type[BaseFactory[Any]]]]_base_factoriesz&ClassVar[dict[Any, Callable[[], Any]]]
_providersz#dict[Any, Callable[[], Any]] | None_extra_providersargsr   kwargsreturnNonec           
     |    t                      j        |i | t          t          d          sg t          _        t          t          d          si t          _        t          t          d          si t          _        | j        | j        k    rd}t          |          d| j
        vs| j        st          | dd           p|                                 }|sd| j         }t          |          || _        |                     |          sut          j        D ]h}|                    |          r8| j         d|j         d	|j         d
|j         d| j         	}t          |          d|j         d}t          |          t#          t          | d          st%          dddd           | j        r|                                  nt          j                            |            t          | dd           }||                     |           | j        r&t          | d          r| t          j        | j        <   d S d S d S )Nr   r   r   zMMinimum collection length shouldn't be greater than maximum collection lengthr|   rv   z;required configuration attribute '__model__' is not set on z does not support z$, but this type is supported by the zF base factory class. To resolve this error, subclass the factory from z instead of zModel type zh is not supported. To support it, register an appropriate base factory and subclass it for your factory.rx   zv2.22.0defaultz4set to `False` explicitly to keep existing behaviour)deprecated_namekindalternativer   )super__init_subclass__hasattrru   r   r   r   r   r   r7   __dict__r|   getattr_infer_model_typerm   rv   is_supported_typer@   rA   rx   %_check_declared_fields_exist_in_modelappendseed_randomr   )clsr   r   msgmodelfactoryrandom_seed	__class__s          rs   r   zBaseFactory.__init_subclass__   s   !!426222{$566 	-*,K'{$;<< 	302K-{L11 	(%'K"(3+HHHaC(   !44C<S4$+Cd$C$C$^sG\G\G^G^E bTWT`bb,   "CM((// 
*: 	 	G0077 !$  z  z  z  zu|  vF  z  z  NU  N^  z  z  lo  lx  z  z4   a  a  a  aC0   +;=NOO  $5" V	    " <99;;;'..s333c#4d;;"OOK(((2 	CwsK7P7P 	C?BK-cm<<<	C 	C 	C 	Crr   build_contextBuildContext | Nonerk   c                f    |dt                      iS i |dt          j        |d                   iS )zHReturn a BuildContext instance.

        :returns: BuildContext
        Nrl   )setcopy)r   r   s     rs   _get_build_contextzBaseFactory._get_build_context  sI      !355))

49]=%ABB
 
 	
rr   type[T] | Nonec                    d t          |           D             }d |D             }t          |          dk    rdS |d         S )a  Return model type inferred from class declaration.
        class Foo(ModelFactory[MyModel]):  # <<< MyModel
            ...

        If more than one base class and/or generic arguments specified return None.

        :returns: Inferred model type or None
        c              3  |   K   | ]7}t          |          t          t          |          t                    3|V  8d S N)r1   
issubclassru   ).0bs     rs   	<genexpr>z0BaseFactory._infer_model_type.<locals>.<genexpr>!  s[       9
 9
*Q--9
DNzZ[}}^iDjDj9
9
 9
 9
 9
 9
 9
rr   c                T    g | ]%}t          |          D ]}t          |          |&S rq   )r0   rO   )r   factory_baseargs      rs   
<listcomp>z1BaseFactory._infer_model_type.<locals>.<listcomp>$  sS     +
 +
 +
 Xl=S=S+
 +
69[fgj[k[k+
+
 +
 +
 +
rr      Nr   )r2   len)r   factory_basesgeneric_argss      rs   r   zBaseFactory._infer_model_type  sj    9
 9
)#..9
 9
 9
+
 +
$1+
 +
 +
 |!!4Arr   SyncPersistenceProtocol[T]c                    | j         r/t          | j                   r|                                  n| j         S d}t          |          )zReturn a SyncPersistenceHandler if defined for the factory, otherwise raises a ConfigurationException.

        :raises: ConfigurationException
        :returns: SyncPersistenceHandler
        zRA '__sync_persistence__' handler must be defined in the factory to use this method)rz   callabler7   r   r   s     rs   _get_sync_persistencez!BaseFactory._get_sync_persistence,  sU     # 	r19#:R1S1Sq3++---Y\Yqqb$
 
 	
rr   AsyncPersistenceProtocol[T]c                    | j         r/t          | j                   r|                                  n| j         S d}t          |          )zReturn a AsyncPersistenceHandler if defined for the factory, otherwise raises a ConfigurationException.

        :raises: ConfigurationException
        :returns: AsyncPersistenceHandler
        zTAn '__async_persistence__' handler must be defined in the factory to use this method)r{   r   r7   r   s     rs   _get_async_persistencez"BaseFactory._get_async_persistence:  sU     $ 	u2:3;T2U2Ut3,,...[^[ttd$
 
 	
rr   field_valuefield_build_parameters
Any | Nonec                   t          t                    r^t          |t                    r j        ddi|S t          |t
                    rfd|D             S                               S t          t                    r                                S t          t                    r                                S t                    r
             S t          t                    rnt          j                  S )E  Handle a value defined on the factory class itself.

        :param field_value: A value defined as an attribute on the factory class.
        :param field_build_parameters: Any build parameters passed to the factory as kwarg values.

        :returns: An arbitrary value correlating with the given field_meta value.
        _build_contextc                .    g | ]} j         dd i|S r   rq   buildr   	parameterr   r   s     rs   r   z5BaseFactory._handle_factory_field.<locals>.<listcomp>[  s?       U^%K%PP]PiPP  rr   r   rq   )rN   ru   
isinstancer&   r   r'   r?   to_valuer;   r   r$   r   deepcopy)r   r   r   r   s    `` rs   _handle_factory_fieldz!BaseFactory._handle_factory_fieldH  s0    K55 		C0':: a({(```I_```0(;;     bx    $$M$BBBk3'' 	*'')))k7++ 	*'')))K   	!;== (h??_{{T]S^E_E__rr   c                    t          t                    rvt          |t                    rt	           j        ddi|          S t          |t                    rfd|D             S t	                                                    S t          t                    r                                S t          t                    rt          j                  S t                    rt                    nS )r   r   c           	     H    g | ]}t           j        dd i|          S r   )rG   coverager   s     rs   r   z>BaseFactory._handle_factory_field_coverage.<locals>.<listcomp>  sK       ! &&:k&:&e&e-&e[d&e&eff  rr   rq   )rN   ru   r   r&   rG   r   r'   r?   r   r;   rH   r   )r   r   r   r   s    ` `rs   _handle_factory_field_coveragez*BaseFactory._handle_factory_field_coveragel  s    K55 
	=0':: w()=)=)u)u])u^t)u)uvvv0(;;     %;   
 %[%9%9%;%;<<<k3'' 	*'')))k7++ 	C,[-ABBB9A+9N9N_(555T__rr   dict[str, Any]c                Z     i  fd j         D             d                                 iS )Nc                2    i | ]}|t          |          S rq   )r   )r   keyr   s     rs   
<dictcomp>z+BaseFactory._get_config.<locals>.<dictcomp>  s%    EEE#sGC%%EEErr   r   )r   get_provider_mapr   s   `rs   _get_configzBaseFactory._get_config  sG    
EEEE1DEEE
 4 4 6 6
 
 	
rr   r   type[U]type[BaseFactory[U]]c                   t           j                            |          x}r|S |                                 }| j        rC|                                D ].}| j                            |          x}r |j        |fi |c S /t          t           j                  D ]'}|	                    |          r |j        |fi |c S (d|j
         }t          |          )zGet a factory from registered factories or generate a factory dynamically.

        :param model: A model type.
        :returns: A Factory sub-class.

        zunsupported model type )ru   r   getr   r}   mrocreate_factoryreversedr   r   rm   r9   )r   r   r   configmodel_ancestorr   s         rs   _get_or_create_factoryz"BaseFactory._get_or_create_factory  s    "7;;EBBB7 	N"") 	C"'))++ C C!<@@PPP7 C171%BB6BBBBBC   ;<< 	? 	?G((// ?-w-e>>v>>>>>? 988 %%%rr   =tuple[dict[str, Any], dict[str, PostGenerated], BuildContext]c                    |                      |                    dd                    }|d                             | j                   i |}i }|||fS )zPrepare the given kwargs and generate initial variables for further usage.

        :param kwargs: Any build kwargs.

        :returns: A tuple of build results.

        r   Nrl   )r   popaddrv   )r   r   r   resultgenerate_posts        rs   _get_initial_variablesz"BaseFactory._get_initial_variables  s\     //

;KT0R0RSS}%))#-888!+F24}n44rr   provider_typeprovider_functionCallable[[], Any]c                    || j         |<   dS )zAAdd a provider for a custom type to be available to all factoriesN)r   )r   r   r   s      rs   add_providerzBaseFactory.add_provider  s     ):}%%%rr   
annotationc                x    t          j                   o$t          fdt          j        D                       S )zDetermine whether a given field is annotated with a type that is supported by a base factory.

        :param annotation: A type annotation.
        :returns: Boolean dictating whether the annotation is a factory type
        c              3  B   K   | ]}|                               V  d S r   )r   )r   r   r   s     rs   r   z.BaseFactory.is_factory_type.<locals>.<genexpr>  sB       :
 :
6=G%%j11:
 :
 :
 :
 :
 :
rr   )inspect
isabstractanyru   r   r   r   s    `rs   is_factory_typezBaseFactory.is_factory_type  sU     %j111 
c :
 :
 :
 :
ALA\:
 :
 :
 7
 7
 	
rr   c                    t          |          p|}t          |t                    rEt          |          x}r4t	          |          dk    o t
                              |d                   S dS )zDetermine whether a given field is annotated with a sequence of supported factory types.

        :param annotation: A type annotation.
        :returns: Boolean dictating whether the annotation is a batch factory type
        r   r   r   F)rJ   rN   r'   rE   r   ru   r   )r   r   originr   s       rs   is_batch_factory_typez!BaseFactory.is_batch_factory_type  sn     !,,:
FH-- 	V;z;R;R3R4 	Vt99>Uk&A&ATRSW&A&U&UUurr   
field_metarc   
build_argsc                   |                     |j                  x}rt          |j                  }t                              |          rWt          |t                    rBt                              t          |                    s|	                    |j                  S t          
                    |          rHt          |t                    r3t          d |D                       s|	                    |j                  S dS )a  Extract from the build kwargs any build parameters passed for a given field meta - if it is a factory type.

        :param field_meta: A field meta instance.
        :param build_args: Any kwargs passed to the factory.
        :returns: Any values
        r  c              3  f   K   | ],}t                               t          |                     V  -dS )r  N)ru   r   type)r   values     rs   r   z=BaseFactory.extract_field_build_parameters.<locals>.<genexpr>  s:      ggTYK774;;7OOggggggrr   N)r   namerF   r   ru   r   r   r&   r  r   r  r'   r   )r   r  r  	build_argr   s        rs   extract_field_build_parametersz*BaseFactory.extract_field_build_parameters  s     #z7779 	7()>??J++z+BB7y'227 $33tI3OO7
 "~~jo666 11Z1HH7y(337 gg]fggggg7
 "~~jo666trr   r	  'TypeGuard[type[T]]'c                    t           )zDetermine whether the given value is supported by the factory.

        :param value: An arbitrary value.
        :returns: A typeguard
        NotImplementedErrorr   r	  s     rs   r   zBaseFactory.is_supported_type  s
     "!rr   seedintc                b    t          |          | _        | j                            |           dS )zSeed faker and random with the given integer.

        :param seed: An integer to set as seed.
        :returns: 'None'

        N)r   r   r~   seed_instance)r   r  s     rs   r   zBaseFactory.seed_random   s-      ##D)))))rr   c                
    |du S )a$  Check whether a given value is an ignored type.

        :param value: An arbitrary value.

        :notes:
            - This method is meant to be overwritten by extension factories and other subclasses

        :returns: A boolean determining whether the value should be ignored.

        Nrq   r  s     rs   is_ignored_typezBaseFactory.is_ignored_type  s     }rr   dict[Any, Callable[[], Any]]c                |    dd}i t            fdt          t          t           j        j        t
           j        j        t           j        j        t           j        j
        t          t          t           j                  t           j        j        t"           j        j        t&           j        j        t*           j        j        t.           fdt0           fdt2          d t4           j        j        t8           fdt:           j        j        t>           j        j         tB           j        j"        tF           j        j$        tJ           fd	tL           fd
tN           fdtP           fdtR           fdtT           fdtV          |tX          j+        |tZ           fdi j.        pi  j/        pi S )zMap types to callables which accept no arguments and return a random value of the given type.

        :notes:
            - This method is distinct to allow overriding.


        :returns: a dictionary mapping types to callables.

        r   r    c                     d S )zReturn a generic lambdac                     d S r   rq   )r   s    rs   <lambda>zJBaseFactory.get_provider_map.<locals>._create_generic_fn.<locals>.<lambda>'  s     rr   rq   rq   rr   rs   _create_generic_fnz8BaseFactory.get_provider_map.<locals>._create_generic_fn%  s    %%%rr   c                 2    t           j        dd          S )Nr   
   
min_length
max_length)r`   r   r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>*  s    -cnWYZZZ rr   c                 P    t           j                                                  S r   )	frozensetr~   pylistr   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>7  s    y)=)=)?)?@@ rr   c                 P    t           j                                                  S r   )r   r~   r%  r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>8  s    5!5!5!7!788 rr   c                 D    t          t          t                              S r   )r   r   __file__rq   rr   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>:  s    $x1122 rr   c                 j    t          t           j                                                            S r   )r-   strr~   uuid4r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda><  s%    $s3=#6#6#8#899:: rr   c                 P    t           j                                                  S r   )r   r~   ipv4r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>C      CM,>,>,@,@!A!A rr   c                 P    t           j                                                  S r   )r   r~   r-  r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>D      <0B0B0D0D#E#E rr   c                 T    t           j                            d                    S NT)network)r   r~   r-  r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>E  "    CM,>,>t,>,L,L!M!M rr   c                 P    t           j                                                  S r   )r   r~   ipv6r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>F  r.  rr   c                 P    t           j                                                  S r   )r   r~   r6  r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>G  r0  rr   c                 T    t           j                            d                    S r2  )r   r~   r6  r   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>H  r4  rr   c                 P    t           j                                                  S r   )r   r~   pystrr   s   rs   r  z.BaseFactory.get_provider_map.<locals>.<lambda>L  s    WS]%8%8%:%:;; rr   )r   r    )0r   objectfloatr~   pyfloatr  pyintrw   pyboolr*  r:  bytesr   r_   r   dictpydicttuplepytuplelistr%  r   pysetr$  r   r   r   	pydecimalr-   r   date_time_betweenr
   date_this_decader   time_objectr   
time_deltar   r   r   r   r   r   r    r   r   r   r   )r   r  s   ` rs   r   zBaseFactory.get_provider_map  s   	& 	& 	& 	&&
ZZZZ&
 F&
 3=(	&

 $&
 #-&&
 $&
 7.??&
 #-&&
 3=(&
 #-&&
 $&
 @@@@&
 8888&
" 22#&
$ S],%&
& ::::'&
* cm5+&
, #-0#-+s}/AAAAEEEEMMMMAAAAEEEEMMMM(L,;;;;G&
 &
H ~#I&
J #)rK&
 &	
rr   bases)tuple[type[BaseFactory[Any]], ...] | None
type[Self]c                    d S r   rq   r   r   rL  r   s       rs   r   zBaseFactory.create_factoryQ  s	     Srr   c                    d S r   rq   rP  s       rs   r   zBaseFactory.create_factoryZ  s	      #srr   type[U] | Nonetype[Self | BaseFactory[U]]c           	         |-	 | j         }n$# t          $ r}d}t          |          |d}~ww xY wt          dt	          |j         dg |pd| R d|i|                    S )aR  Generate a factory for the given type dynamically.

        :param model: A type to model. Defaults to current factory __model__ if any.
            Otherwise, raise an error
        :param bases: Base classes to use when generating the new class.
        :param kwargs: Any kwargs.

        :returns: A 'ModelFactory' subclass.

        NzJA 'model' argument is required when creating a new factory from a base onez
Type[Self]Factoryrq   rv   )rv   AttributeError	TypeErrorr+   r  rm   )r   r   rL  r   exr   s         rs   r   zBaseFactory.create_factoryc  s    " =-! - - -bnn",- >***%5;B%%%e.v. 
 
 	
s    
-(-c                b   	 t          d|j                  }t          |t                    rt	          | j        t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                              S t          |t                    rt          | j        t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                              S t          |t                    rt          | j        t          d|                    d	                    t          d|                    d
                    t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                              S |                    d          x}rt          |          S t          |t                    st          |t                    rt          | j        t          |t                    rt          nt          |                    d          pd|                    d          pd|                    d          |                    d          |                    d                    S 	 t          |          }n# t           $ r d }Y nw xY w||t"          u r;t%          | ||                    d          |                    d          ||          S t'          || |j        r|j        d         n||                    d          |                    d          |                    d          |                    dd          ||	  	        S t          |t*                    rt-          | j        t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                    t          d|                    d                              S t          |t0                    r-|                    d          x}rt3          || j                  S t          |t4                    r-|                    d          x}	rt7          |	| j                  S n# t8          $ r}
t:          |
d }
~
ww xY wd | }t;          |          )!Nrb   r   multiple_ofgtgeltle)randomrZ  r[  r\  r]  r^  decimal_places
max_digits)r_  r`  ra  rZ  r[  r\  r]  r^  url)constraints
lower_caseF
upper_caser!  r"  pattern)r_  t_typerd  re  r!  r"  rf  r   r  	min_items	max_itemsr   r   r   	item_typeunique_items)	collection_typer   r  rk  rj  ri  rl  r   r   tz)fakerr\  r[  r^  r]  rn  uuid_version)rp  ro  	path_type)
constraintro  z*received constraints for unsupported type )r+   rc  rN   r<  rX   r   r   r  rY   r   rW   r\   r*  r@  r[   rC   
ValueErrorrA  rU   rT   childrenr
   rV   r~   r-   r]   r   rZ   rW  r9   )r   r   r  r   r   rc  url_constraintsrm  rp  path_constrainter   s               rs   get_constrained_field_valuez'BaseFactory.get_constrained_field_value  s   ]	,}j.DEEK
E22 /> $UKOOM,J,J K KE;??4#8#899E;??4#8#899E;??4#8#899E;??4#8#899     
C00 -> $UKOOM,J,J K KE;??4#8#899E;??4#8#899E;??4#8#899E;??4#8#899     
G44 
1>#'{?O/P/P#Q#Q#E;??<+H+HII $UKOOM,J,J K KE;??4#8#899E;??4#8#899E;??4#8#899E;??4#8#899	 	 	 	 #.//%"8"88 K-/JJJJ
C00 	4DZQV4W4W 	9>"2:s"C"CN33*|<<E*|<<E*|<<*|<<'OOI66   '"5j"A"A ' ' '"&'*"d**5 ##-"-//,"?"?"-//,"?"?/E&3    5$39C9L\z2155R\)ook::)ool;;)ool;;!,!G!G+A"/
 
 
 
  
D11 .-E;??4#8#899E;??4#8#899E;??4#8#899E;??4#8#899E;??4#8#899     
D11 {WeGfGf7f| .!--   
  
D11 `+//ZeJfJf7f `./QTQ^____ 	, 	, 	,$!+	, H:GG %%%st   C(X +CX ?DX &X ?CX 	O X O(%X 'O((AX 1A8X *CX >AX  AX 
XXXc           
     *	   |                                |                     |j                  rdS ||                     |          rdS t	          |j                  }|                     |          }t          |          r+t          |          x}r| j        	                    |          S t          |t                    r'| j        	                    t          |                    S |j        r|                     |||          S t          |          st          |j                  rU|j        rNd         fd|j        D             }|sdS |                     | j        	                    |          |          S t$                              |          rc|s'|d         v rt)          |j                  rdnt*          S  |                     |          j        ddit          |t0                    r|ni S t$                              |          r|                     |j        d	                   t          |t6                    rfd
|D             S |j        d	         d         v rg S | j        s                              gS | j                            | j        | j                  }                     |          S tC          |          x}rtE          |tF                    rtI          |          }	|	tJ          u o"|j         p|j        d         j        tL          k    }
| j        rd|
sb|	tN          ur:tQ          |	| tR          |j        r|j        d	         n|| j        | j        |          S tU          | || j        | j        |          S tW          ||| |          S | ,                                }|-                    |j                  p|-                    |          x}r
 |            S t]          |          rt_          | j        dd          S ta          |          r6tc          td                    5   |            cddd           S # 1 swxY w Y   d|d|j3         d| j4         d}tk          |          )aX  Return a field value on the subclass if existing, otherwise returns a mock value.

        :param field_meta: FieldMeta instance.
        :param field_build_parameters: Any build parameters passed to the factory as kwarg values.
        :param build_context: BuildContext data for current build.

        :returns: An arbitrary value.

        N)r  r  )r   r  r   r   rl   c                &    g | ]}|j         v|S rq   r  )r   childrl   s     rs   r   z/BaseFactory.get_field_value.<locals>.<listcomp>  s'    fff%%BRZeBeBeBeBeBerr   r   r   r   c                .    g | ]} j         dd i|S r   r   )r   field_parametersr   r   s     rs   r   z/BaseFactory.get_field_value.<locals>.<listcomp>-  sA       ( "GMSSSBRSS  rr   r   )sizer   )rm  r   rk  r  ri  rj  r   r   rh  r   r   r   r  r   Unsupported type: z on field 'z' from class zm.

Either use 'add_provider', extend the providers map, or add a factory function for the field on the model.rq   )6r   r  r   should_set_none_valuerD   _resolve_forward_referencesrL   r0   r   choicer   r   rE  rc  rx  rP   rt  get_field_valueru   r   rM   r:   r   r   r&   r  	type_argsr'   r   randintr   r   batchrJ   rN   r"   rC   rC  EllipsisrA  rT   r   rU   rR   r   r   rO   r`   r   r	   	Exceptionr
  rm   r9   )r   r  r   r   unwrapped_annotationliteral_argsrt  
batch_sizer  rm  is_fixed_lengthprovider_mapproviderr   r   rl   s      `          @@rs   r  zBaseFactory.get_field_value  s     ..}==z455 	4!)c.G.GS].G.^.^)401FGG">>?STT!5666 	7HUiLjLj<jL 	7>((666*H55 	E>((.B)C)CDDD! 	22/%'=+	 3    )** 		ohz7L.M.M 		oS]Sf 		o'6Kffff:+>fffH  t&&s~'<'<X'F'FH^`mnnn&&2F&GG 	) L.BmTaFb.b.b*:+@AAKtttKO3--4H-IIO  ,-78NPW-X-X`))^`  
 ,,8L,MM 	P00z7KA7N0OOG0(;;     ,B   
 #A&-*FFF	6 E]CCDD//0MsOlmmJ==j=OOO%&:;;;F  	AQRXZdAeAe  	12FGGO-6 ''Y:+>r+B+MQY+Y  2 ? "$..8(7 #"%=G=P#`:#6q#9#9V`"%"?"%"?/E&3	 	 	 	 2)!;!;+A"/    *'=+    ++--$(()>??i<CSCSThCiCij8 	8::+,, 	U'1QSTTTT()) 	. )$$ . .++--. . . . . . . . . . . . . . . .}!5 } }JO } }bebn } } } 	
 !
 
 	
s   
Q%%Q),Q)Iterable[Any]c              #    
K   |                      |j                  rdS t          |j                  D ]C
|                     
          

dt          fv rdV  (t          
          r#t          
          x}rt          |          V  [t          
t                    rt          t          
                    V  |j        rt          | j        
|          V  t                              
          rKt           |                     
          j        dd|it          |t$                    r|ni           V  t'          
          x}ret)          |t*                    rP|j        sd}t/          |          t1          
fd|j        D             |          }t3          ||| |          V  |                                 x}                    |j                  p|                    
          x}	rt          |	          V  t9          
          rt;          | j        d	d
          V  t?          
          rt          
          V  0d
d}t/          |          dS )a[  Return a field value on the subclass if existing, otherwise returns a mock value.

        :param field_meta: FieldMeta instance.
        :param field_build_parameters: Any build parameters passed to the factory as kwarg values.
        :param build_context: BuildContext data for current build.

        :returns: An iterable of values.

        Nr  )r   r  r|  r   zFA subclass of Collection should always have children in its field_metac              3  2   K   | ]}|j         k    |V  d S r   r  )r   metar  s     rs   r   z7BaseFactory.get_field_value_coverage.<locals>.<genexpr>  s0      eedT_Pd=d=dT=d=d=d=deerr   )r   r   r  r   r  zJ

Either extend the providers map or add a factory function for this type.rq   ) r  r   rB   r  rQ   rL   r0   rG   r   r   rE  rc  rH   rx  ru   r   r   r   r&   rJ   r   r"   rt  r9   nextrS   r   r   rO   r`   r   r   )r   r  r   r   r  r  r   
child_metar  r  r  s             @rs   get_field_value_coveragez$BaseFactory.get_field_value_coverages  sH       z455 	F$6z7L$M$M :	 :	 #&#B#BCW#X#X #h'777



';<<< 4RZ[oRpRpBp, 4'5555550(;; 1'-A(B(BCCCCCC' ./33)       ,,8L,MM ''SC..5I.JJS  '45?@VX_5`5`h11fh       ,,@AAA& zRXZdGeGe !* 2bC,S111 "eeeej&9eee 

 6j&#]jkkkkkkk "%!5!5!7!77<<Z=RSS :##$899  0999999122 *3>aTVWWWWWWW.//  00DEEEEEE P+?  P  P  P(  q:	 :	rr   c                    | j         s|S t          |          r | j                             |j        |          S t	          |t
                    r| j                             ||          S |S )z2Resolve forward references in the factory's model.)r   rK   r   __forward_arg__r   r*  r   s     rs   r  z'BaseFactory._resolve_forward_references  sv     ) 	*%% 	Z-11*2LjYYY j#&& 	J-11*jIIIrr   c                b    | j         o(t          |j                  ot          | j                  S )a#  Determine whether a given model field_meta should be set to None.

        :param field_meta: Field metadata.

        :notes:
            - This method is distinct to allow overriding.

        :returns: A boolean determining whether 'None' should be set for the given field_meta.

        )r_  )ry   rM   r   r^   r   r   r  s     rs   r  z!BaseFactory.should_set_none_value  s7     ( =J122=%S^<<<	
rr   c                ,    | j         o|j        t          uS )a1  Determine whether to use the default value for the given field.

        :param field_meta: FieldMeta instance.

        :notes:
            - This method is distinct to allow overriding.

        :returns: A boolean determining whether the default value should be used for the given field_meta.

        )r   r   r:   r  s     rs   should_use_default_valuez$BaseFactory.should_use_default_value  s     #F
(:$(FFrr   c                J    |j                             d           o|j         |vS )aX  Determine whether to set a value for a given field_name.

        :param field_meta: FieldMeta instance.
        :param kwargs: Any kwargs passed to the factory.

        :notes:
            - This method is distinct to allow overriding.

        :returns: A boolean determining whether a value should be set for the given field_meta.

        _)r
  
startswith)r   r  r   s      rs   should_set_field_valuez"BaseFactory.should_set_field_value  s)     ?--c222Tzf7TTrr   c                    t           )zuRetrieve a list of fields from the factory's model.


        :returns: A list of field MetaData instances.

        r  r   s    rs   get_model_fieldszBaseFactory.get_model_fields   s
     "!rr   list[tuple[str, Any]]c                L    | j                                         }d |D             S )a  Retrieve a list of fields from the factory.

        Trying to be smart about what should be considered a field on the model,
        ignoring dunder methods and some parent class attributes.

        :returns: A list of tuples made of field name and field definition
        c                R    g | ]$\  }}|                     d           s
|dk     ||f%S )__	_abc_impl)r  )r   
field_namer   s      rs   r   z2BaseFactory.get_factory_fields.<locals>.<listcomp>  sN     
 
 
'
K))$//
 4>3L3L %3L3L3Lrr   )r   items)r   factory_fieldss     rs   get_factory_fieldszBaseFactory.get_factory_fields  s8     ++--
 
+9
 
 
 	
rr   c                $   d |                                  D             }|                                 }|D ]Z\  }}||v r
| d| j         d| j        j         }t	          |t
          t          t          t          f          rt          |          [d S )Nc                    h | ]	}|j         
S rq   )r
  )r   r  s     rs   	<setcomp>zDBaseFactory._check_declared_fields_exist_in_model.<locals>.<setcomp>  s    WWW*joWWWrr   z is declared on the factory z! but it is not part of the model )
r  r  rm   rv   r   r?   r=   r<   r>   r7   )r   model_fields_namesr  r  r   error_messages         rs   r   z1BaseFactory._check_declared_fields_exist_in_model  s    WW@T@T@V@VWWW//11'5 		< 		<#J///  M M3< M M47M4JM M  +]FG'LMM <,];;;<		< 		<rr   c                J   |                      |          \  }}}|                                 D ]@}|                     ||          } | j        |fi |r|                     |          st          | |j                  rt          t          |j                  st          | |j                  }t          |t                    rt          |t                    r#|j        |vrd|j         d}t          |          t          |t                    r|||j        <   |                     |||          ||j        <   |                     |||          }	|	t           u r6|	||j        <   B|                                D ]\  }
}|                    |
|          ||
<   |S )zProcess the given kwargs and generate values for the factory's model.

        :param kwargs: Any build kwargs.

        :returns: A dictionary of build results.

        r  r  Require kwarg  is missingr   r   r   r  )r   r  r  r  r  r   r
  ru   r   r   r<   r>   r8   r=   r   r  r:   r  r   )r   r   r   r   r   r  r   r   r   field_resultr  post_generators               rs   process_kwargszBaseFactory.process_kwargs+  s    140J0J60R0R-~..00 	7 	7J%(%G%GS]jp%G%q%q")s)*???? 7HdHdeoHpHp 73
00 jo9^9^ ")#z"?"?K!+v66 ! !+w77 >JOSY<Y<YKzKKK8===!+}== !9Djo6 .1.G.G$//E&4 /H / /F:?+
 "22+A"0  3    
  4''*6z'*7*=*=*?*? 	M 	M&J!/!8!8V!L!LF:rr   abc.Iterable[dict[str, Any]]c              +  L  K   |                      |          \  }}}|                                 D ])}|                     ||          } | j        |fi |r t	          | |j                  rt	          t          |j                  st          | |j                  }t          |t                    rt          |t                    r#|j        |vrd|j         d}t          |          t          |t                    r|||j        <   |                     |||          ||j        <   t          |                     |||                    ||j        <   +t!          |          D ]9}	|                                D ]\  }
}|                    |
|	          |	|
<   |	V  :dS )zProcess the given kwargs and generate values for the factory's model.

        :param kwargs: Any build kwargs.
        :param build_context: BuildContext data for current build.

        :returns: A dictionary of build results.

        r  r  r  r  r  N)r   r  r  r  r   r
  ru   r   r   r<   r>   r8   r=   r   rG   r  rI   r  r   )r   r   r   r   r   r  r   r   r   resolvedr  r  s               rs   process_kwargs_coveragez#BaseFactory.process_kwargs_coverage\  s      140J0J60R0R-~..00 	 	J%(%G%GS]jp%G%q%q")s)*???? 3
00 jo9^9^ ")#z"?"?K!+v66 ! !+w77 >JOSY<Y<YKzKKK8===!+}== !9Djo6 .1.P.P$//E&4 /Q / /F:?+
 *;00"/E&4 1  + +z' 077 	 	H.;.A.A.C.C U U*
N'5'>'>z8'T'T$$NNNN	 	rr   r  rf   c                N    t          d | j        di  | j        di |          S )zBuild an instance of the factory's __model__

        :param kwargs: Any kwargs. If field names are set in kwargs, their values will be used.

        :returns: An instance of type T.

        rf   rq   )r+   rv   r  )r   r  r   s      rs   r   zBaseFactory.build  s:     CFF););)E)Ef)E)EFFGGGrr   r  list[T]c                >      fdt          |          D             S )zBuild a batch of size n of the factory's Meta.model.

        :param size: Size of the batch.
        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: A list of instances of type T.

        c                *    g | ]} j         d i S )rq   r   )r   r  r   r   s     rs   r   z%BaseFactory.batch.<locals>.<listcomp>  s+    999		##F##999rr   )ranger   r  r   s   ` `rs   r  zBaseFactory.batch  s)     :9999U4[[9999rr   abc.Iterator[T]c              +  h   K    | j         di |D ]!} | j        di |}t          d|          V  "dS )a  Build a batch of the factory's Meta.model with full coverage of the sub-types of the model.

        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: A iterator of instances of type T.

        rf   Nrq   )r  rv   r+   )r   r   datainstances       rs   r   zBaseFactory.coverage  sd       0C/99&99 	& 	&D$s},,t,,HsH%%%%%%	& 	&rr   c                h    |                                                       | j        di |          S )zBuild and persists synchronously a single model instance.

        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: An instance of type T.

        r  rq   )r   saver   r   r   s     rs   create_synczBaseFactory.create_sync  s9     ((**//YSY5H5H5H5H/IIIrr   c                j    |                                                       | j        |fi |          S )a  Build and persists synchronously a batch of n size model instances.

        :param size: Size of the batch.
        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: A list of instances of type T.

        r  )r   	save_manyr  r  s      rs   create_batch_synczBaseFactory.create_batch_sync  s;     ((**44)#)D:S:SF:S:S4TTTrr   c                x   K   |                                                       | j        di |           d{V S )zBuild and persists asynchronously a single model instance.

        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: An instance of type T.
        r  Nrq   )r   r  r   r  s     rs   create_asynczBaseFactory.create_async  sO       //1166ICI<O<O<O<O6PPPPPPPPPrr   c                z   K   |                                                       | j        |fi |           d{V S )a  Build and persists asynchronously a batch of n size model instances.


        :param size: Size of the batch.
        :param kwargs: Any kwargs. If field_meta names are set in kwargs, their values will be used.

        :returns: A list of instances of type T.
        r  N)r   r  r  r  s      rs   create_batch_asynczBaseFactory.create_batch_async  sR       //11;;4AZAZSYAZAZ;[[[[[[[[[rr   )r   r   r   r   r   r   )r   r   r   rk   )r   r   )r   r   )r   r   r   )r   r   r   rk   r   r   r   r   )NN)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   rw   )r  rc   r  r   r   r   )r	  r   r   r  )r  r  r   r   )r	  r   r   rw   )r   r  )r   r   rL  rM  r   r   r   rN  )r   r   rL  rM  r   r   r   r   )r   rR  rL  rM  r   r   r   rS  )
r   r   r  rc   r   r   r   r   r   r   )r  rc   r   r   r   r   r   r   )r  rc   r   r   r   r   r   r  )r   r   r   r   )r  rc   r   rw   )r  rc   r   r   r   rw   )r   r   )r   r  r   r   )r   r   r   r   )r   r   r   r  )r  r   r   r   r   rf   )r  r  r   r   r   r  )r   r   r   r  )r   r   r   rf   )Drm   rn   ro   __doc__rp   rx   ry   rz   r{   r   r|   r}   r.   r~   r3   r   r6   r   r5   r   r4   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r  r   r,   r   rx  r  r  r  r  r  r  r  r  r   r  r  r   r  r   r  r  r  r  __classcell__)r   s   @rs   ru   ru   o   s        MM  "O!!!! 043333 bfeeeeIdhhhhhK*/' !&%%%% LPOOOO
 $)577I**** &4J3333 #""" 7R#QQQQ 0EDDDD 0EDDDD (-,,,, 8:9999(O     ^ &%%%FFFF;;;;6666? =A@@@@l6C 6C 6C 6C 6C 6Cp 
 
 
 [
    [* 
 
 
 [
 
 
 
 [
 
 .2	!` !` !` !` [!`F  .2-1	` ` ` ` [`B 
 
 
 [
 & & & [&0 5 5 5 [5$ : : : [: 
 
 
 [
 	 	 	 [	    [0 " " " ^ [" * * * [*    [ 5
 5
 5
 [5
n  ;?    [ X  <@# # # # [ X#  !%;?
 
 
 
 [
@ 
 .2-1g& g& g& g& [g&R  .2-1	B
 B
 B
 B
 [B
H  .2-1	L L L L [L\    [ 
 
 
 [
" G G G [G U U U [U " " " ^ [" 
 
 
 [
 < < < [< . . . [.` . . . [.` H H H [H 	: 	: 	: [	: 
& 
& 
& [
& J J J [J 	U 	U 	U [	U Q Q Q [Q 	\ 	\ 	\ [	\ 	\ 	\ 	\ 	\rr   ru   r   r   c                 `    ddl } ddl} dD ]"}	 t          |           # t          $ r Y w xY wdS )zZThis function is used to register the base factories, if present.

    :returns: None
    r   N)z&polyfactory.factories.pydantic_factoryz(polyfactory.factories.beanie_odm_factoryz*polyfactory.factories.odmantic_odm_factoryz%polyfactory.factories.msgspec_factory)'polyfactory.factories.dataclass_factory(polyfactory.factories.typed_dict_factoryr   ImportError)polyfactorymodules     rs   _register_builtin_factoriesr    sm    
 32223333  	&!!!! 	 	 	H	 s   
++r  )
__future__r   r   r   r   r   r   collectionsr   r   
contextlibr	   r   r
   r   r   decimalr   enumr   	functoolsr   	importlibr   	ipaddressr   r   r   r   r   r   r   r   r   os.pathr   pathlibr   r_  r   typingr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   uuidr-   ro  r.   typing_extensionsr/   r0   r1   r2   polyfactory.constantsr3   r4   r5   r6   polyfactory.exceptionsr7   r8   r9   polyfactory.field_metar:   polyfactory.fieldsr;   r<   r=   r>   r?   polyfactory.utils._internalr@   polyfactory.utils.deprecationrA   polyfactory.utils.helpersrB   rC   rD   rE   rF    polyfactory.utils.model_coveragerG   rH   rI   polyfactory.utils.predicatesrJ   rK   rL   rM   rN   rO   rP   polyfactory.utils.typesrQ   *polyfactory.value_generators.complex_typesrR   rS   4polyfactory.value_generators.constrained_collectionsrT   rU   .polyfactory.value_generators.constrained_datesrV   0polyfactory.value_generators.constrained_numbersrW   rX   rY   -polyfactory.value_generators.constrained_pathrZ   0polyfactory.value_generators.constrained_stringsr[   ,polyfactory.value_generators.constrained_urlr\   -polyfactory.value_generators.constrained_uuidr]   'polyfactory.value_generators.primitivesr^   r_   r`   ra   rb   rc   polyfactory.persistencerd   re   rf   rg   rh   rk   ru   r  rq   rr   rs   <module>r     s   " " " " " "   # # # # # # # # + + + + + + + + + +       4 4 4 4 4 4 4 4 4 4 4 4                   # # # # # #
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                                   "             L L L L L L L L L L L L            j i i i i i i i i i ' ' ' ' ' ' K K K K K K K K K K K K K K ? ? ? ? ? ? : : : : : :              s r r r r r r r r r                  - , , , , , n n n n n n n n        S R R R R R         
 R Q Q Q Q Q _ _ _ _ _ _ O O O O O O Q Q Q Q Q Q t t t t t t t t t t Z++++++========YYYYYYYY GCLLGCLLGC)***    9   m\ m\ m\ m\ m\#wqz m\ m\ m\`#   .       rr   