
    (ph                     ^    S r SSKJr  SSKJr  SrSrSrSrSr	S	 r
S
 rS rS rS rS rS rg)au  MIME-Type Parser

This module provides basic functions for handling mime-types. It can handle
matching mime-types against a list of media-ranges. See section 14.1 of the
HTTP specification [RFC 2616] for a complete explanation.

   http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1

Contents:
 - parse_mime_type():   Parses a mime-type into its component parts.
 - parse_media_range(): Media-ranges are mime-types with wild-cards and a 'q'
                          quality parameter.
 - quality():           Determines the quality ('q') of a mime-type when
                          compared against a list of media-ranges.
 - quality_parsed():    Just like quality() except the second parameter must be
                          pre-parsed.
 - best_match():        Choose the mime-type with the highest quality ('q')
                          from a list of candidates.
    )absolute_import)reducez0.1.3zJoe Gregoriozjoe@bitworking.orgzMIT License c                    U R                  S5      n[        USS  VVs/ s H<  n[        UR                  SS5       Vs/ s H  o3R                  5       PM     sn5      PM>     snn5      nUS   R                  5       nUS:X  a  SnUR                  S5      u  pgUR                  5       UR                  5       U4$ s  snf s  snnf )	a:  Parses a mime-type into its component parts.

Carves up a mime-type and returns a tuple of the (type, subtype, params)
where 'params' is a dictionary of all the parameters for the media range.
For example, the media range 'application/xhtml;q=0.5' would get parsed
into:

   ('application', 'xhtml', {'q', '0.5'})
;   N=r   *z*/*/)splitdicttuplestrip)	mime_typepartsparamsparams	full_typetypesubtypes           L/var/www/html/venv/lib/python3.13/site-packages/googleapiclient/mimeparse.pyparse_mime_typer   #   s     OOC EFKABiPiU5;;sA#67#6a	#67	8iPF a I C	ooc*OTJJL'--/622 8Ps   B>
B9B>
9B>
c                     [        U 5      u  pnSU;  dA  US   (       a7  [        US   5      (       a$  [        US   5      S:  d  [        US   5      S:  a  SUS'   XU4$ )a  Parse a media-range into its component parts.

Carves up a media range and returns a tuple of the (type, subtype,
params) where 'params' is a dictionary of all the parameters for the media
range.  For example, the media range 'application/*;q=0.5' would get parsed
into:

   ('application', '*', {'q', '0.5'})

In addition this function also guarantees that there is a value for 'q'
in the params dictionary, filling it in with a proper default if
necessary.
qr   r   1)r   float)ranger   r   r   s       r   parse_media_ranger   ;   sg     .e4TF6c{VC[!!!!s6""    c                    SnSn[        U 5      u  pEnU H  u  pxn	Xt:H  =(       d    US:H  =(       d    US:H  n
X:H  =(       d    US:H  =(       d    US:H  nU
(       d  MG  U(       d  MP  [        S UR                  5        VVs/ s H   u  pUS:w  d  M  X;   d  M  XU   :X  d  M  SPM"     snnS5      nXt:H  =(       a    S=(       d    SnXU:H  =(       a    S=(       d    S-  nX-  nX:  d  M  UnU	S   nM     U[        U5      4$ s  snnf )	a  Find the best match for a mime-type amongst parsed media-ranges.

Find the best match for a given mime-type against a list of media_ranges
that have already been parsed by parse_media_range(). Returns a tuple of
the fitness value and the value of the 'q' quality parameter of the best
match, or (-1, 0) if no match was found. Just as for quality_parsed(),
'parsed_ranges' must be a list of parsed media ranges.
r   r
   c                 
    X-   $ N )xys     r   <lambda>,fitness_and_quality_parsed.<locals>.<lambda>i   s    QUr    r   r   d   
   )r   r   itemsr   )r   parsed_rangesbest_fitness
best_fit_qtarget_typetarget_subtypetarget_paramsr   r   r   
type_matchsubtype_matchkeyvalueparam_matchesfitnesss                   r   fitness_and_quality_parsedr9   V   s(    LJ3DY3O0[-#0(MDCKM;#;M
%PCP>S;P 	 :--"" )6(;(;(=(=cz &)m 8=8L (=
 M *38qG>19r>Q>G$G%&#C[
) $1, z***s   ?DDD Dc                     [        X5      S   $ )a~  Find the best match for a mime-type amongst parsed media-ranges.

Find the best match for a given mime-type against a list of media_ranges
that have already been parsed by parse_media_range(). Returns the 'q'
quality parameter of the best match, 0 if no match was found. This function
bahaves the same as quality() except that 'parsed_ranges' must be a list of
parsed media ranges.
r   )r9   )r   r-   s     r   quality_parsedr;   {   s     &i?BBr    c                 v    UR                  S5       Vs/ s H  n[        U5      PM     nn[        X5      $ s  snf )a3  Return the quality ('q') of a mime-type against a list of media-ranges.

Returns the quality 'q' of a mime-type when compared against the
media-ranges in ranges. For example:

>>> quality('text/html','text/*;q=0.3, text/html;q=0.7,
              text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5')
0.7

,)r   r   r;   )r   rangesrr-   s       r   qualityr@      s:     4:<<3DE3Da&q)3DME)33 Fs   6c                 8   [        UR                  S5      5      nU Vs/ s H  n[        U5      PM     nn/ nSnU  H$  nUR                  [	        Xt5      Xg45        US-  nM&     UR                  5         US   S   S   =(       a    US   S   =(       d    S$ s  snf )a1  Return mime-type with the highest quality ('q') from list of candidates.

Takes a list of supported mime-types and finds the best match for all the
media-ranges listed in header. The value of header must be a string that
conforms to the format of the HTTP Accept: header. The value of 'supported'
is a list of mime-types. The list of supported mime-types should be sorted
in order of increasing desirability, in case of a situation where there is
a tie.

>>> best_match(['application/xbel+xml', 'text/xml'],
               'text/*;q=0.5,*/*; q=0.1')
'text/xml'
r=   r   r   r"      r   )_filter_blankr   r   appendr9   sort)	supportedheadersplit_headerr?   parsed_headerweighted_matchesposr   s           r   
best_matchrL      s     !c!23L3?@<a&q)<M@
C	'	A3R	
 	q	 
 B"1%A*:2*>q*AGRG As   Bc              #   T   #    U  H  nUR                  5       (       d  M  Uv   M      g 7fr$   )r   )ir   s     r   rC   rC      s     7799G s   (	(N)__doc__
__future__r   	functoolsr   __version__
__author__	__email____license____credits__r   r   r9   r;   r@   rL   rC   r%   r    r   <module>rW      sQ   
& ' 
 	30#6"+J
C4 H8r    