From 6e82394f2001e0c510e8f709c9d304ba4aefce96 Mon Sep 17 00:00:00 2001 From: roll Date: Wed, 24 Apr 2024 13:06:20 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20site=20from=20@=20frictionless?= =?UTF-8?q?data/dplib-py@8a923f4eae725ec55394d81f49bfbef32b27c54a=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- actions/dialect/index.html | 8 +- actions/package/index.html | 22 +- actions/resource/index.html | 22 +- actions/schema/index.html | 8 +- assets/_mkdocstrings.css | 5 + contributing/index.html | 4 +- models/dialect/index.html | 58 +- models/package/index.html | 76 ++- models/resource/index.html | 152 ++++-- models/schema/index.html | 364 ++++++++---- objects.inv | Bin 6079 -> 6170 bytes plugins/ckan/index.html | 24 +- plugins/datacite/index.html | 12 +- plugins/dcat/index.html | 24 +- plugins/github/index.html | 24 +- plugins/pandas/index.html | 24 +- plugins/polars/index.html | 24 +- plugins/sql/index.html | 34 +- plugins/zenodo/index.html | 1032 ++++++++++++++++++++--------------- sitemap.xml | 48 +- sitemap.xml.gz | Bin 379 -> 379 bytes 21 files changed, 1238 insertions(+), 727 deletions(-) diff --git a/actions/dialect/index.html b/actions/dialect/index.html index 42a53df..3619c71 100644 --- a/actions/dialect/index.html +++ b/actions/dialect/index.html @@ -1179,7 +1179,7 @@

-

Parameters:

+

Parameters:

@@ -1190,7 +1190,7 @@

- +
dialect Union[str, IDict, Dialect] @@ -1209,7 +1209,7 @@

-

Returns:

+

Returns:

@@ -1218,7 +1218,7 @@

- + diff --git a/actions/package/index.html b/actions/package/index.html index 54000e8..5b69663 100644 --- a/actions/package/index.html +++ b/actions/package/index.html @@ -1198,7 +1198,7 @@

-

Parameters:

+

Parameters:

List[MetadataError]
@@ -1209,7 +1209,7 @@

- +
package Union[str, IDict, Package] @@ -1228,7 +1228,7 @@

-

Returns:

+

Returns:

@@ -1237,7 +1237,7 @@

- + @@ -1338,7 +1338,7 @@

-

Parameters:

+

Parameters:

List[MetadataError]
@@ -1349,7 +1349,7 @@

- + - + - + - +
path str @@ -1363,7 +1363,7 @@

required

format Optional[str] @@ -1377,7 +1377,7 @@

None

source Optional[INotation] @@ -1391,7 +1391,7 @@

None

target Optional[INotation] @@ -1410,7 +1410,7 @@

-

Returns:

+

Returns:

@@ -1419,7 +1419,7 @@

- + diff --git a/actions/resource/index.html b/actions/resource/index.html index 837dffe..77d7242 100644 --- a/actions/resource/index.html +++ b/actions/resource/index.html @@ -1198,7 +1198,7 @@

-

Parameters:

+

Parameters:

Model
@@ -1209,7 +1209,7 @@

- +
resource Union[str, IDict, Resource] @@ -1228,7 +1228,7 @@

-

Returns:

+

Returns:

@@ -1237,7 +1237,7 @@

- + @@ -1332,7 +1332,7 @@

Parameters:

+

Parameters:

List[MetadataError]
@@ -1343,7 +1343,7 @@

- + - + - + - +
path str @@ -1357,7 +1357,7 @@

required

format Optional[str] @@ -1371,7 +1371,7 @@

None

source Optional[INotation] @@ -1385,7 +1385,7 @@

None

target Optional[INotation] @@ -1404,7 +1404,7 @@

Returns:

+

Returns:

@@ -1413,7 +1413,7 @@

- + diff --git a/actions/schema/index.html b/actions/schema/index.html index 9c79774..476779b 100644 --- a/actions/schema/index.html +++ b/actions/schema/index.html @@ -1179,7 +1179,7 @@

-

Parameters:

+

Parameters:

Model
@@ -1190,7 +1190,7 @@

- +
schema Union[str, IDict, Schema] @@ -1209,7 +1209,7 @@

-

Returns:

+

Returns:

@@ -1218,7 +1218,7 @@

- + diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css index 57a23e1..85449ec 100644 --- a/assets/_mkdocstrings.css +++ b/assets/_mkdocstrings.css @@ -26,6 +26,11 @@ float: right; } +/* Backward-compatibility: docstring section titles in bold. */ +.doc-section-title { + font-weight: bold; +} + /* Symbols in Navigation and ToC. */ :root, [data-md-color-scheme="default"] { diff --git a/contributing/index.html b/contributing/index.html index b2e6fbf..0c8a974 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -1248,10 +1248,10 @@

PythonDocumentation

Documentation is written with Mkdocs (defined in mkdocs.yaml). The source articles are in the docs directory. To start a live-reload server:

-
hatch run serve
+
hatch run docs
 

Building the docs:

-
hatch run build
+
hatch run docs-build
 

Testing

To run all the checks on the codebase:

diff --git a/models/dialect/index.html b/models/dialect/index.html index 5fa2974..9de16d6 100644 --- a/models/dialect/index.html +++ b/models/dialect/index.html @@ -848,6 +848,15 @@
+ + +
  • + + + to_dict + + +
  • @@ -1499,6 +1508,15 @@ + + +
  • + + + to_dict + + +
  • @@ -1694,7 +1712,12 @@

    123 124 125 -126

    List[MetadataError]
    class Dialect(Model):
    +126
    +127
    +128
    +129
    +130
    +131
    class Dialect(Model):
         """Table Dialect model"""
     
         profile: str = pydantic.Field(
    @@ -1809,6 +1832,11 @@ 

    """ This property specifies a sheet name of a table in the spreadsheet file. """ + + def to_dict(self): + data = {"$schema": settings.PROFILE_CURRENT_DIALECT} + data.update(super().to_dict()) + return data

    @@ -2269,6 +2297,34 @@

    +
    + + + +

    + to_dict() + +

    + + +
    + +
    + Source code in dplib/models/dialect/dialect.py +
    def to_dict(self):
    +    data = {"$schema": settings.PROFILE_CURRENT_DIALECT}
    +    data.update(super().to_dict())
    +    return data
    +
    +
    +
    + +
    + + diff --git a/models/package/index.html b/models/package/index.html index 3581af4..e929f56 100644 --- a/models/package/index.html +++ b/models/package/index.html @@ -797,6 +797,15 @@ + + +
  • + + + to_dict + + +
  • @@ -1661,6 +1670,15 @@ + + +
  • + + + to_dict + + +
  • @@ -2057,7 +2075,14 @@

    142 143 144 -145

    class Package(Model):
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    class Package(Model):
         """Data Package model"""
     
         profile: str = pydantic.Field(
    @@ -2188,6 +2213,13 @@ 

    """ for resource in self.resources: resource.dereference() + + # Converters + + def to_dict(self): + data = {"$schema": settings.PROFILE_CURRENT_PACKAGE} + data.update(super().to_dict()) + return data

    @@ -2559,7 +2591,7 @@

    -

    Parameters:

    +

    Parameters:

    @@ -2570,7 +2602,7 @@

    - +
    resource Resource @@ -2662,7 +2694,7 @@

    -

    Parameters:

    +

    Parameters:

    @@ -2673,7 +2705,7 @@

    - + - +
    name Optional[str] @@ -2687,7 +2719,7 @@

    None

    path Optional[str] @@ -2706,7 +2738,7 @@

    -

    Returns:

    +

    Returns:

    @@ -2715,7 +2747,7 @@

    - + @@ -2796,6 +2828,34 @@

    +
    + + + +

    + to_dict() + +

    + + +
    + +
    + Source code in dplib/models/package/package.py +

    Optional[Resource]
    def to_dict(self):
    +    data = {"$schema": settings.PROFILE_CURRENT_PACKAGE}
    +    data.update(super().to_dict())
    +    return data
    +
    + + + + + + diff --git a/models/resource/index.html b/models/resource/index.html index 92154f0..a0d2f08 100644 --- a/models/resource/index.html +++ b/models/resource/index.html @@ -872,6 +872,15 @@ + + +
  • + + + to_dict + + +
  • @@ -1769,6 +1778,15 @@ + + +
  • + + + to_dict + + +
  • @@ -2217,7 +2235,14 @@

    193 194 195 -196

    class Resource(Model):
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    class Resource(Model):
         """Data Resource model"""
     
         profile: str = pydantic.Field(
    @@ -2381,21 +2406,28 @@ 

    if isinstance(self.schema, str): self.schema = Schema.from_path(self.schema, basepath=self.basepath) # type: ignore - # Compat + # Converters - @pydantic.model_validator(mode="before") - @classmethod - def compat(cls, data: types.IDict): - if not isinstance(data, dict): # type: ignore - return data - - # resource.url - if not data.get("path"): - url = data.pop("url", None) - if url: - data["path"] = url - - return data + def to_dict(self): + data = {"$schema": settings.PROFILE_CURRENT_RESOURCE} + data.update(super().to_dict()) + return data + + # Compat + + @pydantic.model_validator(mode="before") + @classmethod + def compat(cls, data: types.IDict): + if not isinstance(data, dict): # type: ignore + return data + + # resource.url + if not data.get("path"): + url = data.pop("url", None) + if url: + data["path"] = url + + return data

    @@ -2835,31 +2867,31 @@

    Source code in dplib/models/resource/resource.py -
    184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    +            
    @pydantic.model_validator(mode="before")
    -@classmethod
    -def compat(cls, data: types.IDict):
    -    if not isinstance(data, dict):  # type: ignore
    -        return data
    -
    -    # resource.url
    -    if not data.get("path"):
    -        url = data.pop("url", None)
    -        if url:
    -            data["path"] = url
    -
    -    return data
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    @pydantic.model_validator(mode="before")
    +@classmethod
    +def compat(cls, data: types.IDict):
    +    if not isinstance(data, dict):  # type: ignore
    +        return data
    +
    +    # resource.url
    +    if not data.get("path"):
    +        url = data.pop("url", None)
    +        if url:
    +            data["path"] = url
    +
    +    return data
     
    @@ -2922,7 +2954,7 @@

    -

    Returns:

    +

    Returns:

    @@ -2931,7 +2963,7 @@

    - + @@ -2988,7 +3020,7 @@

    -

    Returns:

    +

    Returns:

    Optional[Dialect]
    @@ -2997,7 +3029,7 @@

    - + @@ -3050,7 +3082,7 @@

    -

    Returns:

    +

    Returns:

    Optional[str]
    @@ -3059,7 +3091,7 @@

    - + @@ -3112,7 +3144,7 @@

    -

    Returns:

    +

    Returns:

    Optional[Hash]
    @@ -3121,7 +3153,7 @@

    - + @@ -3178,7 +3210,7 @@

    -

    Returns:

    +

    Returns:

    Optional[Schema]
    @@ -3187,7 +3219,7 @@

    - + @@ -3222,6 +3254,34 @@

    +
    + + + +

    + to_dict() + +

    + + +
    + +
    + Source code in dplib/models/resource/resource.py +

    Optional[Union[str, IDict]]
    def to_dict(self):
    +    data = {"$schema": settings.PROFILE_CURRENT_RESOURCE}
    +    data.update(super().to_dict())
    +    return data
    +
    + + + + + + diff --git a/models/schema/index.html b/models/schema/index.html index aa61409..688005f 100644 --- a/models/schema/index.html +++ b/models/schema/index.html @@ -815,6 +815,15 @@ + + +
  • + + + to_dict + + +
  • @@ -959,6 +968,15 @@ + + +
  • + + + type + + +
  • @@ -968,6 +986,15 @@ +
  • + +
  • + + + serialize_type + + +
  • @@ -2513,6 +2540,15 @@ + + +
  • + + + to_dict + + +
  • @@ -2657,6 +2693,15 @@ + + +
  • + + + type + + +
  • @@ -2666,6 +2711,15 @@ +
  • + +
  • + + + serialize_type + + +
  • @@ -3836,7 +3890,14 @@

    126 127 128 -129

    class Schema(Model):
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    class Schema(Model):
         """Table Schema model"""
     
         profile: str = pydantic.Field(
    @@ -3938,20 +3999,27 @@ 

    """ self.fields.append(field) - # Compat + # Converters - @pydantic.model_validator(mode="before") - @classmethod - def compat(cls, data: types.IDict): - if not isinstance(data, dict): # type: ignore - return data - - # schema.primaryKey - primaryKey = data.get("primaryKey", None) - if isinstance(primaryKey, str): - data["primaryKey"] = [primaryKey] - - return data + def to_dict(self): + data = {"$schema": settings.PROFILE_CURRENT_SCHEMA} + data.update(super().to_dict()) + return data + + # Compat + + @pydantic.model_validator(mode="before") + @classmethod + def compat(cls, data: types.IDict): + if not isinstance(data, dict): # type: ignore + return data + + # schema.primaryKey + primaryKey = data.get("primaryKey", None) + if isinstance(primaryKey, str): + data["primaryKey"] = [primaryKey] + + return data

    @@ -4188,7 +4256,7 @@

    -

    Parameters:

    +

    Parameters:

    @@ -4199,7 +4267,7 @@

    - +
    field IField @@ -4256,29 +4324,29 @@

    Source code in dplib/models/schema/schema.py -
    118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    +            
    @pydantic.model_validator(mode="before")
    -@classmethod
    -def compat(cls, data: types.IDict):
    -    if not isinstance(data, dict):  # type: ignore
    -        return data
    -
    -    # schema.primaryKey
    -    primaryKey = data.get("primaryKey", None)
    -    if isinstance(primaryKey, str):
    -        data["primaryKey"] = [primaryKey]
    -
    -    return data
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    @pydantic.model_validator(mode="before")
    +@classmethod
    +def compat(cls, data: types.IDict):
    +    if not isinstance(data, dict):  # type: ignore
    +        return data
    +
    +    # schema.primaryKey
    +    primaryKey = data.get("primaryKey", None)
    +    if isinstance(primaryKey, str):
    +        data["primaryKey"] = [primaryKey]
    +
    +    return data
     
    @@ -4302,7 +4370,7 @@

    -

    Parameters:

    +

    Parameters:

    @@ -4313,7 +4381,7 @@

    - +
    name Optional[str] @@ -4332,7 +4400,7 @@

    -

    Returns:

    +

    Returns:

    @@ -4341,7 +4409,7 @@

    - + @@ -4402,7 +4470,7 @@

    -

    Returns:

    +

    Returns:

    Optional[IField]
    @@ -4411,7 +4479,7 @@

    - + @@ -4468,7 +4536,7 @@

    -

    Returns:

    +

    Returns:

    List[str]
    @@ -4477,7 +4545,7 @@

    - + @@ -4518,6 +4586,34 @@

    +
    + + + +

    + to_dict() + +

    + + +
    + +
    + Source code in dplib/models/schema/schema.py +

    List[str]
    def to_dict(self):
    +    data = {"$schema": settings.PROFILE_CURRENT_SCHEMA}
    +    data.update(super().to_dict())
    +    return data
    +
    + + + + + + @@ -4932,7 +5028,18 @@

    45 46 47 -48

    class BaseField(Model):
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    class BaseField(Model):
         """Base Field"""
     
         name: Optional[str] = None
    @@ -4940,36 +5047,47 @@ 

    The field descriptor MUST contain a name property. """ - title: Optional[str] = None - """ - A human readable label or title for the field - """ - - description: Optional[str] = None - """ - A description for this field e.g. “The recipient of the funds” - """ - - missingValues: List[str] = [""] - """ - A list of field values to consider as null values - """ - - # Compat - - @pydantic.model_validator(mode="before") - @classmethod - def compat(cls, data: types.IDict): - if not isinstance(data, dict): # type: ignore - return data - - # field.format - format = data.get("format") - if format: - if format.startswith("fmt:"): - data["format"] = format[4:] - - return data + # TODO: use proper abstract type (str/Literal string don't work with subclasses) + type: Optional[Any] = None + """ + A field type i.e. string, number, etc + """ + + title: Optional[str] = None + """ + A human readable label or title for the field + """ + + description: Optional[str] = None + """ + A description for this field e.g. “The recipient of the funds” + """ + + missingValues: List[str] = [""] + """ + A list of field values to consider as null values + """ + + # This method ensures that type is not omitted as defaults in model_dump + @pydantic.field_serializer("type") + def serialize_type(self, value: str, info: Any): + return value + + # Compat + + @pydantic.model_validator(mode="before") + @classmethod + def compat(cls, data: types.IDict): + if not isinstance(data, dict): # type: ignore + return data + + # field.format + format = data.get("format") + if format: + if format.startswith("fmt:"): + data["format"] = format[4:] + + return data

    @@ -5071,6 +5189,28 @@

    +
    + + + +

    + type: Optional[Any] = None + + + class-attribute + instance-attribute + + +

    + + +
    + +

    A field type i.e. string, number, etc

    +
    + +
    + @@ -5092,31 +5232,57 @@

    Source code in dplib/models/field/datatypes/base.py -
    36
    -37
    -38
    -39
    -40
    -41
    +            
    47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    @pydantic.model_validator(mode="before")
    +@classmethod
    +def compat(cls, data: types.IDict):
    +    if not isinstance(data, dict):  # type: ignore
    +        return data
    +
    +    # field.format
    +    format = data.get("format")
    +    if format:
    +        if format.startswith("fmt:"):
    +            data["format"] = format[4:]
    +
    +    return data
    +
    + +
    + + + + +
    + + + +

    + serialize_type(value, info) + +

    + + +
    + +
    + Source code in dplib/models/field/datatypes/base.py +
    41
     42
    -43
    -44
    -45
    -46
    -47
    -48
    @pydantic.model_validator(mode="before")
    -@classmethod
    -def compat(cls, data: types.IDict):
    -    if not isinstance(data, dict):  # type: ignore
    -        return data
    -
    -    # field.format
    -    format = data.get("format")
    -    if format:
    -        if format.startswith("fmt:"):
    -            data["format"] = format[4:]
    -
    -    return data
    +43
    @pydantic.field_serializer("type")
    +def serialize_type(self, value: str, info: Any):
    +    return value
     
    diff --git a/objects.inv b/objects.inv index 9dca5a93cb7f1d9c384d2c07944667b9a34c2a28..10414c4ca7f24354577dbd361f35903e167c6560 100644 GIT binary patch delta 6077 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 diff --git a/plugins/ckan/index.html b/plugins/ckan/index.html index 9750dfd..398306e 100644 --- a/plugins/ckan/index.html +++ b/plugins/ckan/index.html @@ -2624,7 +2624,7 @@

    -

    Parameters:

    +

    Parameters:

    @@ -2635,7 +2635,7 @@

    - +
    package Package @@ -2654,7 +2654,7 @@

    -

    Returns:

    +

    Returns:

    @@ -2663,7 +2663,7 @@

    - + @@ -2818,7 +2818,7 @@

    -

    Returns:

    +

    Returns:

    CkanPackage
    @@ -2827,7 +2827,7 @@

    - + @@ -3417,7 +3417,7 @@

    -

    Parameters:

    +

    Parameters:

    Package
    @@ -3428,7 +3428,7 @@

    - +
    resource Resource @@ -3447,7 +3447,7 @@

    -

    Returns:

    +

    Returns:

    @@ -3456,7 +3456,7 @@

    - + @@ -3559,7 +3559,7 @@

    -

    Returns:

    +

    Returns:

    Optional[CkanResource]
    @@ -3568,7 +3568,7 @@

    - + diff --git a/plugins/datacite/index.html b/plugins/datacite/index.html index 26e2e1b..0b2b12b 100644 --- a/plugins/datacite/index.html +++ b/plugins/datacite/index.html @@ -2097,7 +2097,7 @@

    Parameters:

    Resource
    @@ -2108,7 +2108,7 @@

    package Package @@ -2127,7 +2127,7 @@

    Returns:

    @@ -2136,7 +2136,7 @@

    @@ -2303,7 +2303,7 @@

    Returns:

    DatacitePackage
    @@ -2312,7 +2312,7 @@

    diff --git a/plugins/dcat/index.html b/plugins/dcat/index.html index 24a020c..82a05b0 100644 --- a/plugins/dcat/index.html +++ b/plugins/dcat/index.html @@ -3294,7 +3294,7 @@

    -

    Parameters:

    +

    Parameters:

    Package
    @@ -3305,7 +3305,7 @@

    - +
    package Package @@ -3324,7 +3324,7 @@

    -

    Returns:

    +

    Returns:

    @@ -3333,7 +3333,7 @@

    - + @@ -3770,7 +3770,7 @@

    -

    Returns:

    +

    Returns:

    DcatPackage
    @@ -3779,7 +3779,7 @@

    - + @@ -4867,7 +4867,7 @@

    -

    Parameters:

    +

    Parameters:

    Package
    @@ -4878,7 +4878,7 @@

    - +
    resource Resource @@ -4897,7 +4897,7 @@

    -

    Returns:

    +

    Returns:

    @@ -4906,7 +4906,7 @@

    - + @@ -5181,7 +5181,7 @@

    -

    Returns:

    +

    Returns:

    Optional[DcatResource]
    @@ -5190,7 +5190,7 @@

    - + diff --git a/plugins/github/index.html b/plugins/github/index.html index 51c2607..ecd092f 100644 --- a/plugins/github/index.html +++ b/plugins/github/index.html @@ -2237,7 +2237,7 @@

    Parameters:

    Optional[Resource]
    @@ -2248,7 +2248,7 @@

    package Package @@ -2267,7 +2267,7 @@

    Returns:

    @@ -2276,7 +2276,7 @@

    @@ -2397,7 +2397,7 @@

    Returns:

    +

    Returns:

    GithubPackage
    @@ -2406,7 +2406,7 @@

    - + @@ -2886,7 +2886,7 @@

    Parameters:

    Package
    @@ -2897,7 +2897,7 @@

    resource Resource @@ -2916,7 +2916,7 @@

    Returns:

    @@ -2925,7 +2925,7 @@

    @@ -3016,7 +3016,7 @@

    Returns:

    Optional[GithubResource]
    @@ -3025,7 +3025,7 @@

    diff --git a/plugins/pandas/index.html b/plugins/pandas/index.html index e913632..b08441f 100644 --- a/plugins/pandas/index.html +++ b/plugins/pandas/index.html @@ -1631,7 +1631,7 @@

    Parameters:

    Resource
    @@ -1642,7 +1642,7 @@

    schema Schema @@ -1661,7 +1661,7 @@

    Returns:

    @@ -1670,7 +1670,7 @@

    @@ -1805,7 +1805,7 @@

    -

    Returns:

    +

    Returns:

    PandasSchema
    @@ -1814,7 +1814,7 @@

    - + @@ -2166,7 +2166,7 @@

    Parameters:

    +

    Parameters:

    Schema
    @@ -2177,7 +2177,7 @@

    - +
    field IField @@ -2196,7 +2196,7 @@

    Returns:

    +

    Returns:

    @@ -2205,7 +2205,7 @@

    - + @@ -2312,7 +2312,7 @@

    -

    Returns:

    +

    Returns:

    PandasField
    @@ -2321,7 +2321,7 @@

    - + diff --git a/plugins/polars/index.html b/plugins/polars/index.html index 7d3b9fd..27d2f86 100644 --- a/plugins/polars/index.html +++ b/plugins/polars/index.html @@ -1589,7 +1589,7 @@

    Parameters:

    IField
    @@ -1600,7 +1600,7 @@

    schema Schema @@ -1619,7 +1619,7 @@

    Returns:

    @@ -1628,7 +1628,7 @@

    @@ -1757,7 +1757,7 @@

    -

    Returns:

    +

    Returns:

    PolarsSchema
    @@ -1766,7 +1766,7 @@

    - + @@ -2094,7 +2094,7 @@

    Parameters:

    +

    Parameters:

    Schema
    @@ -2105,7 +2105,7 @@

    - +
    field IField @@ -2124,7 +2124,7 @@

    Returns:

    +

    Returns:

    @@ -2133,7 +2133,7 @@

    - + @@ -2260,7 +2260,7 @@

    -

    Returns:

    +

    Returns:

    PolarsField
    @@ -2269,7 +2269,7 @@

    - + diff --git a/plugins/sql/index.html b/plugins/sql/index.html index 533152c..ece9ac7 100644 --- a/plugins/sql/index.html +++ b/plugins/sql/index.html @@ -1707,7 +1707,7 @@

    -

    Parameters:

    +

    Parameters:

    IField
    @@ -1718,7 +1718,7 @@

    - + - + - + - +
    schema Schema @@ -1732,7 +1732,7 @@

    required

    table_name str @@ -1746,7 +1746,7 @@

    required

    dialect str @@ -1760,7 +1760,7 @@

    DEFAULT_DIALECT

    with_metadata bool @@ -1779,7 +1779,7 @@

    -

    Returns:

    +

    Returns:

    @@ -1788,7 +1788,7 @@

    - + @@ -2003,7 +2003,7 @@

    -

    Returns:

    +

    Returns:

    SqlSchema
    @@ -2012,7 +2012,7 @@

    - + @@ -2533,7 +2533,7 @@

    -

    Parameters:

    +

    Parameters:

    Schema
    @@ -2544,7 +2544,7 @@

    - + - + - +
    field IField @@ -2558,7 +2558,7 @@

    required

    dialect str @@ -2572,7 +2572,7 @@

    DEFAULT_DIALECT

    table_name Optional[str] @@ -2591,7 +2591,7 @@

    -

    Returns:

    +

    Returns:

    @@ -2600,7 +2600,7 @@

    - + @@ -2863,7 +2863,7 @@

    -

    Returns:

    +

    Returns:

    SqlField
    @@ -2872,7 +2872,7 @@

    - + diff --git a/plugins/zenodo/index.html b/plugins/zenodo/index.html index 6a57b7f..002a02d 100644 --- a/plugins/zenodo/index.html +++ b/plugins/zenodo/index.html @@ -1619,8 +1619,7 @@

    Source code in dplib/plugins/zenodo/models/package.py -

    IField
     21
    - 22
    +              
     22
      23
      24
      25
    @@ -1737,125 +1736,194 @@ 

    136 137 138 -139

    class ZenodoPackage(Model):
    -    """Zenodo Package model"""
    -
    -    files: ZenodoFiles = pydantic.Field(default_factory=ZenodoFiles)
    -    metadata: ZenodoMetadata = pydantic.Field(default_factory=ZenodoMetadata)
    -
    -    id: Optional[str] = None
    -    pids: Dict[str, ZenodoPid] = {}
    -    created: Optional[str] = None
    -    updated: Optional[str] = None
    -    links: Dict[str, str] = {}
    -
    -    # Converters
    -
    -    def to_dp(self) -> Package:
    -        """Convert to Data Package
    -
    -        Returns:
    -           Data Package
    -        """
    -        package = Package()
    -
    -        # Id
    -        if self.links.get("doi"):
    -            package.id = self.links.get("doi")
    -
    -        # Title
    -        if self.metadata.title:
    -            package.title = self.metadata.title
    -
    -        # Description
    -        if self.metadata.description:
    -            package.description = self.metadata.description
    -
    -        # Version
    -        if self.metadata.version:
    -            package.version = self.metadata.version
    -
    -        # Created
    -        if self.created:
    -            package.created = self.created
    -
    -        # Homepage
    -        if self.links.get("self"):
    -            package.homepage = self.links.get("self")
    -
    -        # Resources
    -        for entry in self.files.entries.values():
    -            resource = entry.to_dp()
    -            package.resources.append(resource)
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    class ZenodoPackage(Model):
    +    """Zenodo Package model"""
    +
    +    files: ZenodoFiles = pydantic.Field(default_factory=ZenodoFiles)
    +    metadata: ZenodoMetadata = pydantic.Field(default_factory=ZenodoMetadata)
    +
    +    id: Optional[str] = None
    +    pids: Dict[str, ZenodoPid] = {}
    +    created: Optional[str] = None
    +    updated: Optional[str] = None
    +    links: Dict[str, str] = {}
    +
    +    # Converters
    +
    +    def to_dp(self) -> Package:
    +        """Convert to Data Package
    +
    +        Returns:
    +           Data Package
    +        """
    +        package = Package()
    +
    +        # Id
    +        if self.links.get("doi"):
    +            package.id = self.links.get("doi")
    +
    +        # Name
    +        if self.id:
    +            package.name = self.id
    +
    +        # Title
    +        if self.metadata.title:
    +            package.title = self.metadata.title
    +
    +        # Description
    +        if self.metadata.description:
    +            package.description = self.metadata.description
    +
    +        # Version
    +        if self.metadata.version:
    +            package.version = self.metadata.version
    +
    +        # Created
    +        if self.created:
    +            package.created = self.created
    +
    +        # Homepage
    +        if self.links.get("self_html"):
    +            package.homepage = self.links.get("self_html")
     
             # Keywords
             for subject in self.metadata.subjects:
                 package.keywords.append(subject.subject)
     
    -        # Contributors
    -        for creator in self.metadata.creators:
    -            if creator.person_or_org.name:
    -                contributor = Contributor(
    -                    title=creator.person_or_org.name,
    -                    givenName=creator.person_or_org.given_name,
    -                    familyName=creator.person_or_org.family_name,
    -                )
    -                if creator.person_or_org.type:
    -                    contributor.roles = [creator.person_or_org.type]
    -                if creator.affiliations:
    -                    contributor.organization = creator.affiliations[0].name
    -                package.contributors.append(contributor)
    -
    -        return package
    +        # Resources
    +        for entry in self.files.entries.values():
    +            if self.id:
    +                resource = entry.to_dp(package_id=self.id)
    +                package.resources.append(resource)
    +
    +        # Licenses
    +        for right in self.metadata.rights:
    +            if right.id:
    +                license = License(
    +                    name=right.id,
    +                    title=right.title.en,
    +                    path=right.link or right.props.url,
    +                )
    +                package.licenses.append(license)
     
    -    @classmethod
    -    def from_dp(cls, package: Package) -> ZenodoPackage:
    -        """Create a Zenodo Package from Data Package
    -
    -        Parameters:
    -            package: Data Package
    -
    -        Returns:
    -            Zenodo Package
    -        """
    -        zenodo = ZenodoPackage()
    -
    -        # Title
    -        if package.title:
    -            zenodo.metadata.title = package.title
    -
    -        # Description
    -        if package.description:
    -            zenodo.metadata.description = package.description
    -
    -        # Version
    -        if package.version:
    -            zenodo.metadata.version = package.version
    -
    -        # Resources
    -        for resource in package.resources:
    -            entry = ZenodoResource.from_dp(resource)
    -            if entry:
    -                zenodo.files.entries[entry.key] = entry
    +        # Contributors
    +        for type, items in [
    +            ("creator", self.metadata.creators),
    +            ("contributor", self.metadata.contributors),
    +        ]:
    +            for item in items:
    +                if item.person_or_org.name:
    +                    contributor = Contributor(
    +                        title=item.person_or_org.name,
    +                        givenName=item.person_or_org.given_name,
    +                        familyName=item.person_or_org.family_name,
    +                        roles=[item.role.id or type],
    +                    )
    +                    if item.affiliations:
    +                        contributor.organization = item.affiliations[0].name
    +                    package.contributors.append(contributor)
    +
    +        # Custom
    +        if self.id:
    +            package.custom["zenodo:id"] = self.id
    +
    +        return package
    +
    +    @classmethod
    +    def from_dp(cls, package: Package) -> ZenodoPackage:
    +        """Create a Zenodo Package from Data Package
    +
    +        Parameters:
    +            package: Data Package
     
    -        # Keywords
    -        for keyword in package.keywords:
    -            subject = ZenodoSubject(subject=keyword)
    -            zenodo.metadata.subjects.append(subject)
    +        Returns:
    +            Zenodo Package
    +        """
    +        zenodo = ZenodoPackage()
     
    -        # Contributors
    -        for contributor in package.contributors:
    -            creator = ZenodoCreator()
    -            creator.person_or_org.name = contributor.title
    -            creator.person_or_org.given_name = contributor.givenName
    -            creator.person_or_org.family_name = contributor.familyName
    -            if contributor.roles:
    -                creator.person_or_org.type = contributor.roles[0]
    -            if contributor.organization:
    -                affiliation = ZenodoCreatorAffiliation(name=contributor.organization)
    -                creator.affiliations.append(affiliation)
    +        # Title
    +        if package.title:
    +            zenodo.metadata.title = package.title
    +
    +        # Description
    +        if package.description:
    +            zenodo.metadata.description = package.description
    +
    +        # Version
    +        if package.version:
    +            zenodo.metadata.version = package.version
     
    -        return zenodo
    +        # Keywords
    +        for keyword in package.keywords:
    +            subject = ZenodoSubject(subject=keyword)
    +            zenodo.metadata.subjects.append(subject)
    +
    +        # Resources
    +        for resource in package.resources:
    +            entry = ZenodoResource.from_dp(resource)
    +            if entry:
    +                zenodo.files.entries[entry.key] = entry
    +
    +        # Licenses
    +        for license in package.licenses:
    +            right = ZenodoRight()
    +            right.id = license.name
    +            right.link = license.path
    +            right.title.en = license.title
    +            zenodo.metadata.rights.append(right)
    +
    +        # Contributors
    +        for contributor in package.contributors:
    +            item = ZenodoContributor()
    +            item.person_or_org.name = contributor.title
    +            item.person_or_org.given_name = contributor.givenName
    +            item.person_or_org.family_name = contributor.familyName
    +            if contributor.roles:
    +                item.role.id = contributor.roles[0]
    +            if contributor.organization:
    +                affiliation = ZenodoContributorAffiliation(name=contributor.organization)
    +                item.affiliations.append(affiliation)
    +            if contributor.roles and contributor.roles[0] == "creator":
    +                zenodo.metadata.creators.append(item)
    +            else:
    +                zenodo.metadata.contributors.append(item)
    +
    +        return zenodo
     
    @@ -2032,7 +2100,7 @@

    Parameters:

    @@ -2043,7 +2111,7 @@

    package Package @@ -2062,7 +2130,7 @@

    Returns:

    @@ -2071,7 +2139,7 @@

    @@ -2086,30 +2154,7 @@

    Source code in dplib/plugins/zenodo/models/package.py -

    ZenodoPackage
     92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    +            
    115
     116
     117
     118
    @@ -2133,54 +2178,101 @@ 

    136 137 138 -139

    @classmethod
    -def from_dp(cls, package: Package) -> ZenodoPackage:
    -    """Create a Zenodo Package from Data Package
    -
    -    Parameters:
    -        package: Data Package
    -
    -    Returns:
    -        Zenodo Package
    -    """
    -    zenodo = ZenodoPackage()
    -
    -    # Title
    -    if package.title:
    -        zenodo.metadata.title = package.title
    -
    -    # Description
    -    if package.description:
    -        zenodo.metadata.description = package.description
    -
    -    # Version
    -    if package.version:
    -        zenodo.metadata.version = package.version
    -
    -    # Resources
    -    for resource in package.resources:
    -        entry = ZenodoResource.from_dp(resource)
    -        if entry:
    -            zenodo.files.entries[entry.key] = entry
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    @classmethod
    +def from_dp(cls, package: Package) -> ZenodoPackage:
    +    """Create a Zenodo Package from Data Package
    +
    +    Parameters:
    +        package: Data Package
     
    -    # Keywords
    -    for keyword in package.keywords:
    -        subject = ZenodoSubject(subject=keyword)
    -        zenodo.metadata.subjects.append(subject)
    +    Returns:
    +        Zenodo Package
    +    """
    +    zenodo = ZenodoPackage()
     
    -    # Contributors
    -    for contributor in package.contributors:
    -        creator = ZenodoCreator()
    -        creator.person_or_org.name = contributor.title
    -        creator.person_or_org.given_name = contributor.givenName
    -        creator.person_or_org.family_name = contributor.familyName
    -        if contributor.roles:
    -            creator.person_or_org.type = contributor.roles[0]
    -        if contributor.organization:
    -            affiliation = ZenodoCreatorAffiliation(name=contributor.organization)
    -            creator.affiliations.append(affiliation)
    +    # Title
    +    if package.title:
    +        zenodo.metadata.title = package.title
    +
    +    # Description
    +    if package.description:
    +        zenodo.metadata.description = package.description
    +
    +    # Version
    +    if package.version:
    +        zenodo.metadata.version = package.version
     
    -    return zenodo
    +    # Keywords
    +    for keyword in package.keywords:
    +        subject = ZenodoSubject(subject=keyword)
    +        zenodo.metadata.subjects.append(subject)
    +
    +    # Resources
    +    for resource in package.resources:
    +        entry = ZenodoResource.from_dp(resource)
    +        if entry:
    +            zenodo.files.entries[entry.key] = entry
    +
    +    # Licenses
    +    for license in package.licenses:
    +        right = ZenodoRight()
    +        right.id = license.name
    +        right.link = license.path
    +        right.title.en = license.title
    +        zenodo.metadata.rights.append(right)
    +
    +    # Contributors
    +    for contributor in package.contributors:
    +        item = ZenodoContributor()
    +        item.person_or_org.name = contributor.title
    +        item.person_or_org.given_name = contributor.givenName
    +        item.person_or_org.family_name = contributor.familyName
    +        if contributor.roles:
    +            item.role.id = contributor.roles[0]
    +        if contributor.organization:
    +            affiliation = ZenodoContributorAffiliation(name=contributor.organization)
    +            item.affiliations.append(affiliation)
    +        if contributor.roles and contributor.roles[0] == "creator":
    +            zenodo.metadata.creators.append(item)
    +        else:
    +            zenodo.metadata.contributors.append(item)
    +
    +    return zenodo
     
    @@ -2204,7 +2296,7 @@

    Returns:

    +

    Returns:

    @@ -2213,7 +2305,7 @@

    - + @@ -2228,117 +2320,161 @@

    Source code in dplib/plugins/zenodo/models/package.py -

    Package
    35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    def to_dp(self) -> Package:
    -    """Convert to Data Package
    -
    -    Returns:
    -       Data Package
    -    """
    -    package = Package()
    -
    -    # Id
    -    if self.links.get("doi"):
    -        package.id = self.links.get("doi")
    -
    -    # Title
    -    if self.metadata.title:
    -        package.title = self.metadata.title
    -
    -    # Description
    -    if self.metadata.description:
    -        package.description = self.metadata.description
    -
    -    # Version
    -    if self.metadata.version:
    -        package.version = self.metadata.version
    -
    -    # Created
    -    if self.created:
    -        package.created = self.created
    -
    -    # Homepage
    -    if self.links.get("self"):
    -        package.homepage = self.links.get("self")
    -
    -    # Resources
    -    for entry in self.files.entries.values():
    -        resource = entry.to_dp()
    -        package.resources.append(resource)
    +            
    def to_dp(self) -> Package:
    +    """Convert to Data Package
    +
    +    Returns:
    +       Data Package
    +    """
    +    package = Package()
    +
    +    # Id
    +    if self.links.get("doi"):
    +        package.id = self.links.get("doi")
    +
    +    # Name
    +    if self.id:
    +        package.name = self.id
    +
    +    # Title
    +    if self.metadata.title:
    +        package.title = self.metadata.title
    +
    +    # Description
    +    if self.metadata.description:
    +        package.description = self.metadata.description
    +
    +    # Version
    +    if self.metadata.version:
    +        package.version = self.metadata.version
    +
    +    # Created
    +    if self.created:
    +        package.created = self.created
    +
    +    # Homepage
    +    if self.links.get("self_html"):
    +        package.homepage = self.links.get("self_html")
     
         # Keywords
         for subject in self.metadata.subjects:
             package.keywords.append(subject.subject)
     
    -    # Contributors
    -    for creator in self.metadata.creators:
    -        if creator.person_or_org.name:
    -            contributor = Contributor(
    -                title=creator.person_or_org.name,
    -                givenName=creator.person_or_org.given_name,
    -                familyName=creator.person_or_org.family_name,
    -            )
    -            if creator.person_or_org.type:
    -                contributor.roles = [creator.person_or_org.type]
    -            if creator.affiliations:
    -                contributor.organization = creator.affiliations[0].name
    -            package.contributors.append(contributor)
    -
    -    return package
    +    # Resources
    +    for entry in self.files.entries.values():
    +        if self.id:
    +            resource = entry.to_dp(package_id=self.id)
    +            package.resources.append(resource)
    +
    +    # Licenses
    +    for right in self.metadata.rights:
    +        if right.id:
    +            license = License(
    +                name=right.id,
    +                title=right.title.en,
    +                path=right.link or right.props.url,
    +            )
    +            package.licenses.append(license)
    +
    +    # Contributors
    +    for type, items in [
    +        ("creator", self.metadata.creators),
    +        ("contributor", self.metadata.contributors),
    +    ]:
    +        for item in items:
    +            if item.person_or_org.name:
    +                contributor = Contributor(
    +                    title=item.person_or_org.name,
    +                    givenName=item.person_or_org.given_name,
    +                    familyName=item.person_or_org.family_name,
    +                    roles=[item.role.id or type],
    +                )
    +                if item.affiliations:
    +                    contributor.organization = item.affiliations[0].name
    +                package.contributors.append(contributor)
    +
    +    # Custom
    +    if self.id:
    +        package.custom["zenodo:id"] = self.id
    +
    +    return package
     
    @@ -2374,8 +2510,7 @@

    Source code in dplib/plugins/zenodo/models/resource.py -
    10
    -11
    +              
    11
     12
     13
     14
    @@ -2446,79 +2581,94 @@ 

    79 80 81 -82

    class ZenodoResource(Model):
    -    """Zenodo Resource model"""
    -
    -    key: str
    -    id: Optional[str] = None
    -    checksum: Optional[str] = None
    -    ext: Optional[str] = None
    -    mimetype: Optional[str] = None
    -    size: Optional[int] = None
    -
    -    # Converters
    -
    -    def to_dp(self) -> Resource:
    -        """Convert to Data Package resource
    -
    -        Returns:
    -           Data Resource
    -        """
    -        resource = Resource(path=self.key, name=slugify_name(self.key))
    -
    -        # Format
    -        if self.ext:
    -            resource.format = self.ext.lower()
    +82
    +83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    class ZenodoResource(Model):
    +    """Zenodo Resource model"""
    +
    +    key: str
    +    id: Optional[str] = None
    +    checksum: Optional[str] = None
    +    ext: Optional[str] = None
    +    mimetype: Optional[str] = None
    +    size: Optional[int] = None
    +
    +    # Converters
    +
    +    def to_dp(self, *, package_id: str) -> Resource:
    +        """Convert to Data Package resource
    +
    +        Returns:
    +           Data Resource
    +        """
    +        resource = Resource(
    +            path=f"https://zenodo.org/records/{package_id}/files/{self.key}",
    +            name=slugify_name(self.key),
    +        )
     
    -        # Mediatype
    -        if self.mimetype:
    -            resource.mediatype = self.mimetype
    +        # Format
    +        if self.ext:
    +            resource.format = self.ext.lower()
     
    -        # Bytes
    -        if self.size:
    -            resource.bytes = self.size
    +        # Mediatype
    +        if self.mimetype:
    +            resource.mediatype = self.mimetype
     
    -        # Hash
    -        if self.checksum:
    -            resource.hash = self.checksum.replace("md5:", "")
    +        # Bytes
    +        if self.size:
    +            resource.bytes = self.size
     
    -        return resource
    -
    -    @classmethod
    -    def from_dp(cls, resource: Resource) -> Optional[ZenodoResource]:
    -        """Create Zenodo Resource from Data Resource
    -
    -        Parameters:
    -            resource: Data Resource
    -
    -        Returns:
    -            Zenodo Resource
    -        """
    -        if not resource.path or not isinstance(resource.path, str):
    -            return
    -
    -        # Path
    -        zenodo = ZenodoResource(key=resource.path)
    -
    -        # Format
    -        if resource.format:
    -            zenodo.ext = resource.format
    -
    -        # Mediatype
    -        if resource.mediatype:
    -            zenodo.mimetype = resource.mediatype
    +        # Hash
    +        if self.checksum:
    +            resource.hash = self.checksum.replace("md5:", "")
    +
    +        # Custom
    +        if self.id:
    +            resource.custom["zenodo:id"] = self.id
    +
    +        return resource
    +
    +    @classmethod
    +    def from_dp(cls, resource: Resource) -> Optional[ZenodoResource]:
    +        """Create Zenodo Resource from Data Resource
    +
    +        Parameters:
    +            resource: Data Resource
    +
    +        Returns:
    +            Zenodo Resource
    +        """
    +        if not resource.path or not isinstance(resource.path, str):
    +            return
    +
    +        # Path
    +        zenodo = ZenodoResource(key=os.path.basename(resource.path))
     
    -        # Bytes
    -        if resource.bytes:
    -            zenodo.size = resource.bytes
    +        # Format
    +        if resource.format:
    +            zenodo.ext = resource.format
     
    -        # Hash
    -        hash = resource.get_hash()
    -        if hash:
    -            if hash.type == "md5":
    -                zenodo.checksum = hash.long
    -
    -        return zenodo
    +        # Mediatype
    +        if resource.mediatype:
    +            zenodo.mimetype = resource.mediatype
    +
    +        # Bytes
    +        if resource.bytes:
    +            zenodo.size = resource.bytes
    +
    +        # Hash
    +        hash = resource.get_hash()
    +        if hash:
    +            if hash.type == "md5":
    +                zenodo.checksum = hash.long
    +
    +        return zenodo
     
    @@ -2674,7 +2824,7 @@

    Parameters:

    @@ -2685,7 +2835,7 @@

    resource Resource @@ -2704,7 +2854,7 @@

    Returns:

    @@ -2713,7 +2863,7 @@

    @@ -2728,15 +2878,7 @@

    Source code in dplib/plugins/zenodo/models/resource.py -

    Optional[ZenodoResource]
    48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    +            
    56
     57
     58
     59
    @@ -2762,41 +2904,49 @@ 

    79 80 81 -82

    @classmethod
    -def from_dp(cls, resource: Resource) -> Optional[ZenodoResource]:
    -    """Create Zenodo Resource from Data Resource
    -
    -    Parameters:
    -        resource: Data Resource
    -
    -    Returns:
    -        Zenodo Resource
    -    """
    -    if not resource.path or not isinstance(resource.path, str):
    -        return
    -
    -    # Path
    -    zenodo = ZenodoResource(key=resource.path)
    -
    -    # Format
    -    if resource.format:
    -        zenodo.ext = resource.format
    -
    -    # Mediatype
    -    if resource.mediatype:
    -        zenodo.mimetype = resource.mediatype
    +82
    +83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    @classmethod
    +def from_dp(cls, resource: Resource) -> Optional[ZenodoResource]:
    +    """Create Zenodo Resource from Data Resource
    +
    +    Parameters:
    +        resource: Data Resource
    +
    +    Returns:
    +        Zenodo Resource
    +    """
    +    if not resource.path or not isinstance(resource.path, str):
    +        return
    +
    +    # Path
    +    zenodo = ZenodoResource(key=os.path.basename(resource.path))
     
    -    # Bytes
    -    if resource.bytes:
    -        zenodo.size = resource.bytes
    +    # Format
    +    if resource.format:
    +        zenodo.ext = resource.format
     
    -    # Hash
    -    hash = resource.get_hash()
    -    if hash:
    -        if hash.type == "md5":
    -            zenodo.checksum = hash.long
    -
    -    return zenodo
    +    # Mediatype
    +    if resource.mediatype:
    +        zenodo.mimetype = resource.mediatype
    +
    +    # Bytes
    +    if resource.bytes:
    +        zenodo.size = resource.bytes
    +
    +    # Hash
    +    hash = resource.get_hash()
    +    if hash:
    +        if hash.type == "md5":
    +            zenodo.checksum = hash.long
    +
    +    return zenodo
     
    @@ -2809,7 +2959,7 @@

    - to_dp() + to_dp(*, package_id)

    @@ -2820,7 +2970,7 @@

    Returns:

    @@ -2829,7 +2979,7 @@

    @@ -2844,8 +2994,7 @@

    Source code in dplib/plugins/zenodo/models/resource.py -

    Resource
    22
    -23
    +            
    23
     24
     25
     26
    @@ -2868,31 +3017,46 @@ 

    43 44 45 -46

    def to_dp(self) -> Resource:
    -    """Convert to Data Package resource
    -
    -    Returns:
    -       Data Resource
    -    """
    -    resource = Resource(path=self.key, name=slugify_name(self.key))
    -
    -    # Format
    -    if self.ext:
    -        resource.format = self.ext.lower()
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    def to_dp(self, *, package_id: str) -> Resource:
    +    """Convert to Data Package resource
    +
    +    Returns:
    +       Data Resource
    +    """
    +    resource = Resource(
    +        path=f"https://zenodo.org/records/{package_id}/files/{self.key}",
    +        name=slugify_name(self.key),
    +    )
     
    -    # Mediatype
    -    if self.mimetype:
    -        resource.mediatype = self.mimetype
    +    # Format
    +    if self.ext:
    +        resource.format = self.ext.lower()
     
    -    # Bytes
    -    if self.size:
    -        resource.bytes = self.size
    +    # Mediatype
    +    if self.mimetype:
    +        resource.mediatype = self.mimetype
     
    -    # Hash
    -    if self.checksum:
    -        resource.hash = self.checksum.replace("md5:", "")
    +    # Bytes
    +    if self.size:
    +        resource.bytes = self.size
     
    -    return resource
    +    # Hash
    +    if self.checksum:
    +        resource.hash = self.checksum.replace("md5:", "")
    +
    +    # Custom
    +    if self.id:
    +        resource.custom["zenodo:id"] = self.id
    +
    +    return resource
     
    diff --git a/sitemap.xml b/sitemap.xml index 9b07b85..f3c1581 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,122 +2,122 @@ https://frictionlessdata.github.io/dplib-py/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/changelog/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/contributing/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/converting-metadata/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/installation/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/validating-metadata/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/working-with-models/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/actions/dialect/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/actions/package/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/actions/resource/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/actions/schema/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/models/dialect/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/models/package/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/models/resource/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/models/schema/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/ckan/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/cli/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/datacite/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/dcat/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/github/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/pandas/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/polars/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/sql/ - 2024-04-19 + 2024-04-24 daily https://frictionlessdata.github.io/dplib-py/plugins/zenodo/ - 2024-04-19 + 2024-04-24 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 1548aeb7ae7ad436b887bc298a4c82896310ff0c..c5992029e6a456eb683bd2ef601248cb9b0d3f89 100644 GIT binary patch delta 361 zcmV-v0ha#z0{a37ABzYG$^$8p2OWQORS(-l>1|)IeSn*!5X~esHf7z{FDYp1ecHjf z0I_49z$l_QehpY$Z6p``p?s>hWnsMz#`*40e!Ra`&*ib*G*d*fT%=@Ahq7lLUzM8Y zxhBVUfRXADJ4L!r7o^rnwXI*uc2lI03oK{%(O}SRu0pBIIXcbh_GpO=Fw}pY<9<5T zE+{jiJ5}RNH7c)oEC9qqFzs%;+gICtwcDqZb?zZe_uxBwj`q?TaCmFf!^|R6zqG$1 zm(mzIA>80Oy3@qzU5gQ?R?XgOunaj(2HbgKK!ltpLwp5vDJJhx&mn$h^_)Ugf>!g=Uxk?G zxh50!2%c&edO>nX7bMn6(bR{s+Z1W!0?XNBwCH4)t57O)2}Z_rd(=bg7XXT*Q{ArF?W<;AZ4W7BoqI}?1K3_)g1&YN4BlJuG_%OWFYT|$ zr8K&p3D?;e%z29GU9%CVR?XgO)DdzT54f=u0TFT@5AhAqq!_