
    
,                        S r SSKrSSKrSr/ SQr/ SQr1 SkrS rS$S jrS	 r	S
 r
S rS rS%S jrS rS rS rS rS rS r\" SS5        \" SS5        \" SS5        \" SS5        \" SS5        \" SS5        \" S S!5        \" S"S#5        g)&z
inflection
~~~~~~~~~~~~

A port of Ruby on Rails' inflector to Python.

:copyright: (c) 2012-2020 by Janne Vanhala

:license: MIT, see LICENSE for more details.
    Nz0.5.1))z(?i)(quiz)$z\1zes)z(?i)^(oxen)$\1)z
(?i)^(ox)$z\1en)(?i)(m|l)ice$\1ice)z(?i)(m|l)ouse$r   )z(?i)(passer)s?by$z\1sby)z(?i)(matr|vert|ind)(?:ix|ex)$z\1ices)z(?i)(x|ch|ss|sh)$\1es)z(?i)([^aeiouy]|qu)y$z\1ies)z(?i)(hive)$z\1s)z(?i)([lr])f$\1ves)z(?i)([^f])fe$r   )z(?i)sis$ses)(?i)([ti])a$\1a)z(?i)([ti])um$r
   )z(?i)(buffal|potat|tomat)o$z\1oes)z
(?i)(bu)s$z\1ses)z(?i)(alias|status)$r   )z(?i)(octop|vir)i$\1i)z(?i)(octop|vir)us$r   )z(?i)^(ax|test)is$r   )(?i)s$s)$r   )!)z(?i)(database)s$r   )z(?i)(quiz)zes$r   )z(?i)(matr)ices$z\1ix)z(?i)(vert|ind)ices$z\1ex)z(?i)(passer)sby$z\1by)z(?i)^(ox)enr   )z(?i)(alias|status)(es)?$r   )z(?i)(octop|vir)(us|i)$z\1us)z(?i)^(a)x[ie]s$z\1xis)z(?i)(cris|test)(is|es)$z\1is)z(?i)(shoe)s$r   )z
(?i)(o)es$r   )z(?i)(bus)(es)?$r   )r   z\1ouse)z(?i)(x|ch|ss|sh)es$r   )z(?i)(m)ovies$z\1ovie)z(?i)(s)eries$z\1eries)z(?i)([^aeiouy]|qu)ies$z\1y)z(?i)([lr])ves$z\1f)z(?i)(tive)s$r   )z(?i)(hive)s$r   )z(?i)([^f])ves$z\1fe)z(?i)(t)he(sis|ses)$z\1hesis)z(?i)(s)ynop(sis|ses)$z	\1ynopsis)z(?i)(p)rogno(sis|ses)$z
\1rognosis)z(?i)(p)arenthe(sis|ses)$z\1arenthesis)z(?i)(d)iagno(sis|ses)$z
\1iagnosis)z(?i)(b)a(sis|ses)$z\1asis)z(?i)(a)naly(sis|ses)$z	\1nalysis)r	   z\1um)z(?i)(n)ews$z\1ews)z	(?i)(ss)$r   )r    >	   fishricejeansmoneysheepseriesspecies	equipmentinformationc                    S nU S   R                  5       US   R                  5       :X  a  [        R                  SSR                  U S   U SS 5      SUSS -   45        [        R                  SSR                  US   USS 5      SUSS -   45        [        R                  SSR                  US   USS 5      SU SS -   45        g[        R                  SSR                  U S   R                  5       U" U SS 5      5      US   R                  5       USS -   45        [        R                  SSR                  U S   R                  5       U" U SS 5      5      US   R                  5       USS -   45        [        R                  SSR                  US   R                  5       U" USS 5      5      US   R                  5       USS -   45        [        R                  SSR                  US   R                  5       U" USS 5      5      US   R                  5       USS -   45        [        R                  SSR                  US   R                  5       U" USS 5      5      U S   R                  5       U SS -   45        [        R                  SSR                  US   R                  5       U" USS 5      5      U S   R                  5       U SS -   45        g)z
A convenience function to add appropriate rules to plurals and singular
for irregular words.

:param singular: irregular word in singular form
:param plural: irregular word in plural form
c                 2    SR                  S U  5       5      $ )Nr   c              3   T   #    U  H  nS U-   UR                  5       -   S-   v   M      g7f)[]N)upper).0chars     .platform/bq/third_party/inflection/__init__.py	<genexpr>6_irregular.<locals>.caseinsensitive.<locals>.<genexpr>e   s$     J64sTzDJJL0366s   &()join)strings    r!   caseinsensitive#_irregular.<locals>.caseinsensitived   s    wwJ6JJJ    r   z(?i)({}){}$   Nr   z{}{}$)r   PLURALSinsertformat	SINGULARSlower)singularpluralr&   s      r!   
_irregularr1   \   s   K {fQioo//q!!(1+x|<F12J
 	 	q!!&)VABZ8F12J
 	 	!!&)VABZ8HQRL 
 	
 	qOOHQK--/+HQRL9;1IOOqr
*
 	
 	qOOHQK--/+HQRL9;1IOOqr
*
 	
 	qOOF1IOO-vabz/JK1IOOqr
*
 	 	qOOF1IOO-vabz/JK1IOOqr
*
 	 	OOF1IOO-vabz/JKQK(12,.
 	 	OOF1IOO-vabz/JKQK(12,.
 	r(   c                     U(       a  [         R                  " SS U 5      $ U S   R                  5       [        U 5      SS -   $ )a  
Convert strings to CamelCase.

Examples::

    >>> camelize("device_type")
    'DeviceType'
    >>> camelize("device_type", False)
    'deviceType'

:func:`camelize` can be thought of as a inverse of :func:`underscore`,
although there are some cases where that does not hold::

    >>> camelize(underscore("IOError"))
    'IoError'

:param uppercase_first_letter: if set to `True` :func:`camelize` converts
    strings to UpperCamelCase. If set to `False` :func:`camelize` produces
    lowerCamelCase. Defaults to `True`.
z
(?:^|_)(.)c                 @    U R                  S5      R                  5       $ Nr)   groupr   ms    r!   <lambda>camelize.<locals>.<lambda>       qwwqz/?/?/Ar(   r   r)   N)resubr.   camelize)r%   uppercase_first_letters     r!   r>   r>      s=    * vvm%A6JJay 8F#3AB#777r(   c                 &    U R                  SS5      $ )zkReplace underscores with dashes in the string.

Example::

    >>> dasherize("puni_puni")
    'puni-puni'

_-)replacewords    r!   	dasherizerF      s     <<S!!r(   c                     [         R                  " SSU 5      n U R                  SS5      n [         R                  " SS U 5      n [         R                  " SS U 5      n U $ )	a  
Capitalize the first word and turn underscores into spaces and strip a
trailing ``"_id"``, if any. Like :func:`titleize`, this is meant for
creating pretty output.

Examples::

    >>> humanize("employee_salary")
    'Employee salary'
    >>> humanize("author_id")
    'Author'

z_id$r   rA    z(?i)([a-z\d]*)c                 @    U R                  S5      R                  5       $ r4   )r6   r.   r7   s    r!   r9   humanize.<locals>.<lambda>   r;   r(   z^\wc                 @    U R                  S5      R                  5       $ )Nr   r5   r7   s    r!   r9   rJ      s    AGGAJ$4$4$6r(   )r<   r=   rC   rD   s    r!   humanizerL      sR     66'2t$D<<S!D66#%A4HD66&6=DKr(   c                 p    [        [        U 5      5      n U S-  S;   a  gSSSS.R                  U S-  S5      $ )	a@  
Return the suffix that should be added to a number to denote the position
in an ordered sequence such as 1st, 2nd, 3rd, 4th.

Examples::

    >>> ordinal(1)
    'st'
    >>> ordinal(2)
    'nd'
    >>> ordinal(1002)
    'nd'
    >>> ordinal(1003)
    'rd'
    >>> ordinal(-11)
    'th'
    >>> ordinal(-1021)
    'st'

d   )         thstndrd)r)         
   )absintgetnumbers    r!   ordinalr^      sH    * VF||# 
 #frk4
 		!r(   c                 8    SR                  U [        U 5      5      $ )a[  
Turn a number into an ordinal string used to denote the position in an
ordered sequence such as 1st, 2nd, 3rd, 4th.

Examples::

    >>> ordinalize(1)
    '1st'
    >>> ordinalize(2)
    '2nd'
    >>> ordinalize(1002)
    '1002nd'
    >>> ordinalize(1003)
    '1003rd'
    >>> ordinalize(-11)
    '-11th'
    >>> ordinalize(-1021)
    '-1021st'

z{}{})r,   r^   r\   s    r!   
ordinalizer`      s    * ==11r(   c                    [        U 5      n [        R                  " SX5      n U(       aU  [        R                  " U5      n[        R                  " SU-  X5      n [        R                  " SR	                  US9SU 5      n U R                  5       $ )z
Replace special characters in a string so that it may be used as part of a
'pretty' URL.

Example::

    >>> parameterize(u"Donald E. Knuth")
    'donald-e-knuth'

z(?i)[^a-z0-9\-_]+z%s{2,}z(?i)^{sep}|{sep}$)sepr   )transliterater<   r=   escaper,   r.   )r%   	separatorre_seps      r!   parameterizerg     sr     6"FVV()<F9%	F*I>,333?VL<<>r(   c                     U (       a  U R                  5       [        ;   a  U $ [         H9  u  p[        R                  " X5      (       d  M"  [        R
                  " XU 5      s  $    U $ )z
Return the plural form of a word.

Examples::

    >>> pluralize("posts")
    'posts'
    >>> pluralize("octopus")
    'octopi'
    >>> pluralize("sheep")
    'sheep'
    >>> pluralize("CamelOctopus")
    'CamelOctopi'

)r.   UNCOUNTABLESr*   r<   searchr=   )rE   rulereplacements      r!   	pluralizerm     sM      4::<</!(Dyy$$vvd66 ") r(   c                     [          H&  n[        R                  " SU-  U 5      (       d  M$  U s  $    [         H9  u  p#[        R                  " X 5      (       d  M"  [        R                  " X#U 5      s  $    U $ )a/  
Return the singular form of a word, the reverse of :func:`pluralize`.

Examples::

    >>> singularize("posts")
    'post'
    >>> singularize("octopi")
    'octopus'
    >>> singularize("sheep")
    'sheep'
    >>> singularize("word")
    'word'
    >>> singularize("CamelOctopi")
    'CamelOctopus'

z(?i)\b(%s)\Z)ri   r<   rj   r-   r=   )rE   
inflectionrk   rl   s       r!   singularizerp   6  s_    $ #
99_z1488K # '99T  66$T22 ' Kr(   c                 *    [        [        U 5      5      $ )aK  
Create the name of a table like Rails does for models to table names. This
method uses the :func:`pluralize` method on the last word in the string.

Examples::

    >>> tableize('RawScaledScorer')
    'raw_scaled_scorers'
    >>> tableize('egg_and_ham')
    'egg_and_hams'
    >>> tableize('fancyCategory')
    'fancy_categories'
)rm   
underscorerD   s    r!   tableizers   R  s     Z%&&r(   c           	      t    [         R                  " SS [        [        U 5      5      R	                  5       5      $ )a  
Capitalize all the words and replace some characters in the string to
create a nicer looking title. :func:`titleize` is meant for creating pretty
output.

Examples::

  >>> titleize("man from the boondocks")
  'Man From The Boondocks'
  >>> titleize("x-men: the last stand")
  'X Men: The Last Stand'
  >>> titleize("TheManWithoutAPast")
  'The Man Without A Past'
  >>> titleize("raiders_of_the_lost_ark")
  'Raiders Of The Lost Ark'

z\b('?\w)c                 @    U R                  S5      R                  5       $ r4   )r6   
capitalize)matchs    r!   r9   titleize.<locals>.<lambda>w  s    ekk!n//1r(   )r<   r=   rL   rr   titlerD   s    r!   titleizerz   c  s1    $ 661D!"((* r(   c                 r    [         R                  " SU 5      nUR                  SS5      R                  S5      $ )u  
Replace non-ASCII characters with an ASCII approximation. If no
approximation exists, the non-ASCII character is ignored. The string must
be ``unicode``.

Examples::

    >>> transliterate('älämölö')
    'alamolo'
    >>> transliterate('Ærøskøbing')
    'rskbing'

NFKDasciiignore)unicodedata	normalizeencodedecode)r%   
normalizeds     r!   rc   rc   |  s4     &&vv6JWh/66w??r(   c                     [         R                  " SSU 5      n [         R                  " SSU 5      n U R                  SS5      n U R                  5       $ )aM  
Make an underscored, lowercase form from the expression in the string.

Example::

    >>> underscore("DeviceType")
    'device_type'

As a rule of thumb you can think of :func:`underscore` as the inverse of
:func:`camelize`, though there are cases where that does not hold::

    >>> camelize(underscore("IOError"))
    'IoError'

z([A-Z]+)([A-Z][a-z])z\1_\2z([a-z\d])([A-Z])rB   rA   )r<   r=   rC   r.   rD   s    r!   rr   rr     sF      66)8T:D66%x6D<<S!D::<r(   personpeoplemanmenhumanhumanschildchildrensexsexesmovemovescowkinezombiezombies)T)rB   )__doc__r<   r   __version__r*   r-   ri   r1   r>   rF   rL   r^   r`   rg   rm   rp   rs   rz   rc   rr    r(   r!   <module>r      s   	 
 4"	H	2j86	"*!@20028'"2@$, 8X  
5%  
7H  
7J  
5'  
67  
5&  
8Y r(   