U
    k&p[u                     @   s  d dl mZ zd dlmZ W n  ek
r<   d dlmZ Y nX d dlZd dlZd dlZd dlZd dl	Z	zd dl
ZW n ek
r   dZY nX dZd dlZd dlmZ ejdkreZdZd	Zd
ZeeegZG dd dejZG dd dejZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd deZ!G dd dej"Z#G dd  d eZ$dS )!    )print_function)ConfigParserNFT)ManpageGenerator)   ZLoggingz Configuration files and settingsZ
Peformancec                   @   s   e Zd Zdd Zdd ZdS )UnknownConfigVariablec                 C   s   d||f }t j| | d S )Nz%%s: Unknown configuration variable %scliappAppException__init__)selffilenamenamemsg r   1/usr/lib/python3/dist-packages/cliapp/settings.pyr
   ;   s    zUnknownConfigVariable.__init__c                 C   s   | j S Nr   r   r   r   r   __str__?   s    zUnknownConfigVariable.__str__N__name__
__module____qualname__r
   r   r   r   r   r   r   9   s   r   c                   @   s   e Zd Zdd Zdd ZdS )MalformedYamlConfigc                 C   s   t j| | d S r   r   )r   r   r   r   r   r
   E   s    zMalformedYamlConfig.__init__c                 C   s   | j S r   r   r   r   r   r   r   H   s    zMalformedYamlConfig.__str__Nr   r   r   r   r   r   C   s   r   c                   @   sp   e Zd ZdZdZdZdZdddZdd	 Zd
d Z	dd Z
dd Zdd ZeeeZdd Zdd Zdd ZdS )Settingstorestring   NFc                 C   s4   || _ | | || _|p |  | _|| _|| _d S r   )names	set_valuehelpdefault_metavarmetavargrouphiddenr   r   default	help_textr"   r#   r$   r   r   r   r
   S   s    
zSetting.__init__c                 C   s   d S r   r   r   r   r   r   r!   \   s    zSetting.default_metavarc                 C   s   | j S r   _string_valuer   r   r   r   	get_value_   s    zSetting.get_valuec                 C   s
   || _ d S r   r(   r   valuer   r   r   r   b   s    zSetting.set_valuec                 C   s   |   S r   )r*   r   r   r   r   call_get_valuee   s    zSetting.call_get_valuec                 C   s   |  | d S r   )r   r+   r   r   r   call_set_valueh   s    zSetting.call_set_valuec                 C   s
   | j d k	S r   r,   r   r   r   r   	has_valuem   s    zSetting.has_valuec                 C   s
   || _ d S r   r/   )r   r   r   r   r   parse_valuep   s    zSetting.parse_valuec                 C   s
   t | jS r   )strr,   r   r   r   r   formats   s    zSetting.format)NNF)r   r   r   actiontypenargschoicesr
   r!   r*   r   r-   r.   propertyr,   r0   r1   r3   r   r   r   r   r   L   s      
	
r   c                   @   s   e Zd Zdd ZdS )StringSettingc                 C   s   | j d  S Nr   r   upperr   r   r   r   r!   y   s    zStringSetting.default_metavarN)r   r   r   r!   r   r   r   r   r9   w   s   r9   c                   @   sJ   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )StringListSettingappendNFc              	   C   s4   t j| |g ||||d || _| jp&g | _d| _d S )Nr"   r#   r$   T)r   r
   r&   _stringsusing_default_valuer%   r   r   r   r
      s         zStringListSetting.__init__c                 C   s   | j d  S r:   r;   r   r   r   r   r!      s    z!StringListSetting.default_metavarc                 C   s   | j S r   )r@   r   r   r   r   r*      s    zStringListSetting.get_valuec                 C   s&   t |tkr|g| _n|| _d| _d S NF)r5   listr@   rA   )r   Zstringsr   r   r   r      s    
zStringListSetting.set_valuec                 C   s
   | j g kS r   r/   r   r   r   r   r0      s    zStringListSetting.has_valuec                 C   sl   g }d}d}|D ]8}|dkr$| }q|dkr@|s@| | d}q||7 }q|rX| | dd |D | _d S )N F",c                 S   s   g | ]}|  qS r   )strip.0vr   r   r   
<listcomp>   s     z1StringListSetting.parse_value.<locals>.<listcomp>)r>   r,   )r   r   valuesr,   Zinside_quotecr   r   r   r1      s    


zStringListSetting.parse_valuec                 C   s   dd | j D }d|S )Nc                 S   s    g | ]}d |krd| n|qS )rF   z"%s"r   rH   r   r   r   rK      s     z,StringListSetting.format.<locals>.<listcomp>z, )r,   join)r   rL   r   r   r   r3      s    zStringListSetting.format)NNF)r   r   r   r4   r
   r!   r*   r   r0   r1   r3   r   r   r   r   r=   }   s     
	r=   c                   @   s"   e Zd ZdZdddZdd ZdS )	ChoiceSettingchoiceNFc              	   C   s&   t j| ||d ||||d || _d S )Nr   r?   )r   r
   r7   )r   r   r7   r'   r"   r#   r$   r   r   r   r
      s         zChoiceSetting.__init__c                 C   s   | j d  S r:   r;   r   r   r   r   r!      s    zChoiceSetting.default_metavar)NNF)r   r   r   r5   r
   r!   r   r   r   r   rO      s
     
rO   c                   @   s8   e Zd ZdZdZdZddddgZdZdd	 Zd
d Z	dS )BooleanSetting
store_trueNZyesZon1trueZnoc                 C   s   | j  | jkS r   )r)   lower_truesr   r   r   r   r*      s    zBooleanSetting.get_valuec                    s.    fdd}| r" j d  _n j _d S )Nc                      s6   dksdkrS t ttfkr2  jkS S )NTF)r5   r2   unicoderU   rV   r   r+   r   r   is_true   s
    z)BooleanSetting.set_value.<locals>.is_truer   )rV   r)   _false)r   r,   rX   r   r+   r   r      s    zBooleanSetting.set_value)
r   r   r   r4   r6   r5   rV   rY   r*   r   r   r   r   r   rQ      s   rQ   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ByteSizeSettingc              	   C   sd   t jd| t jd}|sdS t|d}|d}dddd	d
dddd}t|||d S dS )z+Parse a size using suffix into plain bytes.z[(?P<number>\d+(\.\d+)?) \s*
                         (?P<unit>k|ki|m|mi|g|gi|t|ti)? b? \s*$)flagsr   numberuniti  i@B i ʚ;l    J)i   i   i   @l        )kmgtZkimiZgiZtir   N)rematchrU   Xfloatr#   intget)r   sizer_   r\   r]   Zunitsr   r   r   parse_human_size   s$     

z ByteSizeSetting.parse_human_sizec                 C   s   dS )NSIZEr   r   r   r   r   r!      s    zByteSizeSetting.default_metavarc                 C   s
   t | jS r   rg   r)   r   r   r   r   r*      s    zByteSizeSetting.get_valuec                 C   s(   t |ttfkr| |}t|| _d S r   )r5   r2   rW   rj   r)   r+   r   r   r   r      s    
zByteSizeSetting.set_valueN)r   r   r   rj   r!   r*   r   r   r   r   r   rZ      s   rZ   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	IntegerSettingrg   c                 C   s   | j d  S r:   r;   r   r   r   r   r!      s    zIntegerSetting.default_metavarc                 C   s
   t | jS r   rl   r   r   r   r   r*     s    zIntegerSetting.get_valuec                 C   s   t || _d S r   )r2   r)   r+   r   r   r   r     s    zIntegerSetting.set_valueN)r   r   r   r5   r!   r*   r   r   r   r   r   rm      s   rm   c                   @   s   e Zd Zdd ZdS )FormatHelpParagraphsc                 C   s"   t j| jd}||}|dS )z+Like the default, except handle paragraphs.)width
)r   Z
TextFormatro   r3   rstrip)r   textZfmtZ	formattedr   r   r   _format_text  s    
z!FormatHelpParagraphs._format_textN)r   r   r   rs   r   r   r   r   rn   
  s   rn   c                   @   s0  e Zd ZdZdDddZdd Zdd ZdEd
dZdFddZdd Z	dGddZ
dHddZdIddZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdJd(d)ZdKd*d+Zed,d- Zejfd.d/Zd0d1 Zd2d3 ZeeeZd4d5 Ze fd6d7Z!d8d9 Z"d:d; Z#d<d= Z$d>d? Z%d@dA Z&dBdC Z'dS )LSettingsa/  Settings for a cliapp application.

    You probably don't need to create a settings object yourself,
    since ``cliapp.Application`` does it for you.

    Settings are read from configuration files, and parsed from the
    command line. Every setting has a type, name, and help text,
    and may have a default value as well.

    For example::

        settings.boolean(['verbose', 'v'], 'show what is going on')

    This would create a new setting, ``verbose``, with a shorter alias
    ``v``. On the command line, the options ``--verbose`` and
    ``-v`` would work equally well. There can be any number of aliases.

    The help text is shown if the user uses ``--help`` or
    ``--generate-manpage``.
    You can use the ``metavar`` keyword argument to set the name shown
    in the generated option lists; the default name is whatever
    ``optparse`` decides (i.e., name of option).

    Use ``load_configs`` to read configuration files, and
    ``parse_args`` to parse command line arguments.

    The current value of a setting can be accessed by indexing
    the settings class::

        settings['verbose']

    The list of configuration files for the appliation is stored
    in ``config_files``. Add or remove from the list if you wish.
    The files need to exist: those that don't are silently ignored.

    Nc                 C   sT   t  | _i | _t | _|| _|| _|| _|| _|| _	| 
  d | _g | _t | _d S r   )dict_settingses_all_config_datarC   _canonical_namesversionprognameusagedescriptionepilog_add_default_settings_config_files_required_config_filesr   Z_cp)r   rz   ry   r{   r|   r}   r   r   r   r
   ;  s    zSettings.__init__c                 C   s   | j dgddd | j dgddtd | jdgd	d
ddddgddtd | jdgdddtd | jdgdddtd | j dgdddtd | jdgdd gd!d"td | jd#gd$d%d&td d S )'Noutputz0write output to FILE, instead of standard outputFILE)r"   logzwrite log entries to FILE (default is to not write log files at all); use "syslog" to log to system log, "stderr" to log to the standard error output, or "none" to disable logging)r"   r#   z	log-leveldebuginfoZwarningerrorZcriticalZfatalzUlog at LEVEL, one of debug, info, warning, error, critical, fatal (default: %default)ZLEVELzlog-maxz@rotate logs larger than SIZE, zero for never (default: %default)rk   r   )r"   r&   r#   zlog-keepzkeep last N logs (%default)N
   zlog-modezBset permissions of new log files to MODE (octal; default %default)ZMODEZ0600zdump-memory-profileZsimpleZnonezymake memory profiling dumps using METHOD, which is one of: none, or simple (no meliae support anymore)(default: %default)ZMETHODzmemory-dump-intervalz2make memory profiling dumps at least SECONDS apartZSECONDSi,  )r   log_group_namerP   bytesizeintegerperf_group_namer   r   r   r   r~   M  sX        
    zSettings._add_default_settingsc                 C   s,   | j |jd  |jD ]}|| j|< qdS )zAdd a setting to self._cp.r   N)rx   r>   r   rv   )r   settingr   r   r   r   _add_settingu  s    
zSettings._add_settingrD   c                 K   s   |  t|||f| dS )z"Add a setting with a string value.N)r   r9   r   r   r'   r&   kwargsr   r   r   r   |  s    zSettings.stringc                 K   s   |  t||pg |f| dS )zAdd a setting which have multiple string values.

        An example would be an option that can be given multiple times
        on the command line, e.g., "--exclude=foo --exclude=bar".

        N)r   r=   r   r   r   r   string_list  s    zSettings.string_listc                 K   s   |  t|||f| dS )a  Add a setting which chooses from list of acceptable values.

        An example would be an option to set debugging level to be
        one of a set of accepted names: debug, info, warning, etc.

        The default value is the first possibility.

        N)r   rO   )r   r   Zpossibilitiesr'   r   r   r   r   rP     s    
zSettings.choiceFc                 K   s   |  t|||f| dS )z#Add a setting with a boolean value.N)r   rQ   r   r   r   r   boolean  s    zSettings.booleanr   c                 K   s   |  t|||f| dS )z}Add a setting with a size in bytes.

        The user can use suffixes for kilo/mega/giga/tera/kibi/mibi/gibi/tibi.

        N)r   rZ   r   r   r   r   r     s    zSettings.bytesizec                 K   s   |  t|||f| dS )zAdd an integer setting.N)r   rm   r   r   r   r   r     s    zSettings.integerc                 C   s   | j | jS r   rv   r,   r   r   r   r   r   __getitem__  s    zSettings.__getitem__c                 C   s   || j | _d S r   r   )r   r   r,   r   r   r   __setitem__  s    zSettings.__setitem__c                 C   s
   || j kS r   rv   r   r   r   r   __contains__  s    zSettings.__contains__c                 c   s   | j D ]
}|V  qdS )z&Iterate over canonical settings names.Nrx   r   r   r   r   __iter__  s    
zSettings.__iter__c                 C   s   | j dd S )z Return canonical settings names.Nr   r   r   r   r   keys  s    zSettings.keysc                 G   sJ   g }|D ] }| j |  s|d|  qt|dkrFtd|dS )zvRaise exception if a setting has not been set.

        Option must have a value, and a default value is OK.

        z,Setting %s has no value, but one is requiredr   rp   N)rv   r0   r>   lenr   r	   rN   )r   Zsetting_namesZmessagesr   r   r   r   require  s    zSettings.requirec                 C   s   dd |D S )zTurn setting names into option names.

        Names with a single letter are short options, and get prefixed
        with one dash. The rest get prefixed with two dashes.

        c                 S   s(   g | ] }t |d krd| nd| qS )r   z--%sz-%s)r   )rI   r   r   r   r   rK     s   z*Settings._option_names.<locals>.<listcomp>r   )r   r   r   r   r   _option_names  s    zSettings._option_namesc                 C   s   d |d}|S )N_-)rN   splitr   r   r   r   	_destname  s    zSettings._destnamec                    s  fddfdd}dd }|j }|j}	tjjjt ||	jd}
tt	}j
D ]$}j| }|jdk	r`||j q`t|}i }|D ]"}t|
|}|
| |||< q|t }d	d
  fddfdd} d|ddd||ddd fdd} d|ddd||dd fdd} d|ddd|dd fdd} d|ddd d!|d"d#d$	 fd%d&} d|d'dd||d(dd __ d|
d)dd d!jd*dd+d$	 fd,d-} d|d.dd/||d0 d1d2 
d3d4 	 
fd5d6} 	fd7d8}j
D ]f}j| }|jdkrf|
}n
||j }||| t|tkr||| |
jf ||ji qF|
S )9z,Build OptionParser for parsing command line.c                    s    rdd S | S )Nc                  W   s   d S r   r   argsr   r   r   <lambda>      z6Settings.build_parser.<locals>.maybe.<locals>.<lambda>r   func)configs_onlyr   r   maybe  s    z$Settings.build_parser.<locals>.maybec                    s    fdd}|S )Nc                     s     fdd d S )Nc                      s     S r   r   r   )r   r   r   r   r     r   zMSettings.build_parser.<locals>.defer_last.<locals>.callback.<locals>.<lambda>)r>   r   )deferred_lastr   r   r   callback  s    z;Settings.build_parser.<locals>.defer_last.<locals>.callbackr   )r   r   )r   r   r   
defer_last  s    z)Settings.build_parser.<locals>.defer_lastc                 S   s&   | d kst | ttfkr| S |  S d S r   )r5   r2   rW   )xr   r   r   getit  s    z$Settings.build_parser.<locals>.getit)progry   Z	formatterr{   r|   r}   Nc                 _   s   |j ||}| |_|S r   )
add_optionZfrom_setting)r   r#   r   r   optionr   r   r   add_option_to_group  s    z2Settings.build_parser.<locals>.add_option_to_groupc                    s    s|s| S t jS d S r   )optparseZSUPPRESS_HELP)rr   r$   )all_optionsr   r   r'     s    z(Settings.build_parser.<locals>.help_textc                     s*    j D ]}tjd|  qtd d S )Nz%s
r   )rx   sysstdoutwriteexit)r   r   r   r   r   dump_setting_names!  s    
z1Settings.build_parser.<locals>.dump_setting_namesz--dump-setting-namesr   r   z(write out all names of settings and quitF)r4   r6   r   r    c                     s     tj td d S r:   )dump_configr   r   r   r   r   r   r   call_dump_config0  s    z/Settings.build_parser.<locals>.call_dump_configz--dump-configz*write out the entire current configurationc                    s   g  _ g  _d S r   )config_filesr   r   opt_strr,   parserr   r   r   reset_configs>  s    z,Settings.build_parser.<locals>.reset_configsz--no-default-configsz)clear list of configuration files to readc                    s    j |  j| d S r   )r   r>   r   r   r   r   r   append_to_configsL  s    z0Settings.build_parser.<locals>.append_to_configsz--configr   r   zadd FILE to config filesr   )r4   r6   r5   r   r    r"   c                     s"    j D ]}t| qtd d S r:   )r   printr   r   )r   r   r   r   r   list_config_files\  s    

z0Settings.build_parser.<locals>.list_config_filesz--list-config-fileszlist all possible config filesz--generate-manpagezfill in manual page TEMPLATETEMPLATEc                     s0   j  dd}tj|  td d S )NT)r   arg_synopsiscmd_synopsisr   r   )build_parserr   r   r   Zformat_helpr   )r   Zpp)r   r   r   r   r   r   help_ally  s    z'Settings.build_parser.<locals>.help_allz
--help-allzshow all options)r4   r    r   c                 S   sV   |j dkr,|jr|g|_qR| j|g7  _n&|j dkr>d|_n|j dksLt||_d S )Nr>   rR   Tr   )r4   rA   r,   AssertionErrorr   r   r,   r   r   r   r   r   r     s    


z(Settings.build_parser.<locals>.set_valuec                 S   s
   d|_ d S rB   r/   r   r   r   r   	set_false  s    z(Settings.build_parser.<locals>.set_falsec                    sL    |j} || f|d|f|j|j|j|j|j|jd d S )Nr   )r4   r   callback_argsr5   r6   r7   r    r"   )r   r   r5   r6   r7   r    r$   r"   )objsoption_names)r   r'   r   r   r   r   r   r     s      z)Settings.build_parser.<locals>.add_optionc              
      st    |j}dd |D }dd |D }fdd|D } || f|d|f|jd|d  |jd d S )	Nc                 S   s   g | ]}| d r|qS )z--)
startswithrI   r   r   r   r   rK     s     
 zFSettings.build_parser.<locals>.add_negation_option.<locals>.<listcomp>c                 S   s   g | ]}d |dd  qS )z--no-   Nr   r   r   r   r   rK     s     c                    s"   g | ]}|d d  j kr|qS )r   Nr   r   r   r   r   rK     s    r   zopposite of %sr   )r4   r   r   r5   r    )r   r   r5   r$   )r   r   r   Z
long_namesZ	neg_namesZunused_names)r   r'   r   r   r   r   r   add_negation_option  s      z2Settings.build_parser.<locals>.add_negation_option)r{   r|   r   ZOptionParserrz   ry   rn   r}   setdefault_group_namesrx   rv   r#   addsortedZOptionGroupZadd_option_groupconfig_group_name_arg_synopsis_cmd_synopsis_generate_manpager5   rQ   Zset_defaultsr   r,   )r   r   r   r   r   r   r   r   r{   r|   pZgroup_namesr   r   Zoption_groupsr#   Zconfig_groupr   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r'   r   r   r   r   r   r     s    

	




 

 

 
  

 	 






zSettings.build_parserc	                 C   sX   g }	|p| j ||||	|d}
|r*dd |
_|
|\}}|rD||  |	D ]
}|  qH|S )zParse the command line.

        Return list of non-option arguments. ``args`` would usually
        be ``sys.argv[1:]``.

        )r   r   r   r   r   c                 S   s
   t dS )Nr   )r   r   r   r   r   r   r     r   z%Settings.parse_args.<locals>.<lambda>)r   r   
parse_args)r   r   r   Zsuppress_errorsr   r   r   Zcompute_setting_valuesr   r   r   r   r   r   r   r   r     s    

zSettings.parse_argsc                 C   s   g }| d| j  | d| j  || d| j 7 }| tjd| j  | tjd| j  || tjd| j 7 }trttj	j
D ]6}tj|| j}| |D ]}||kr| | qq|S )zReturn list of default config files to read.

        The names of the files are dependent on the name of the program,
        as set in the progname attribute.

        The files may or may not exist.

        z/etc/%s.confz/etc/%s.yamlz/etc/%sz
~/.%s.confz
~/.%s.yamlz~/.config/%s)r>   rz   	listconfsospath
expanduserxdg_is_availablereversedxdgZBaseDirectoryZxdg_config_dirsrN   )r   Zconfigsdirnamepathnamelocationr   r   r   default_config_files  s     	zSettings.default_config_filesc                    s:   t j sg S | }|jdd d  fdd|D S )zReturn list of pathnames to config files in dirname.

        Config files are expected to have names ending in '.conf' or
        '.yaml'.

        If dirname does not exist or is not a directory, return empty
        list.

        c                 S   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )ord)rI   rM   r   r   r   rK     s     z8Settings.listconfs.<locals>.<lambda>.<locals>.<listcomp>r   )r   r   r   r   r     r   z$Settings.listconfs.<locals>.<lambda>)keyc                    s.   g | ]&}| d s| drtj |qS )z.conf.yaml)endswithr   r   rN   r   r   r   r   rK     s   
 
z&Settings.listconfs.<locals>.<listcomp>)r   r   isdirsort)r   r   listdirZ	basenamesr   r   r   r     s    
zSettings.listconfsc                 C   s   | j d kr| j| _ | j S r   )r   r   r   r   r   r   _get_config_files  s    
zSettings._get_config_filesc                 C   s
   || _ d S r   )r   )r   r   r   r   r   _set_config_files!  s    zSettings._set_config_filesc                 C   s,   || j krt||| j | }|| |S )z9Set value of a setting from a raw, unparsed string value.)rv   r   r1   )r   r   r   Z
raw_stringr   r   r   r   set_from_raw_string&  s
    



zSettings.set_from_raw_stringc              	   C   sp   i | _ | jD ]^}z8||}|dr2| || n| || |  W q tk
rh   || jkrd Y qX qdS )zgLoad all config files in self.config_files.

        Silently ignore files that do not exist.

        r   N)rw   r   r   
_read_yaml	_read_inicloseIOErrorr   )r   Z	open_filer   fr   r   r   load_configs.  s    


zSettings.load_configsc           
      C   s   t  }|d || |dD ].}|d|}| |||}t|dr$d|_q$dd | D D ]B}|| j	kr~i | j	|< | j	| }||D ]}	|||	||	< qqfd S )NconfigrA   Tc                 S   s   g | ]}|d kr|qS r   r   rI   r   r   r   r   rK   M  s      z&Settings._read_ini.<locals>.<listcomp>)
r   add_sectionZreadfpZoptionsrh   r   hasattrrA   Zsectionsrw   )
r   r   r   cpr   r,   r   sectionsection_datar   r   r   r   r   C  s    





zSettings._read_inic                 C   s   t |}| || |dp"i }t| D ]@\}}|| jkrLt||| j| }|| t	|dr0d|_
q0dd |D D ]@}|| jkri | j|< | j| }	|| D ]}
|| |
 |	|
< qqd S )Nr   rA   Tc                 S   s   g | ]}|d kr|qS r   r   r   r   r   r   rK   `  s      z'Settings._read_yaml.<locals>.<listcomp>)yamlZ	safe_load_check_yamlrh   rC   itemsrv   r   r   r   rA   rw   )r   r   r   r   r   r   r,   r   r  r  r   r   r   r   r   T  s     








zSettings._read_yamlc                 C   s2   t |tstd| d|kr.td| d S )Nz:Configuration file %s does not specify a key/value mappingr   z2Configuration file %s does not have a "config" key)
isinstanceru   r   r   )r   r   r   r   r   r   r  g  s    
zSettings._check_yamlc                 C   s<   t | }t||| j| j}tj|  t	d d S r:   )
openreadr   r   r   r   r   r   Zformat_templater   )r   oZdummyr,   r   template	generatorr   r   r   r   r  s    
zSettings._generate_manpagec                 C   s|   t  }|d | jD ]}|d|| j|   q| jD ]<}|dkr:|| | j|  D ]\}}|||| q^q:|S )a  Return a ConfigParser instance with current values of settings.

        Any sections outside of ``[config]`` are preserved as is. This
        lets the application use those as it wishes, and assign any
        meanings it desires to the section names.

        r   )r   r   rx   r   rv   r3   rw   r  )r   r   r   r  r   r,   r   r   r   as_cpy  s    	



zSettings.as_cpc                 C   s   |   }|| d S r   )r  r   )r   r   r   r   r   r   r     s    zSettings.dump_config)NNN)rD   )N)F)r   )r   )FNNNF)NFFNNNF)(r   r   r   __doc__r
   r~   r   r   r   rP   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r   r   r   r   r   r   r   r  r   r   r   r  r   r  r   r   r   r   r   rt     s^   %  
(



	
      
 n        

$
rt   )%Z
__future__r   configparserr   ImportErrorr   r   rc   r   r  Zxdg.BaseDirectoryr   r   r   Zcliapp.genmanr   version_infor2   rW   r   r   r   r   r	   r   r   objectr   r9   r=   rO   rQ   rZ   rm   ZIndentedHelpFormatterrn   rt   r   r   r   r   <module>   sH   


	+2%
