U
    	^3                  	   @   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 ddlmZ e	d	Zee Zd
ddddddddg	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)string_types)_gi)GErrorGLibr   r   r   r   r   OptionOptionGroupOptionParsermake_optionc                   @   sP   e Zd ZdZejjd Zejjdddg 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   sX   t jj| f|| | js"tdt| jt| jk r>td| jsTt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 |kr| j| j  tj| | t| jt| jkrBt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%   k   s
    
zOption._set_opt_stringc                 c   s   d}| j r|tjjO }| jr(|tjjO }|  rD| jrP|tjjO }n|tjj	O }| j
dkrf|tjjO }t| j| jD ]@\}}|d }t|ts|d}|dd  ||| j| jfV  qt| jt| jd  D ] }|dd  d|| j| jfV  qd 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_goptionentriess   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   8   s   
c                   @   s<   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   sV   t j| td| || _d | _|| _|r.|| _d | _|| _	|rR|D ]}| 
| qBd S )Nerror)r   ZOptionContainerr   r   nameparserhelp_descriptiondefaultsvaluestranslation_domainZ
add_option)r   r6   descriptionr8   option_listr9   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r6|j g }jD ]}||	  q@|
| |S )Nc                    s   |  drj|  }n
j|  }z|| |j  W nJ tk
r   t d }tt	|}t
|_tjj|_t	||_|Y nX d S )Nr   r   )
startswith	_long_opt
_short_optprocessr:   r   sysexc_infor   strOPTION_CONTEXT_ERROR_QUARKdomainr   r   	BAD_VALUEcodemessage)option_nameoption_valuegroupoptr5   Zgerrorr7   r   r!   r"   callback   s    



z.OptionGroup._to_goptiongroup.<locals>.callback)r
   r   r6   r<   r8   r;   Zset_translation_domainr=   extendr/   add_entries)r   r7   rR   rO   entriesr>   r!   rQ   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_defaultsrV   )r   r7   r!   r!   r"   get_option_group   s    zOptionGroup.get_option_groupc                 C   sR   | j D ]8}| j|j}t|tr| }|||| j|j< qt	| j| _
d S r?   )r=   r9   getdestr*   r	   Zget_opt_stringZcheck_valuer   ZValuesr:   )r   r>   defaultZopt_strr!   r!   r"   rW      s    

 z"OptionGroup.set_values_to_defaults)r4   NNN)N)	r0   r1   r2   r3   r   r@   rV   rX   rW   r!   r!   r!   r"   r      s        

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   sL   d|krt |d< |dd| _|dd| _tjj| f|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   s8   |d krd| _ n$|dr.|tdd  | _ n|| _ d S )Nr4   z%prog)usagerA   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
| }|| qF fdd}t
d d d |}g } jD ]}	||	  q|| || |S )Nz - c                    s4   |  dr j|  }n
 j|  }|| |  d S )Nr   )rA   rB   rC   rD   )rM   rN   rO   rP   r   r:   r!   r"   rR   (  s    

z1OptionParser._to_goptioncontext.<locals>.callback)r<   r_   r
   ZOptionContextZset_help_enabledr\   Zset_ignore_unknown_optionsr]   option_groupsr*   r   rX   Z	add_groupr=   rS   r/   rT   Zset_main_group)
r   r:   Zparameter_stringcontextZoption_groupZg_grouprR   Z
main_groupZmain_entriesr>   r!   ra   r"   _to_goptioncontext  s&    





zOptionParser._to_goptioncontextc                 O   s   t |d tr,tj| t| f|| d S t|dkr|st |d trt|d js^| |d _|d j| k	rttdt |d t	jr| j
|d  d S tjj| f|| d S )Nr   r   z"invalid OptionGroup (wrong parser))r*   r	   r   r   add_option_groupr   r   r7   r   r
   rb   r$   r   r!   r!   r"   re   8  s    

zOptionParser.add_option_groupc                 C   s6   | j d d  }| jD ]}t|tjr||j  q|S r?   )r=   rb   r*   r   r   rS   )r   optionsrO   r!   r!   r"   _get_all_optionsH  s
    
zOptionParser._get_all_optionsc                 C   s4   |  |}|tjd g| dd  |d d < d S )Nr   r   )rd   parserE   argv)r   ZlargsZrargsr:   rc   r!   r!   r"   _process_argsO  s    
zOptionParser._process_argsNc                 C   s   zt j| ||\}}W n| tk
r   t d }|jtkr@ |jt	j
jkrZt|jn6|jt	j
jkrtt|jn|jt	j
jkrt|jn Y nX | jD ]&}|jj D ]\}}||| qq||fS )Nr   )r   r   
parse_argsr   rE   rF   rI   rH   rK   r   r   rJ   r   rL   ZUNKNOWN_OPTIONr   ZFAILEDr   rb   r:   __dict__itemsZensure_value)r   r   r:   rf   r5   rO   keyvaluer!   r!   r"   rk   W  s*      

zOptionParser.parse_args)NN)r0   r1   r2   r3   r   r`   rd   re   rg   rj   rk   r!   r!   r!   r"   r      s   	 )r3   rE   r   r   r   r   r   r   moduler   Z_compatr	   Zgir
   Z	gi._errorr   r   Zquark_to_stringZoption_error_quarkrH   __all__r   r   r   r   r!   r!   r!   r"   <module>   s.   
Wa