B
    °F.\C  ã               @   s¤   d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZmZmZ d dlmZ dd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    )Úprint_functionÚdivisionÚabsolute_importN)Úcaptured_handlerÚcaptured_loggerÚ
new_configÚnew_config_file)Úinitialize_loggingc              C   s¤   t  ¡ } | jj}tƒ  tdƒ dd„ }g }| |d| ƒ¡ xDt| ¡ ƒD ]4\}}t|t j	ƒs^qH|j
|kslt‚| |||ƒ¡ qHW x|D ]}td| ƒ q†W tƒ  d S )Nz7== Loggers (name, level, effective level, propagate) ==c             S   s    | t  |j¡t  | ¡ ¡|jfS )N)ÚloggingZgetLevelNameÚlevelZgetEffectiveLevelÚ	propagate)ÚnameÚlogger© r   ú<lib/python3.7/site-packages/distributed/tests/test_config.pyÚlogger_info   s    z%dump_logger_list.<locals>.logger_infoz<root>z%-40s %-8s %-8s %-5s)r
   Ú	getLoggerZmanagerZ
loggerDictÚprintÚappendÚsortedÚitemsÚ
isinstanceZLoggerr   ÚAssertionError)ÚrootÚloggersr   Zinfosr   r   Úinfor   r   r   Údump_logger_list   s    
r   c           
   C   s†  t  d¡} t| jƒdkst‚t| jd t jƒs2t‚t  d¡}|j}| d¡ x| jD ]}| d¡ qTW zt  d¡}t  d¡}t  d	¡}t	| jd ƒš}t
|t jd
€}t  |¡}	d}
|	 t  |
¡¡ | |	¡ d|_tƒ  |  d¡ |  d¡ | d¡ | d¡ | d¡ | d¡ | d¡ W dQ R X W dQ R X | ¡  ¡ }| ¡  ¡ }|ddgks`t‚|ddgksrt‚W d| |¡ X dS )z-
    Test default logging configuration.
    Zdistributedé   r   Ú ZWARNÚINFOzdistributed.foo.barZfoozfoo.bar)r   z)[%(levelname)s in %(name)s] - %(message)sFz1: debugz2: infoz3: infoz4: infoz5: errorz6: infoz7: errorNzdistributed - INFO - 2: infoz$distributed.foo.bar - INFO - 3: infoz[ERROR in foo.bar] - 5: error)r
   r   ÚlenÚhandlersr   r   ZStreamHandlerr   ZsetLevelr   r   ÚERRORZsetFormatterZ	FormatterZ
addHandlerr   r   Údebugr   ÚerrorÚgetvalueÚ
splitlines)Údr   Zold_root_levelZhandlerZdfbÚfZfbZdistributed_logZforeign_logÚhZfmtr   r   r   Útest_logging_default+   sH    













r*   c            	   C   s   t i ƒ tƒ  W d Q R X d S )N)r   r*   r   r   r   r   Útest_logging_empty_simpleh   s    
r+   c           	   C   s<   ddddœi} t | ƒ d}t tjd|g¡ W dQ R X dS )z:
    Test simple ("old-style") logging configuration.
    r
   r   r$   )zdistributed.foozdistributed.foo.barae  if 1:
            import logging
            import dask

            from distributed.utils_test import captured_handler

            d = logging.getLogger('distributed')
            assert len(d.handlers) == 1
            assert isinstance(d.handlers[0], logging.StreamHandler)
            df = logging.getLogger('distributed.foo')
            dfb = logging.getLogger('distributed.foo.bar')

            with captured_handler(d.handlers[0]) as distributed_log:
                df.info("1: info")
                dfb.warning("2: warning")
                dfb.error("3: error")

            distributed_log = distributed_log.getvalue().splitlines()

            assert distributed_log == [
                "distributed.foo - INFO - 1: info",
                "distributed.foo.bar - ERROR - 3: error",
                ], (dask.config.config, distributed_log)
            z-cN)r   Ú
subprocessÚ
check_callÚsysÚ
executable)ÚcÚcoder   r   r   Útest_logging_simplem   s    

r2   c           	   C   sl   dddddiiddddd	œid
did
didœddgdœdœi} t | ƒ d}t tjd|g¡ W dQ R X dS )z<
    Test extended ("new-style") logging configuration.
    r
   Ú1ZsimpleÚformatz$%(levelname)s: %(name)s: %(message)sZconsolezlogging.StreamHandlerzext://sys.stderr)ÚclassÚstreamZ	formatterr   r   r"   )zdistributed.foozdistributed.foo.barZWARNING)r   r!   )ÚversionZ
formattersr!   r   r   a^  if 1:
            import logging

            from distributed.utils_test import captured_handler

            root = logging.getLogger()
            d = logging.getLogger('distributed')
            df = logging.getLogger('distributed.foo')
            dfb = logging.getLogger('distributed.foo.bar')

            with captured_handler(root.handlers[0]) as root_log:
                df.info("1: info")
                dfb.warning("2: warning")
                dfb.error("3: error")
                d.info("4: info")
                d.warning("5: warning")

            root_log = root_log.getvalue().splitlines()
            print(root_log)

            assert root_log == [
                "INFO: distributed.foo: 1: info",
                "ERROR: distributed.foo.bar: 3: error",
                "WARNING: distributed: 5: warning",
                ]
            z-cN)r   r,   r-   r.   r/   )r0   r1   r   r   r   Útest_logging_extended•   s    

r8   c           	   C   s0   ddiddœ} t  t¡ t| ƒ W dQ R X dS )zV
    Ensure that 'logging-file-config' and 'logging' have to be mutual exclusive.
    ZdaskZwarningz/path/to/config)r
   zlogging-file-configN)ÚpytestZraisesÚRuntimeErrorr	   )Zconfigr   r   r   Útest_logging_mutual_exclusiveØ   s    r;   c           	   C   sl   d} t jddd}| | ¡ W dQ R X d|ji}t|ƒ d}t tjd|g¡ W dQ R X t	 
|j¡ dS )	z:
    Test `logging-file-config` logging configuration
    a‘  
[handlers]
keys=console

[formatters]
keys=simple

[loggers]
keys=root, foo, foo_bar

[handler_console]
class=StreamHandler
level=INFO
formatter=simple
args=(sys.stdout,)

[formatter_simple]
format=%(levelname)s: %(name)s: %(message)s

[logger_root]
level=WARNING
handlers=console

[logger_foo]
level=INFO
handlers=console
qualname=foo

[logger_foo_bar]
level=ERROR
handlers=console
qualname=foo.bar
ÚwF)ÚmodeÚdeleteNzlogging-file-configa)  if 1:
            import logging
            from distributed import config
            foo = logging.getLogger('foo')
            bar = logging.getLogger('foo.bar')
            assert logging.INFO == foo.getEffectiveLevel()
            assert logging.ERROR == bar.getEffectiveLevel()
            z-c)ÚtempfileZNamedTemporaryFileÚwriter   r   r,   r-   r.   r/   ÚosÚremove)Zlogging_config_contentsZlogging_configZdask_configr1   r   r   r   Útest_logging_file_configá   s    $

rC   )Z
__future__r   r   r   r
   r,   r.   r?   rA   r9   Zdistributed.utils_testr   r   r   r   Zdistributed.configr	   r   r*   r+   r2   r8   r;   rC   r   r   r   r   Ú<module>   s   =(C	