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   Z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   ZOptionFlagsZHIDDENr   ZIN_MAINZtakes_valuer   ZOPTIONAL_ARGZNO_ARGtypeZFILENAMEzipr   r   
isinstancebytesencoder   metavarr   )r   flagsZ	long_nameZ
short_nameZshort_bytesr    r    r!   _to_goptionentriesr   s*   


zOption._to_goptionentriesN)__name__
__module____qualname____doc__r   r   ZTYPESZATTRSr   ZOPTION_REMAININGr"   r   r$   r.   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   ZOptionContainerr   r   nameparserhelp_descriptiondefaultsvaluestranslation_domainZ
add_option)r   r5   descriptionr7   option_listr8   r:   optionr    r    r!   r      s   zOptionGroup.__init__c                 C   s   g | _ |   d S N)r<   Z_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processr9   r   sysexc_infor
   strOPTION_CONTEXT_ERROR_QUARKdomainr   r   	BAD_VALUEcodemessage)option_nameoption_valuegroupoptr4   Zgerrorr6   r   r    r!   callback   s   



z.OptionGroup._to_goptiongroup.<locals>.callback)r	   r   r5   r;   r7   r:   Zset_translation_domainr<   extendr.   add_entries)r   r6   rQ   rN   entriesr=   r    rP   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_defaultsrU   )r   r6   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 r>   )r<   r8   getdestr)   rF   Zget_opt_stringZcheck_valuer   ZValuesr9   )r   r=   defaultZopt_strr    r    r!   rV      s   

z"OptionGroup.set_values_to_defaults)r3   NNNr>   )	r/   r0   r1   r2   r   r?   rU   rW   rV   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 )NZoption_classhelp_enabledTignore_unknown_optionsFZadd_help_option)r   popr[   r\   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 )Nr3   z%prog)usager@   r   )r   r^   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   )r@   rA   rB   rC   )rL   rM   rN   rO   r   r9   r    r!   rQ   '  s   

z1OptionParser._to_goptioncontext.<locals>.callback)r;   r^   r	   ZOptionContextZset_help_enabledr[   Zset_ignore_unknown_optionsr\   option_groupsr)   r   rW   	add_groupr<   rR   r.   rS   Zset_main_group)
r   r9   Zparameter_stringcontextZoption_groupZg_grouprQ   Z
main_groupZmain_entriesr=   r    r`   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))r)   rF   r   r   add_option_groupr   r   r6   r   r	   ra   r#   r   r    r    r!   re   7  s   

zOptionParser.add_option_groupc                 C   s6   | j d d  }| jD ]}t|tjr||j  q
|S r>   )r<   ra   r)   r   r   rR   )r   optionsrN   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   )rd   parserD   argv)r   ZlargsZrargsr9   rc   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
   rD   rE   rH   rG   rJ   r   r   rI   r   rK   ZUNKNOWN_OPTIONr   ZFAILEDr   ra   r9   __dict__itemsZensure_value)r   r   r9   rf   r4   rN   keyvaluer    r    r!   rk   V  s*   




zOptionParser.parse_args)NN)r/   r0   r1   r2   r   r_   rd   re   rg   rj   rk   r    r    r    r!   r      s    	 r   )r2   rD   r   r   r   r   r   r   moduler   Zgir	   Z	gi._errorr
   r   Zquark_to_stringZoption_error_quarkrG   __all__r   r   r   r   r    r    r    r!   <module>   s   
Wa