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