
    ; i~C                       d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZ eeeef         Zeeej        eee	eegef         f         e
e         ej        ej        f         Ze	egef         Zd)dZd*dZ ej        d           G d dej                              Z	 	 d+d,dZ G d dej                  Z  G d dej                  Z! G d d ej                  Z" ej        d           G d! d"e                      Z# G d# d$e#          Z$ G d% d&e          Z% ej        d           G d' d(e                      Z&dS )-aY  Classes that define arguments for populating ArgumentParser.

The argparse module's ArgumentParser.add_argument() takes several parameters and
is quite customizable. However this can lead to bugs where arguments do not
behave as expected.

For better ease-of-use and better testability, define a set of classes for the
types of flags used by LLM Magics.

Sample usage:

  str_flag = SingleValueFlagDef(name="title", required=True)
  enum_flag = EnumFlagDef(name="colors", required=True, enum_type=ColorsEnum)

  str_flag.add_argument_to_parser(my_parser)
  enum_flag.add_argument_to_parser(my_parser)
    )annotationsN)AnyCallableSequenceTupleUnion)llmfn_inputs_source)llmfn_outputsx	type[Any]returnstrc                P    	 | j         S # t          $ r t          |           cY S w xY wN)__name__AttributeErrorr   r   s    }/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/google/generativeai/notebook/flag_def.py_get_type_namer   ?   s9    z   1vvs   	 %%namec                ^    | st          d          | d         dk    rt          d          | S )z.Validation for long and short names for flags.zCannot be emptyr   -zCannot start with dash)
ValueError)r   s    r   _validate_flag_namer   F   s:     ,*+++Aw#~~1222K    T)frozenc                      e Zd ZU dZded<   dZded<   dZded	<   eZd
ed<   dZ	ded<   dZ
ded<   dZded<   dZded<   ej        dd            Zej        dd            Zd dZd!dZd ZdS )"FlagDefa  Abstract base class for flag definitions.

    Attributes:
      name: Long name, e.g. "colors" will define the flag "--colors".
      required: Whether the flag must be provided on the command line.
      short_name: Optional short name.
      parse_type: The type that ArgumentParser should parse the command line
        argument to.
      dest_type: The type that the parsed value is converted to. This is used when
        we want ArgumentParser to parse as one type, then convert to a different
        type. E.g. for enums we parse as "str" then convert to the desired enum
        type in order to provide cleaner help messages.
      parse_to_dest_type_fn: If provided, this function will be used to convert
        the value from `parse_type` to `dest_type`. This can be used for
        validation as well.
      choices: If provided, limit the set of acceptable values to these choices.
      help_msg: If provided, adds help message when -h is used in the command
        line.
    r   r   FboolrequiredN
str | None
short_nameztype[_PARSETYPES]
parse_typeztype[_DESTTYPES] | None	dest_typez_PARSEFN | Noneparse_to_dest_type_fnzlist[_PARSETYPES] | Nonechoiceshelp_msgparserargparse.ArgumentParserr   Nonec                    dS )zAdds this flag as an argument to `parser`.

        Child classes should implement this as a call to parser.add_argument()
        with the appropriate parameters.

        Args:
          parser: The parser to which this argument will be added.
        N )selfr(   s     r   add_argument_to_parserzFlagDef.add_argument_to_parserq         r   c                    dS )z.For child classes to do additional validation.Nr,   r-   s    r   _do_additional_validationz!FlagDef._do_additional_validation|   r/   r   type[_DESTTYPES]c                ,    | j         | j        n| j         S )z!Returns the final converted type.)r$   r#   r1   s    r   _get_dest_typezFlagDef._get_dest_type   s    "&."8tdnLr   _PARSEFNc                f    | j         | j         S |                                 }|| j        k    rd S |S )z;Returns a function to convert from parse_type to dest_type.Nc                    | S r   r,   r   s    r   <lambda>z4FlagDef._get_parse_to_dest_type_fn.<locals>.<lambda>   s    Q r   )r%   r5   r#   )r-   r$   s     r   _get_parse_to_dest_type_fnz"FlagDef._get_parse_to_dest_type_fn   sB     %1--''))	'';r   c                    t          | j                   | j        t          | j                   |                                  d S r   )r   r   r"   r2   r1   s    r   __post_init__zFlagDef.__post_init__   sB    DI&&&?&000&&(((((r   r(   r)   r   r*   r   r*   )r   r3   )r   r6   )r   
__module____qualname____doc____annotations__r    r"   r   r#   r$   r%   r&   r'   abcabstractmethodr.   r2   r5   r:   r<   r,   r   r   r   r   O   s$         ( IIIH!J!!!!$'J'''')-I-----11111(,G,,,,H    	= = = =M M M M   ) ) ) ) )r   r   F	namespaceargparse.Namespacedesthas_defaultr   default_valuer   c                V    t          | |          sdS |sdS t          | |          |k    S )a  Returns true if `namespace.dest` is set to a non-default value.

    Args:
      namespace: The Namespace that is populated by ArgumentParser.
      dest: The attribute in the Namespace to be populated.
      has_default: "None" is a valid default value so we use an additional
        `has_default` boolean to indicate that `default_value` is present.
      default_value: The default value to use when `has_default` is True.

    Returns:
      Whether namespace.dest is set to something other than the default value.
    FT)hasattrgetattr)rE   rG   rH   rI   s       r   _has_non_default_valuerM      s?    $ 9d## u  t9d##}44r   c                  0     e Zd ZdZd fdZ	 dddZ xZS )_SingleValueStoreActionzCustom Action for storing a value in an argparse.Namespace.

    This action checks that the flag is specified at-most once.
    r$   r   r%   r6   c                Z     t                      j        ||fi | || _        || _        d S r   super__init__
_dest_type_parse_to_dest_type_fnr-   option_stringsrG   r$   r%   kwargs	__class__s         r   rS   z _SingleValueStoreAction.__init__   ;     	88888#&;###r   Nr(   r)   rE   rF   valuesstr | Sequence[Any] | Noneoption_stringr!   c                   t          |t                    st          |t                    rJ t          || j        t          | d          t          | d                    r(t          j        | d	                    |                    	 | 
                    |d                   }n\# t          $ rO}t          j        | d	                    |d         t          t          |                    |                    d }~ww xY wt          || j                  sOt          d	                    t          | j                  t          t          |                                        t!          || j        |           d S )NdefaultrH   rI   Cannot set {} more than oncer   !Error with value "{}", got {}: {}+Converted to wrong type, expected {} got {})
isinstancer   bytesrM   rG   rK   rL   argparseArgumentErrorformatrU   	Exceptionr   typerT   RuntimeErrorsetattr)r-   r(   rE   r[   r]   converted_valuees          r   __call__z _SingleValueStoreAction.__call__   s    fc**L:fe3L3LLLL!Ii00!$	22	
 
 
 	e (/M/T/TUb/c/cddd	"99&)DDOO 	 	 	(3::6!9nUYZ[U\U\F]F]_`aa  	 /4?;; 	=DD"4?33"4#8#899    		49o66666s   
B& &
C?0A
C::C?r$   r   r%   r6   r   r(   r)   rE   rF   r[   r\   r]   r!   r   r?   r@   rA   rS   ro   __classcell__rY   s   @r   rO   rO      se         

< 
< 
< 
< 
< 
<" %)"7 "7 "7 "7 "7 "7 "7 "7 "7r   rO   c                  0     e Zd ZdZd fdZ	 dddZ xZS )_MultiValuesAppendActionzCustom Action for appending values in an argparse.Namespace.

    This action checks that the flag is specified at-most once.
    r$   r   r%   r6   c                Z     t                      j        ||fi | || _        || _        d S r   rQ   rV   s         r   rS   z!_MultiValuesAppendAction.__init__   rZ   r   Nr(   r)   rE   rF   r[   r\   r]   r!   c                   t          |t                    st          |t                    rJ t          || j                  }|r(t          j        | d                    |                    |D ]}	 |                     |          }n\# t          $ rO}t          j        | d                    |d         t          t          |                    |                    d }~ww xY wt          || j                  s5t          d                    | j        t          |                              ||v r(t          j        | d                    |                    |                    |           d S )Nra   rb   r   rc   zDuplicate values "{}")rd   r   re   rL   rG   rf   rg   rh   rU   ri   r   rj   rT   rk   append)	r-   r(   rE   r[   r]   
curr_valuevaluerm   rn   s	            r   ro   z!_MultiValuesAppendAction.__call__   s    fc**L:fe3L3LLLLY	22
 	e(/M/T/TUb/c/cddd 	/ 	/E"&"="=e"D"D   ,7>>q	>$q''#:#:A    ot?? "AHHo)>)>   
 *,,,T3J3Q3QRW3X3XYYYo....)	/ 	/s   2B
C!A
CC!rp   r   rq   rr   rt   s   @r   rv   rv      se         

< 
< 
< 
< 
< 
<" %)#/ #/ #/ #/ #/ #/ #/ #/ #/r   rv   c                  .     e Zd ZdZ fdZ	 dddZ xZS )_BooleanValueStoreActionzCustom Action for setting a boolean value in argparse.Namespace.

    The boolean flag expects the default to be False and will set the value to
    True.
    This action checks that the flag is specified at-most once.
    c                >     t                      j        ||fi | d S r   )rR   rS   )r-   rW   rG   rX   rY   s       r   rS   z!_BooleanValueStoreAction.__init__-  s,     	8888888r   Nr(   r)   rE   rF   r[   r\   r]   r!   c                    t          || j        dd          r(t          j        | d                    |                    t          || j        d           d S )NTFr`   ra   )rM   rG   rf   rg   rh   rl   )r-   r(   rE   r[   r]   s        r   ro   z!_BooleanValueStoreAction.__call__5  si     "I	
 
 
 	e (/M/T/TUb/c/cddd	49d+++++r   r   rq   rr   rt   s   @r   r}   r}   %  s`         9 9 9 9 9 %), , , , , , , , ,r   r}   c                  j    e Zd ZU dZ G d dej                  Zej        Zde	d<   ddZ
ddZddZdS )SingleValueFlagDefao  Definition for a flag that takes a single value.

    Sample usage:
      # This defines a flag that can be specified on the command line as:
      #   --count=10
      flag = SingleValueFlagDef(name="count", parse_type=int, required=True)
      flag.add_argument_to_parser(argument_parser)

    Attributes:
      default_value: Default value for optional flags.
    c                      e Zd ZdZdZdS ) SingleValueFlagDef._DefaultValuezSpecial value to represent "no value provided".

        "None" can be used as a default value, so in order to differentiate between
        "None" and "no value provided", create a special value for "no value
        provided".
        N)r   r?   r@   rA   NOT_SETr,   r   r   _DefaultValuer   U  s        	 	 r   r   z!_DESTTYPES | _DefaultValue | NonerI   r   r   c                6    | j         t          j        j        k    S )z2Returns whether `default_value` has been provided.)rI   r   r   r   r1   s    r   _has_default_valuez%SingleValueFlagDef._has_default_valuea  s    !%7%E%MMMr   r(   r)   r*   c           
     X   d| j         z   g}| j        |d| j        z   gz  }i }|                                 r
| j        |d<   | j        
| j        |d<   | j        
| j        |d<    |j        |t          | j        | 	                                | 
                                | j        dd| d S )N--r   r_   r&   help   )actionrj   r$   r%   r    nargs)r   r"   r   rI   r&   r'   add_argumentrO   r#   r5   r:   r    r-   r(   argsrX   s       r   r.   z)SingleValueFlagDef.add_argument_to_parsere  s    ty !?&S4?*++D""$$ 	3 $ 2F9<# $F9=$!]F6N*))++"&"A"A"C"C]		
 		
 		
 		
 		
 		
 		
r   c                L   | j         r$|                                 rt          d          n#|                                 st          d          |                                 r=| j        8t	          | j        |                                           st          d          d S d S d S )Nz(Required flags cannot have default valuez(Optional flags must have a default valuez>Default value must be of the same type as the destination type)r    r   r   rI   rd   r5   r1   s    r   r2   z,SingleValueFlagDef._do_additional_validation}  s    = 	M&&(( M !KLLLM **,, M !KLLL""$$ 	c);)Gd0$2E2E2G2GHH c !abbb	c 	c)G)Gc cr   N)r   r   r=   r>   )r   r?   r@   rA   enumEnumr   r   rI   rB   r   r.   r2   r,   r   r   r   r   G  s         
 
    	    8E7LMLLLLN N N N
 
 
 
0
c 
c 
c 
c 
c 
cr   r   c                  $     e Zd ZdZd fdZ xZS )EnumFlagDefaT  Definition for a flag that takes a value from an Enum.

    Sample usage:
      # This defines a flag that can be specified on the command line as:
      #   --color=red
      flag = SingleValueFlagDef(name="color", enum_type=ColorsEnum,
                                required=True)
      flag.add_argument_to_parser(argument_parser)
    	enum_typetype[enum.Enum]c                  t          |t          j                  st          d          d|v rt	          d          t
          |d<   d|v rt	          d          ||d<   d|v rI|d         D ]?}	  ||           # t          $ r$ t	          d                    |                    d w xY wnd |D             |d<    t                      j        |i | d S )	Nz "enum_type" must be of type Enumr#   z@Cannot set "parse_type" for EnumFlagDef; set "enum_type" insteadr$   z?Cannot set "dest_type" for EnumFlagDef; set "enum_type" insteadr&   z Invalid value in "choices": "{}"c                    g | ]	}|j         
S r,   )r{   ).0r   s     r   
<listcomp>z(EnumFlagDef.__init__.<locals>.<listcomp>  s     < < <Q < < <r   )	
issubclassr   r   	TypeErrorr   r   rh   rR   rS   )r-   r   r   rX   r   rY   s        r   rS   zEnumFlagDef.__init__  s(   )TY// 	@>??? 6!!_```"|&  ^___'{I& ] ]]IaLLLL! ] ] ]$%G%N%Nq%Q%QRRX\\]] != <) < < <F9$)&)))))s   /A;;.B))r   r   )r   r?   r@   rA   rS   rs   rt   s   @r   r   r     sG         * * * * * * * * * *r   r   c                  "    e Zd ZdZd	dZd
dZdS )MultiValuesFlagDefa6  Definition for a flag that takes multiple values.

    Sample usage:
      # This defines a flag that can be specified on the command line as:
      #   --colors=red green blue
      flag = MultiValuesFlagDef(name="colors", parse_type=str, required=True)
      flag.add_argument_to_parser(argument_parser)
    r(   r)   r   r*   c                   d| j         z   g}| j        |d| j        z   gz  }i }| j        
| j        |d<   | j        
| j        |d<    |j        |t
          | j        |                                 |                                 | j	        g dd| d S )Nr   r   r&   r   +)r   rj   r$   r%   r    r_   r   )
r   r"   r&   r'   r   rv   r#   r5   r:   r    r   s       r   r.   z)MultiValuesFlagDef.add_argument_to_parser  s    ty !?&S4?*++D<# $F9=$!]F6N+))++"&"A"A"C"C]
	
 
	
 
	
 
	
 
	
 
	
 
	
r   c                    d S r   r,   r1   s    r   r2   z,MultiValuesFlagDef._do_additional_validation  s    r   Nr=   r>   )r   r?   r@   rA   r.   r2   r,   r   r   r   r     sF         
 
 
 
.     r   r   c                  "    e Zd ZdZd	dZd
dZdS )BooleanFlagDefzDefinition for a Boolean flag.

    A boolean flag is always optional with a default value of False. The flag does
    not take any values. Specifying the flag on the commandline will set it to
    True.
    r   r*   c                    | j         t          d          | j        t          d          | j        t          d          d S )Nz*dest_type cannot be set for BooleanFlagDefz6parse_to_dest_type_fn cannot be set for BooleanFlagDefz(choices cannot be set for BooleanFlagDef)r$   r   r%   r&   r1   s    r   r2   z(BooleanFlagDef._do_additional_validation  sP    >%IJJJ%1UVVV<#GHHH $#r   r(   r)   c           	         d| j         z   g}| j        |d| j        z   gz  }i }| j        
| j        |d<    |j        |t          t
          dddd| d S )Nr   r   r   Fr   )r   rj   r    r_   r   )r   r"   r'   r   r}   r   r   s       r   r.   z%BooleanFlagDef.add_argument_to_parser  s    ty !?&S4?*++D=$!]F6N+	
 	
 	
 	
 	
 	
 	
r   Nr>   r=   )r   r?   r@   rA   r2   r.   r,   r   r   r   r     sJ         I I I I
 
 
 
 
 
r   r   )r   r   r   r   )r   r   r   r   )FN)
rE   rF   rG   r   rH   r   rI   r   r   r   )'rA   
__future__r   rC   rf   dataclassesr   typingr   r   r   r   r    google.generativeai.notebook.libr	   r
   r   intfloat_PARSETYPESr   LLMFnInputsSourceLLMFnOutputsSink
_DESTTYPESr6   r   r   	dataclassABCr   rM   ActionrO   rv   r}   r   r   r   r   r,   r   r   <module>r      s   " # " " " " " 



       8 8 8 8 8 8 8 8 8 8 8 8 8 8 @ @ @ @ @ @ : : : : : : CeO$ I	#xc
C(
()SM)"$
 [M:-.       d###F) F) F) F) F)cg F) F) $#F)X 	5 5 5 5 5:47 47 47 47 47ho 47 47 47n5/ 5/ 5/ 5/ 5/x 5/ 5/ 5/p, , , , ,x , , ,D d###?c ?c ?c ?c ?c ?c ?c $#?cD"* "* "* "* "*$ "* "* "*J# # # # # # # #L d###!
 !
 !
 !
 !
W !
 !
 $#!
 !
 !
r   