
    8                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKJr  \	" 1 Sk5      r
 " S S	\R                  5      r " S
 S\R                  5      r " S S\R                  5      r " S S\R                  5      rS rS rg)a  This module provides argparse integration with absl.flags.

argparse_flags.ArgumentParser is a drop-in replacement for
argparse.ArgumentParser. It takes care of collecting and defining absl flags
in argparse.

Here is a simple example:

    # Assume the following absl.flags is defined in another module:
    #
    #     from absl import flags
    #     flags.DEFINE_string('echo', None, 'The echo message.')
    #
    parser = argparse_flags.ArgumentParser(
        description='A demo of absl.flags and argparse integration.')
    parser.add_argument('--header', help='Header message to print.')

    # The parser will also accept the absl flag `--echo`.
    # The `header` value is available as `args.header` just like a regular
    # argparse flag. The absl flag `--echo` continues to be available via
    # `absl.flags.FLAGS` if you want to access it.
    args = parser.parse_args()

    # Example usages:
    # ./program --echo='A message.' --header='A header'
    # ./program --header 'A header' --echo 'A message.'


Here is another example demonstrates subparsers:

    parser = argparse_flags.ArgumentParser(description='A subcommands demo.')
    parser.add_argument('--header', help='The header message to print.')

    subparsers = parser.add_subparsers(help='The command to execute.')

    roll_dice_parser = subparsers.add_parser(
        'roll_dice', help='Roll a dice.',
        # By default, absl flags can also be specified after the sub-command.
        # To only allow them before sub-command, pass
        # `inherited_absl_flags=None`.
        inherited_absl_flags=None)
    roll_dice_parser.add_argument('--num_faces', type=int, default=6)
    roll_dice_parser.set_defaults(command=roll_dice)

    shuffle_parser = subparsers.add_parser('shuffle', help='Shuffle inputs.')
    shuffle_parser.add_argument(
        'inputs', metavar='I', nargs='+', help='Inputs to shuffle.')
    shuffle_parser.set_defaults(command=shuffle)

    args = parser.parse_args(argv[1:])
    args.command(args)

    # Example usages:
    # ./program --echo='A message.' roll_dice --num_faces=6
    # ./program shuffle --echo='A message.' 1 2 3 4


There are several differences between absl.flags and argparse_flags:

1. Flags defined with absl.flags are parsed differently when using the
   argparse parser. Notably:

   1) absl.flags allows both single-dash and double-dash for any flag, and
      doesn't distinguish them; argparse_flags only allows double-dash for
      flag's regular name, and single-dash for flag's `short_name`.
   2) Boolean flags in absl.flags can be specified with `--bool`, `--nobool`,
      as well as `--bool=true/false` (though not recommended);
      in argparse_flags, it only allows `--bool`, `--nobool`.

2. Help related flag differences:
   1) absl.flags does not define help flags, absl.app does that; argparse_flags
      defines help flags unless passed with `add_help=False`.
   2) absl.app supports `--helpxml`; argparse_flags does not.
   3) argparse_flags supports `-h`; absl.app does not.
    )absolute_import)division)print_functionN)flags>   helphelpxmlundefokflagfilehelpfull	helpshortc                   H   ^  \ rS rSrSrU 4S jrSU 4S jjrS rS rSr	U =r
$ )	ArgumentParsero   z:Custom ArgumentParser class to support special absl flags.c                 V  > UR                  SS5      nUS:w  a  [        SR                  U5      5      eUR                  S[        R
                  5      U l        [        [        U ]&  " S0 UD6  U R                  (       aR  U R                  SS[        R                  [        R                  S9  U R                  S[        [        R                  S	S9  U R                  (       aI  U R                  S
[        R                  [        R                  S9  U R                  U R                  5        gg)a  Initializes ArgumentParser.

Args:
  **kwargs: same as argparse.ArgumentParser, except:
      1. It also accepts `inherited_absl_flags`: the absl flags to inherit.
         The default is the global absl.flags.FLAGS instance. Pass None to
         ignore absl flags.
      2. The `prefix_chars` argument must be the default value '-'.

Raises:
  ValueError: Raised when prefix_chars is not '-'.
prefix_chars-zTargparse_flags.ArgumentParser only supports "-" as the prefix character, found "{}".inherited_absl_flagsz--helpshortr   )actiondefaultr   z
--helpfullzshow full help message and exitz	--undefok)r   r   N )get
ValueErrorformatpopr   FLAGS_inherited_absl_flagssuperr   __init__add_helpadd_argumentargparseSUPPRESS_HelpFullAction_define_absl_flags)selfkwargsr   	__class__s      4platform/bq/third_party/absl/flags/argparse_flags.pyr   ArgumentParser.__init__r   s    ::nc2Ls##)6,#79 9
 "(,BEKK!PD 
.$(262}} 
##(*;*;  = 
##*K  M !!

x00x7H7H  J
d889 "    c                 V  > Uc  [         R                  SS  nU R                  (       a  U R                  R                  USS9n[	        5       n[        USU5      n[        [        U ]#  X5      u  p!XCLa  XBl	        U R                  (       aa  [        US5      (       a  [        UR                  U5      nU?	U R                  R                  5          U R                  R                  5         X!4$ X!4$ ! [        R                   a&  nU R!                  [#        U5      5         S nAX!4$ S nAff = f)N   T)	force_gnur	   )sysargvr   read_flags_from_filesobjectgetattrr   r   parse_known_argsr	   hasattr_strip_undefok_argsmark_as_parsedvalidate_all_flagsr   IllegalFlagValueErrorerrorstr)r%   args	namespaceundefok_missingr	   er'   s         r(   r3   ArgumentParser.parse_known_args   s   |XXab\d!! ''==
$ >  d hOiO<GNDBOI %!!! 
I	&	&"9#4#4d; 
  //1""557 ?9? (( 

3q6?s   C. .D(D##D(c                     [        UR                  [        R                  S   5      5      nU H9  nU[        ;   a  M  X   nX4R
                  :X  d  M$  XB;  nU R                  XE5        M;     g)zDefines flags from absl_flags.r   N)setget_key_flags_for_moduler.   r/   _BUILT_IN_FLAGSname_define_absl_flag)r%   
absl_flags	key_flagsrD   flag_instancesuppresss         r(   r$   !ArgumentParser._define_absl_flags   sb    J77DEI		  &m 
##	# !1}7 r*   c                    UR                   nUR                  nSU-   /nU(       a  UR                  SSU-   5        U(       a  [        R                  nOUR
                  R                  SS5      nUR                  (       aF  UR                  SU-   5        U R                  " U[        UUR                   R                  5       US.6  gU R                  " U[        UUR                   R                  5       US.6  g)	z&Defines a flag from the flag_instance.--r   r   %z%%z--no)r   r   metavarrH   N)rD   
short_nameinsertr!   r"   r   replacebooleanappendr    _BooleanFlagActionupper_FlagAction)r%   rH   rI   	flag_namerO   argument_nameshelptexts          r(   rE    ArgumentParser._define_absl_flag   s    ""I))JY&'NAsZ/0""h ##++C6hFY./
"48$$**,%'
 +H$$**,%'r*   )r   )NN)__name__
__module____qualname____firstlineno____doc__r   r3   r$   rE   __static_attributes____classcell__r'   s   @r(   r   r   o   s!    B':R'R8 ' 'r*   r   c                   P   ^  \ rS rSrSr\R                  4U 4S jjrSS jrSr	U =r
$ )rV      z*Action class for Abseil non-boolean flags.c                 X   > AXPl         [        [        U ]  U[        R
                  UUS9  g)av  Initializes _FlagAction.

Args:
  option_strings: See argparse.Action.
  dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS.
  help: See argparse.Action.
  metavar: See argparse.Action.
  flag_instance: absl.flags.Flag, the absl flag instance.
  default: Ignored. The flag always uses dest=argparse.SUPPRESS so it
      doesn't affect the parsing result.
)option_stringsdestr   rN   N)_flag_instancer   rV   r   r!   r"   )r%   rf   rg   r   rN   rH   r   r'   s          r(   r   _FlagAction.__init__   s4    & 	'	+t%%	 & r*   c                 \    U R                   R                  U5        SU R                   l        g)CSee https://docs.python.org/3/library/argparse.html#action-classes.FN)rh   parseusing_default_value)r%   parserr<   valuesoption_strings        r(   __call___FlagAction.__call__  s$    f%.3D+r*   )rh   Nr[   r\   r]   r^   r_   r!   r"   r   rq   r`   ra   rb   s   @r(   rV   rV      s     2 64 4r*   rV   c                   P   ^  \ rS rSrSr\R                  4U 4S jjrSS jrSr	U =r
$ )rT   i  z&Action class for Abseil boolean flags.c                 *  > AAXPl         U R                   R                  /nU R                   R                  (       a%  UR                  U R                   R                  5        [	        U5      U l        [        [        U ]#  U[        R                  SUUS9  g)a}  Initializes _BooleanFlagAction.

Args:
  option_strings: See argparse.Action.
  dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS.
  help: See argparse.Action.
  metavar: See argparse.Action.
  flag_instance: absl.flags.Flag, the absl flag instance.
  default: Ignored. The flag always uses dest=argparse.SUPPRESS so it
      doesn't affect the parsing result.
r   )rf   rg   nargsr   rN   N)rh   rD   rO   rS   	frozenset_flag_namesr   rT   r   r!   r"   )	r%   rf   rg   r   rN   rH   r   
flag_namesr'   s	           r(   r   _BooleanFlagAction.__init__  s    & 	g'%%**+J%%++667 ,D	
d,% - r*   c                    [        U[        5      (       a  U(       a  [        S5      eUR                  S5      (       a  USS nOUSS nXPR                  ;   a  U R
                  R                  S5        ORUR                  S5      (       a  USS U R                  ;  a  [        SU-   5      eU R
                  R                  S	5        S
U R
                  l        g)rk   zvalues must be an empty list.rL      Nr,   truenozinvalid option_string: falseF)
isinstancelistr   
startswithry   rh   rl   rm   )r%   rn   r<   ro   rp   options         r(   rq   _BooleanFlagAction.__call__5  s    fd##v677%%QR fQR f!!!
't$$qr
$:J:J(J2]BCC
(.3D+r*   )rh   ry   rs   rt   rb   s   @r(   rT   rT     s!    . @4 4r*   rT   c                   6   ^  \ rS rSrSrU 4S jrSS jrSrU =r$ )r#   iF  z!Action class for --helpfull flag.c                 l   > AA[         [        U ]  U[        R                  [        R                  SUS9  g)zInitializes _HelpFullAction.

Args:
  option_strings: See argparse.Action.
  dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS.
  default: Ignored.
  help: See argparse.Action.
r   )rf   rg   r   rw   r   N)r   r#   r   r!   r"   )r%   rf   rg   r   r   r'   s        r(   r   _HelpFullAction.__init__I  s9     	g	/4)%!! * r*   c                 "   UR                  5         UR                  nU(       a\  [        UR                  5       5      n[        R
                  S   nXv;   a  UR                  U5        [        UR                  USSS95        UR                  5         g)rk   r    T)prefixinclude_special_flagsN)

print_helpr   sortedflags_by_module_dictr.   r/   removeprint_get_help_for_modulesexit)r%   rn   r<   ro   rp   rF   modulesmain_modules           r(   rq   _HelpFullAction.__call__Z  sz     --Jz6689gHHQKk		{#J,,
"D - : ;
KKMr*   r   rs   )	r[   r\   r]   r^   r_   r   rq   r`   ra   rb   s   @r(   r#   r#   F  s    )" r*   r#   c                     U (       aZ  [        S U R                  S5       5       5      nU[        S U 5       5      -  nU Vs/ s H  n[        X25      (       a  M  UPM     nnU$ s  snf )z=Returns a new list of args after removing flags in --undefok.c              3   @   #    U  H  oR                  5       v   M     g 7frs   )strip.0rD   s     r(   	<genexpr>&_strip_undefok_args.<locals>.<genexpr>q  s     D1C

1Cs   ,c              3   ,   #    U  H
  nS U-   v   M     g7f)r   Nr   r   s     r(   r   r   r  s     ?s   )rA   split_is_undefok)r	   r;   undefok_namesargs       r(   r5   r5   n  sY    Ds1CDDMS????MG4C{3'FC4DG	+ Hs   A$A$c                     U R                  S5      (       d  gU R                  S5      (       a  U SS nOU SS nSU;   a  UR                  SS5      u  p4OUnX1;   a  gg)	zGReturns whether we can ignore arg based on a set of undefok flag names.r   FrL   r}   Nr,   =T)r   r   )r   r   arg_without_dashrD   _s        r(   r   r   x  sk    			^^D12w12w$$S!,GD!D		r*   )r_   
__future__r   r   r   r!   r.   abslr   rx   rC   r   ActionrV   rT   r#   r5   r   r   r*   r(   <module>r      s   JX '  %  
    |'X,, |'~!4(// !4H14 14h%hoo %Pr*   