From 4fff842431fb3fb83821375863e8f71a34bb0a69 Mon Sep 17 00:00:00 2001 From: pkdash Date: Mon, 10 Jan 2022 14:43:29 -0500 Subject: [PATCH 1/3] [#27] changes to relation and source models --- hsmodels/schemas/enums.py | 20 +++++++++++------- hsmodels/schemas/rdf/fields.py | 26 +++++++++++++----------- hsmodels/schemas/rdf/resource.py | 4 ---- hsmodels/schemas/resource.py | 9 ++------ tests/data/json/resource.json | 8 ++------ tests/data/metadata/resourcemetadata.xml | 16 +++------------ tests/test_defaults.py | 4 ++-- tests/test_metadata.py | 6 +----- 8 files changed, 37 insertions(+), 56 deletions(-) diff --git a/hsmodels/schemas/enums.py b/hsmodels/schemas/enums.py index 6d3055b..62d11b7 100644 --- a/hsmodels/schemas/enums.py +++ b/hsmodels/schemas/enums.py @@ -51,16 +51,22 @@ class UserIdentifierType(StringEnum): class RelationType(StringEnum): - isCopiedFrom = 'The content of this resource was copied from' isPartOf = 'The content of this resource is part of' - hasPart = 'Has Part' - isExecutedBy = 'The content of this resource can be executed by' + hasPart = 'This resource includes' + isExecutedBy = 'The content of this resource was created by a related App or software program' isCreatedBy = 'The content of this resource was created by' - isVersionOf = 'Version Of' - isReplacedBy = 'Replaced By' - isDataFor = 'The content of this resource serves as the data for' - cites = 'This resource cites' + isVersionOf = 'This resource updates and replaces a previous version' + isReplacedBy = 'This resource has been replaced by a newer version' isDescribedBy = 'This resource is described by' + conformsTo = 'This resource conforms to established standard described by' + hasFormat = 'This resource has a related resource in another format' + isFormatOf = 'This resource is a different format of' + isRequiredBy = 'This resource is required by' + requires = 'This resource requires' + isReferencedBy = 'This resource is referenced by' + references = 'The content of this resource references' + replaces = 'This resource replaces' + source = 'The content of this resource is derived from' class AggregationType(StringEnum): diff --git a/hsmodels/schemas/rdf/fields.py b/hsmodels/schemas/rdf/fields.py index cc9989e..fcb1531 100644 --- a/hsmodels/schemas/rdf/fields.py +++ b/hsmodels/schemas/rdf/fields.py @@ -35,23 +35,25 @@ class DCTypeInRDF(RDFBaseModel): label: str = Field(rdf_predicate=RDFS.label) -class SourceInRDF(RDFBaseModel): - is_derived_from: str = Field(rdf_predicate=HSTERMS.isDerivedFrom, default=None) - - class RelationInRDF(RDFBaseModel): - isHostedBy: str = Field(rdf_predicate=HSTERMS.isHostedBy, default=None) - isCopiedFrom: str = Field(rdf_predicate=HSTERMS.isCopiedFrom, default=None) - isPartOf: str = Field(rdf_predicate=HSTERMS.isPartOf, default=None) - hasPart: str = Field(rdf_predicate=HSTERMS.hasPart, default=None) isExecutedBy: str = Field(rdf_predicate=HSTERMS.isExecutedBy, default=None) isCreatedBy: str = Field(rdf_predicate=HSTERMS.isCreatedBy, default=None) - isVersionOf: str = Field(rdf_predicate=HSTERMS.isVersionOf, default=None) - isReplacedBy: str = Field(rdf_predicate=HSTERMS.isReplacedBy, default=None) - isDataFor: str = Field(rdf_predicate=HSTERMS.isDataFor, default=None) - cites: str = Field(rdf_predicate=HSTERMS.cites, default=None) isDescribedBy: str = Field(rdf_predicate=HSTERMS.isDescribedBy, default=None) + isPartOf: str = Field(rdf_predicate=DCTERMS.isPartOf, default=None) + hasPart: str = Field(rdf_predicate=DCTERMS.hasPart, default=None) + isVersionOf: str = Field(rdf_predicate=DCTERMS.isVersionOf, default=None) + isReplacedBy: str = Field(rdf_predicate=DCTERMS.isReplacedBy, default=None) + conformsTo: str = Field(rdf_predicate=DCTERMS.conformsTo, default=None) + hasFormat: str = Field(rdf_predicate=DCTERMS.hasFormat, default=None) + isFormatOf: str = Field(rdf_predicate=DCTERMS.isFormatOf, default=None) + isRequiredBy: str = Field(rdf_predicate=DCTERMS.isRequiredBy, default=None) + requires: str = Field(rdf_predicate=DCTERMS.requires, default=None) + isReferencedBy: str = Field(rdf_predicate=DCTERMS.isReferencedBy, default=None) + references: str = Field(rdf_predicate=DCTERMS.references, default=None) + replaces: str = Field(rdf_predicate=DCTERMS.replaces, default=None) + source: str = Field(rdf_predicate=DCTERMS.source, default=None) + _parse_relation = root_validator(pre=True)(parse_relation_rdf) diff --git a/hsmodels/schemas/rdf/resource.py b/hsmodels/schemas/rdf/resource.py index 341468e..987af58 100644 --- a/hsmodels/schemas/rdf/resource.py +++ b/hsmodels/schemas/rdf/resource.py @@ -17,7 +17,6 @@ PublisherInRDF, RelationInRDF, RightsInRDF, - SourceInRDF, ) from hsmodels.schemas.rdf.root_validators import ( parse_coverages, @@ -31,7 +30,6 @@ coverages_spatial_constraint, dates_constraint, language_constraint, - parse_rdf_sources, rdf_parse_identifier, sort_creators, ) @@ -79,7 +77,6 @@ class ResourceMetadataInRDF(BaseModel): creators: List[CreatorInRDF] = Field(rdf_predicate=DC.creator, default=[]) contributors: List[ContributorInRDF] = Field(rdf_predicate=DC.contributor, default=[]) - sources: List[SourceInRDF] = Field(rdf_predicate=DC.source, default=[]) relations: List[RelationInRDF] = Field(rdf_predicate=DC.relation, default=[]) extended_metadata: List[ExtendedMetadataInRDF] = Field(rdf_predicate=HSTERMS.extendedMetadata, default=[]) rights: RightsInRDF = Field(rdf_predicate=DC.rights, default=None) @@ -95,7 +92,6 @@ class ResourceMetadataInRDF(BaseModel): _parse_description = root_validator(pre=True, allow_reuse=True)(rdf_parse_description) _parse_identifier = validator("identifier", pre=True, allow_reuse=True)(rdf_parse_identifier) - _parse_rdf_sources = validator("sources", pre=True, allow_reuse=True)(parse_rdf_sources) _language_constraint = validator('language', allow_reuse=True)(language_constraint) _dates_constraint = validator('dates', allow_reuse=True)(dates_constraint) diff --git a/hsmodels/schemas/resource.py b/hsmodels/schemas/resource.py index 8d17bfc..24a7e2f 100644 --- a/hsmodels/schemas/resource.py +++ b/hsmodels/schemas/resource.py @@ -24,7 +24,7 @@ split_coverages, split_dates, ) -from hsmodels.schemas.validators import list_not_empty, parse_identifier, parse_sources, parse_spatial_coverage +from hsmodels.schemas.validators import list_not_empty, parse_identifier, parse_spatial_coverage class ResourceMetadataIn(BaseMetadata): @@ -62,11 +62,6 @@ class Config: title="Contributors", description="A list of Contributor objects indicating the entities that contributed to a resource", ) - sources: List[str] = Field( - default=[], - title="Sources", - description="A list of strings containing references to related resources from which a described resource was derived", - ) relations: List[Relation] = Field( default=[], title="Related resources", @@ -109,7 +104,7 @@ class Config: _parse_coverages = root_validator(pre=True, allow_reuse=True)(split_coverages) _parse_additional_metadata = root_validator(pre=True, allow_reuse=True)(parse_additional_metadata) _parse_abstract = root_validator(pre=True)(parse_abstract) - _parse_sources = validator("sources", pre=True)(parse_sources) + _parse_spatial_coverage = validator("spatial_coverage", allow_reuse=True, pre=True)(parse_spatial_coverage) _normalize_additional_metadata = root_validator(allow_reuse=True, pre=True)(normalize_additional_metadata) diff --git a/tests/data/json/resource.json b/tests/data/json/resource.json index 7bdf47b..41a39f1 100644 --- a/tests/data/json/resource.json +++ b/tests/data/json/resource.json @@ -58,13 +58,9 @@ } } ], - "sources": [ - "another", - "the source" - ], "relations": [ { - "type": "The content of this resource serves as the data for", + "type": "This resource is described by", "value": "Bastidas Pacheco, C. J., Horsburgh, J. S., Tracy, R. J. (2020). A low-cost, open source monitoring system for collecting high-resolution water use data on magnetically-driven residential water meters, Sensors, 20(13), 3655, https://doi.org/10.3390/s20133655." }, { @@ -72,7 +68,7 @@ "value": "https://sadf.com" }, { - "type": "The content of this resource was copied from", + "type": "The content of this resource was created by", "value": "https://www.google.com" } ], diff --git a/tests/data/metadata/resourcemetadata.xml b/tests/data/metadata/resourcemetadata.xml index 187daa9..5116ff3 100644 --- a/tests/data/metadata/resourcemetadata.xml +++ b/tests/data/metadata/resourcemetadata.xml @@ -13,11 +13,6 @@ Logan River a custom citation - - - another - - CUAHSI @@ -40,7 +35,7 @@ fdas - https://sadf.com + https://sadf.com @@ -54,12 +49,12 @@ Time Series - Bastidas Pacheco, C. J., Horsburgh, J. S., Tracy, R. J. (2020). A low-cost, open source monitoring system for collecting high-resolution water use data on magnetically-driven residential water meters, Sensors, 20(13), 3655, https://doi.org/10.3390/s20133655. + Bastidas Pacheco, C. J., Horsburgh, J. S., Tracy, R. J. (2020). A low-cost, open source monitoring system for collecting high-resolution water use data on magnetically-driven residential water meters, Sensors, 20(13), 3655, https://doi.org/10.3390/s20133655. - https://www.google.com + https://www.google.com @@ -135,11 +130,6 @@ key 1 - - - the source - - diff --git a/tests/test_defaults.py b/tests/test_defaults.py index 2371fc2..cf416be 100644 --- a/tests/test_defaults.py +++ b/tests/test_defaults.py @@ -26,7 +26,7 @@ from hsmodels.schemas.resource import ResourceMetadata schema_list_count = [ - (ResourceMetadata, 6), + (ResourceMetadata, 5), (GeographicRasterMetadata, 1), (GeographicFeatureMetadata, 2), (MultidimensionalMetadata, 2), @@ -36,7 +36,7 @@ (TimeSeriesMetadata, 2), (ModelProgramMetadata, 4), (ModelInstanceMetadata, 1), - (ResourceMetadataInRDF, 9), + (ResourceMetadataInRDF, 8), (GeographicRasterMetadataInRDF, 3), (GeographicFeatureMetadataInRDF, 4), (MultidimensionalMetadataInRDF, 4), diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 55844ec..e42bbaa 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -86,10 +86,6 @@ def test_resource_metadata(res_md): assert "key2" in res_md.additional_metadata assert res_md.additional_metadata["key2"] == "value2" - assert len(res_md.sources) == 2 - assert "another" in res_md.sources - assert "the source" in res_md.sources - assert len(res_md.creators) == 3 creator = res_md.creators[0] assert creator.organization == 'Utah State University' @@ -121,7 +117,7 @@ def test_resource_metadata(res_md): assert len(res_md.relations) == 3 assert any(x for x in res_md.relations if x.value == "https://sadf.com" and x.type == RelationType.isPartOf) assert any( - x for x in res_md.relations if x.value == "https://www.google.com" and x.type == RelationType.isCopiedFrom + x for x in res_md.relations if x.value == "https://www.google.com" and x.type == RelationType.isCreatedBy ) assert res_md.rights.statement == "my statement" From a9b3805c18052e3f3416b37757e8ba0a07a44489 Mon Sep 17 00:00:00 2001 From: pkdash Date: Tue, 18 Jan 2022 10:29:26 -0500 Subject: [PATCH 2/3] [#27] removing source meta related validators --- hsmodels/schemas/rdf/validators.py | 6 ------ hsmodels/schemas/validators.py | 6 ------ 2 files changed, 12 deletions(-) diff --git a/hsmodels/schemas/rdf/validators.py b/hsmodels/schemas/rdf/validators.py index c0d1d18..bdf7c0b 100644 --- a/hsmodels/schemas/rdf/validators.py +++ b/hsmodels/schemas/rdf/validators.py @@ -2,12 +2,6 @@ from hsmodels.schemas.languages_iso import languages -def parse_rdf_sources(cls, value): - if len(value) > 0 and isinstance(value[0], str): - return [{"is_derived_from": v} for v in value] - return value - - def rdf_parse_extended_metadata(cls, value): from hsmodels.schemas.rdf.fields import ExtendedMetadataInRDF diff --git a/hsmodels/schemas/validators.py b/hsmodels/schemas/validators.py index 71fb733..a789548 100644 --- a/hsmodels/schemas/validators.py +++ b/hsmodels/schemas/validators.py @@ -42,12 +42,6 @@ def parse_identifier(cls, value): return value -def parse_sources(cls, value): - if len(value) > 0 and isinstance(value[0], dict): - return [f['is_derived_from'] for f in value] - return value - - def parse_spatial_coverage(cls, value): # This is a workaround for form submissions that do not include type if isinstance(value, dict) and "type" not in value: From ee11359c4c5b14f2ba96445e7ce62a86d76cef9b Mon Sep 17 00:00:00 2001 From: pkdash Date: Tue, 18 Jan 2022 10:30:44 -0500 Subject: [PATCH 3/3] [#27] removing source meta from test data file --- .../resourcemetadata_with_point_coverage.xml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/tests/data/metadata/resourcemetadata_with_point_coverage.xml b/tests/data/metadata/resourcemetadata_with_point_coverage.xml index 7b2b794..9706103 100644 --- a/tests/data/metadata/resourcemetadata_with_point_coverage.xml +++ b/tests/data/metadata/resourcemetadata_with_point_coverage.xml @@ -13,11 +13,6 @@ Logan River a custom citation - - - another - - application/dbf @@ -59,7 +54,7 @@ - + https://sadf.com @@ -73,7 +68,7 @@ Time Series - + Bastidas Pacheco, C. J., Horsburgh, J. S., Tracy, R. J. (2020). A low-cost, open source monitoring system for collecting high-resolution water use data on magnetically-driven residential water meters, Sensors, 20(13), 3655, https://doi.org/10.3390/s20133655. @@ -153,11 +148,6 @@ key 1 - - - the source - - application/sbn