U
    w	dL                  
   @   s  d Z ddlmZ ddlZddlZddlZddlZdZG dd deZ	G dd deZ
d	d
 ZG dd deZdZi ZeZejdk reef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dd  ZdBd!d"ZdCd#d$ZdDd%d&ZdEd'd(ZdFd)d*Z ej!"d+Z#e#rddl$Z$zdd,l$m%Z& W n" e'k
rP   dd-l$m&Z& Y nX e(e#d.Z)e$j*e)e&d/Z+W 5 Q R X g Z,e+d0 D ]@Z-e-d1 Z.e-"d2Z/e-"d3Z0e-"d4Z1e,2e	e.e/e0e1 qg Z3e+d5 D ]XZ4e4d1 Z.e4"d6Z5e4"d7Z6e4"d8Z7e4"d9Z8e4"d:Z9e32e
e.e5e6e7e8e9 qg Z:e+d; D ]LZ;e;d1 Z.e;"d<Z<e;"d=Z=e;"d>Z>e;"d?Z?e:2ee.e<e=e>e? q6[+[$[&nd@dAl@m,Z,m:Z:m3Z3 dS )Gz'Python implementation of the UA parser.    )absolute_importNz Lindsey Simon <elsigh@gmail.com>c                   @   s&   e Zd ZdddZdd Zdd ZdS )	UserAgentParserNc                 C   s*   || _ t| j | _|| _|| _|| _dS )aE  Initialize UserAgentParser.

        Args:
          pattern: a regular expression string
          family_replacement: a string to override the matched family (optional)
          v1_replacement: a string to override the matched v1 (optional)
          v2_replacement: a string to override the matched v2 (optional)
        N)patternrecompileuser_agent_refamily_replacementv1_replacementv2_replacement)selfr   r   r	   r
    r   ?/tmp/pip-unpacked-wheel-zwpncm2w/ua_parser/user_agent_parser.py__init__   s
    zUserAgentParser.__init__c                    s6   g }| j |  r2 fddtd jd D }|S )Nc                    s   g | ]}  |qS r   span.0Zgroup_indexmatchr   r   
<listcomp>1   s    z.UserAgentParser.MatchSpans.<locals>.<listcomp>   r   searchrange	lastindexr   user_agent_stringZmatch_spansr   r   r   
MatchSpans-   s    
zUserAgentParser.MatchSpansc                 C   s   d\}}}}| j |}|r| jrPtd| jrHtd|d| j}qZ| j}n
|d}| jrh| j}n|jr|jdkr|dpd }| jr| j}n|jr|jdkr|dpd }|jr|jdkr|dpd }||||fS )N)NNNNz\$1r            )	r   r   r   r   subgroupr	   r   r
   )r   r   familyv1v2v3r   r   r   r   Parse6   s&    
zUserAgentParser.Parse)NNN__name__
__module____qualname__r   r   r'   r   r   r   r   r      s        
	r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	OSParserNc                 C   s6   || _ t| j | _|| _|| _|| _|| _|| _dS )a  Initialize UserAgentParser.

        Args:
          pattern: a regular expression string
          os_replacement: a string to override the matched os (optional)
          os_v1_replacement: a string to override the matched v1 (optional)
          os_v2_replacement: a string to override the matched v2 (optional)
          os_v3_replacement: a string to override the matched v3 (optional)
          os_v4_replacement: a string to override the matched v4 (optional)
        N)	r   r   r   r   os_replacementos_v1_replacementos_v2_replacementos_v3_replacementos_v4_replacement)r   r   r-   r.   r/   r0   r1   r   r   r   r   S   s    zOSParser.__init__c                    s6   g }| j |  r2 fddtd jd D }|S )Nc                    s   g | ]}  |qS r   r   r   r   r   r   r   r   s    z'OSParser.MatchSpans.<locals>.<listcomp>r   r   r   r   r   r   r   n   s    
zOSParser.MatchSpansc                 C   s  d\}}}}}| j |}|r| jr2t| j|}n|jrB|d}| jrVt| j|}n|jrp|jdkrp|d}| jrt| j|}n|jr|jdkr|d}| jrt| j|}n|jr|jdkr|d}| j	rt| j	|}n|jr|jdkr|d}|||||fS )N)NNNNNr   r   r   r       )
r   r   r-   MultiReplacer   r"   r.   r/   r0   r1   )r   r   osos_v1os_v2os_v3os_v4r   r   r   r   r'   w   s0    




zOSParser.Parse)NNNNNr(   r   r   r   r   r,   R   s        
	r,   c                    s8    fdd}t d|| }t dd|}|dkr4d S |S )Nc                    s2   t | dd }  }|t|k r.|| S dS )Nr    )intr"   groupslen)mindexr"   r   r   r   _repl   s
    zMultiReplace.<locals>._replz\$(\d)z	^\s+|\s+$r9   )r   r!   )stringr   r?   _stringr   r   r   r3      s    r3   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	DeviceParserNc                 C   sF   || _ |dkr"t| j tj| _nt| j | _|| _|| _|| _dS )zInitialize UserAgentParser.

        Args:
          pattern: a regular expression string
          device_replacement: a string to override the matched device (optional)
        iN)r   r   r   
IGNORECASEr   device_replacementbrand_replacementmodel_replacement)r   r   
regex_flagrE   rF   rG   r   r   r   r      s    zDeviceParser.__init__c                    s6   g }| j |  r2 fddtd jd D }|S )Nc                    s   g | ]}  |qS r   r   r   r   r   r   r      s    z+DeviceParser.MatchSpans.<locals>.<listcomp>r   r   r   r   r   r   r      s    
zDeviceParser.MatchSpansc                 C   s   d\}}}| j |}|rx| jr.t| j|}n
|d}| jrJt| j|}| jr^t| j|}nt| dkrx|d}|||fS )N)NNNr   r   )	r   r   rE   r3   r"   rF   rG   r<   r;   )r   r   devicebrandmodelr   r   r   r   r'      s    


zDeviceParser.Parse)NNNNr(   r   r   r   r   rB      s       
	rB      )r   c                 C   sh   t | tstd|  | tt| f}t|}|d k	r@|S ttt	krTt
  d| i }t|< |S )Nz*Expected user agent to be a string, got %rr@   )
isinstance	_UA_TYPES	TypeErrortuplesorteditems_PARSE_CACHEgetr<   MAX_CACHE_SIZEclear)uaargskeyentryvr   r   r   _lookup   s    

r\   c                 C   s.   t | |}||}|s*|| | }||< |S )N)r\   rT   )rW   rX   rY   fnrZ   rr   r   r   _cached   s
    

r_   c                 K   s`   t | |}t|dkr|S d|kr0t| ||d< d|krFt| ||d< d|kr\t| ||d< |S )zParse all the things
    Args:
      user_agent_string: the full user agent string
    Returns:
      A dictionary containing all parsed bits
    r    
user_agentr4   rI   )r\   r<   _ParseUserAgent_ParseOS_ParseDevice)r   jsParseBitsrZ   r   r   r   r'      s    
r'   c                 K   s   t | |dtS )zParses the user-agent string for user agent (browser) info.
    Args:
      user_agent_string: The full user-agent string.
    Returns:
      A dictionary containing parsed bits.
    r`   )r_   ra   r   rd   r   r   r   ParseUserAgent  s    rf   c           	      C   s  |rt jdtdd d|kr\|d dkr\|d }|dp<d }|dpJd }|dpXd }n$tD ]}|| \}}}}|r` qq`d	|kr|d	 }|r|d
dkr| ddkri }t|}d||f }|d }|d }|d }|pd}||pd |pd |pd dS )NDjavascript overrides are deprecated and will be removed next releaser   category
stackleveljs_user_agent_familyr9   js_user_agent_v1js_user_agent_v2js_user_agent_v3js_user_agent_stringChrome/chromeframeChrome Frame (%s %s)majorminorpatchOther)r#   rt   ru   rv   )warningswarnDeprecationWarningrT   USER_AGENT_PARSERSr'   findrf   )	r   rd   r#   r$   r%   r&   ZuaParserro   Z
jsOverrider   r   r   ra     sL    
ra   c                 K   s   t | |dtS )zParses the user-agent string for operating system info
    Args:
      user_agent_string: The full user-agent string.
    Returns:
      A dictionary containing parsed bits.
    r4   )r_   rb   re   r   r   r   ParseOSI  s    r}   c                 C   sR   |rt jdtdd tD ] }|| \}}}}}|r q:q|p@d}|||||dS )Nrg   r   rh   rw   )r#   rt   ru   rv   Zpatch_minor)rx   ry   rz   
OS_PARSERSr'   )r   rd   ZosParserr4   r5   r6   r7   r8   r   r   r   rb   S  s"    rb   c                 K   s   t | |dtS )zParses the user-agent string for device info.
    Args:
        user_agent_string: The full user-agent string.
    Returns:
        A dictionary containing parsed bits.
    rI   )r_   rc   re   r   r   r   ParseDeviceh  s    r   c                 C   sN   |rt jdtdd tD ]}|| \}}}|r q6q|d krBd}|||dS )Nrg   r   rh   rw   )r#   rJ   rK   )rx   ry   rz   DEVICE_PARSERSr'   )r   rd   ZdeviceParserrI   rJ   rK   r   r   r   rc   r  s    rc   c                 C   sX   |r2|d   r d| |||f S d| |||f S n"|rDd| ||f S |rTd| |f S | S )zPretty user agent string.r   %s %s.%s.%s
%s %s.%s%s%s %s.%s%s %sisdigitr#   r$   r%   r&   r   r   r   PrettyUserAgent  s    r   c                 C   sn   |rd| ||||f S |rH|d   r6d| |||f S d| |||f S n"|rZd| ||f S |rjd| |f S | S )zPretty os string.z%s %s.%s.%s.%sr   r   r   r   r   r   )r4   r5   r6   r7   r8   r   r   r   PrettyOS  s    r   c                 C   s   t jdtdd |dk	rV|dkrV|}d}d}d}	|dk	r<|}|dk	rH|}|dk	rz|}	n$tD ]}
|
| \}}}}	|rZ qzqZ|r|ddkr| ddkrd	||f }t|}|d
 }|d }|d }	|pd|||	fS )zAbackwards compatible. use one of the other Parse methods instead!z#Use Parse (or a specialised parser)r   rj   Nr9   rp   rq   rr   rs   rt   ru   rv   rw   )rx   ry   rz   r{   r'   r|   rf   )r   ro   rk   rl   rm   rn   r#   r$   r%   r&   parserZua_dictr   r   r   ParseWithJSOverrides  s@    	  r   c                 C   sh   t jdtdd |rB|d  r0d| |||f S d| |||f S n"|rTd| ||f S |rdd| |f S | S )	z2backwards compatible. use PrettyUserAgent instead!zUse PrettyUserAgentr   r   r   r   r   r   r   )rx   ry   rz   r   r   r   r   r   Pretty  s    r   c           
      C   sB   i }|||||d}|  D ] \}}	|	dk	r|	dkr|	||< q|S )a  Return the optional arguments that should be saved and used to query.

    js_user_agent_string is always returned if it is present. We really only need
    it for Chrome Frame. However, I added it in the generally case to find other
    cases when it is different. When the recording of js_user_agent_string was
    added, we created new records for all new user agents.

    Since we only added js_document_mode for the IE 9 preview case, it did not
    cause new user agent records the way js_user_agent_string did.

    js_document_mode has since been removed in favor of individual property
    overrides.

    Args:
      user_agent_string: The full user-agent string.
      js_user_agent_string: JavaScript ua string from client-side
      js_user_agent_family: This is an override for the family name to deal
          with the fact that IE platform preview (for instance) cannot be
          distinguished by user_agent_string, but only in javascript.
      js_user_agent_v1: v1 override - see above.
      js_user_agent_v2: v1 override - see above.
      js_user_agent_v3: v1 override - see above.
    Returns:
      {js_user_agent_string: '[...]', js_family_name: '[...]', etc...}
    )ro   rk   rl   rm   rn   Nr9   )rR   )
r   ro   rk   rl   rm   rn   filtersZ
filterdictrY   valuer   r   r   
GetFilters  s    !
r   UA_PARSER_YAML)CSafeLoader)
SafeLoaderrb)LoaderZuser_agent_parsersregexr   r	   r
   Z
os_parsersr-   r.   r/   r0   r1   Zdevice_parsersrH   rE   rF   rG   r   )r{   r   r~   )NNN)NNNN)NNNNN)NNN)NNNNN)A__doc__
__future__r   r4   r   sysrx   
__author__objectr   r,   r3   rB   rU   rS   strrN   version_infounicoder\   r_   r'   rf   ra   r}   rb   r   rc   r   r   r   r   r   environrT   r   Zyamlr   r   ImportErroropenfploadZregexesr{   Z
_ua_parser_regexZ_family_replacementZ_v1_replacementZ_v2_replacementappendr~   Z
_os_parserZ_os_replacementZ_os_v1_replacementZ_os_v2_replacementZ_os_v3_replacementZ_os_v4_replacementr   Z_device_parserZ_regex_flagZ_device_replacementZ_brand_replacementZ_model_replacementZ_regexesr   r   r   r   <module>   s   7E5

-



     
.
     
0


   








