Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Changelog

## [1.0.24] - 2026-02-16

Added a property `fairscapeVersion` to all classes which is set to the version of this models package.
Added a bound method `generateFileElem` to `fairscape_models.rocrate.ROCrateMetadataElem` to generate the `fairscape_models.rocrate.ROCrateFileElem` required in an ROCrate.
1 change: 1 addition & 0 deletions fairscape_models/_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__version__ = "1.0.24"
2 changes: 2 additions & 0 deletions fairscape_models/activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Optional, List, Union

from fairscape_models.fairscape_base import IdentifierValue
from fairscape_models._version import __version__

class Activity(BaseModel):
"""Base class for Activity types (Computation, Annotation, Experiment)"""
Expand All @@ -16,5 +17,6 @@ class Activity(BaseModel):
# PROV-O fields (auto-populated)
used: Optional[List[Union[str, IdentifierValue]]] = Field(default=[], alias="prov:used")
wasAssociatedWith: Optional[List[Union[str, IdentifierValue]]] = Field(default=[], alias="prov:wasAssociatedWith")
fairscapeVersion: str = __version__

model_config = ConfigDict(extra="allow", populate_by_name=True)
2 changes: 2 additions & 0 deletions fairscape_models/biochem_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Optional, List, Union

from fairscape_models.fairscape_base import IdentifierValue, IdentifierPropertyValue
from fairscape_models._version import __version__

class BioChemEntity(BaseModel):
""" Pydantic model for the Schema.org BioChemEntity datatype
Expand All @@ -16,5 +17,6 @@ class BioChemEntity(BaseModel):
usedBy: Optional[List[IdentifierValue]] = Field(default=[])
description: Optional[str] = Field(default=None)
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
fairscapeVersion: str = __version__

model_config = ConfigDict(extra="allow")
2 changes: 2 additions & 0 deletions fairscape_models/digital_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Optional, List, Union

from fairscape_models.fairscape_base import IdentifierValue
from fairscape_models._version import __version__

class DigitalObject(BaseModel):
"""Base class for DigitalObject types (Dataset, Software, MLModel)"""
Expand All @@ -16,6 +17,7 @@ class DigitalObject(BaseModel):
contentUrl: Optional[Union[str, List[str]]] = Field(default=None)
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
usedByComputation: Optional[List[IdentifierValue]] = Field(default=[])
fairscapeVersion: str = __version__

# PROV-O fields (auto-populated)
wasGeneratedBy: Optional[List[Union[str, IdentifierValue]]] = Field(default=[], alias="prov:wasGeneratedBy")
Expand Down
4 changes: 3 additions & 1 deletion fairscape_models/instrument.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional, List, Union
from fairscape_models.fairscape_base import IdentifierValue
from fairscape_models._version import __version__

class Instrument(BaseModel):
guid: str = Field(alias="@id")
Expand All @@ -14,4 +15,5 @@ class Instrument(BaseModel):
usedByExperiment: Optional[List[IdentifierValue]] = Field(default=[]) # changed from usedByComputation
contentUrl: Optional[str] = Field(default=None)
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
model_config = ConfigDict(extra="allow")
model_config = ConfigDict(extra="allow")
fairscapeVersion: str = __version__
4 changes: 3 additions & 1 deletion fairscape_models/medical_condition.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Optional, List

from fairscape_models.fairscape_base import IdentifierValue, IdentifierPropertyValue
from fairscape_models._version import __version__

class MedicalCondition(BaseModel):
""" Pydantic model for the Schema.org MedicalCondition datatype
Expand All @@ -15,4 +16,5 @@ class MedicalCondition(BaseModel):
drug: Optional[List[IdentifierValue]] = Field(default=[])
usedBy: Optional[List[IdentifierValue]] = Field(default=[])
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
description: str
description: str
fairscapeVersion: str = __version__
2 changes: 2 additions & 0 deletions fairscape_models/patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
Union
)
from fairscape_models.fairscape_base import IdentifierValue
from fairscape_models._version import __version__

class Patient(BaseModel):
guid: str = Field(alias="@id")
Expand All @@ -26,3 +27,4 @@ class Patient(BaseModel):
gender: Optional[str]
birthDate: Optional[str] = Field(default=None)
deathDate: Optional[str] = Field(default=None)
fairscapeVersion: str = __version__
17 changes: 15 additions & 2 deletions fairscape_models/rocrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from fairscape_models.sample import Sample
from fairscape_models.activity import Activity
from fairscape_models.digital_object import DigitalObject
from fairscape_models._version import __version__

class GenericMetadataElem(BaseModel):
"""Generic Metadata Element of an ROCrate"""
Expand All @@ -27,6 +28,7 @@ class GenericMetadataElem(BaseModel):

model_config = ConfigDict(extra="allow")


class ROCrateMetadataFileElem(BaseModel):
"""Metadata Element of an ROCrate cooresponding to the `ro-crate-metadata.json` file itself

Expand All @@ -49,6 +51,7 @@ class ROCrateMetadataFileElem(BaseModel):
metadataType: Literal["CreativeWork"] = Field(alias="@type")
conformsTo: IdentifierValue
about: IdentifierValue
fairscapeVersion: str = __version__


class ROCrateMetadataElem(BaseModel):
Expand Down Expand Up @@ -96,6 +99,7 @@ class ROCrateMetadataElem(BaseModel):
associatedPublication: Optional[Union[str, List[str]]] = Field(default=None)
conditionsOfAccess: Optional[str] = Field(default=None)
copyrightNotice: Optional[str] = Field(default=None)
fairscapeVersion: str = __version__

rai_data_limitations: Optional[str] = Field(alias="rai:dataLimitations", default=None)
rai_data_biases: Optional[str] = Field(alias="rai:dataBiases", default=None)
Expand Down Expand Up @@ -129,7 +133,17 @@ class ROCrateMetadataElem(BaseModel):
evi_total_entities: Optional[int] = Field(alias="evi:totalEntities", default=None)
evi_formats: Optional[List[str]] = Field(alias="evi:formats", default=None)


def generateFileElem(self)->ROCrateMetadataFileElem:
return ROCrateMetadataFileElem.validate({
"@id": "ro-crate-metadata.json",
"@type": "CreativeWork",
"about": {
"@id": self.guid,
"@type": ["EVI:Dataset", "EVI:ROCrate"],
"name": self.name
},
"conformsTo": {"@id": "https://w3id.org/ro/crate/1.2"}
})


class ROCrateDistribution(BaseModel):
Expand All @@ -138,7 +152,6 @@ class ROCrateDistribution(BaseModel):
extractedObjectPath: Optional[List[str]] = Field(default=[])
archivedObjectPath: Optional[str] = Field(default=None)



class ROCrateV1_2(BaseModel):
context: Optional[Dict] = Field(alias="@context")
Expand Down
2 changes: 2 additions & 0 deletions fairscape_models/sample.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional, List, Union, Dict
from fairscape_models.fairscape_base import IdentifierValue
from fairscape_models._version import __version__

class Sample(BaseModel):
guid: str = Field(alias="@id")
Expand All @@ -12,5 +13,6 @@ class Sample(BaseModel):
contentUrl: Optional[Union[str, List[str]]] = Field(default=None)
cellLineReference: Optional[IdentifierValue] = Field(default=None)
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
fairscapeVersion: str = __version__

model_config = ConfigDict(extra='allow')
3 changes: 3 additions & 0 deletions fairscape_models/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import re
from enum import Enum
from fairscape_models.fairscape_base import IdentifierValue, FairscapeEVIBaseModel
from fairscape_models._version import __version__

# TODO switch to ENUM for better clarification
class ItemTypeEnum(Enum):
Expand Down Expand Up @@ -76,5 +77,7 @@ class Schema(FairscapeEVIBaseModel):
header: Optional[bool] = Field(default=True)
examples: Optional[List[Dict]] = []
isPartOf: Optional[List[IdentifierValue]] = Field(default=[])
fairscapeVersion: str = __version__


model_config = ConfigDict(extra='allow')
8 changes: 7 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "fairscape-models"
version = "1.0.22"
version = "1.0.24"
description = "Fairscape pydantic models"
readme = "README.md"
authors = [
Expand Down Expand Up @@ -40,3 +40,9 @@ exclude_lines = [
"raise NotImplementedError",
"if __name__ == .__main__.:",
]

[dependency-groups]
dev = [
"pytest>=8.3.5",
"pytest-cov>=5.0.0",
]
Loading
Loading