
    K:gT                     T   d 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mZ ddlZddlmZ ddlmZ ddlmZ dd	lmZ d
dddddZ G d d      Ze G d d             Ze G d d             ZdedefdZdedefdZdej<                  defdZdej@                  de	ee      fdZ!y)a  
pyAirtable can generate ORM models that reflect the schema of an Airtable base.

The simplest way to use this functionality is with the command line utility:

.. code-block::

    % pip install 'pyairtable[cli]'
    % pyairtable base YOUR_BASE_ID orm > your_models.py
    N)	dataclass)cached_property)AnyDictListOptionalSequenceType)Base)Table)schema)fieldszfrom datetime import datezfrom datetime import datetimezfrom datetime import timedeltazfrom typing import Anyzfrom typing import Union)datedatetime	timedeltar   zUnion\[.+\]c            	       n    e Zd ZdZ	 	 ddedeee      deee      fdZe	de
edf   fd	       Zdefd
Zy)ModelFileBuilderz}
    Produces the code for a Python module file that contains ORM classes
    representing all tables in the given base.
    Nbase	table_idstable_namesc                     |xs g }|xs g }|j                         }|s|r,|D cg c]!  }|j                  |v s|j                  |v s |# }}|D cg c]  }t        | |       c}| _        yc c}w c c}w )z
        Args:
            base: The base to use when inspecting table schemas.
            table_ids: An optional list of table IDs to limit the output.
            table_names: An optional list of table names to limit the output.
        N)tablesnameidModelBuildermodel_builders)selfr   r   r   r   ttables          T/var/www/html/lionshead/venv/lib/python3.12/site-packages/pyairtable/orm/generate.py__init__zModelFileBuilder.__init__'   sx     O	!'R)!'VA166[+@ADDIDUaFVFLMfU|D%8fM WMs   !A-A-A2returnr   c                     | j                   D ci c]6  }|j                  j                  |j                  j                  fD ]  }|| 8 c}}S c c}}w N)r   r   r   r   )r   builderkeys      r    model_lookupzModelFileBuilder.model_lookup:   sY      ..
.(('--*<*<= L= .
 	
 
s   ;Ac                 V   dj                  d | j                  D              ddgfdt        j                         D        }dj                  ddgd	 |D        dd
d      }dj                  dgt	        d | j                  D              d      }dj                  ||g      S )Nz


c              3   2   K   | ]  }t        |        y wr$   )str).0r%   s     r    	<genexpr>z+ModelFileBuilder.__str__.<locals>.<genexpr>C   s     #T@SWCL@Ss   z	import oszfrom functools import partialc              3   \   K   | ]#  \  }}t        j                  d | d      r| % yw)z\[z\]N)research)r+   import_exprimport_textmodels_exprs      r    r,   z+ModelFileBuilder.__str__.<locals>.<genexpr>G   s5      0K,K99;-r2K@ 0Ks   ),
z"from __future__ import annotations c              3   &   K   | ]	  }|s|  y wr$    )r+   lines     r    r,   z+ModelFileBuilder.__str__.<locals>.<genexpr>Q   s     8<44$<s   z from pyairtable.orm import Modelz&from pyairtable.orm import fields as Fz__all__ = [c              3   <   K   | ]  }d |j                   d  yw)    ,N)
class_name)r+   bs     r    r,   z+ModelFileBuilder.__str__.<locals>.<genexpr>Z   s!     N:MQ$q||.a0:M   ])joinr   _ANNOTATION_IMPORTSitemssorted)r   import_exprspreambleall_exprr2   s       @r    __str__zModelFileBuilder.__str__B   s    mm#T@S@S#TT+
0C0I0I0K
 994 9<8 	
 3 9	
 99N$:M:MNN 
 }}hX>??    )NN)__name__
__module____qualname____doc__r   r   r	   r*   r!   r   r   r'   rF   r6   rG   r    r   r   !   sy     .2/3	NN HSM*N hsm,	N& 
d3#67 
 
@ @rG   r   c                   n    e Zd ZU eed<   eed<   dZeed<   ede	d   fd       Z
edefd       Zdefd	Zy
)r   file_generatorr   AIRTABLE_API_KEYmeta_envvarr"   FieldBuilderc                     | j                   j                         j                  D cg c]#  }t        || j                  j
                        % c}S c c}w )N)lookup)r   r   r   rP   rM   r'   )r   field_schemas     r    field_builderszModelBuilder.field_buildersg   sO     !%

 1 1 3 : :
 : d.A.A.N.NO :
 	
 
s   (Ac                 \    t        | j                  j                         j                        S r$   )table_class_namer   r   r   r   s    r    r;   zModelBuilder.class_namen   s     

 1 1 3 8 899rG   c           	         dj                  d| j                   ddd| j                  dd| j                  j                  j
                  d| j                  j                         j                  d	gd
 | j                  D              S )Nr3   zclass z(Model):z    class Meta:z*        api_key = partial(os.environ.get, )z        base_id = z        table_name = r4   c              3   &   K   | ]	  }d |   yw)r9   Nr6   )r+   fgs     r    r,   z'ModelBuilder.__str__.<locals>.<genexpr>{   s     <(;"D+(;s   )	r?   r;   rO   r   r   r   r   r   rT   rW   s    r    rF   zModelBuilder.__str__r   s    yy)2!<T=M=M<PPQR$TZZ__%7%7$:;'

(9(9(;(@(@'CD =(;(;<

 
	
rG   N)rH   rI   rJ   r   __annotations__r   rO   r*   propertyr   rT   r;   rF   r6   rG   r    r   r   a   s\    $$L)K)
^ 4 
 
 :C : :
 
rG   r   c                       e Zd ZU ej                  ed<   eeef   ed<   e	defd       Z
e	deej                     fd       ZdefdZy)rP   r   rR   r"   c                 @    t        | j                  j                        S r$   )field_variable_namer   r   rW   s    r    var_namezFieldBuilder.var_name   s    "4;;#3#344rG   c                 2   | j                   j                  }t        | j                   t        j                  t        j
                  f      rJ| j                   j                  j                  r*| j                   j                  j                  j                  }t        | j                   t        j                        r.	 | j                  | j                   j                  j                      t        j                  |   S # t        $ r t        j                  cY S w xY wr$   )r   type
isinstanceSFormulaFieldSchemaRollupFieldSchemaoptionsresultMultipleRecordLinksFieldSchemarR   linked_table_idKeyErrorr   
_ListFieldFIELD_TYPES_TO_CLASSES)r   
field_types     r    field_classzFieldBuilder.field_class   s    [[%%
dkkA$8$8!:M:M#NO{{""))![[0077<<
dkk1#C#CD)DKK//??@ ,,Z88  )((()s   :-C: :DDc                 v   | j                   j                  g}i }d}| j                  }t        | j                   t        j
                        rt        | j                         }|t        j                  u rwt        | j                   t        j                        sJ | j                  | j                   j                  j                     }|j                  |d<   t        |j                        }|t        j                  u rd}| j                   j                   dv rt        | j                   t        j"                  t        j$                  f      sJ t        j&                  }| j                   j                  j(                  r;t        j*                  | j                   j                  j(                  j                      }d|d<   |xr d| d}|D cg c]  }t        |       }}|j-                  d	 |j/                         D               d
j1                  |      }| j2                   d|j4                   | d| dS c c}w )Nr4   modelr*   )formularollupTreadonly[r>   c              3   0   K   | ]  \  }}| d |  yw)=Nr6   )r+   kvs      r    r,   z'FieldBuilder.__str__.<locals>.<genexpr>   s     CN&1aA3auNs   , z = F.(rY   )r   r   rp   rd   re   MultipleLookupValuesFieldSchemalookup_field_type_annotationr   	LinkFieldrj   rR   rh   rk   r;   reprrm   rc   rf   rg   Fieldri   rn   extendrA   r?   ra   rH   )	r   argskwargsgenericclslinked_modelarg	args_repr	args_joins	            r    rF   zFieldBuilder.__str__   s   ;;++,!#dkk1#D#DE24;;?G&"""dkk1+K+KLLL;;t{{':':'J'JKL*55F7O<223G&###G;;44dkkA,@,@!BUBU+VWWW,,C{{""))33DKK4G4G4N4N4S4ST!%F:,'!n*./$3T#Y$	/CFLLNCCIIi(	--cll^G9Ai[JJ 0s   
H6N)rH   rI   rJ   re   FieldSchemar\   r   r*   r   r]   ra   r
   r   AnyFieldrp   rF   r6   rG   r    rP   rP      sg    MMl"##5# 5 5 
9T&//2 
9 
9K KrG   rP   
table_namer"   c                    t        j                  |       }t        j                  dd|      j	                         }t        j                  dd|      }t        j                  dd|      }dj                  d |j                         D              S )	zB
    Convert an Airtable table name into a Python class name.
    [^a-zA-Z0-9]+ ([0-9]) +([0-9])\1_\2^([0-9])_\1r4   c              3   <   K   | ]  }|j                           y wr$   )
capitalize)r+   parts     r    r,   z#table_class_name.<locals>.<genexpr>   s     >4??$r=   )
inflectionsingularizer.   substripr?   split)r   r   s     r    rV   rV      sp     !!*-D66"C.446D66%x6D66+vt,D77>>>>rG   
field_namec                     t        j                  dd|       }|j                         j                         j	                  dd      }t        j                  dd|      }t        j                  dd|      }|S )zE
    Convert an Airtable field name into a Python variable name.
    r   r   _r   r   r   r   )r.   r   r   lowerreplace)r   r   s     r    r`   r`      sb     66"C4D::<''S1D66%x6D66+vt,DKrG   r   c                    | j                   j                  sy| j                   j                  j                  }|dk(  ryt        j                  |   }t        t        |dd      x}t              r|j                  S t        |j                        }t        |      dk(  r|d   j                  S dd	j                  d
 t        |j                        D              z  S )z
    Given the schema for a multipleLookupValues field, determine the type annotation
    we should use when creating the field descriptor.
    r   multipleRecordLinksr*   contains_typeN   r   z	Union[%s]r{   c              3   4   K   | ]  }|j                     y wr$   )rH   )r+   r   s     r    r,   z/lookup_field_type_annotation.<locals>.<genexpr>   s     "Q7P!1::7Ps   )rh   ri   rc   r   rn   rd   getattrrH   _flattenvalid_typeslenr?   )r   lookup_typer   contained_typer   s        r    r~   r~      s    
 >>  ..'',,K++

'
'
4CGC$$GG.N&&&3??+K
;11~&&&"Qx7P"QQQQrG   
class_infoc                     t        | t              r| gS | D cg c]  }t        |t              s| }}| D ]-  }t        |t              s|j                  t	        |             / |S c c}w )z
    Given a _ClassInfo tuple (which can contain multiple levels of nested tuples)
    return a single list of all the actual types contained.
    )rd   rc   tupler   r   )r   r   	flatteneds      r    r   r      sf    
 *d#|&>Jq*Q*=JI>aXa[)  	 ?s
   A(A()"rK   r.   dataclassesr   	functoolsr   typingr   r   r   r   r	   r
   r   pyairtable.api.baser   pyairtable.api.tabler   pyairtable.modelsr   re   pyairtable.ormr   r@   r   r   rP   r*   rV   r`   r}   r~   
_ClassInfor   r6   rG   r    <module>r      s   	 
 ! % < <  $ & ) ! (/1#. =@ =@@ 
 
 
< 2K 2K 2Kj? ? ?C C R)J)J Rs R&** tDI rG   