U
    Ha`                     @   s   d dl Z d dlZd dlZddlmZ ejr6d dlm	Z	 G dd d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dS )    N   )	UserAgent)WSGIEnvironmentc                   @   s   e Zd ZU dZejejejeef   e	d< dZ
ejejejeef   e	d< dZedZddd	d
Zeejeje eje eje eje f dddZdS )_UserAgentParser))z cros Zchromeos)z
iphone|iosZiphone)ipadr   )zdarwin\b|mac\b|os\s*xZmacos)winZwindows)androidr   )netbsdr	   )openbsdr
   )freebsdr   )Z	dragonflyZdragonflybsd)z(sun|i86)ossolaris)zx11\b|lin(\b|ux)?linux)znintendo\s+wiiZwii)irixr   )zhp-?uxZhpux)aixr   )zsco|unix_svZsco)bsdr   )amigar   )zblackberry|playbookZ
blackberry)symbianr   platform_rules))Z	googlebotZgoogle)ZmsnbotZmsn)yahoor   )z
ask jeevesask)zaol|america\s+online\s+browserZaol)z	opera|oprZopera)zedge|edgZedge)zchrome|criosZchrome)	seamonkeyr   )z"firefox|firebird|phoenix|iceweaselZfirefox)galeonr   )zsafari|versionZsafari)webkitr   )caminor   )	konquerorr   )zk-meleonZkmeleon)netscaper   )z4msie|microsoft\s+internet\s+explorer|trident/.+? rv:Zmsie)lynxr   )linksr   )ZBaiduspiderZbaidu)ZbingbotZbing)mozillar   browser_rulesz&(?:{pattern})[/\sa-z(]*(\d+[.\da-z]+)?za(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)Nreturnc                    s,   dd  j D  _ fdd jD  _d S )Nc                 S   s"   g | ]\}}|t |t jfqS  )recompileI.0abr"   r"   7/tmp/pip-unpacked-wheel-ub1y1qyw/werkzeug/useragents.py
<listcomp>D   s     z-_UserAgentParser.__init__.<locals>.<listcomp>c                    s,   g | ]$\}}|t  jj|d t jfqS ))pattern)r#   r$   _browser_version_reformatr%   r&   selfr"   r*   r+   E   s   )r   	platformsr   browsersr/   r"   r/   r*   __init__C   s    
z_UserAgentParser.__init__)
user_agentr!   c           	      C   s   | j D ]\}}||}|d k	r q*qd }d}tdtj|s`d|kr`|d dkr`|d}| jD ]0\}}|||d  }|d k	rf|d} qqfd  }}| j|}|d k	r|dp|d}nd }||||fS )Nr   ztrident/.+? rv:)r      )	r1   searchr#   r$   r%   rindexr2   group_language_re)	r0   r4   platformregexmatchZlast_closing_parenbrowserversionlanguager"   r"   r*   __call__J   s0    



z_UserAgentParser.__call__)__name__
__module____qualname__r   tClassVarIterableTuplestr__annotations__r   r-   r#   r$   r;   r3   OptionalrB   r"   r"   r"   r*   r      s   
""(r   c                       s&   e Zd ZdZdd fddZ  ZS )UserAgentParserzA simple user agent parser.  Used by the `UserAgent`.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Use a dedicated parser library
        instead.
    Nr    c                    s   t jdtdd t   d S )Nzl'UserAgentParser' is deprecated and will be removed in Werkzeug 2.1. Use a dedicated parser library instead.r7   
stacklevel)warningswarnDeprecationWarningsuperr3   r/   	__class__r"   r*   r3   {   s    zUserAgentParser.__init__rC   rD   rE   __doc__r3   __classcell__r"   r"   rT   r*   rM   s   s   rM   c                       sN   e Zd Zejdgejf dd fddZejejejd fddZ  ZS )	_deprecated_property
_UserAgentN)fgetr!   c                    s    t  | d|jd| _d S )NzVThe built-in user agent parser is deprecated and will be removed in Werkzeug 2.1. The z property will be 'None'. Subclass 'werkzeug.user_agent.UserAgent' and set 'Request.user_agent_class' to use a different parser.)rS   r3   rC   message)r0   r[   rT   r"   r*   r3      s    z_deprecated_property.__init__)argskwargsr!   c                    s    t j| jtdd t j||S )N   rN   )rP   rQ   r\   rR   rS   __get__)r0   r]   r^   rT   r"   r*   r`      s    z_deprecated_property.__get__)	rC   rD   rE   rF   CallableAnyr3   r`   rX   r"   r"   rT   r*   rY      s   "
rY   c                       s   e Zd Ze Zedd fddZeej	e dddZ
eej	e ddd	Zeej	e dd
dZeej	e dddZ  ZS )rZ   N)stringr!   c                    s.   t  | | |}|\| _| _| _| _d S N)rS   r3   _parser	_platform_browser_version	_language)r0   rc   inforT   r"   r*   r3      s    
z_UserAgent.__init__r    c                 C   s   | j S rd   )rf   r/   r"   r"   r*   r<      s    z_UserAgent.platformc                 C   s   | j S rd   )rg   r/   r"   r"   r*   r?      s    z_UserAgent.browserc                 C   s   | j S rd   )rh   r/   r"   r"   r*   r@      s    z_UserAgent.versionc                 C   s   | j S rd   )ri   r/   r"   r"   r*   rA      s    z_UserAgent.language)rC   rD   rE   r   re   rJ   r3   rY   rF   rL   r<   r?   r@   rA   rX   r"   r"   rT   r*   rZ      s   rZ   c                       s(   e Zd ZdZddd fddZ  ZS )r   a  Represents a parsed user agent header value.

    This uses a basic parser to try to extract some information from the
    header.

    :param environ_or_string: The header value to parse, or a WSGI
        environ containing the header.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Subclass
        :class:`werkzeug.user_agent.UserAgent` (note the new module
        name) to use a dedicated parser instead.

    .. versionchanged:: 2.0
        Passing a WSGI environ is deprecated and will be removed in 2.1.
    zt.Union[str, WSGIEnvironment]N)environ_or_stringr!   c                    sL   t |tr(tjdtdd |dd}n|}tjdtdd t | d S )NzzPassing an environ to 'UserAgent' is deprecated and will be removed in Werkzeug 2.1. Pass the header value string instead.r7   rN   ZHTTP_USER_AGENT zThe 'werkzeug.useragents' module is deprecated and will be removed in Werkzeug 2.1. The new base API is 'werkzeug.user_agent.UserAgent'.)
isinstancedictrP   rQ   rR   getrS   r3   )r0   rk   rc   rT   r"   r*   r3      s    
zUserAgent.__init__rV   r"   r"   rT   r*   r      s   r   )r#   typingrF   rP   r4   r   Z_BaseUserAgentTYPE_CHECKINGZ_typeshed.wsgir   r   rM   propertyrY   rZ   r"   r"   r"   r*   <module>   s   h