
    zTi                        U d Z ddlmZ ddlZdZerddlmZmZ ddlm	Z	 nd ZdZ
d	ed
<   dZd	ed<   dZd	ed<   dZd	ed<   	 dZd	ed<   	 e G d de             Ze G d de             Ze G d d             Zd ej*                  d       ej*                  d      fd ej*                  d       ej*                  d      fd ej*                  d        ej*                  d!      fd" ej*                  d#       ej*                  d$      fd% ej*                  d&       ej*                  d'      fd( ej*                  d)       ej*                  d*      fd+ ej*                  d,       ej*                  d-      fd. ej*                  d/       ej*                  d0      fd1 ej*                  d2       ej*                  d3      fd4 ej*                  d5       ej*                  d6      fd7 ej*                  d8       ej*                  d9      fd: ej*                  d;       ej*                  d<      fd ej*                  d=       ej*                  d>      ffZd	ed?<   y)@zConversion between integers and roman numerals.

Copyright (c) 2024, Adam Turner.

This project is licenced under the terms of either the Zero-Clause BSD licence
or the CC0 1.0 Universal licence.
    )annotationsNF)Finalfinal)Selfc                    | S )N )fs    J/home/agent/.local/lib/python3.12/site-packages/roman_numerals/__init__.pyr   r      s        z4.1.0r   __version__)      r   version_info)MAXMINInvalidRomanNumeralErrorOutOfRangeErrorRomanNumeral__all__r   r   i  r   c                      e Zd ZdZy)r   z2Number out of range (must be between 1 and 3,999).N)__name__
__module____qualname____doc__r   r   r
   r   r   *   s    <r   r   c                  $     e Zd ZdZd fdZ xZS )r   zNot a valid Roman numeral.c                0    d| }t        |   |g|  y )NzInvalid Roman numeral: )super__init__)selfvalueargsmsg	__class__s       r
   r   z!InvalidRomanNumeralError.__init__3   s!    'w/$t$r   )r    strr!   objectreturnNone)r   r   r   r   r   __classcell__r#   s   @r
   r   r   /   s    $% %r   r   c                       e Zd ZU dZdZded<   ddZddZddZddZ	dd	Z
dd
ZddZd fdZd fdZddZddZedd       Z xZS )r   zA Roman numeral.

    Only values between 1 and 3,999 are valid.
    Stores the value internally as an ``int``.

    >>> answer = RomanNumeral(42)
    >>> print(answer.to_uppercase())
    XLII
    _valueintr,   c                  t        |      t        ur%t        |      j                  }d|}t        |      |t        k  s	|t
        kD  r| d}t        |      t        j                  |       }t        j                  |d|       |S )z)Construct a RomanNumeral from an integer.z0RomanNumeral() argument must be an integer, not z/ is out of range (must be between 1 and 3,999).r,   )
typer-   r   	TypeErrorr   r   r   r%   __new____setattr__)clsr    	type_namer"   objs        r
   r1   zRomanNumeral.__new__G   s}    ;c!U00IDYMRCC. 3;%#+GJKC!#&&NN3'3%0
r   c                    | j                   S )z)Return the integer value of this numeral.r+   r   s    r
   __int__zRomanNumeral.__int__T   s    {{r   c                "    | j                         S )z;Return the well-formed (uppercase) string for this numeral.)to_uppercaser7   s    r
   __str__zRomanNumeral.__str__X   s      ""r   c                N    | j                   j                   d| j                  dS )z1Return the string representation of this numeral.())r#   r   r,   r7   s    r
   __repr__zRomanNumeral.__repr__\   s$    ..))*!DKK?!<<r   c                `    t        |t              r| j                  |j                  k(  S t        S )zReturn self == other.
isinstancer   r,   NotImplementedr   others     r
   __eq__zRomanNumeral.__eq__`   s%    e\*;;%,,..r   c                `    t        |t              r| j                  |j                  k  S t        S )zReturn self < other.rA   rD   s     r
   __lt__zRomanNumeral.__lt__f   s%    e\*;;--r   c                ,    t        | j                        S )z(Return the hashed value of this numeral.)hashr,   r7   s    r
   __hash__zRomanNumeral.__hash__l   s    DKK  r   c                R    |dk(  rd|d}t        |      t        | 	  ||       y)z%Implement setattr(self, name, value).r,   zCannot set the  attribute.N)AttributeErrorr   r2   )r   keyr    r"   r#   s       r
   r2   zRomanNumeral.__setattr__p   s2    (?#C7+6C %%C'r   c                P    |dk(  rd|d}t        |      t        | 	  |       y)zImplement delattr(self, name).r,   zCannot delete the rM   N)rN   r   __delattr__)r   rO   r"   r#   s      r
   rQ   zRomanNumeral.__delattr__w   s0    (?&sg[9C %%C r   c                    g }| j                   }t        D ](  \  }}}||k\  s||z  }|j                  |       ||k\  r* dj                  |      S )zConvert a ``RomanNumeral`` to an uppercase string.

        >>> answer = RomanNumeral(42)
        >>> assert answer.to_uppercase() == 'XLII'
         r,   _ROMAN_NUMERAL_PREFIXESappendjoin)r   outnr    name_s         r
   r:   zRomanNumeral.to_uppercase~   s\     KK5 	!NE4u*U


4  u*	! wws|r   c                    g }| j                   }t        D ](  \  }}}||k\  s||z  }|j                  |       ||k\  r* dj                  |      S )zConvert a ``RomanNumeral`` to a lowercase string.

        >>> answer = RomanNumeral(42)
        >>> assert answer.to_lowercase() == 'xlii'
        rS   rT   )r   rX   rY   r    r[   rZ   s         r
   to_lowercasezRomanNumeral.to_lowercase   s\     KK5 	!NE1du*U


4  u*	! wws|r   c                  |rt        |t              st        |      |j                         r"|j	                         r|j                  d      }nK|j                         r0|j                         r |j                         j                  d      }nt        |      t        d      j                  |      st        |      d}d}t        d      D ]  }|||dz    dk(  r|dz  }|dz  } n t        |      |k(  r | |      S |||dz    d	k(  r|d
z  }|dz  }nR|||dz    dk(  r|dz  }|dz  }n<|||dz    dk(  r
|dz  }|dz  }t        d      D ]  }|||dz    dk(  r|dz  }|dz  } n t        |      |k(  r | |      S |||dz    dk(  r|dz  }|dz  }nR|||dz    dk(  r|dz  }|dz  }n<|||dz    dk(  r
|dz  }|dz  }t        d      D ]  }|||dz    dk(  r|dz  }|dz  } n t        |      |k(  r | |      S |||dz    dk(  r|dz  }|dz  }nR|||dz    dk(  r|dz  }|dz  }n<|||dz    dk(  r
|dz  }|dz  }t        d      D ]  }|||dz    dk(  r|dz  }|dz  } n t        |      |k(  r | |      S t        |      ) zCreate a ``RomanNumeral`` from a well-formed string representation.

        Returns ``RomanNumeral`` or raises ``InvalidRomanNumeralError``.

        >>> answer = RomanNumeral.from_string('XLII')
        >>> assert int(answer) == 42
        asciis   IVXLCDMr   r   r      M     s   CM  s   CD     D        Cd   s   XCZ   s   XL(      L2      X
   s   IX	   s   IV   V      I)rB   r$   r   isasciiisupperencodeislowerupper	frozenset
issupersetrangelen)r3   stringcharsresultidxr[   s         r
   from_stringzRomanNumeral.from_string   sJ    Z4*622 >> 0MM'*E^^&.."2LLN))'2E +622 $//6*622 q 	AS37#t+$q	 u:v; sQw5(cMF1HC3q!U*cMF1HCS37#t+#q1X sQw'4/cMF1HC u:v; sQw5(bLF1HC3q!U*bLF1HCS37#t+"q1X sQw'4/bLF1HC u:v; sQw5(aKF1HC3q!U*aKF1HCS37#t+!q1X sQw'4/aKF1HC u:v;&v..r   )r    r-   r&   r   )r&   r-   )r&   r$   )rE   r%   r&   bool)rO   r$   r    r%   r&   r'   )rO   r$   r&   r'   )r}   r$   r&   r   )r   r   r   r   	__slots____annotations__r1   r8   r;   r?   rF   rH   rK   r2   rQ   r:   r]   classmethodr   r(   r)   s   @r
   r   r   8   sa     IK#=!(! d/ d/r   r   ra   Mmrc   CMcmrf   Ddrd   CDcdri   Ccrj   XCxcrm   Llrk   XLxlro   Xxrp   IXixrr   Vvr   IVivIirU   )r   
__future__r   sysTYPE_CHECKINGtypingr   r   typing_extensionsr   r   r   r   r   r   r   r0   r   
ValueErrorr   r   internrU   r   r   r
   <module>r      s`   # 
#& U e   U :U  9 =i = = %z % % F/ F/ F/T 
:3::c?JCJJsO,*#**T
JCJJt,-*#**S/:3::c?+*#**T
JCJJt,-*#**S/:3::c?+D	:3::d+,C*#**S/*D	:3::d+,C*#**S/*


4*#**T*+


3C)


4*#**T*+


3C)"   Cr   