Source code for pathfinder_framework.data_model_extension.data_model_extension
from packaging.version import Version, InvalidVersion
from urllib.parse import urlparse
import json
[docs]
class DataModelExtension:
"""
Data Model Extension class.
Attributes:
spec_version (str): The version of the Data Model Extension specification.
Must be a string in the format major.minor.patch as defined in Semantic Versioning 2.0.0.
Must be 2.0.0 when referencing this specification.
data_schema (str): The URL to the publicly accessible Extension Schema File.
Must be a string representing a URL with the HTTPS schema.
data (dict): A JSON Object that conforms to the extension schema file referenced by the dataSchema property.
documentation (str): The URL to the publicly accessible Extension Documentation.
Must be a string representing a URL with the HTTPS schema.
"""
def __init__(
self, spec_version: str, data_schema: str, data: dict, documentation: str = None
):
"""
Initializes a DataModelExtension object.
Args:
spec_version (str): The version of the Data Model Extension specification.
data_schema (str): The URL to the publicly accessible Extension Schema File.
data (dict): A JSON Object that conforms to the extension schema file referenced by the dataSchema property.
documentation (str, optional): The URL to the publicly accessible Extension Documentation.
Raises:
ValueError: If the spec_version is not in the format major.minor.patch or is not 2.0.0.
ValueError: If the data_schema is not a string representing a URL with the HTTPS schema.
ValueError: If the data is not a dictionary or cannot be serialized to a JSON object.
ValueError: If the documentation is not a string representing a URL with the HTTPS schema.
"""
try:
semvar_version = Version(spec_version)
if (
semvar_version.major != 2
or semvar_version.minor != 0
or semvar_version.micro != 0
):
raise ValueError("Invalid spec version")
except InvalidVersion:
raise ValueError("Invalid spec version")
parsed_url = urlparse(data_schema)
if parsed_url.scheme != "https":
raise ValueError("Invalid data schema URL scheme")
if not parsed_url.netloc:
raise ValueError("Invalid data schema URL")
if not isinstance(data, dict):
raise ValueError("Invalid data type")
try:
json.dumps(data)
except TypeError:
raise ValueError("Invalid data format")
if documentation is not None:
parsed_url = urlparse(documentation)
if parsed_url.scheme != "https":
raise ValueError("Invalid documentation URL scheme")
if not parsed_url.netloc:
raise ValueError("Invalid documentation URL")
self.spec_version = spec_version
self.data_schema = data_schema
self.data = data
self.documentation = documentation
def __eq__(self, other):
"""
Returns True if the other object is a DataModelExtension with the same attributes.
Args:
other (object): The object to compare with.
Returns:
bool: True if the objects are equal, False otherwise.
"""
if not isinstance(other, DataModelExtension):
return False
return (
self.spec_version == other.spec_version
and self.data_schema == other.data_schema
and self.data == other.data
and self.documentation == other.documentation
)
def __repr__(self):
"""
Returns a string representation of the DataModelExtension object.
Returns:
str: A string representation of the DataModelExtension object.
"""
return f"DataModelExtension(spec_version={self.spec_version}, data_schema={self.data_schema}, data={self.data}, documentation={self.documentation})"