httk.core.entry_provider¶
The neutral entry-provider contract shared across httk₂ modules.
An EntryProvider supplies queryable entry types — named collections
of records with described properties — to consumers that expose them, for
example an OPTIMADE server. The contract is deliberately domain-neutral: nothing here is
specific to materials science (or to OPTIMADE). A materials module such as
httk.atomistic implements a provider that serves its structures from
this contract, and a serving module such as httk.optimade consumes any
provider without depending on the domain module.
Classes¶
One related entry of a record, as reported by |
|
Supplies described, queryable entry types as plain JSON-able records. |
Module Contents¶
- class httk.core.entry_provider.RelatedEntry[source]¶
One related entry of a record, as reported by
EntryProvider.relationships().Mirrors the OPTIMADE v1.3 relationships model: a related entry is named by its entry type and id, optionally carrying the per-identifier metadata the standard defines —
description(the human-readable relationship description introduced in OPTIMADE v1.2 asmeta.description) androle(the machine-readable relationship role introduced in OPTIMADE v1.3 asmeta.role, e.g."input"/"output"for the calculations↔files relationship). An absentrolemeans exactly that — no role is declared and no default is assumed.
- class httk.core.entry_provider.EntryProvider[source]¶
Bases:
abc.ABCSupplies described, queryable entry types as plain JSON-able records.
A provider serves one or more entry types, each identified by a name (e.g.
"structures"). For every entry type it describes the entry type and its properties, states how each served property maps to a record key, and yields the records themselves.Three notions define the contract:
Definitions (
entry_types()) are first-classEntryTypeDefinitionobjects — the OPTIMADE property-definition model shared across httk₂ modules. A provider obtains them from the vendored standards (viastandard_entry_type()orload_entry_type_definition()) or builds them fromfrom_optimade()andfrom_simple(). A standard definition typically describes more properties than a provider serves; the served subset is exactly the property names inproperty_keys().Property keys (
property_keys()) map each served property name to the key under which that property’s value is found in a record. Every entry type’s property-key map MUST cover at leastidandtype, and every served name MUST be described by the entry type’s definition (custom properties must therefore live in anextended()definition).Records (
records()) are plain JSON-able mappings keyed by the record keys named inproperty_keys()(values are strings, numbers, booleans,None, or nested lists/dicts of the same).
A consumer combines the three: the definitions become the served schema, the property keys drive both response-field extraction and filter handling, and the records are loaded into a store the consumer queries.
A provider may additionally declare relationships (
relationships()): a flat tuple ofRelatedEntryvalues per entry id, each naming a related entry (and optionally the relationship’sdescription/rolemetadata) that the consumer serves as the entry’s relationships block.- abstractmethod entry_types() collections.abc.Mapping[str, httk.core.property_definitions.EntryTypeDefinition][source]¶
Return the served entry types keyed by name.
Each value is an
EntryTypeDefinitiondescribing the entry type and its properties. The subset a provider actually serves is named byproperty_keys(); a definition may describe more properties than are served.
- abstractmethod property_keys(entry_type: str) collections.abc.Mapping[str, str][source]¶
Return the served-property-name to record-key map for
entry_type.The mapping MUST include entries for at least
idandtype. Every key names a property described byentry_types(); every value names the key under which that property’s value is found in a record fromrecords().
- abstractmethod records(entry_type: str) collections.abc.Iterable[collections.abc.Mapping[str, Any]][source]¶
Yield the records for
entry_typeas plain JSON-able mappings.Each record is a mapping keyed by the record keys named in
property_keys(); values are JSON-able (strings, numbers, booleans,None, or nested lists/dicts of the same).
- relationships(entry_type: str) collections.abc.Mapping[str, tuple[RelatedEntry, Ellipsis]][source]¶
Return the related entries for each record of
entry_type.The result maps an entry id to a flat tuple of
RelatedEntryvalues, e.g.{"struct-1": (RelatedEntry("references", "ref-1"), RelatedEntry("references", "ref-2", description="Cites the method"))}. Grouping the related entries by related entry type is the serving layer’s concern (JSON:API groups them at render time). This is the neutral source of an OPTIMADE relationships block: a consumer turns each related entry into a resource identifier under its entry type (carrying thedescription/rolemetadata when present), and aninclude=<type>request then embeds those related resources. The default implementation returns an empty mapping (no relationships); a provider overrides it to declare them. Ids referring to records this provider (or a sibling provider serving the related type) does not supply are simply not resolvable by the consumer.