jsonapi¶
This module should reproduce JSON API v1.0 https://jsonapi.org/format/1.0/
  Attributes (BaseModel)   pydantic-model  ¶
 Members of the attributes object ("attributes") represent information about the resource object in which it's defined. The keys for Attributes MUST NOT be: relationships links id type
  Config  ¶
  check_illegal_attributes_fields(values)  classmethod  ¶
 Source code in optimade/models/jsonapi.py
 @root_validator(pre=True)
def check_illegal_attributes_fields(cls, values):
    illegal_fields = ("relationships", "links", "id", "type")
    for field in illegal_fields:
        if field in values:
            raise ValueError(
                f"{illegal_fields} MUST NOT be fields under Attributes"
            )
    return values
  BaseResource (BaseModel)   pydantic-model  ¶
 Minimum requirements to represent a Resource
 id: str  pydantic-field required  ¶
 Resource ID
 type: str  pydantic-field required  ¶
 Resource type
  Config  ¶
  schema_extra(schema, model)  staticmethod  ¶
 Ensure id and type are the first two entries in the list required properties.
Note
This requires that id and type are the first model fields defined for all sub-models of BaseResource.
Source code in optimade/models/jsonapi.py
 @staticmethod
def schema_extra(schema: Dict[str, Any], model: Type["BaseResource"]) -> None:
    """Ensure `id` and `type` are the first two entries in the list required properties.
    Note:
        This _requires_ that `id` and `type` are the _first_ model fields defined
        for all sub-models of `BaseResource`.
    """
    if "id" not in schema.get("required", []):
        schema["required"] = ["id"] + schema.get("required", [])
    if "type" not in schema.get("required", []):
        required = []
        for field in schema.get("required", []):
            required.append(field)
            if field == "id":
                # To make sure the property order match the listed properties,
                # this ensures "type" is added immediately after "id".
                required.append("type")
        schema["required"] = required
  Error (BaseModel)   pydantic-model  ¶
 An error response
 code: str  pydantic-field  ¶
 an application-specific error code, expressed as a string value.
 detail: str  pydantic-field  ¶
 A human-readable explanation specific to this occurrence of the problem.
 id: str  pydantic-field  ¶
 A unique identifier for this particular occurrence of the problem.
 links: ErrorLinks  pydantic-field  ¶
 A links object storing about
 meta: Meta  pydantic-field  ¶
 a meta object containing non-standard meta-information about the error.
 source: ErrorSource  pydantic-field  ¶
 An object containing references to the source of the error
 status: str  pydantic-field  ¶
 the HTTP status code applicable to this problem, expressed as a string value.
 title: str  pydantic-field  ¶
 A short, human-readable summary of the problem. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
 __hash__(self)  special  ¶
 Return hash(self).
Source code in optimade/models/jsonapi.py
 def __hash__(self):
    return hash(self.json())
  ErrorLinks (BaseModel)   pydantic-model  ¶
 A Links object specific to Error objects
 about: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 A link that leads to further details about this particular occurrence of the problem.
  ErrorSource (BaseModel)   pydantic-model  ¶
 an object containing references to the source of the error
  JsonApi (BaseModel)   pydantic-model  ¶
    Link (BaseModel)   pydantic-model  ¶
    Meta (BaseModel)   pydantic-model  ¶
 Non-standard meta-information that can not be represented as an attribute or relationship.
  Config  ¶
   Relationship (BaseModel)   pydantic-model  ¶
 Representation references from the resource object in which it’s defined to other resource objects.
 data: Union[optimade.models.jsonapi.BaseResource, List[optimade.models.jsonapi.BaseResource]]  pydantic-field  ¶
 Resource linkage
 links: RelationshipLinks  pydantic-field  ¶
 a links object containing at least one of the following: self, related
 meta: Meta  pydantic-field  ¶
 a meta object that contains non-standard meta-information about the relationship.
 at_least_one_relationship_key_must_be_set(values)  classmethod  ¶
 Source code in optimade/models/jsonapi.py
 @root_validator(pre=True)
def at_least_one_relationship_key_must_be_set(cls, values):
    for value in values.values():
        if value is not None:
            break
    else:
        raise ValueError(
            "Either 'links', 'data', or 'meta' MUST be specified for Relationship"
        )
    return values
  RelationshipLinks (BaseModel)   pydantic-model  ¶
 A resource object MAY contain references to other resource objects ("relationships"). Relationships may be to-one or to-many. Relationships can be specified by including a member in a resource's links object.
 related: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
   self: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 A link for the relationship itself (a 'relationship link'). This link allows the client to directly manipulate the relationship. When fetched successfully, this link returns the linkage for the related resources as its primary data. (See Fetching Relationships.)
 either_self_or_related_must_be_specified(values)  classmethod  ¶
 Source code in optimade/models/jsonapi.py
 @root_validator(pre=True)
def either_self_or_related_must_be_specified(cls, values):
    for value in values.values():
        if value is not None:
            break
    else:
        raise ValueError(
            "Either 'self' or 'related' MUST be specified for RelationshipLinks"
        )
    return values
  Relationships (BaseModel)   pydantic-model  ¶
 Members of the relationships object ("relationships") represent references from the resource object in which it's defined to other resource objects. Keys MUST NOT be: type id
 check_illegal_relationships_fields(values)  classmethod  ¶
 Source code in optimade/models/jsonapi.py
 @root_validator(pre=True)
def check_illegal_relationships_fields(cls, values):
    illegal_fields = ("id", "type")
    for field in illegal_fields:
        if field in values:
            raise ValueError(
                f"{illegal_fields} MUST NOT be fields under Relationships"
            )
    return values
  Resource (BaseResource)   pydantic-model  ¶
 Resource objects appear in a JSON API document to represent resources.
 attributes: Attributes  pydantic-field  ¶
 an attributes object representing some of the resource’s data.
 links: ResourceLinks  pydantic-field  ¶
 a links object containing links related to the resource.
 meta: Meta  pydantic-field  ¶
 a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship.
 relationships: Relationships  pydantic-field  ¶
 Relationships object describing relationships between the resource and other JSON API resources.
  ResourceLinks (BaseModel)   pydantic-model  ¶
 A Resource Links object
 self: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 A link that identifies the resource represented by the resource object.
  Response (BaseModel)   pydantic-model  ¶
 A top-level response
 data: Union[NoneType, optimade.models.jsonapi.Resource, List[optimade.models.jsonapi.Resource]]  pydantic-field  ¶
 Outputted Data
 errors: List[optimade.models.jsonapi.Error]  pydantic-field  ¶
 A list of unique errors
 included: List[optimade.models.jsonapi.Resource]  pydantic-field  ¶
 A list of unique included resources
 jsonapi: JsonApi  pydantic-field  ¶
 Information about the JSON API used
 links: ToplevelLinks  pydantic-field  ¶
 Links associated with the primary data or errors
 meta: Meta  pydantic-field  ¶
 A meta object containing non-standard information related to the Success
  Config  ¶
 The specification mandates that datetimes must be encoded following RFC3339, which does not support fractional seconds, thus they must be stripped in the response. This can cause issues when the underlying database contains fields that do include microseconds, as filters may return unexpected results.
 either_data_meta_or_errors_must_be_set(values)  classmethod  ¶
 Source code in optimade/models/jsonapi.py
 @root_validator(pre=True)
def either_data_meta_or_errors_must_be_set(cls, values):
    required_fields = ("data", "meta", "errors")
    if not any(field in values for field in required_fields):
        raise ValueError(
            f"At least one of {required_fields} MUST be specified in the top-level response"
        )
    if "errors" in values and not values.get("errors"):
        raise ValueError("Errors MUST NOT be an empty or 'null' value.")
    return values
  ToplevelLinks (BaseModel)   pydantic-model  ¶
 A set of Links objects, possibly including pagination
 first: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 The first page of data
 last: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 The last page of data
 next: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 The next page of data
 prev: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 The previous page of data
 related: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 A related resource link
 self: Union[pydantic.networks.AnyUrl, optimade.models.jsonapi.Link]  pydantic-field  ¶
 A link to itself
  Config  ¶
  check_additional_keys_are_links(values)  classmethod  ¶
 The ToplevelLinks class allows any additional keys, as long as they are also Links or Urls themselves.
Source code in optimade/models/jsonapi.py
 @root_validator(pre=False)
def check_additional_keys_are_links(cls, values):
    """The `ToplevelLinks` class allows any additional keys, as long as
    they are also Links or Urls themselves.
    """
    for key, value in values.items():
        if key not in cls.schema()["properties"]:
            values[key] = parse_obj_as(Optional[Union[AnyUrl, Link]], value)
    return values