
    $HJj6!              
           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y)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 j                  d      r d   |d<    d   dk(  r8 j                  d      r' j                  d      r d   d	    d
 d   d	    |d<    d   dv r[ j                  d      du rt        d      t         fddD              r)i |d<   dD ]  } j                  |      s |   |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  
 y wN ).0propspecs     [/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/csvw/frictionless.py	<genexpr>z,_convert_numeric_datatype.<locals>.<genexpr>    s     E(Dtt|(Ds   )decimalChar	groupChar)getNotImplementedErrorany)r   datatypeps   `  r   _convert_numeric_datatyper"      s    V%HF|xDHHX$6 $XF|y TXXl%;@W $\ 21 56a]8KA8N7OPF|,,88L!T)%-. .
 E(DEE!#HX188A;,0GHX&q) 2 O    c                    ddd}d| v r|| d   dk(  r| j                  d      dk(  rddiS | d   dk(  r| j                  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H%%<8#(:e(CH%%<7"GDL122< 
 
 -T22<.."1CDD<9$"1GHHHr#   r   returnc                 6   | d   t        |       d}| j                  d      fD cg c]  }|s|	 }}|r||d<   d| v r	| d   g|d<   d| v r| d   |d<   | j                  d	i       }d
D ])  }||v r||   |d   |<   d|v sd|d   vs|d   |d   d<   + |S c c}w )zj
    https://specs.frictionlessdata.io/table-schema/#field-descriptors

    :param spec:
    :return:
    name)r8   r    titletitlesdescriptiondc:descriptionrdfTypepropertyUrlconstraints)required	minLength	maxLengthminimummaximumr    patternr
   )r5   r   )r   restr:   r?   r   s         r   convert_column_specrH   ?   s     <->t-D
EC((7+,2,Aa,F2H!%m!4 5D!)_M((="-KL;$/$5C
OD!$83z?+J(3I(>C
OH%	 M J! 3s
   BBrsc_namefkresource_mapc                 >    |d   |d   d   ||d   d   xs |    ddS )zF
    https://specs.frictionlessdata.io/table-schema/#foreign-keys
    fields	referenceresource)columnReferencerO   )rP   rN   r   )rI   rJ   rK   s      r   convert_foreignKeyrQ   [   s<     h<!+x8$R_Z%@%LHM
 r#   c           	          d|d   D cg c]  }t        |       c}i}dD ]N  }t        |t              r|\  }}n|}||v s ||   ||<   |dk(  s.||   D cg c]  }t        | ||       c}||<   P |S c c}w c c}w )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.
    columnsrM   ))missingValuesnull
primaryKeyforeignKeysrW   )rH   
isinstancetuplerQ   )rI   schemarK   frF   r   toproprJ   s           r   convert_table_schemar]   k   s     vh7GH7G!*1-7GH
IC
 dE"LD&F6> ,CK}$X[\bXcdXcRT1(BMXcdF J I es   A4A9c                     | j                  di       }d|v r|d   }i }|j                  d      r|d   |d<   | j                  d      r| d   |d<   dD ]  }||v s||   ||<    d|v r|d   |d<   |S )zk
    Limitations: lineTerminator is not supported.

    https://specs.frictionlessdata.io/csv-dialect/
    dialectcsv	delimiterencoding)ra   	quoteChardoubleQuoteskipInitialSpaceheadercommentCharcommentPrefix)r   )rscdrF   r   s       r   convert_dialectrk      s     		2AzeH
Cuu[[>K
wwzj/J 19$CI  /OJr#   c                   (    e Zd ZdZddZdeddfdZy)	DataPackagez6
    Metadata according to the frictionless spec.
    Nc                    t        |t              r#|j                  | _        |j                  | _        y t        |t              r&t        j                  |xs d      | _        || _        y t        |t
        j                        rB|xs |j                  | _        t        j                  |j                  d            }|| _        y t        j                  |      }t        j                  |xs d      | _        || _        y )N.utf8)rb   )
rX   rm   r2   dirdictpathlibPathparentloads	read_text)selfr   	directorys      r   __init__zDataPackage.__init__   s    dK(		DIxxDHdD!||I$45DH 	 gll+ /DKKDH::dnnfn=>D
 	 ::d#D||I$45DH	r#   clsr6   r   c                 d   ddi}t        j                  | j                         |d<   dD ]&  \  }}|| j                   v s| j                   |   ||<   ( d| j                   v rAd| j                   vr| j                   d   |d<   n d| j                   vr| j                   d   |d	<   | j                   j                  d
g       D cg c]	  }d|v s| }}|D ci c]  }d|v s|d   |d    }}|D ]  }|j                  d      }|s|j                  d      dk(  s,|j                  d      dk(  sA|j                  dg        |d   t	        |j                  d      ||      t        |      d}	|d   j                  |	        |j                  |      }
| j                  dz  |
_	        |
S c c}w c c}w )Nz@contextzhttp://www.w3.org/ns/csvwzdc:replaces)
)iddc:identifier)licensesz
dc:license)r9   dc:title)homepagezdcat:accessURL)r;   r<   )sourcesz	dc:source)contributorszdc:contributor)profilezdc:conformsTo)keywordsz
dc:subject)createdz
dc:createdr8   r}   r~   r9   r   	resourcespathrZ   schemefiler
   r`   tables)urltableSchemar_   zcsvw-metadata.json)
r2   dumpsr   
setdefaultr]   rk   append	fromvaluerq   _fname)rx   r{   mdflpropcsvwpropri   r   rK   rZ   tablerF   s              r   to_tablegroupzDataPackage.to_tablegroup   s   (*EF JJtyy1=
!
FH "#yy08!
 TYY499$&*ii&7?#		)!%6!2: %)IIMM+r$BT$BSfPSmS$B	T<EWISSVFS[0IWCWWX&FGGH%/GGH%.h+v;#7Q]#^.s3
 8##E*  mmBXX 44

% UWs   ?	F(	F(	F-F-r   )__name__
__module____qualname____doc__rz   r   r   r   r#   r   rm   rm      s    "0 0, 0r#   rm   )r   r2   rs   typingr   r   csvw.metadatar   r"   r5   rr   strrH   rQ   r]   rk   rm   r   r#   r   <module>r      s   	   %(*.d38n c3h 8/38<S#X 4:E Er#   