Ë
    Ã?Æi<  ã                  óð   — 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	m
Z
 eeeeeeef   ed   f   Z ej"                  d«      Z ej"                  d	«      Zi Z G d
„ d«      Z	 	 	 	 dd„Zdd„Zdd„Zdd„Zy)aÏ  Query structured number format files with number properties.

This module contains functions for reading and querying a database that
stores numbers that use a hierarchical format (e.g. ISBN, IBAN, phone
numbers, etc).

To read a database from a file:

>>> with open('tests/numdb-test.dat', 'r') as f:
...     dbfile = read(f)

To split a number:

>>> dbfile.split('01006')
['0', '100', '6']
>>> dbfile.split('902006')
['90', '20', '06']
>>> dbfile.split('909856')
['90', '985', '6']

To split the number and get properties for each part:

>>> import pprint
>>> pprint.pprint(dbfile.info('01006'))
[('0', {'prop1': 'foo'}), ('100', {'prop2': 'bar'}), ('6', {})]
>>> pprint.pprint(dbfile.info('02006'))
[('0', {'prop1': 'foo'}), ('200', {'prop2': 'bar', 'prop3': 'baz'}), ('6', {})]
>>> pprint.pprint(dbfile.info('03456'))
[('0', {'prop1': 'foo'}), ('345', {'prop2': 'bar', 'prop3': 'baz'}), ('6', {})]
>>> pprint.pprint(dbfile.info('902006'))
[('90', {'prop1': 'booz'}), ('20', {'prop2': 'foo'}), ('06', {})]
>>> pprint.pprint(dbfile.info('909856'))
[('90', {'prop1': 'booz'}), ('985', {'prop2': 'fooz'}), ('6', {})]
>>> pprint.pprint(dbfile.info('9889'))
[('98', {'prop1': 'booz'}), ('89', {'prop2': 'foo'})]
>>> pprint.pprint(dbfile.info('633322'))
[('6', {'prop1': 'boo'}), ('333', {'prop2': 'bar', 'prop3': 'baz', 'prop4': 'bla'}), ('22', {})]
>>> pprint.pprint(dbfile.info('1200333'))
[('1', {'prop1': 'foo'}), ('200', {'prop2': 'bar', 'prop3': 'baz'}), ('333', {'prop4': 'bax'})]

é    )ÚannotationsNF)Ú	GeneratorÚIterable)ÚIOÚAnyÚ
PrefixInfozZ^(?P<indent> *)(?P<ranges>([^-,\s]+(-[^-,\s]+)?)(,[^-,\s]+(-[^-,\s]+)?)*)\s*(?P<props>.*)$z+(?P<prop>[0-9a-zA-Z-_]+)="(?P<value>[^"]*)"c                  óF   — e Zd ZU dZded<   d	d„Zed
d„«       Zdd„Zdd„Z	y)ÚNumDBzNumber database.úlist[PrefixInfo]Úprefixesc                ó   — g | _         y)zConstruct an empty database.N)r   )Úselfs    úS/var/www/html/myprovider/mon_projet_qr/lib/python3.12/site-packages/stdnum/numdb.pyÚ__init__zNumDB.__init__b   s	   € àˆ�ó    c                ó4  — | sg S | }i }g }|D ]b  \  }}}}}	t        |«      |k\  sŒ||d| cxk  r|k  sŒ'n Œ*|t        |«      k  r	|d| }i }g }|j                  |«       |j                  |	«       Œd ||fgt        j	                  | t        |«      d |«      z   S )zˆLookup the specified number in the list of prefixes, this will
        return basically what info() should return but works recursively.N)ÚlenÚupdateÚextendr
   Ú_find)
Únumberr   ÚpartÚ
propertiesÚnext_prefixesÚlengthÚlowÚhighÚpropsÚchildrens
             r   r   zNumDB._findf   s»   € ñ ØˆIØˆØ%'ˆ
Ø*,ˆà2:ò 	/Ñ.ˆF�C˜˜u hÜ�4‹y˜FÓ" s¨d°7°F¨mÔ'C¸tÖ'CàœC ›IÒ%Ø  ˜=�DØ!#�JØ$&�MØ×!Ñ! %Ô(Ø×$Ñ$ XÕ.ð	/ð �zÐ"Ð#¤e§k¡k°&¼¸T»¸Ð2DÀmÓ&TÑTÐTr   c                óB   — t         j                  || j                  «      S )zßSplit the provided number in components and associate properties
        with each component. This returns a tuple of tuples. Each tuple
        consists of a string (a part of the number) and a dict of properties.
        )r
   r   r   )r   r   s     r   Úinfoz
NumDB.info|   s   € ô
 �{‰{˜6 4§=¡=Ó1Ð1r   c                óV   — | j                  |«      D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )zoSplit the provided number in components. This returns a tuple with
        the number of components identified.)r!   )r   r   r   r   s       r   ÚsplitzNumDB.splitƒ   s%   € ð )-¯	©	°&Ó(9×:™˜˜u’Ó:Ð:ùÓ:s   •%N)ÚreturnÚNone)r   Ústrr   r   r$   ú list[tuple[str, dict[str, str]]])r   r&   r$   r'   )r   r&   r$   z	list[str])
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Ústaticmethodr   r!   r#   © r   r   r
   r
   ]   s0   … ÙàÓóð òUó ðUó*2ô;r   r
   c              #  óÄ  K  — | D ]×  }|d   dk(  s|j                  «       dk(  rŒt        j                  |«      }|€J ‚t        |j	                  d«      «      }|j	                  d«      }t        t        j                  |j	                  d«      «      «      }g }|j                  d«      D ]2  }d	|v r|j                  d	«      \  }}	n||}	}|t        |«      ||	||f–— Œ4 ŒÙ y­w)
zgRead lines of text from the file pointer and generate indent, length,
    low, high, properties tuples.r   ú#Ú NÚindentÚrangesr   ú,ú-)	ÚstripÚ_line_reÚsearchr   ÚgroupÚdictÚ_prop_reÚfindallr#   )
ÚfpÚlineÚmatchr2   r3   r   r   Úrnger   r   s
             r   Ú_parserA   ‰   sà   è ø€ ð
 ò ?ˆà�‰7�cŠ>˜TŸZ™Z›\¨RÒ/Øä—‘ Ó%ˆØÐ Ð Ð Ü�U—[‘[ Ó*Ó+ˆØ—‘˜XÓ&ˆÜ”X×%Ñ% e§k¡k°'Ó&:Ó;Ó<ˆØ%'ˆØ—L‘L Ó%ò 	?ˆDØ�d‰{Ø ŸJ™J s›O‘	�‘Tà  $�T�Øœ#˜c›( C¨¨u°hÐ>Ó>ñ	?ñ?ùs   ‚CC c                óÄ   — d}t        «       }d|j                  i}t        | «      D ]7  \  }}}}}}	||kD  r||   d   d   ||<   ||   j                  |||||	f«       |}Œ9 |S )zAReturn a new database with the data read from the specified file.r   éÿÿÿÿé   )r
   r   rA   Úappend)
r=   Úlast_indentÚdbÚstackr2   r   r   r   r   r   s
             r   ÚreadrI   ¡   s…   € à€KÜ	‹€BØ�—‘Ð€EÜ6<¸R³jò Ñ2ˆ�˜˜T 5¨(Ø�KÒà! +Ñ.¨rÑ2°1Ñ5ˆE�&‰MØˆf‰×Ñ˜f c¨4°¸ÐAÔBØ‰ðð €Ir   c                óä   — 	 ddl }|j                  j                  t        «      j	                  | «      j                  d«      S # t        t        f$ r ddl}|j                  t        | «      cY S w xY w)z4Return a readable file-like object for the resource.r   NÚrb)Úimportlib.resourcesÚ	resourcesÚfilesÚ__package__ÚjoinpathÚopenÚImportErrorÚAttributeErrorÚpkg_resourcesÚresource_streamr(   )ÚnameÚ	importlibrT   s      r   Ú_get_resource_streamrX   ¯   sa   € ð=Û"Ø×"Ñ"×(Ñ(¬Ó5×>Ñ>¸tÓD×IÑIÈ$ÓOÐOøÜœÐ(ò =ÛØ×,Ñ,¬X°tÓ<Ò<ð=ús   ‚A A Á)A/Á.A/c                óæ   — | t         vrMddl}|j                  d«      } |t        | dz   «      «      5 }t	        |«      t         | <   ddd«       t         |    S t         |    S # 1 sw Y   t         |    S xY w)z>Open a database with the specified name to perform queries on.r   Nzutf-8z.dat)Ú_open_databasesÚcodecsÚ	getreaderrX   rI   )rV   r[   Úreaderr=   s       r   Úgetr^   ¹   so   € à”?Ñ"ÛØ×!Ñ! 'Ó*ˆÙÔ(¨°©Ó7Ó8ð 	-¸BÜ$(¨£HŒO˜DÑ!÷	-ä˜4Ñ Ð Œ?˜4Ñ Ð ÷	-ä˜4Ñ Ð ús   ²AÁA0)r=   úIterable[str]r$   zFGenerator[tuple[int, int, str, str, dict[str, str], list[PrefixInfo]]])r=   r_   r$   r
   )rV   r&   r$   z	IO[bytes])rV   r&   r$   r
   )r+   Ú
__future__r   ÚreÚTYPE_CHECKINGÚcollections.abcr   r   Útypingr   r   ÚtupleÚintr&   r:   Úlistr   Úcompiler7   r;   rZ   r
   rA   rI   rX   r^   r.   r   r   ú<module>ri      s§   ðñ((õT #ã 	ð €Ùß3ßØ�s˜C  d¨3°¨8¡n°d¸<Ñ6HÐHÑI€Jð ˆ2�:‰:ðó€ð ˆ2�:‰:Ø2ó4€ð €÷);ñ );ðX?Øð?àKó?ó0ó=ô!r   