a
    yf%                     @   s   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 d dlZd dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ e jddZe jddZed	Zd
Ze e!dddZ"dd Z#dddZ$G dd dZ%e% Z&dS )    N)Path)ARGVENVIRONMENTIS_COLAB
IS_GIT_DIRIS_PIP_PACKAGELOGGERONLINERANKSETTINGSTESTS_RUNNINGTQDM	TryExcept__version__colorstrget_git_origin_url)GITHUB_ASSETS_NAMESZULTRALYTICS_HUB_APIzhttps://api.ultralytics.comZULTRALYTICS_HUB_WEBzhttps://hub.ultralytics.comzUltralytics HUB: z]If this issue persists please visit https://github.com/ultralytics/hub/issues for assistance.)urlreturnc                 C   sF   t stdddlm} ddlm} ||d|  d |dS )a/  
    Make an AJAX request with cookies attached in a Google Colab environment.

    Args:
        url (str): The URL to make the request to.

    Returns:
        (any): The response data from the AJAX request.

    Raises:
        OSError: If the function is not run in a Google Colab environment.
    z:request_with_credentials() must run in a Colab environmentr   )output)displayz
            window._hub_tmp = new Promise((resolve, reject) => {
                const timeout = setTimeout(() => reject("Failed authenticating existing browser session"), 5000)
                fetch("a  ", {
                    method: 'POST',
                    credentials: 'include'
                })
                    .then((response) => resolve(response.json()))
                    .then((json) => {
                    clearTimeout(timeout);
                    }).catch((err) => {
                    clearTimeout(timeout);
                    reject(err);
                });
            });
            Z_hub_tmp)r   OSErrorZgoogle.colabr   ZIPythonr   Z
JavascriptZeval_js)r   r   r    r   Q/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/hub/utils.pyrequest_with_credentials&   s    r   c                 K   s   | dd}|s$tj| |fi |S tj| |fddi|}tt|trV|jddn|}z<t|dddd	}|j	dd
D ]}|
t| qz|  W n tjjy   |  Y n0 |S )a  
    Make an HTTP request using the specified method and URL, with an optional progress bar.

    Args:
        method (str): The HTTP method to use (e.g. 'GET', 'POST').
        url (str): The URL to send the request to.
        **kwargs (any): Additional keyword arguments to pass to the underlying `requests.request` function.

    Returns:
        (requests.Response): The response object from the HTTP request.

    Note:
        - If 'progress' is set to True, the progress bar will display the download progress for responses with a known
        content length.
        - If 'progress' is a number then progress bar will display assuming content length = progress.
    progressFstreamTzcontent-lengthr   Bi   )totalunitZ
unit_scaleZunit_divisor)
chunk_size)poprequestsrequestint
isinstanceboolheadersgetr   iter_contentupdatelenclose
exceptionsChunkedEncodingError)methodr   kwargsr   responser   Zpbardatar   r   r   requests_with_progressO   s     r3         TFc                    s`   dt d fdd}	| |f}
||d< |rNtj|	|
|dd  n|	|
i |S dS )	aw  
    Makes an HTTP request using the 'requests' library, with exponential backoff retries up to a specified timeout.

    Args:
        method (str): The HTTP method to use for the request. Choices are 'post' and 'get'.
        url (str): The URL to make the request to.
        retry (int, optional): Number of retries to attempt before giving up. Default is 3.
        timeout (int, optional): Timeout in seconds after which the function will give up retrying. Default is 30.
        thread (bool, optional): Whether to execute the request in a separate daemon thread. Default is True.
        code (int, optional): An identifier for the request, used for logging purposes. Default is -1.
        verbose (bool, optional): A flag to determine whether to print out to console or not. Default is True.
        progress (bool, optional): Whether to show a progress bar during the request. Default is False.
        **kwargs (any): Keyword arguments to be passed to the requests function specified in method.

    Returns:
        (requests.Response): The HTTP response object. If the request is executed in a separate thread, returns None.
    )i  i  )verbosec                    s@  d}t   }td D ] }t   | kr4 q<t| |fi |}|jdk rV q<z| dd}W n ty   d}Y n0 |dkr,|jv r|rd d	 d
nd7 }n4|jdkr|j}d|d  d|d  d|d  d
}rt	t
 | dt d|j d  d	 |jvr,|  S t d|  q|S )zNMake HTTP requests with retries and timeouts, with optional progress tracking.N   i,  messagezNo JSON message.zUnable to read JSON.r   z
 Retrying zx for zs. i  zRate limit reached (zX-RateLimit-Remaining/zX-RateLimit-Limitz). Please retry after zRetry-After z (z #)   )timeranger3   status_codejsonr(   AttributeErrorr'   r   warningPREFIXHELP_MSGsleep)Zfunc_methodZfunc_urlZfunc_kwargsrt0imhcoderetryZretry_codestimeoutr7   r   r   func   s6    



 
(zsmart_request.<locals>.funcr   T)targetargsr0   daemonN)r   	threadingThreadstart)r/   r   rO   rP   threadrN   r7   r   r0   rQ   rS   r   rM   r   smart_requesto   s    rY   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )Eventsa  
    A class for collecting anonymous event analytics. Event analytics are enabled when sync=True in settings and
    disabled when sync=False. Run 'yolo settings' to see and update settings.

    Attributes:
        url (str): The URL to send anonymous events.
        rate_limit (float): The rate limit in seconds for sending events.
        metadata (dict): A dictionary containing metadata about the environment.
        enabled (bool): A flag to enable or disable Events based on certain conditions.
    zihttps://www.google-analytics.com/mp/collect?measurement_id=G-X8NCJYTQXM&api_secret=QLQrATrNSwGRFRLE-cbHJwc                 C   s   g | _ d| _d| _ttd jdktr*dn
tr2dnddt	
 d	d
 tttt d dd| _td otdv ot ototpt dk| _d	S )zWInitializes the Events object with default values for events, rate_limit, and metadata.g      >@g        r   Zyologitpipother.Nr>   g  4&kCi  )cliinstallpythonversionenvZ
session_idZengagement_time_msecsync>   r   r6   z.https://github.com/ultralytics/ultralytics.git)events
rate_limittr   r   namer   r   joinplatformpython_version_tupler   r   roundrandommetadatar   r
   r   r	   r   enabled)selfr   r   r   __init__   s(    
zEvents.__init__c                 C   s   | j s
dS t| jdk rfi | j|j|jtv r4|jndd}|jdkrR|j|d< | j	|j|d t

 }|| j | jk rdS td | jd	}td
| j|ddd g | _|| _dS )z
        Attempts to add a new event to the events list and send events if the rate limit is reached.

        Args:
            cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
        N   Zcustom)taskmodelZexportformat)rh   paramsuuid)Z	client_idre   postr   F)rB   rO   r7   )ro   r+   re   rn   rs   rt   r   moderu   appendr?   rg   rf   r   rY   r   )rp   cfgrv   rg   r2   r   r   r   __call__   s&    

zEvents.__call__N)__name__
__module____qualname____doc__r   rq   r|   r   r   r   r   rZ      s   rZ   )r4   r5   Tr6   TF)'osrj   rm   rU   r?   pathlibr   r"   Zultralytics.utilsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zultralytics.utils.downloadsr   environr(   ZHUB_API_ROOTZHUB_WEB_ROOTrE   rF   stranyr   r3   rY   rZ   re   r   r   r   r   <module>   s"   D) 
;L