
    #Zj6!              
           d Z ddlZddlZddlmZmZ erddlmZ d Zd Z	de
eef         de
eef         fd	Zd
ede
de
de
eef         fdZd Zd Z G d d          ZdS )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                     d d         i} d         dk    r                       d          r d         |d<    d         dk    rL                      d          r7                      d          r" d         d	          d
 d         d	          |d<    d         dv rq                      d          du rt          d          t           fddD                       r0i |d<   dD ](}                      |          r |         |d         |<   )|S )Nbasetypestringformat	dc:formatboolean
trueValuesfalseValuesr   |)numberinteger
bareNumberTzbareNumber 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       K   | ]}|v V  	d S N ).0propspecs     ]/Users/jameslopez/projects/MentorCore/.venv/lib/python3.11/site-packages/csvw/frictionless.py	<genexpr>z,_convert_numeric_datatype.<locals>.<genexpr>    s'      EEtt|EEEEEE    )decimalChar	groupChar)getNotImplementedErrorany)r   datatypeps   `  r   _convert_numeric_datatyper#      sF   V%HF|xDHHX$6$6 $XF|y  TXXl%;%; @W@W  $\ 21 5PP]8KA8NPPF|,,,88L!!T))%-. . .
 EEEE(DEEEEE 	4!#HX1 4 488A;; 4,0GHX&q)Or   c                 f   ddd}d| v r| d         dk    r|                      d          dk    rddiS | d         dk    r|                      d          d	k    rdd
iS | d         |v rd|| d                  iS | d         dv rt          |           S | d         dv rdddS | d         dk    rdddS ddiS )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_datatyper5   (   s   ! G ~~<8##(:(:h(F(FH%%<8##(:(:e(C(CH%%<7""GDL122< 
 
 
 -T222<..."1CDDD<9$$"1GHHHHr   r   returnc                 `   | d         t          |           d}d |                     d          fD             }|r||d<   d| v r| d         g|d<   d| v r| d         |d	<   |                     d
i           }dD ]6}||v r||         |d         |<   d|v rd|d         vr|d         |d         d<   7|S )zj
    https://specs.frictionlessdata.io/table-schema/#field-descriptors

    :param spec:
    :return:
    name)r8   r!   c                     g | ]}||S r   r   )r   ts     r   
<listcomp>z'convert_column_spec.<locals>.<listcomp>H   s    222A2a222r   titletitlesdescriptiondc:descriptionrdfTypepropertyUrlconstraints)required	minLength	maxLengthminimummaximumr!   patternr
   )r5   r   )r   resr=   rB   r   s        r   convert_column_specrJ   ?   s     <->t-D-D
E
EC22$((7++,222F H!%m!4 5D!)_M((="--KL ? ?;$/$5C
OD!$$83z?+J+J(3I(>C
OH% Jr   rsc_namefkresource_mapc                 ^    |d         |d         d         ||d         d         p|          ddS )zF
    https://specs.frictionlessdata.io/table-schema/#foreign-keys
    fields	referenceresource)columnReferencerQ   )rR   rP   r   )rK   rL   rM   s      r   convert_foreignKeyrS   [   sF     h<!+x8$R_Z%@%LHM
 
  r   c                      dd |d         D             i}dD ]L}t          |t                    r|\  }}n|}||v r)||         ||<   |dk    r fd||         D             ||<   M|S )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.
    columnsc                 ,    g | ]}t          |          S r   )rJ   )r   fs     r   r;   z(convert_table_schema.<locals>.<listcomp>t   s!    HHH!*1--HHHr   rO   ))missingValuesnull
primaryKeyforeignKeysr[   c                 2    g | ]}t          |          S r   )rS   )r   rL   rM   rK   s     r   r;   z(convert_table_schema.<locals>.<listcomp>   s'    dddRT1(BMMdddr   )
isinstancetuple)rK   schemarM   rI   r   toprops   ` `   r   convert_table_schemara   k   s     HHvh7GHHH
IC e e
 dE"" 	LD&&F6>> ,CK}$$dddddX[\bXcdddFJr   c                    |                      di           }d|v r|d         }i }|                     d          r|d         |d<   |                      d          r| d         |d<   dD ]}||v r||         ||<   d|v r|d         |d<   |S )zk
    Limitations: lineTerminator is not supported.

    https://specs.frictionlessdata.io/csv-dialect/
    dialectcsv	delimiterencoding)re   	quoteChardoubleQuoteskipInitialSpaceheadercommentCharcommentPrefix)r   )rscdrI   r   s       r   convert_dialectro      s     		2AzzeH
Cuu[ *[>K
wwz *j/J     199$CI /OJr   c                   *    e Zd ZdZddZdeddfdZdS )	DataPackagez6
    Metadata according to the frictionless spec.
    Nc                    t          |t                    r|j        | _        |j        | _        d S t          |t                    rt          j        |pd          | _        nt          |t
          j                  r7|p|j        | _        t          j        |	                    d                    }n/t          j        |          }t          j        |pd          | _        || _        d S )N.utf8)rf   )
r]   rq   r2   dirdictpathlibPathparentloads	read_text)selfr   	directorys      r   __init__zDataPackage.__init__   s    dK(( 		DIxDHFdD!! 	6|I$455DHHgl++ 	6 /DKDH:dnnfn==>>DD:d##D|I$455DH			r   clsr6   r   c                    ddi}t          j        | j                   |d<   dD ]\  }}|| j         v r| j         |         ||<   d| j         v r3d| j         vr| j         d         |d<   nd| j         vr| j         d         |d	<   d
 | j                             dg           D             }d |D             }|D ]}|                    d          }|r|                    d          dk    r|                    d          dk    rl|                    dg            |d         t	          |                    d          ||          t          |          d}	|d                             |	           |                    |          }
| j        dz  |
_	        |
S )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:createdr8   r   r   r<   r   c                     g | ]}d |v |	S )pathr   r   rm   s     r   r;   z-DataPackage.to_tablegroup.<locals>.<listcomp>   s    TTTSfPSmmSmmmr   	resourcesc                 4    i | ]}d |v |d          |d         S )r8   r   r   r   s     r   
<dictcomp>z-DataPackage.to_tablegroup.<locals>.<dictcomp>   s(    WWWSSVFS[r   r_   schemefiler
   rd   tablesr   )urltableSchemarc   zcsvw-metadata.json)
r2   dumpsr   
setdefaultra   ro   append	fromvalueru   _fname)r|   r   mdflpropcsvwpropr   rM   rm   r_   tablerI   s              r   to_tablegroupzDataPackage.to_tablegroup   s   (*EF Jty11=
!
 	1 	1FH ""#y08TY49$$&*i&7?##	))!%6!2: UTDIMM+r$B$BTTT	WWIWWW 	+ 	+CWWX&&F 
+GGH%%//GGH%%..h+++v;#7Q]#^#^.s33 
 8##E***mmBX 44

r   r   )__name__
__module____qualname____doc__r~   r   r   r   r   r   rq   rq      sT            "0 0, 0 0 0 0 0 0r   rq   )r   r2   rw   typingr   r   csvw.metadatar   r#   r5   rv   strrJ   rS   ra   ro   rq   r   r   r   <module>r      s;  	 	   % % % % % % % % )((((((  *  .d38n c3h    8/38<S#X      4  :E E E E E E E E E Er   