
    ii-                    f   d dl mZ d dlmZ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mZ d dlmZ d dlmZmZ d dl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' d dl(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 n# e4$ rZ5dZ6 ee6          e5dZ5[5ww xY werd dl7m8Z8 d dl1m9Z9 d dl:m;Z; d dlm<Z<  ed          Z= G d dee=                   Z> G d dee=                   Z? edd          Z@ G d d ee@                   ZA G d! d"e	e=         ee=                   ZBdS )#    )annotations)datedatetime)	TYPE_CHECKINGAnyCallableClassVarGenericListProtocolTypeVarUnion)	Annotated)MissingDependencyExceptionParameterException)BaseFactory)Constraints	FieldMeta)AsyncPersistenceProtocolSyncPersistenceProtocol)is_attribute_overridden)warn_deprecation)
Frozendict)ARRAYColumnNumericStringinspecttypes)mssqlmysql
postgresqlsqlite)NoInspectionAvailable)AssociationProxy)InstanceStateMapperzsqlalchemy is not installedN)AsyncSession)Session)
TypeEngine)	TypeGuardTc                  &    e Zd ZddZddZdd
ZdS )SQLASyncPersistencesessionr)   returnNonec                    || _         dS )z)Sync persistence handler for SQLAFactory.Nr/   selfr/   s     /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/polyfactory/factories/sqlalchemy_factory.py__init__zSQLASyncPersistence.__init__%           datar,   c                l    | j                             |           | j                                          |S N)r/   addcommitr5   r:   s     r6   savezSQLASyncPersistence.save)   s1    r9   list[T]c                l    | j                             |           | j                                          |S r<   )r/   add_allr>   r?   s     r6   	save_manyzSQLASyncPersistence.save_many.   s1    T"""r9   N)r/   r)   r0   r1   r:   r,   r0   r,   r:   rA   r0   rA   __name__
__module____qualname__r7   r@   rD    r9   r6   r.   r.   $   sP              
     r9   r.   c                  &    e Zd ZddZddZdd
ZdS )SQLAASyncPersistencer/   r(   r0   r1   c                    || _         dS )z*Async persistence handler for SQLAFactory.Nr3   r4   s     r6   r7   zSQLAASyncPersistence.__init__5   r8   r9   r:   r,   c                   K   | j         4 d {V }|                    |           |                                 d {V  |                    |           d {V  d d d           d {V  n# 1 d {V swxY w Y   |S r<   )r/   r=   r>   refresh)r5   r:   r/   s      r6   r@   zSQLAASyncPersistence.save9   s     < 	( 	( 	( 	( 	( 	( 	(7KK.."""""""""//$'''''''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( s   AA--
A7:A7rA   c                  K   | j         4 d {V }|                    |           |                                 d {V  |D ]}|                    |           d {V  	 d d d           d {V  n# 1 d {V swxY w Y   |S r<   )r/   rC   r>   rP   )r5   r:   r/   
batch_items       r6   rD   zSQLAASyncPersistence.save_many@   s0     < 	2 	2 	2 	2 	2 	2 	27OOD!!!.."""""""""" 2 2
ooj11111111112	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2
 s   AA33
A= A=N)r/   r(   r0   r1   rE   rF   rG   rK   r9   r6   rM   rM   4   sP                   r9   rM   _T_coT)	covariantc                  &    e Zd Zedd            ZdS )_SessionMakerr0   rS   c                     d S r<   rK   rK   r9   r6   __call__z_SessionMaker.__call__M   s     Sr9   N)r0   rS   )rH   rI   rJ   staticmethodrX   rK   r9   r6   rV   rV   L   s&            \   r9   rV   c                      e Zd ZU dZdZ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ed<   g ej        ddddR Zed+ fd            Zed,d            Zed-d            Zed, fd            Zed.d            Zed/d            Zed0d"            Zed1d$            Zed2d&            Zed3 fd(            Zed4 fd*            Z xZS )5SQLAlchemyFactoryz#Base factory for SQLAlchemy models.TzClassVar[bool]__set_primary_key____set_foreign_keys__F__set_relationships____set_association_proxy__Nz1ClassVar[Session | _SessionMaker[Session] | None]__session__z;ClassVar[AsyncSession | _SessionMaker[AsyncSession] | None]__async_session__argsr   kwargsr0   r1   c                     t                      j        |i | dD ],}t          t          | |          rt	          d|dd           -d S )N)r^   zv2.22.0defaultz4set to `False` explicitly to keep existing behaviour)deprecated_namekindalternative)super__init_subclass__r   r[   r   )clsrb   rc   key	__class__s       r6   rj   z#SQLAlchemyFactory.__init_subclass__j   sx    !!426222- 		 		C&'8#sCC  #R	    			 		r9   dict[Any, Callable[[], Any]]c                X    i t           j         j        j        t          j         fdt          j         fdt          j         fdt          j	         fdt          j
         fdt          j         fdt          j         fdt          j         fdt          j         fd	t          j         fd
t          j         fdt          j         fdt          j         fdt          j         fdt          j         fdt(          j         fdt           j         fdiS )zGet mapping of types where column type should be used directly.

        For sqlalchemy dialect `JSON` type, accepted only basic types in pydict in case sqlalchemy process `JSON` raise serialize error.
        c                 j     j                             t          t          t          t
          f          S N)value_types	__faker__pydictstrintboolfloatrk   s   r6   <lambda>z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   $     4 4#sDRWAX 4 Y Y r9   c                 :     j                             dd          S )Nim  ik  )
__random__randintrz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s     6 6tT B B r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   r|   r9   c                 :     j                             d          S )NTnetworkrt   ipv4rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s    S]%7%7%7%E%E r9   c                 \     j                                         t          j                    fS r<   )rt   	past_dater   todayrz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s     3=+B+B+D+Ddjll*S r9   c                 :     j                             d          S )NFr   r   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s    S]%7%7%7%F%F r9   c                     t          t           j                                         j                                        g                    S r<   tuplesortedrt   pyintrz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   8    %8K8K8M8Ms}ObObOdOd7e0f0f*g*g r9   c                     t          t           j                                         j                                        g                    S r<   r   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   r   r9   c                 <     j                             dd          S )Nz^^:^^:^^:^^:^^:^^T)textupper)rt   hexifyrz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s    (<(<BU]a(<(b(b r9   c                     t          t           j                                         j                                        g                    S r<   r   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s8    vs}7J7J7L7LcmNaNaNcNc6d/e/e)f)f r9   c                 \     j                                         t          j                    fS r<   rt   past_datetimer   nowrz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s     )D)D)F)F(W r9   c                 \     j                                         t          j                    fS r<   r   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s     3=+F+F+H+H(,..*Y r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s%    s}';';cSWY^H_';'`'` r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s%    S]%9%9sCQUW\F]%9%^%^ r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s%    cm&:&:SRVX]G^&:&_&_ r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   s$    !5!53TSXBY!5!Z!Z r9   c                 j     j                             t          t          t          t
          f          S rq   rs   rz   s   r6   r{   z8SQLAlchemyFactory.get_sqlalchemy_types.<locals>.<lambda>   r|   r9   )r   	TupleTypert   pytupler    JSONr!   YEARr"   CIDR	DATERANGEINET	INT4RANGE	INT8RANGEMACADDRNUMRANGETSRANGE	TSTZRANGEHSTOREJSONBr#   rz   s   `r6   get_sqlalchemy_typesz&SQLAlchemyFactory.get_sqlalchemy_typesy   s   
OS]2
JYYYY
 JBBBB
 JYYYY	

 OEEEE
  "S"S"S"S
 OFFFF
  "g"g"g"g
  "g"g"g"g
  b b b b
 !f!f!f!f
  W W W W
  "Y"Y"Y"Y
 ````
 O^^^^
  ____!
" KZZZZ#
$ JYYYY%
 
 	
r9   &dict[type[TypeEngine], dict[str, str]]c                ,    t           ddit          dddiS )z@Get mapping of SQLA type engine to attribute to constraints key.length
max_length
max_digitsdecimal_places)	precisionscale)r   r   rz   s    r6   get_sqlalchemy_constraintsz,SQLAlchemyFactory.get_sqlalchemy_constraints   s0     , )) 	
 	
r9   c                    t                                                      }|                    |                                            |S r<   )ri   get_provider_mapupdater   )rk   providers_maprm   s     r6   r   z"SQLAlchemyFactory.get_provider_map   s>    0022S5577888r9   valueTypeGuard[type[T]]c                ~    	 t          |          }n# t          $ r Y dS w xY wt          |t          t          f          S NF)r   r$   
isinstancer'   r&   )rk   r   	inspecteds      r6   is_supported_typez#SQLAlchemyFactory.is_supported_type   sK    	II$ 	 	 	55	)fm%<===s    
  columnrx   c                    t          |t                    sdS | j        s	|j        rdS t	          | j        p|j                   S r   )r   r   r\   primary_keyrx   r]   foreign_keys)rk   r   s     r6   should_column_be_setz&SQLAlchemyFactory.should_column_be_set   sO    &&)) 	5& 	6+= 	5C,GF4G0GHHHr9   type_enginer*   typec                   t          |          |                                 v rt          |          S 	 |j        }nB# t          $ r5 t	          |d          sd| d}t          |          d |j        j        }Y nw xY wi }|                                                                 D ]H\  }}t          ||          s|                                D ]\  }}t          ||d           x}	|	||<   I|rt          |t          |          f         }|S )NimplzUnsupported type engine: z*.
Override get_sqlalchemy_types to support)r   r   python_typeNotImplementedErrorhasattrr   r   r   itemsr   getattrr   r   )
rk   r   
annotationmsgconstraintstype_constraint_fieldssqlalchemy_fieldconstraint_fieldr   s
             r6   _get_type_from_type_enginez,SQLAlchemyFactory._get_type_from_type_engine   sV    8 8 : :::$$$	6$0JJ" 	6 	6 	6;// 8j+jjj(--47$)5JJJ		6 $&(+(F(F(H(H(N(N(P(P 	: 	:$E$k511 6G6M6M6O6O : :2 "2$[2BDIIIEV49K 01:  	H":z+/F/F#FGJs   < <A;:A;r   c                   t          |j        t          t          j        f          r-|                     |j        j                  }t          |         }n|                     |j                  }|j        rt          |d f         }|S r<   )	r   r   r   r"   r   	item_typer   nullabler   )rk   r   r   r   s       r6   get_type_from_columnz&SQLAlchemyFactory.get_type_from_column   sx     fkE:+;#<== 	E66v{7LMMIiJJ77DDJ? 	1z4/0Jr9   list[FieldMeta]c                    g }t           j                  }|                     fd|j                                        D                         j        rj|j                                        D ]P\  }}|j        j        }|j	        s|nt          |         }|                    t          j        ||                     Q j        r|j                                        D ]\  }}t!          |t"                    r|j                            |j                  }|rn|j        j        }	t)          |	|j                  }
|
rK|
j        j        }|j	        s|nt          |         }|                    t          j        ||                     |S )Nc              3     K   | ]E\  }}                     |          t          j                            |          |           V  FdS ))r   nameN)r   r   	from_typer   ).0r   r   rk   s      r6   	<genexpr>z5SQLAlchemyFactory.get_model_fields.<locals>.<genexpr>   sw       
 

 f''//
33F;;  
 
 
 
 
 
r9   )r   r   )r   	__model__extendcolumnsr   r^   relationshipsentityclass_uselistr   appendr   r   r_   all_orm_descriptorsr   r%   gettarget_collectionr   
value_attr)rk   fields_metatabler   relationshipr   r   attrr   target_classtarget_attrs   `          r6   get_model_fieldsz"SQLAlchemyFactory.get_model_fields   s   ').. 
 
 
 

 !& 3 3 5 5
 
 
 	
 	
 	
 $ 		&+&9&?&?&A&A  "l%,3+7+?QVVT&\
""'!#-      ( 	#7==??  
dd$455 (-(;(?(?@V(W(W%( '8'?'F&-lDO&L&L& %0%7%>F7H7P)bVZ[aVbJ'.. ) 3)-/9!" !" !"   r9   SyncPersistenceProtocol[T]c                    | j         It          | j                   r!t          |                                            nt          | j                   S t                                                      S r<   )r`   callabler.   ri   _get_sync_persistencerk   rm   s    r6   r   z'SQLAlchemyFactory._get_sync_persistence  sa    ?& CO,,:#COO$5$5666(99
 ww,,...r9   AsyncPersistenceProtocol[T]c                    | j         It          | j                   r!t          |                                            nt          | j                   S t                                                      S r<   )ra   r   rM   ri   _get_async_persistencer   s    r6   r   z(SQLAlchemyFactory._get_async_persistence  sg     , C122A$S%:%:%<%<===)#*?@@
 ww--///r9   )rb   r   rc   r   r0   r1   )r0   rn   )r0   r   )r   r   r0   r   )r   r   r0   rx   )r   r*   r0   r   )r   r   r0   r   )r0   r   )r0   r   )r0   r   )rH   rI   rJ   __doc____is_base_factory__r\   __annotations__r]   r^   r_   r`   ra   r   __config_keys__classmethodrj   r   r   r   r   r   r   r   r   r   r   __classcell__)rm   s   @r6   r[   r[   Q   sn        --*.....J+/////P,11111S055555VEIKIIIIUYYYYY		$ 	 	 	
 	$ O      [ 
 
 
 [
4 

 

 

 [

      [
 > > > [> I I I [I    [2    [ ' ' ' ['R / / / / / [/ 0 0 0 0 0 [0 0 0 0 0r9   r[   )C
__future__r   r   r   typingr   r   r   r	   r
   r   r   r   r   typing_extensionsr   polyfactory.exceptionsr   r   polyfactory.factories.baser   polyfactory.field_metar   r   polyfactory.persistencer   r   polyfactory.utils._internalr   polyfactory.utils.deprecationr   polyfactory.utils.typesr   
sqlalchemyr   r   r   r   r   r   sqlalchemy.dialectsr    r!   r"   r#   sqlalchemy.excr$   sqlalchemy.ext.associationproxyr%   sqlalchemy.ormr&   r'   ImportErrorer   sqlalchemy.ext.asyncior(   r)   sqlalchemy.sql.type_apir*   r+   r,   r.   rM   rS   rV   r[   rK   r9   r6   <module>r     s/   " " " " " " # # # # # # # # b b b b b b b b b b b b b b b b b b b b b b ' ' ' ' ' ' Q Q Q Q Q Q Q Q 2 2 2 2 2 2 9 9 9 9 9 9 9 9 U U U U U U U U ? ? ? ? ? ? : : : : : : . . . . . .1IIIIIIIIIIIIIIIIDDDDDDDDDDDD444444@@@@@@444444444 1 1 1
'C
$
$S
)
)q01  ,333333&&&&&&222222++++++ GCLL    1!4        3A6   * 	4(((! ! ! ! !HUO ! ! !
L0 L0 L0 L0 L0
KN L0 L0 L0 L0 L0s   0B B%B  B%