
V3              	   @   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	 e j
 d k rz e Z d d   Z n e Z e Z d d	 l m Z d d
 l m Z e	 d  Z e j e j    Z d d d d d d d d d g	 Z Gd d   d e j  Z Gd d   d e j  Z Gd 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   c             C   s
   |  j    S)N)encode)s r   ,/usr/lib/python3/dist-packages/gi/_option.py<lambda>&   s    r   )_glib)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_argz--c             O   sx   t  j j |  | |  |  j s+ t d   t |  j  t |  j  k  rU t d   |  j st 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kwargsr   r   r   r   e   s    			zOption.__init__c             C   sc   |  j  | k r" |  j j |  j   t j 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&   q   s
    zOption._set_opt_stringc             c   s8  d } |  j  r | t j j O} |  j r8 | t j j O} |  j   r` |  j rp | t j j O} n | t j j	 O} |  j
 d k r | t j j O} xQ t |  j |  j  D]: \ } } | d d   t | d  | |  j |  j f Vq WxN |  j t |  j  d   D]0 } | d d   t d  | |  j |  j f Vq Wd  S)Nr   r      r    )r   r   ZOptionFlagsZHIDDENr   ZIN_MAINZtakes_valuer   ZOPTIONAL_ARGZNO_ARGtypeZFILENAMEzipr   r   _bytesr    metavarr   )r!   flagsZ	long_nameZ
short_namer   r   r   _to_goptionentriesy   s    			"2#zOption._to_goptionentriesN)zfilename)__name__
__module____qualname____doc__r   r   ZTYPESZATTRSr   ZOPTION_REMAININGr$   r   r&   r.   r   r   r   r   r   >   s   		
c               @   sa   e  Z d  Z d Z d d d 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   s}   t  j j |  t d |  | |  _ d  |  _ | |  _ | rC | |  _ d  |  _ | |  _	 | ry x | D] } |  j
 |  qb Wd  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  |  _  |  j   d  S)N)r<   Z_create_option_mappings)r!   r   r   r   _create_option_list   s    	zOptionGroup._create_option_listc                s      f d d   } t  j  j  j  j |  }  j rO | j  j  g  } x$  j D] } | j | j	    q_ W| j
 |  | S)Nc                s   |  j  d  r  j |  } n  j |  } y | j |  |  j    Wna t k
 r t j   d } t t	 |   } t
 | _ t j j | _ t	 |  | _ |  Yn Xd  S)Nz--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   rO   rM   entriesr=   r   )r6   r!   r   _to_goptiongroup   s    	zOptionGroup._to_goptiongroupc             C   s   |  j    |  j |  S)z Returns the corresponding GOptionGroup object.

        Can be used as parameter for gnome_program_init(), gtk_init().
        )set_values_to_defaultsrS   )r!   r6   r   r   r   get_option_group   s    
zOptionGroup.get_option_groupc             C   sy   x] |  j  D]R } |  j j | j  } t | t  r
 | j   } | j | |  |  j | j <q
 Wt j	 |  j  |  _
 d  S)N)r<   r8   getdest
isinstance_basestringZget_opt_stringZcheck_valuer   ZValuesr9   )r!   r=   defaultZopt_strr   r   r   rT      s    z"OptionGroup.set_values_to_defaults)	r/   r0   r1   r2   r   r>   rS   rU   rT   r   r   r   r   r      s   c               @   sp   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 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   s`   d | k r t  | d <| j d d  |  _ | j d d  |  _ t j j |  | d d | d  S)NZoption_classhelp_enabledTignore_unknown_optionsFZadd_help_option)r   popr[   r\   r   r   r   )r!   r"   r#   r   r   r   r   
  s    
	zOptionParser.__init__c             C   sP   | d  k r d |  _  n4 | j d  rC | t d  d   |  _  n	 | |  _  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  | j   j  xH   j D]= } t	 | t j
  r | } n | j    } | j |  qb W   f d d   } t j
 d  d  d  |  } g  } x$   j D] }	 | j |	 j    q W| j |  | j |  | S)Nz - c                sF   |  j  d  r   j |  } n   j |  } | j |  |     d  S)Nz--)r?   r@   rA   rB   )rK   rL   rM   rN   )r!   r9   r   r   rO   +  s    z1OptionParser._to_goptioncontext.<locals>.callback)r;   r^   r   ZOptionContextZset_help_enabledr[   Zset_ignore_unknown_optionsr\   option_groupsrX   r   rU   Z	add_groupr<   rP   r.   rQ   Zset_main_group)
r!   r9   Zparameter_stringcontextZoption_groupZg_grouprO   Z
main_groupZmain_entriesr=   r   )r!   r9   r   _to_goptioncontext  s&    			zOptionParser._to_goptioncontextc             O   s   t  | d t  r6 t j j |  t |  | |   d  St |  d k r | r t  | d t  r | d j s| |  | d _ | d j |  k	 r t d   t  | d t	 j  r |  j
 j | d  d  St j j |  | |  d  S)Nr   r   z"invalid OptionGroup (wrong parser))rX   rY   r   r   add_option_groupr   r   r6   r   r   r`   r%   )r!   r"   r#   r   r   r   rc   ;  s    zOptionParser.add_option_groupc             C   sM   |  j  d  d   } x3 |  j D]( } t | t j  r | j | j   q W| S)N)r<   r`   rX   r   r   rP   )r!   optionsrM   r   r   r   _get_all_optionsK  s
    zOptionParser._get_all_optionsc             C   sD   |  j  |  } | j t j d g |  d d   | d  d   <d  S)Nr   r   )rb   parserC   argv)r!   ZlargsZrargsr9   ra   r   r   r   _process_argsR  s    zOptionParser._process_argsNc       	      C   sE  | p	 g  } y" t  j j |  | |  \ } } Wn t k
 r t j   d } | j t k r`   | j t	 j
 j k r t | j   nQ | j t	 j
 j k r t | j   n* | j t	 j
 j k r t | j   n   Yn XxD |  j D]9 } x0 | j j j   D] \ } } | j | |  q Wq W| d t |   } | | f S)Nr   r'   )r   r   
parse_argsr   rC   rD   rG   rF   rI   r   r   rH   r   rJ   ZUNKNOWN_OPTIONr   ZFAILEDr   r`   r9   __dict__itemsZensure_valuer   )	r!   r"   r9   Zold_argsrd   r4   rM   keyvaluer   r   r   ri   Z  s(    	zOptionParser.parse_args)r/   r0   r1   r2   r   r_   rb   rc   re   rh   ri   r   r   r   r   r      s   	 )r	   r   )r2   rC   r   r   r   r   r   r   moduler   version_inforE   rY   r+   Z
basestringZgi._gir   Z	gi._errorr   r   Zquark_to_stringZoption_error_quarkrF   __all__r   r   r   r   r   r   r   r   <module>   s4   (	Ta