U
    d3                     @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZm Z m!Z!m"Z" dZ#dZ$e%dej&Z'dZ(dZ)dZ*dd Z+G dd deZ,ej-fddZ.ej-fddZ/eddZ0e0e ee/e(Z1e0eee.e)Z2d-dd Z3G d!d" d"Z4d#d$ Z5d%d& Z6d'd( Z7d)d* Z8eefd+d,Z9dS ).z?App utilities: Compat settings, bug-report tool, pickling apps.    N)
namedtuple)Mapping)deepcopy)
ModuleType)maybe_sanitize_url)ImproperlyConfigured)pyimplementation)ConfigurationView)import_from_cwdqualnamesymbol_by_namepretty   )_OLD_DEFAULTS_OLD_SETTING_KEYS_TO_NEW_KEY_TO_OLD_KEYDEFAULTSSETTING_KEYSfind)Settingsappstr	bugreportfilter_hidden_settingsfind_appa   
software -> celery:{celery_v} kombu:{kombu_v} py:{py_v}
            billiard:{billiard_v} {driver_v}
platform -> system:{system} arch:{arch}
            kernel version:{kernel_version} imp:{py_i}
loader   -> {loader}
settings -> transport:{transport} results:{results}

{human_settings}
z=API|TOKEN|KEY|SECRET|PASS|PROFANITIES_LIST|SIGNATURE|DATABASEzk

Cannot mix new and old setting keys, please rename the
following settings to the new format:

{renames}

z

Cannot mix new setting names with old setting names, please
rename the following settings to use the old format:

{renames}

Or change all of the settings to use the new format :)

z{replace:<36} -> {with_}c                 C   s   | j pd dt| dS )z1String used in __repr__ etc, to id app instances.__main__z at z#x)mainid)app r    4/tmp/pip-unpacked-wheel-mu1yl971/celery/app/utils.pyr   B   s    r   c                       s   e Zd ZdZdd fdd
Zedd Zedd	 Zed
d Zedd Z	edd Z
edd Zedd Zdd Zdd Zd*ddZd+ddZdd Zd d! Zd,d$d%Zd-d&d'Zd(d) Z  ZS ).r   zsCelery settings object.

    .. seealso:

        :ref:`configuration` for a full list of configuration keys.

    N)deprecated_settingsc                   s   t  j|| || _d S N)super__init__r"   )selfr"   argskwargs	__class__r    r!   r%   P   s    zSettings.__init__c                 C   s   t jdp| dp| jS )NZCELERY_BROKER_READ_URLbroker_read_urlosenvironget
broker_urlr&   r    r    r!   r+   U   s
    zSettings.broker_read_urlc                 C   s   t jdp| dp| jS )NZCELERY_BROKER_WRITE_URLbroker_write_urlr,   r1   r    r    r!   r2   ]   s
    zSettings.broker_write_urlc                 C   s   t jdp| ddS )NZCELERY_BROKER_URLr0   Zbroker_hostr-   r.   r/   firstr1   r    r    r!   r0   e   s    
zSettings.broker_urlc                 C   s   t jdp| ddS )NZCELERY_RESULT_BACKENDresult_backendr3   r1   r    r    r!   r5   l   s    
zSettings.result_backendc                 C   s   |  ddS )Ntask_default_exchangetask_default_queuer4   r1   r    r    r!   r6   s   s    zSettings.task_default_exchangec                 C   s   |  ddS )Ntask_default_routing_keyr7   r8   r1   r    r    r!   r9   z   s    z!Settings.task_default_routing_keyc                 C   s   |  ddS )NtimezoneZ	time_zoner8   r1   r    r    r!   r:      s    zSettings.timezonec                 C   s   t i | jdd S )z7Return the current configuration, but without defaults.N)r   mapsr1   r    r    r!   without_defaults   s    zSettings.without_defaultsc                 C   s   ||   kS r#   )r=   )r&   keyr    r    r!   value_set_for   s    zSettings.value_set_for c                 C   s
   t ||S )a  Search for option by name.

        Example:
            >>> from proj.celery import app
            >>> app.conf.find_option('disable_rate_limits')
            ('worker', 'prefetch_multiplier',
             <Option: type->bool default->False>))

        Arguments:
            name (str): Name of option, cannot be partial.
            namespace (str): Preferred name-space (``None`` by default).
        Returns:
            Tuple: of ``(namespace, key, type)``.
        )r   r&   name	namespacer    r    r!   find_option   s    zSettings.find_optionceleryc                 C   s   | j | ||dd  S )z6Shortcut to ``get_by_parts(*find_option(name)[:-1])``.Nr;   )get_by_partsrD   rA   r    r    r!   find_value_for_key   s    zSettings.find_value_for_keyc                 G   s   | d dd |D  S )zReturn the current value for setting specified as a path.

        Example:
            >>> from proj.celery import app
            >>> app.conf.get_by_parts('worker', 'disable_rate_limits')
            False
        _c                 s   s   | ]}|r|V  qd S r#   r    ).0partr    r    r!   	<genexpr>   s      z(Settings.get_by_parts.<locals>.<genexpr>)join)r&   partsr    r    r!   rF      s    zSettings.get_by_partsc                 C   s&   z| d  W n t k
r    Y nX | S )NZ	__bogus__)KeyErrorr1   r    r    r!   finalize   s
    zSettings.finalizeFTc                    sJ   |rt ndd }tt |   |r(| n|  }| fdd| D S )Nc                 S   s   | S r#   r    )vr    r    r!   <lambda>       z Settings.table.<locals>.<lambda>c                    s(   i | ] \}}| d s| kr||qS )rH   )
startswithrI   krP   Zdict_membersr    r!   
<dictcomp>   s
   
  z"Settings.table.<locals>.<dictcomp>)r   dirdictrO   r=   items)r&   with_defaultscensoredZfiltsettingsr    rV   r!   table   s    zSettings.tablec                 C   s    d dd | || D S )z;Return a human readable text showing configuration changes.
c                 s   s(   | ] \}}| d t |dd V  qdS )z: 2   )widthNr   )rI   r>   valuer    r    r!   rK      s   z$Settings.humanize.<locals>.<genexpr>)rL   r^   rZ   )r&   r[   r\   r    r    r!   humanize   s    
zSettings.humanizec                 C   sV   | j rRddlm} ddlm} | j D ](}|jd|ddd||  dd	 q$d
S dS )Nr   )r   )
deprecatedzThe z settingz6.0.0zUse the z instead)descriptionZremovalalternativeTF)r"   Zcelery.app.defaultsr   Zcelery.utilsrd   warn)r&   r   rd   Zsettingr    r    r!   maybe_warn_deprecated_settings   s    
z'Settings.maybe_warn_deprecated_settings)r@   )rE   )FT)FT)__name__
__module____qualname____doc__r%   propertyr+   r2   r0   r5   r6   r9   r:   r=   r?   rD   rG   rF   rO   r^   rc   rh   __classcell__r    r    r)   r!   r   G   s2   









	


r   c                 C   s
   || | S r#   r    r>   convertr    r    r!   _new_key_to_old   s    rq   c                 C   s
   || | S r#   r    ro   r    r    r!   _old_key_to_new   s    rr   Zsettings_info_t)defaultsrp   Zkey_t	mix_errorc                    sn  |si n|}|st  n|}|s"tn|}|s.tn|}| }| d krH|i  }} t | |   |} |}d |rt| }	|rt|t|krt| }	|rΈst| }	|rt|t|krt| }	n
t| }	|rtt   }	 fdd|	D }
|
r,tj	j
dfddt|
D dfdd| D }ttjf|}t|| |gttf||d	S )
Nc                    s   h | ]}j |  kr|qS r    )rp   rI   r>   Zhaveinfor    r!   	<setcomp>  s      z"detect_settings.<locals>.<setcomp>r_   c                 3   s"   | ]}t j| j| d V  qdS ))replaceZwith_N)FMT_REPLACE_SETTINGformatrp   ru   rw   r    r!   rK     s   z"detect_settings.<locals>.<genexpr>)renamesc                    s    i | ]\}} j |||qS r    )rp   r/   rT   r|   r    r!   rW     s      z#detect_settings.<locals>.<dictcomp>)r"   prefix)setr   r   keysintersection_settings_infolen_old_settings_infor   rt   r{   rL   sortedrZ   rY   r   rs   r   rr   rq   )confZpreconfZignore_keysr~   Zall_keysZold_keyssourceZ	is_in_newZ	is_in_oldleftZreally_leftrs   r    rv   r!   detect_settings   sJ    






 r   c                   @   s:   e Zd ZdZdd Zdd Zdd Zdd	d
Zdd ZdS )
AppPicklerz*Old application pickler/unpickler (< 3.1).c                 G   s*   | j | }| j|f|}| j|f| |S r#   )build_kwargs	constructprepare)r&   clsr'   r(   r   r    r    r!   __call__%  s    
zAppPickler.__call__c                 K   s   |j |d  d S )Nchanges)r   update)r&   r   r(   r    r    r!   r   +  s    zAppPickler.preparec                 G   s
   | j | S r#   )build_standard_kwargs)r&   r'   r    r    r!   r   .  s    zAppPickler.build_kwargsNc                 C   s   ||||||||d|
d
S )NF)
r   loaderbackendamqpr   eventslogcontrolset_as_currentconfig_sourcer    )r&   r   r   r   r   r   r   r   r   Zaccept_magic_kwargsr   r    r    r!   r   1  s        z AppPickler.build_standard_kwargsc                 K   s
   |f |S r#   r    )r&   r   r(   r    r    r!   r   9  s    zAppPickler.construct)N)	ri   rj   rk   rl   r   r   r   r   r   r    r    r    r!   r   "  s    
r   c                 G   s   | | f| S )zRebuild app for versions 2.5+.r    )r   Zpicklerr'   r    r    r!   _unpickle_app=  s    r   c                 C   s   d|d< | f |S )zRebuild app for versions 3.1+.Fr   r    )r   r(   r    r    r!   _unpickle_app_v2B  s    r   c                    s    ddd  fdd|   D S )zFilter sensitive settings.********c                 S   sn   t |trt|S t | trjt| r*|S d|  krRddlm} ||j	|dS d|  krjt
||dS |S )Nr0   r   )
Connection)maskr   )
isinstancer   r   strHIDDEN_SETTINGSsearchlowerkombur   as_urir   )r>   rb   r   r   r    r    r!   maybe_censorJ  s    


z,filter_hidden_settings.<locals>.maybe_censorc                    s   i | ]\}}| ||qS r    r    rT   r   r    r!   rW   X  s      z*filter_hidden_settings.<locals>.<dictcomp>)r   )rZ   )r   r    r   r!   r   H  s    
r   c                 C   s   ddl }ddl}ddl}z(|  }d|jj|j }|j}W n t	k
r\   d }}Y nX t
jt ddd t D t t |j|j|jt ||t| jjpd| j t| jjd	S )
z=Return a string containing information useful in bug-reports.r   Nz{}:{}r@   z, c                 s   s   | ]}|r|V  qd S r#   r    )rI   xr    r    r!   rK   l  s      zbugreport.<locals>.<genexpr>disabled)systemarchZkernel_versionZpy_iZcelery_vZkombu_vZ
billiard_vZpy_vdriver_v	transportresultsZhuman_settingsr   )billiardr   rE   
connectionr{   r   Zdriver_nameZdriver_versionZtransport_cls	ExceptionBUGREPORT_INFO	_platformr   rL   architecturereleaser   ZVERSION_BANNER__version__python_versionr   r   r5   rc   r   r   r*   )r   r   r   rE   connr   r   r    r    r!   r   [  s4    


r   c                 C   s4  ddl m} z|| |d}W n tk
r8   || }Y nX t|tr0d| kr0z|j}t|trht W n tk
r*   z|j}t|trtdW n tk
r   t|ddrzt|  d||d	W  Y  Y S  t	k
r   Y nX t
| D ]}t||r|   Y  Y S q Y n
X | Y S Y nX |S |S )
zFind app by name.r   )Celery)imp:zBattribute 'celery' is the celery module not the instance of celery__path__Nz.celery)r   r   )baser   AttributeErrorr   r   r   rE   getattrr   ImportErrorvarsvalues)r   r   r   r   symfoundZsuspectr    r    r!   r   {  sD    


 
r   )NNNNN):rl   r-   platformr   recollectionsr   collections.abcr   copyr   typesr   Zkombu.utils.urlr   Zcelery.exceptionsr   Zcelery.platformsr   Zcelery.utils.collectionsr	   Zcelery.utils.importsr
   r   r   Zcelery.utils.textr   rs   r   r   r   r   r   r   r   __all__r   compile
IGNORECASEr   ZE_MIX_OLD_INTO_NEWZE_MIX_NEW_INTO_OLDrz   r   r   r/   rq   rr   Z_settings_info_tr   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   sf   $	 
          
9 