ó
    %ÑLj6!  ã            
       ó¸   • S r SSKrSSKrSSKJrJr  \(       a  SSKJr  S rS r	S\
\\4   S\
\\4   4S	 jrS
\S\
S\
S\
\\4   4S jrS rS r " S S5      rg)aÃ  
Functionality to convert tabular data in Frictionless Data Packages to CSVW.

We translate [table schemas](https://specs.frictionlessdata.io/table-schema/) defined
for [data resources](https://specs.frictionlessdata.io/data-resource/) in a
[data package](https://specs.frictionlessdata.io/data-package/) to a CVSW TableGroup.

This functionality can be used together with the `frictionless describe` command to add
CSVW metadata to "raw" CSV tables.
é    N)ÚAnyÚTYPE_CHECKING)Ú
TableGroupc                 óà  ^ • ST S   0nT S   S:X  a  T R                  S5      (       a  T S   US'   T S   S:X  aB  T R                  S5      (       a,  T R                  S5      (       a  T S   S	    S
T S   S	    3US'   T S   S;   aj  T R                  S5      SL a  [        S5      e[        U 4S jS 5       5      (       a1  0 US'   S H&  nT R                  U5      (       d  M  T U   US   U'   M(     U$ )NÚbaseÚtypeÚstringÚformatú	dc:formatÚbooleanÚ
trueValuesÚfalseValuesr   Ú|)ÚnumberÚintegerÚ
bareNumberTz»bareNumber is not supported in CSVW. It may be possible to translate to a number pattern, though. See https://www.w3.org/TR/2015/REC-tabular-data-model-20151217/#formats-for-numeric-typesc              3   ó,   >#   • U  H	  oT;   v •  M     g 7f©N© )Ú.0ÚpropÚspecs     €ÚŸC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\csvw/frictionless.pyÚ	<genexpr>Ú,_convert_numeric_datatype.<locals>.<genexpr>    s   øé € ÐEÒ(D �tŽ|Ò(Dùs   ƒ)ÚdecimalCharÚ	groupChar)ÚgetÚNotImplementedErrorÚany)r   ÚdatatypeÚps   `  r   Ú_convert_numeric_datatyper#      s  ø€ Ø˜˜V™Ð%€HØˆF�|�xÓ D§H¡H¨X×$6Ñ$6Ø $ X¡ˆ�ÑØˆF�|�yÓ  T§X¡X¨l×%;Ñ%;ÀÇÁÈ×@WÑ@WØ $ \Ñ 2°1Ñ 5Ð6°a¸¸]Ñ8KÈAÑ8NÐ7OÐPˆ�ÑØˆF�|Ð,Ó,Ø�8‰8�LÓ! TÒ)Ü%ð-ó.ð .ô
 ÔEÑ(DÓE×EÑEØ!#ˆH�XÑÛ1�Ø—8‘8˜A—;“;Ø,0°©G�H˜XÑ& qÓ)ñ 2ð €Oó    c                 ó,  • SSS.nSU ;   a†  U S   S:X  a  U R                  S5      S:X  a  SS0$ U S   S:X  a  U R                  S5      S	:X  a  SS
0$ U S   U;   a	  SXS      0$ U S   S;   a  [        U 5      $ U S   S;   a  SSS.$ U S   S:X  a  SSS.$ SS0$ )NÚgYearÚ
gYearMonth)ÚyearÚ	yearmonthr   r	   r
   Úbinaryr   ÚuriÚanyURI)r	   r   r   r   ÚdateÚtimeÚdatetimeÚduration)ÚobjectÚarrayÚjsonzapplication/json)r   r   Úgeojsonzapplication/geo+json)r   r#   )r   Útypemaps     r   Ú_convert_datatyper6   (   sÞ   € àØ!ñ€Gð �ƒ~Ø�‰<˜8Ó#¨¯©°Ó(:¸hÓ(FØ˜HÐ%Ð%Ø�‰<˜8Ó#¨¯©°Ó(:¸eÓ(CØ˜HÐ%Ð%Ø�‰<˜7Ó"Ø˜G¨¡LÑ1Ð2Ð2Ø�‰<ð 
ó 
ô -¨TÓ2Ð2Ø�‰<Ð.Ó.Ø"Ð1CÑDÐDØ�‰<˜9Ó$Ø"Ð1GÑHÐHØ�HÐÐr$   r   Úreturnc                 óf  • U S   [        U 5      S.nU R                  S5      4 Vs/ s H  o"(       d  M  UPM     nnU(       a  X1S'   SU ;   a	  U S   /US'   SU ;   a  U S   US'   U R                  S	0 5      nS
 H0  nXT;   a
  XE   US   U'   SU;   d  M  SUS   ;  d  M%  US   US   S'   M2     U$ s  snf )zZ
https://specs.frictionlessdata.io/table-schema/#field-descriptors

:param spec:
:return:
Úname)r9   r!   ÚtitleÚtitlesÚdescriptionúdc:descriptionÚrdfTypeÚpropertyUrlÚconstraints)ÚrequiredÚ	minLengthÚ	maxLengthÚminimumÚmaximumr!   Úpatternr
   )r6   r   )r   ÚresÚtr;   r@   r   s         r   Úconvert_column_specrI   ?   sÛ   € ð ˜‘<Ô->¸tÓ-DÑ
E€CàŸ(™( 7Ó+Ñ,Ó2Ò,�A³�aÑ,€FÐ2ÞØˆH‰Ø˜ÓØ!% mÑ!4Ð 5ˆÐÑØ�DÓØ! )™_ˆˆMÑà—(‘(˜=¨"Ó-€KÛLˆØÓØ$/Ñ$5ˆC�
‰O˜DÑ!Ø˜Õ$¨8¸3¸z¹?Õ+JØ(3°IÑ(>ˆC�
‰O˜HÓ%ñ	 Mð €Jùò! 3s
   ¦
B.´B.Úrsc_nameÚfkÚresource_mapc                 óF   • US   US   S   X!S   S   =(       d    U    S.S.$ )z>
https://specs.frictionlessdata.io/table-schema/#foreign-keys
ÚfieldsÚ	referenceÚresource)ÚcolumnReferencerP   )rQ   rO   r   )rJ   rK   rL   s      r   Úconvert_foreignKeyrR   [   s:   € ð ˜h™<à! +™¨xÑ8Ø$¨¡_°ZÑ%@×%LÀHÑMñ
ñð r$   c           	      ó  • SUS    Vs/ s H  n[        U5      PM     sn0nS HU  n[        U[        5      (       a  Uu  pVOUnXQ;   d  M&  X   XF'   US:X  d  M4  XF    Vs/ s H  n[        XU5      PM     snXF'   MW     U$ s  snf s  snf )a–  
:param rsc_name: `name` property of the resource the schema belongs to. Needed to resolve     self-referential foreign keys.
:param schema: `dict` parsed from JSON representing a frictionless Table Schema object.
:param resource_map: `dict` mapping resource names to resource paths, needed to convert foreign    key constraints.
:return: `dict` suitable for instantiating a `csvw.metadata.Schema` object.
ÚcolumnsrN   ))ÚmissingValuesÚnullÚ
primaryKeyÚforeignKeysrX   )rI   Ú
isinstanceÚtuplerR   )rJ   ÚschemarL   ÚfrG   r   ÚtoproprK   s           r   Úconvert_table_schemar^   k   s    € ð °v¸hÒ7GÓHÒ7G°!Ô*¨1Ö-Ñ7GÑHÐ
I€Cóˆô
 �dœE×"Ñ"Ø‰LˆD�&àˆFØ�>Ø ™,ˆC‰KØ�}Õ$ØX[ÒXcÓdÒXcÐRTÔ1°(ÀÖMÑXcÑd�“ñð €Jùò Iùò es   ‰A?ÁBc                 ó  • U R                  S0 5      nSU;   a  US   n0 nUR                  S5      (       a  US   US'   U R                  S5      (       a  U S   US'   S H  nX1;   d  M
  X   X#'   M     SU;   a  US   US'   U$ )z_
Limitations: lineTerminator is not supported.

https://specs.frictionlessdata.io/csv-dialect/
ÚdialectÚcsvÚ	delimiterÚencoding)rb   Ú	quoteCharÚdoubleQuoteÚskipInitialSpaceÚheaderÚcommentCharÚcommentPrefix)r   )ÚrscÚdrG   r   s       r   Úconvert_dialectrl   …   sœ   € ð 	�‰�	˜2Ó€Aà�ƒzØˆe‰HˆØ
€CØ‡u�uˆ[×ÑØ˜[™>ˆˆKÑØ
‡w�wˆz×ÑØ˜j™/ˆˆJ‰óˆð �9Ø™ˆC‹Iñð ˜ÓØ  Ñ/ˆˆOÑØ€Jr$   c                   ó4   • \ rS rSrSrS
S jrS\SS4S jrS	rg)ÚDataPackageé¢   z.
Metadata according to the frictionless spec.
Nc                 ó"  • [        U[        5      (       a#  UR                  U l        UR                  U l        g [        U[        5      (       a%  [
        R                  " U=(       d    S5      U l        O—[        U[
        R                  5      (       a>  U=(       d    UR                  U l        [        R                  " UR                  SS95      nO:[        R                  " U5      n[
        R                  " U=(       d    S5      U l        Xl        g )NÚ.Úutf8)rc   )
rY   rn   r3   ÚdirÚdictÚpathlibÚPathÚparentÚloadsÚ	read_text)Úselfr   Ú	directorys      r   Ú__init__ÚDataPackage.__init__¦   s¬   € Ü�dœK×(Ñ(ØŸ	™	ˆDŒIØ—x‘xˆDŒHØÜ�dœD×!Ñ!ä—|’| I×$4°Ó5ˆD�HÜ˜œgŸl™l×+Ñ+Ø ×/ D§K¡KˆDŒHÜ—:’:˜dŸn™n°f˜nÐ=Ó>‰Dä—:’:˜dÓ#ˆDÜ—|’| I×$4°Ó5ˆDŒHà�	r$   Úclsr7   r   c                 ó¤  • SS0n[         R                  " U R                   5      US'   S H'  u  p4X0R                   ;   d  M  U R                   U   X$'   M)     SU R                   ;   aE  SU R                   ;  a  U R                   S   US'   O"SU R                   ;  a  U R                   S   US	'   U R                   R                  S
/ 5       Vs/ s H  nSU;   d  M  UPM     nnU Vs0 s H  nSU;   d  M  US   US   _M     nnU Hœ  nUR                  S5      nU(       d  M  UR                  S5      S:X  d  M4  UR                  S5      S:X  d  MK  UR                  S/ 5        US   [	        UR                  S5      X‡5      [        U5      S.n	US   R                  U	5        Mž     UR                  U5      n
U R                  S-  U
l	        U
$ s  snf s  snf )Nz@contextzhttp://www.w3.org/ns/csvwzdc:replaces)
)Úidúdc:identifier)Úlicensesz
dc:license)r:   údc:title)Úhomepagezdcat:accessURL)r<   r=   )Úsourcesz	dc:source)Úcontributorszdc:contributor)Úprofilezdc:conformsTo)Úkeywordsz
dc:subject)Úcreatedz
dc:createdr9   r€   r�   r:   rƒ   Ú	resourcesÚpathr[   ÚschemeÚfiler
   ra   Útables)ÚurlÚtableSchemar`   zcsvw-metadata.json)
r3   Údumpsr   Ú
setdefaultr^   rl   ÚappendÚ	fromvaluers   Ú_fname)rz   r~   ÚmdÚflpropÚcsvwproprj   rŠ   rL   r[   ÚtablerG   s              r   Úto_tablegroupÚDataPackage.to_tablegroup·   s«  € Ø(Ð*EÐFˆä ŸJšJ t§y¡yÓ1ˆˆ=Ñó
!
ÑˆFð Ÿ™Õ"Ø#Ÿy™y¨Ñ0�“ñ!
ð �T—Y‘YÓØ˜4Ÿ9™9Ó$Ø&*§i¡i°Ñ&7��?Ò#Ø §	¡	Ó)Ø!%§¡¨6Ñ!2��:‘ð %)§I¡I§M¡M°+¸rÔ$BÓTÒ$B˜SÀfÐPSÁm—SÑ$Bˆ	ÐTÙ<EÓWºI°SÈÐSVÉÓ0˜˜F™ S¨¡[Ò0¹IˆÐWÛˆCØ—W‘W˜XÓ&ˆFßˆvØ—G‘G˜HÓ%¨Õ/Ø—G‘G˜HÓ%¨Õ.à—‘˜h¨Ô+à˜v™;Ü#7¸¿¹À»ÈÓ#^Ü.¨sÓ3ñ�ð
 �8‘×#Ñ# EÖ*ñ ð �m‰m˜BÓˆØ—X‘XÐ 4Ñ4ˆŒ
Øˆ
ùò% UùÚWs   Ã
GÃGÃ"
GÃ0G)rs   r3   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r|   r   rš   Ú__static_attributes__r   r$   r   rn   rn   ¢   s   † ñôð"0 ð 0¨,÷ 0r$   rn   )r    r3   ru   Útypingr   r   Úcsvw.metadatar   r#   r6   rt   ÚstrrI   rR   r^   rl   rn   r   r$   r   Ú<module>r¥      s‹   ðñ	ó Û ß %æÝ(òò*ð.˜d 3¨ 8™nð °°c¸3°h±ô ð8ØðØðØ/3ðØ8<¸SÀ#¸X¹ôò ò4÷:Eò Er$   