o
    f_T3                     @   s   d 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 ddlmZ e	dZee Zg d	ZG d
d dejZG dd dejZG dd dejZeZdS )a,  GOption command line parser

Extends optparse to use the GOptionGroup, GOptionEntry and GOptionContext
objects. So it is possible to use the gtk, gnome_program and gstreamer command
line groups and contexts.

Use this interface instead of the raw wrappers of GOptionContext and
GOptionGroup in glib.
    N)OptParseErrorOptionErrorOptionValueErrorBadOptionErrorOptionConflictError   )get_introspection_module)_gi)GErrorGLib)	r   r   r   r   r   OptionOptionGroupOptionParsermake_optionc                   @   sN   e Zd ZdZejjd Zejjg d Zdej	 Z
dd Zdd Zd	d
 ZdS )r   a  Represents a command line option

    To use the extended possibilities of the GOption API Option
    (and make_option) are extended with new types and attributes.

    Types:
        filename   The supplied arguments are read as filename, GOption
                   parses this type in with the GLib filename encoding.

    :ivar optional_arg:
        This does not need a arguement, but it can be supplied.
    :ivar hidden:
        The help list does not show this option
    :ivar in_main:
        This option apears in the main group, this should only
        be used for backwards compatibility.

    Use Option.REMAINING as option name to get all positional arguments.

    .. NOTE::
        Every argument to an option is passed as utf-8 coded string, the only
        exception are options which use the 'filename' type, its arguments
        are passed as strings in the GLib filename encoding.

    For further help, see optparse.Option.
    )filename)hiddenin_mainoptional_arg--c                 O   s^   t jj| g|R i | | jstdt| jt| jk r"td| js-td| jd d S )Nz!%s at least one long option name.z;%s at least more long option names than short option names.z%s needs a help message.r   )optparser   __init__
_long_opts
ValueErrorlen_short_optshelpselfargskwargs r    ,/usr/lib/python3/dist-packages/gi/_option.pyr   ^   s   zOption.__init__c                 C   sF   | j |v r| j| j  tj| | t| jt| jkr!tdd S )NzCgoption.Option needs more long option names than short option names)		REMAININGr   appendr   r   _set_opt_stringr   r   r   )r   optsr    r    r!   r$   j   s   
zOption._set_opt_stringc                 c   s    d}| j r|tjjO }| jr|tjjO }|  r#| jr"|tjjO }n|tjj	O }| j
dkr4|tjjO }t| j| jD ] \}}|d }t|tsM|d}|dd  ||| j| jfV  q;| jt| jd  D ]}|dd  d|| j| jfV  qfd S )Nr   r   r   zutf-8       )r   r   OptionFlagsHIDDENr   IN_MAINtakes_valuer   OPTIONAL_ARGNO_ARGtypeFILENAMEzipr   r   
isinstancebytesencoder   metavarr   )r   flags	long_name
short_nameshort_bytesr    r    r!   _to_goptionentriesr   s*   


zOption._to_goptionentriesN)__name__
__module____qualname____doc__r   r   TYPESATTRSr   OPTION_REMAININGr"   r   r$   r9   r    r    r    r!   r   7   s    
r   c                   @   sB   e Zd ZdZ			dddZdd Zdd	 Zdd
dZdd ZdS )r   a  A group of command line options.

    :param str name:
        The groups name, used to create the --help-{name} option
    :param str description:
        Shown as title of the groups help view
    :param str help_description:
        Shown as help to the --help-{name} option
    :param list option_list:
        The options used in this group, must be option.Option()
    :param dict defaults:
        A dicitionary of default values
    :param translation_domain:
           Sets the translation domain for gettext().

    .. NOTE::
        This OptionGroup does not exactly map the optparse.OptionGroup
        interface. There is no parser object to supply, but it is possible
        to set default values and option_lists. Also the default values and
        values are not shared with the OptionParser.

    To pass a OptionGroup into a function which expects a GOptionGroup (e.g.
    gnome_program_init() ). OptionGroup.get_option_group() can be used.

    For further help, see optparse.OptionGroup.
     Nc                 C   sZ   t j| td| || _d | _|| _|r|| _d | _|| _	|r)|D ]	}| 
| q!d S d S )Nerror)r   OptionContainerr   r   nameparserhelp_descriptiondefaultsvaluestranslation_domain
add_option)r   rD   descriptionrF   option_listrG   rI   optionr    r    r!   r      s   zOptionGroup.__init__c                 C   s   g | _ |   d S N)rL   _create_option_mappings)r   r    r    r!   _create_option_list   s   zOptionGroup._create_option_listc                    sb    fdd}t jjj|}jr|j g }jD ]	}||	  q |
| |S )Nc                    s~   |  drj|  }nj|  }z|| |j  W d S  ty>   t d }tt	|}t
|_tjj|_t	||_|w )Nr   r   )
startswith	_long_opt
_short_optprocessrH   r   sysexc_infor
   strOPTION_CONTEXT_ERROR_QUARKdomainr   r   	BAD_VALUEcodemessage)option_nameoption_valuegroupoptrB   gerrorrE   r   r    r!   callback   s   



z.OptionGroup._to_goptiongroup.<locals>.callback)r	   r   rD   rK   rF   rI   set_translation_domainrL   extendr9   add_entries)r   rE   rc   r_   entriesrM   r    rb   r!   _to_goptiongroup   s   

zOptionGroup._to_goptiongroupc                 C   s   |    | |S )z Returns the corresponding GOptionGroup object.

        Can be used as parameter for gnome_program_init(), gtk_init().
        )set_values_to_defaultsrh   )r   rE   r    r    r!   get_option_group   s   
zOptionGroup.get_option_groupc                 C   sR   | j D ]}| j|j}t|tr| }|||| j|j< qt	| j| _
d S rN   )rL   rG   getdestr1   rW   get_opt_stringcheck_valuer   ValuesrH   )r   rM   defaultopt_strr    r    r!   ri      s   

z"OptionGroup.set_values_to_defaults)rA   NNNrN   )	r:   r;   r<   r=   r   rP   rh   rj   ri   r    r    r    r!   r      s    

r   c                   @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dddZ
dS )r   aH  Command line parser with GOption support.

    :param bool help_enabled:
        The --help, --help-all and --help-{group} options are enabled (default).
    :param bool ignore_unknown_options:
        Do not throw a exception when a option is not knwon, the option
        will be in the result list.

    .. NOTE::
        The OptionParser interface is not the exactly the same as the
        optparse.OptionParser interface. Especially the usage parameter
        is only used to show the metavar of the arguements.

    OptionParser.add_option_group() does not only accept OptionGroup instances
    but also glib.OptionGroup, which is returned by gtk_get_option_group().

    Only glib.option.OptionGroup and glib.option.Option instances should
    be passed as groups and options.

    For further help, see optparse.OptionParser.
    c                 O   sN   d|vrt |d< |dd| _|dd| _tjj| g|R ddi| d S )Noption_classhelp_enabledTignore_unknown_optionsFadd_help_option)r   poprs   rt   r   r   r   r   r    r    r!   r     s   


zOptionParser.__init__c                 C   s<   |d u r	d| _ d S |dr|tdd  | _ d S || _ d S )NrA   z%prog)usagerQ   r   )r   rw   r    r    r!   	set_usage  s
   


zOptionParser.set_usagec           
         s    j r jd  j  }n j}t|}| j | j  jD ]}t	|tj
r.|}n| }|| q# fdd}t
d d d |}g } jD ]	}	||	  qM|| || |S )Nz - c                    s4   |  dr j|  }n j|  }|| |  d S )Nr   )rQ   rR   rS   rT   )r]   r^   r_   r`   r   rH   r    r!   rc   '  s   

z1OptionParser._to_goptioncontext.<locals>.callback)rK   rw   r	   OptionContextset_help_enabledrs   set_ignore_unknown_optionsrt   option_groupsr1   r   rj   	add_grouprL   re   r9   rf   set_main_group)
r   rH   parameter_stringcontextoption_groupg_grouprc   
main_groupmain_entriesrM   r    ry   r!   _to_goptioncontext  s&   





zOptionParser._to_goptioncontextc                 O   s   t |d trtj| t| g|R i | d S t|dkrO|sOt |d tr=|d js2| |d _|d j| ur=tdt |d t	jrO| j
|d  d S tjj| g|R i | d S )Nr   r   z"invalid OptionGroup (wrong parser))r1   rW   r   r   add_option_groupr   r   rE   r   r	   r}   r#   r   r    r    r!   r   7  s   

zOptionParser.add_option_groupc                 C   s6   | j d d  }| jD ]}t|tjr||j  q
|S rN   )rL   r}   r1   r   r   re   )r   optionsr_   r    r    r!   _get_all_optionsG  s   
zOptionParser._get_all_optionsc                 C   s4   |  |}|tjd g| dd  |d d < d S )Nr   r   )r   parserU   argv)r   largsrargsrH   r   r    r    r!   _process_argsN  s   
*zOptionParser._process_argsNc                 C   s   zt j| ||\}}W n8 tyD   t d }|jtkr |jt	j
jkr+t|j|jt	j
jkr7t|j|jt	j
jkrCt|j w | jD ]}|jj D ]
\}}||| qPqH||fS )Nr   )r   r   
parse_argsr
   rU   rV   rY   rX   r[   r   r   rZ   r   r\   UNKNOWN_OPTIONr   FAILEDr   r}   rH   __dict__itemsensure_value)r   r   rH   r   rB   r_   keyvaluer    r    r!   r   V  s*   




zOptionParser.parse_args)NN)r:   r;   r<   r=   r   rx   r   r   r   r   r   r    r    r    r!   r      s    	 r   )r=   rU   r   r   r   r   r   r   moduler   gir	   	gi._errorr
   r   quark_to_stringoption_error_quarkrX   __all__r   r   r   r   r    r    r    r!   <module>   s   
Wa