Malli schemas for URPX v0.2.0 entities, describing the coerced shape.
Two-layer model (mirroring the clj-oa3 pattern):
Schemas carry :decode/urpx-jsonld decoders that turn the raw parser output
(strings) into the typed shape described here. The transformer is built and
applied in urpx.coerce. Reference resolution keeps :jsonld/id references
intact; consumers dereference via an entity index.
Schemas are bare def vars referenced by symbol — there is no central registry except inside ConditionExpression, where the recursive Comparison/Boolean operand tree uses a local Malli registry.
Malli schemas for URPX v0.2.0 entities, describing the coerced shape.
Two-layer model (mirroring the clj-oa3 pattern):
- urpx.core — raw parse: JSON-LD with namespaced keys, all string values.
- urpx.schema — coerced shape: typed Clojure values (BigDecimal, LocalDate,
LocalTime, LocalDateTime, Duration, integer month numbers).
Schemas carry `:decode/urpx-jsonld` decoders that turn the raw parser output
(strings) into the typed shape described here. The transformer is built and
applied in `urpx.coerce`. Reference resolution keeps :jsonld/id references
intact; consumers dereference via an entity index.
Schemas are bare def vars referenced by symbol — there is no central registry
except inside ConditionExpression, where the recursive Comparison/Boolean
operand tree uses a local Malli registry.One axis of a customer-profile choice — e.g. 'incomeTier' (with possible values CARE / FERA / Standard) or 'voltageLevel'.
Per upstream urpx commit c9d974f (closes urpx-org/urpx#30), exactly one of urpx:dimensionProperty (xsd:anyURI when a suitable URPX property exists) or urpx:customDimensionProperty (xsd:string fallback) must be present. The xone is enforced by SHACL (pyshacl); we keep the Malli schema open-world and let SHACL catch violations, consistent with the existing stance for analogous customConditionProperty on operand nodes.
One axis of a customer-profile choice — e.g. 'incomeTier' (with possible values CARE / FERA / Standard) or 'voltageLevel'. Per upstream urpx commit c9d974f (closes urpx-org/urpx#30), exactly one of urpx:dimensionProperty (xsd:anyURI when a suitable URPX property exists) or urpx:customDimensionProperty (xsd:string fallback) must be present. The xone is enforced by SHACL (pyshacl); we keep the Malli schema open-world and let SHACL catch violations, consistent with the existing stance for analogous customConditionProperty on operand nodes.
Container for the AlternativeDimension(s) that span a ProfileAlternatives choice (typically a single dimension; multi-dimension matrices possible).
Container for the AlternativeDimension(s) that span a ProfileAlternatives choice (typically a single dimension; multi-dimension matrices possible).
Container for cross-cutting applicability conditions; carried on Price/PriceSet to express things like income-tier eligibility. Extra geographic/customer fields exist in v0.2.0 SHACL but most fixtures only carry name + hasConditionExpression.
Container for cross-cutting applicability conditions; carried on Price/PriceSet to express things like income-tier eligibility. Extra geographic/customer fields exist in v0.2.0 SHACL but most fixtures only carry name + hasConditionExpression.
v0.2.0: hasPriceDefinition is required (min 1) and lives at this level
(not inside Ledger). The v0.1.x BillingModel.hasServiceTier flat vector
is gone — block tiers now live under hasServiceTiers's nested
urpx:hasServiceTier field.
Both hasTOUSchedule and hasServiceTiers are vectors (sh:maxCount
unbounded per BillingModelShape). single-or-vec->vec keeps
single-container fixtures compatible without touching their JSON-LD:
v0.2.0: hasPriceDefinition is required (min 1) and lives at this level
(not inside Ledger). The v0.1.x BillingModel.hasServiceTier flat vector
is gone — block tiers now live under hasServiceTiers's nested
`urpx:hasServiceTier` field.
Both hasTOUSchedule and hasServiceTiers are vectors (sh:maxCount
unbounded per BillingModelShape). `single-or-vec->vec` keeps
single-container fixtures compatible without touching their JSON-LD:
- hasTOUSchedule is a vector for filings that TOU-zone multiple
metric inputs (CPAU E-4 TOU: separate energy + demand schedules,
URPX-qb5).
- hasServiceTiers is a vector for filings with a baseline-allowance
matrix — one ServiceTiers per (territory, code) cell — driven by
ProfileAlternatives selection (PG&E E-TOU-C baseline-tier modifier;
URPX-6hf, per upstream Una guidance on matrix handling).urpx:CompletenessResultValue, 6 members. The coverage verdict on a CoverageClaim. Freshness (urpx:stale) and resolution provenance (urpx:fallbackSourced) are orthogonal booleans, not members here.
urpx:CompletenessResultValue, 6 members. The coverage verdict on a CoverageClaim. Freshness (urpx:stale) and resolution provenance (urpx:fallbackSourced) are orthogonal booleans, not members here.
Recursive condition tree. Uses a local Malli registry to express the ComparisonNode / BooleanOperationNode mutual recursion.
Tree shape: ConditionExpression.rootNode → ComparisonNode | BooleanOperationNode ComparisonNode.{leftOperand,rightOperand} → any operand (recursively) BooleanOperationNode.operandNodes → vector of operands
Where 'operand' is one of: ObjectOperandNode, DatatypeOperandNode, CustomOperandNode, ComparisonNode, BooleanOperationNode.
Recursive condition tree. Uses a local Malli registry to express the
ComparisonNode / BooleanOperationNode mutual recursion.
Tree shape:
ConditionExpression.rootNode → ComparisonNode | BooleanOperationNode
ComparisonNode.{leftOperand,rightOperand} → any operand (recursively)
BooleanOperationNode.operandNodes → vector of operands
Where 'operand' is one of: ObjectOperandNode, DatatypeOperandNode,
CustomOperandNode, ComparisonNode, BooleanOperationNode.A JSON-LD @context, in any of the three forms the spec permits: an inline definition object, an IRI string pointing at a remote context, or an array mixing the two.
The array form is not hypothetical: every v0.5.1 test case shipped with urpx-org/urpx carries ["https://urpx.org/ns/context/releases/v0.5.1/jsonld/urpx-context.jsonld" {"prefix": "..."}] a remote context followed by a local prefix map, so typing this as :map alone rejected the standard's own reference documents.
Deliberately permissive. clj-urpx never interprets @context: it round-trips it untouched and urpx.emit attaches its own. There is no consumer path that a tighter shape would protect, so the only thing a narrower type can do here is reject valid input.
A JSON-LD @context, in any of the three forms the spec permits: an inline
definition object, an IRI string pointing at a remote context, or an array
mixing the two.
The array form is not hypothetical: every v0.5.1 test case shipped with
urpx-org/urpx carries
["https://urpx.org/ns/context/releases/v0.5.1/jsonld/urpx-context.jsonld"
{"prefix": "..."}]
a remote context followed by a local prefix map, so typing this as :map
alone rejected the standard's own reference documents.
Deliberately permissive. clj-urpx never interprets @context: it round-trips
it untouched and urpx.emit attaches its own. There is no consumer path that
a tighter shape would protect, so the only thing a narrower type can do here
is reject valid input.What a version snapshot claims to cover. urpx:completenessResult is the one required field (sh:minCount 1 on urpx-shacl:CoverageClaimShape).
What a version snapshot claims to cover. urpx:completenessResult is the one required field (sh:minCount 1 on urpx-shacl:CoverageClaimShape).
v0.2.0: greatly expanded; we list the few properties we currently consume plus hasCustomerKind which is the canonical test-case dispatch in the fixtures.
v0.2.0: greatly expanded; we list the few properties we currently consume plus hasCustomerKind which is the canonical test-case dispatch in the fixtures.
Like DatatypeOperandNode but with a free-form customConditionProperty
string in lieu of a Ref-valued conditionProperty. Useful when the
condition property isn't yet in the URPX vocabulary (e.g. PG&E's
departureVintage).
Like DatatypeOperandNode but with a free-form `customConditionProperty` string in lieu of a Ref-valued conditionProperty. Useful when the condition property isn't yet in the URPX vocabulary (e.g. PG&E's `departureVintage`).
v0.2.0: many new optional fields. mediaType is now Ref-only (no longer string); we list the most commonly populated fields.
v0.2.0: many new optional fields. mediaType is now Ref-only (no longer string); we list the most commonly populated fields.
Typed-literal operand. Carries optional conditionProperty (a Ref) and one typed value field. SHACL's sh:xone enforces 'exactly one value field'; the coercer simply decodes whichever is present.
Typed-literal operand. Carries optional conditionProperty (a Ref) and one typed value field. SHACL's sh:xone enforces 'exactly one value field'; the coercer simply decodes whichever is present.
v0.2.0: closed shape. hasCustomerProfile is gone (moved to Scenario). hasConditionExpression is the only required body field.
v0.2.0: closed shape. hasCustomerProfile is gone (moved to Scenario). hasConditionExpression is the only required body field.
(enum-ref & locals)A JSON-LD @id reference restricted to a fixed vocabulary: like Ref, but the
id must be one of locals, each given bare and prefixed with "urpx:" here.
URPX encodes these as IRI references rather than strings, so a value arrives as {:jsonld/id "urpx:complete"} and this checks membership of that id. Upstream they are owl:oneOf classes enforced through sh:in at the property.
A JSON-LD @id reference restricted to a fixed vocabulary: like `Ref`, but the
id must be one of `locals`, each given bare and prefixed with "urpx:" here.
URPX encodes these as IRI references rather than strings, so a value arrives
as {:jsonld/id "urpx:complete"} and this checks membership of that id.
Upstream they are owl:oneOf classes enforced through sh:in at the property.How a coverage claim was arrived at: who evaluated it, when, and of what kind. Reached from CoverageClaim via urpx:explainedBy.
How a coverage claim was arrived at: who evaluated it, when, and of what kind. Reached from CoverageClaim via urpx:explainedBy.
urpx:EvaluationKindValue, 5 members.
urpx:EvaluationKindValue, 5 members.
urpx:ExclusionReasonValue, 4 members. New at v0.5.1.
urpx:ExclusionReasonValue, 4 members. New at v0.5.1.
A JSON-LD @id reference used where an INLINE NODE is the alternative, as in
[:or SomeEntity ExclusiveRef]. Closed, unlike Ref, and that is the whole
point: Ref is an open map, so an [:or Node Ref] whose second arm is Ref
matches any map carrying a :jsonld/id and the node arm is never reached.
A malformed inline node then validates as though it were a reference.
Closing it means a bare reference still passes while anything richer must
satisfy the node schema.
Closed to @id ALONE, deliberately. A node that asserts an @type is asserting something about itself and should be validated as a node of that type, not waved through as a reference; without this, an @id paired with any @type at all passes whatever slot it sits in. Every one of the 15,295 bare references in the urpx-rate-plans corpus carries @id and nothing else, so this costs nothing real.
Use Ref for reference-only properties, where no inline form is permitted
and openness costs nothing.
A JSON-LD @id reference used where an INLINE NODE is the alternative, as in [:or SomeEntity ExclusiveRef]. Closed, unlike `Ref`, and that is the whole point: `Ref` is an open map, so an [:or Node Ref] whose second arm is `Ref` matches any map carrying a :jsonld/id and the node arm is never reached. A malformed inline node then validates as though it were a reference. Closing it means a bare reference still passes while anything richer must satisfy the node schema. Closed to @id ALONE, deliberately. A node that asserts an @type is asserting something about itself and should be validated as a node of that type, not waved through as a reference; without this, an @id paired with any @type at all passes whatever slot it sits in. Every one of the 15,295 bare references in the urpx-rate-plans corpus carries @id and nothing else, so this costs nothing real. Use `Ref` for reference-only properties, where no inline form is permitted and openness costs nothing.
v0.2.0: holidayName is required. Observance can be a literal date (urpx:holidayDate) or a free-form rule string (urpx:holidayRule); urpx:observanceRule (Ref) optionally shifts the date when it lands on a weekend.
v0.2.0: holidayName is required. Observance can be a literal date (urpx:holidayDate) or a free-form rule string (urpx:holidayRule); urpx:observanceRule (Ref) optionally shifts the date when it lands on a weekend.
An xsd:integer field — JSON parser may produce long already, but tolerate strings.
An xsd:integer field — JSON parser may produce long already, but tolerate strings.
v0.2.0: Ledger no longer carries hasPriceDefinition. PriceDefinitions live at BillingModel.hasPriceDefinition with PriceDefinition.referencesLedger pointing back to one of the BillingModel.hasLedger entries.
v0.2.0: Ledger no longer carries hasPriceDefinition. PriceDefinitions live at BillingModel.hasPriceDefinition with PriceDefinition.referencesLedger pointing back to one of the BillingModel.hasLedger entries.
Something a PricingModel deliberately leaves out, and why. New in v0.5.1. urpx:PricingModel is not modeled in clj-urpx, so excludedModel stays a Ref.
Something a PricingModel deliberately leaves out, and why. New in v0.5.1. urpx:PricingModel is not modeled in clj-urpx, so excludedModel stays a Ref.
Common JSON-LD identity fields present on most entities.
Common JSON-LD identity fields present on most entities.
Ref-valued operand. sh:xone in SHACL constrains exactly one of conditionProperty, referencesValue, or referencesMetricInput to be present; we don't enforce that here — let pyshacl be the strict validator.
Ref-valued operand. sh:xone in SHACL constrains exactly one of conditionProperty, referencesValue, or referencesMetricInput to be present; we don't enforce that here — let pyshacl be the strict validator.
v0.2.0: legalName is now optional; organizationType is required. urpx:eiaId is gone — utility identifiers now live under hasIdentity → urpx:OrganizationIdentity (not modeled here yet).
v0.2.0: legalName is now optional; organizationType is required. urpx:eiaId is gone — utility identifiers now live under hasIdentity → urpx:OrganizationIdentity (not modeled here yet).
A typed external identifier for an organization, hung off urpx:hasIdentity. v0.5.1 reshaped this: urpx:identifierScheme and urpx:utilityId are gone and skos:notation plus urpx:scheme are now required. An EIA id rides here as notation under the EIA scheme rather than as the former urpx:eiaId.
A typed external identifier for an organization, hung off urpx:hasIdentity. v0.5.1 reshaped this: urpx:identifierScheme and urpx:utilityId are gone and skos:notation plus urpx:scheme are now required. An EIA id rides here as notation under the EIA scheme rather than as the former urpx:eiaId.
v0.2.0: gains optional urpx:hasProfileAlternatives for declarative
customer-or-configuration choices (income tier, voltage configuration,
PCIA default tier, …). Each ProfileAlternatives is referenced by a
PriceSetAlternatives at Prices.hasPriceSetAlternatives — the per-customer
selection that determines which alternative's prices apply.
v0.2.0: gains optional `urpx:hasProfileAlternatives` for declarative customer-or-configuration choices (income tier, voltage configuration, PCIA default tier, …). Each ProfileAlternatives is referenced by a PriceSetAlternatives at Prices.hasPriceSetAlternatives — the per-customer selection that determines which alternative's prices apply.
v0.2.0: many new optional value fields (adder, amount, basePrice, basedOnPrice, currentPrice, multiplier) and metadata (hasApplicabilityGroup, hasRateCase, …). referencesPriceDefinition is sh:maxCount 1 (still required in practice for any per-energy price).
v0.2.0: many new optional value fields (adder, amount, basePrice, basedOnPrice, currentPrice, multiplier) and metadata (hasApplicabilityGroup, hasRateCase, …). referencesPriceDefinition is sh:maxCount 1 (still required in practice for any per-energy price).
v0.2.0: PriceDefinition gains required referencesLedger plus many properties that used to live on Price (priceCurrency, primaryChargeType, referencesServiceTier, referencesTouPeriod, serviceTierNumber, …). One PD can govern many Prices via Price.referencesPriceDefinition.
v0.2.0: PriceDefinition gains required referencesLedger plus many properties that used to live on Price (priceCurrency, primaryChargeType, referencesServiceTier, referencesTouPeriod, serviceTierNumber, …). One PD can govern many Prices via Price.referencesPriceDefinition.
A PriceDefinition a snapshot relies on, and whether its content is included here or has to be retrieved elsewhere. urpx:referenceInclusion is required. urpx:ModelCollection is not modeled, so resolvedFrom stays a Ref vector.
A PriceDefinition a snapshot relies on, and whether its content is included here or has to be retrieved elsewhere. urpx:referenceInclusion is required. urpx:ModelCollection is not modeled, so resolvedFrom stays a Ref vector.
v0.2.0: gains optional urpx:hasPriceSetAlternatives for customer-profile-
driven price selection. Each PriceSetAlternatives references a sibling
ProfileAlternatives (declared at PlanElements.hasProfileAlternatives) and
exposes one PriceSetAlternative per ProfileAlternative.
v0.2.0: gains optional `urpx:hasPriceSetAlternatives` for customer-profile- driven price selection. Each PriceSetAlternatives references a sibling ProfileAlternatives (declared at PlanElements.hasProfileAlternatives) and exposes one PriceSetAlternative per ProfileAlternative.
One Price-bearing alternative within a PriceSetAlternatives set.
Carries Price-like top-level fields (chargeType, billPortion, …) plus
the required referencesProfileAlternative Ref linking it to one of
the sibling ProfileAlternatives, plus hasPrice (1..*) for the actual
prices that apply when this alternative is selected.
One Price-bearing alternative within a PriceSetAlternatives set. Carries Price-like top-level fields (chargeType, billPortion, …) plus the required `referencesProfileAlternative` Ref linking it to one of the sibling ProfileAlternatives, plus `hasPrice` (1..*) for the actual prices that apply when this alternative is selected.
Top-level container for a customer-profile-driven price selection. Lives at Prices.hasPriceSetAlternatives. References one ProfileAlternatives (declared at PlanElements.hasProfileAlternatives) whose alternatives drive per-PriceSetAlternative choice.
Top-level container for a customer-profile-driven price selection. Lives at Prices.hasPriceSetAlternatives. References one ProfileAlternatives (declared at PlanElements.hasProfileAlternatives) whose alternatives drive per-PriceSetAlternative choice.
A single named alternative within a ProfileAlternatives set. The
hasConditionExpression says how to determine whether this alternative
applies to a given customer; defaultSelectionLogic is a free-form
tie-breaker / default note when conditions don't disambiguate.
A single named alternative within a ProfileAlternatives set. The `hasConditionExpression` says how to determine whether this alternative applies to a given customer; `defaultSelectionLogic` is a free-form tie-breaker / default note when conditions don't disambiguate.
Top-level declaration of a customer-profile-driven choice. Lives at PlanElements.hasProfileAlternatives. PriceSetAlternatives reference one ProfileAlternatives via urpx:referencesProfileAlternatives, and each PriceSetAlternative within the set selects ONE of its sibling ProfileAlternatives via urpx:referencesProfileAlternative.
Top-level declaration of a customer-profile-driven choice. Lives at PlanElements.hasProfileAlternatives. PriceSetAlternatives reference one ProfileAlternatives via urpx:referencesProfileAlternatives, and each PriceSetAlternative within the set selects ONE of its sibling ProfileAlternatives via urpx:referencesProfileAlternative.
v0.2.0: NEW. Identifies the regulatory proceeding that authorized a PriceDefinition / RatePlanVersion / Price / PriceSet.
v0.2.0: NEW. Identifies the regulatory proceeding that authorized a PriceDefinition / RatePlanVersion / Price / PriceSet.
v0.2.0: ratePlanUniqueIdentifier is required (replaces v0.1.x ratePlanIdentifier). RatePlan gains many optional date/metadata fields; we list the ones the tests / consumers care about.
v0.2.0: ratePlanUniqueIdentifier is required (replaces v0.1.x ratePlanIdentifier). RatePlan gains many optional date/metadata fields; we list the ones the tests / consumers care about.
A typed external identifier for a urpx:RatePlan, e.g. a CPUC MIDAS RIN.
A typed external identifier for a urpx:RatePlan, e.g. a CPUC MIDAS RIN.
v0.2.0: modifierUniqueIdentifier is required (was per-version in v0.1.x). urpx:isOptional is gone.
v0.2.0: modifierUniqueIdentifier is required (was per-version in v0.1.x). urpx:isOptional is gone.
Parallel to RatePlanIdentifier, for a urpx:RatePlanModifier.
Parallel to `RatePlanIdentifier`, for a urpx:RatePlanModifier.
v0.2.0: changeReason, serviceRole, publishedBy, modifierVersionNumber are now required. modifierIdentifier is gone — it moved to RatePlanModifier as modifierUniqueIdentifier.
v0.2.0: changeReason, serviceRole, publishedBy, modifierVersionNumber are now required. modifierIdentifier is gone — it moved to RatePlanModifier as modifierUniqueIdentifier.
v0.2.0: changeReason, serviceRole, publishedBy are now required; gains customerChoice, isDefault, hasModifierOptions, hasRateCase, supersedes, plus a set of date/dateTime metadata fields. We list the fields we currently consume plus the headline metadata.
v0.2.0: changeReason, serviceRole, publishedBy are now required; gains customerChoice, isDefault, hasModifierOptions, hasRateCase, supersedes, plus a set of date/dateTime metadata fields. We list the fields we currently consume plus the headline metadata.
A JSON-LD @id reference: {:jsonld/id "urpx:foo"}. Resolved against the entity index built from the parsed document.
A JSON-LD @id reference: {:jsonld/id "urpx:foo"}.
Resolved against the entity index built from the parsed document.urpx:ReferenceInclusionValue, 2 members.
urpx:ReferenceInclusionValue, 2 members.
v0.2.0: NEW. EligibilityRule.hasCustomerProfile moved here. SHACL's sh:or constraint requires either hasCustomerProfile xor hasServicePointProfile; we treat both as optional.
v0.2.0: NEW. EligibilityRule.hasCustomerProfile moved here. SHACL's sh:or constraint requires either hasCustomerProfile xor hasServicePointProfile; we treat both as optional.
v0.2.0 + 423e83f: contextual boundary definition for a ServiceTier. Carries the bounds + bound operators that previously lived inline on ServiceTier, plus optional appliesInSeason / referencesProfileAlternative qualifiers so a single logical tier (one ServiceTier, identified by serviceTierNumber) can carry season- or PA-specific bound variants by attaching multiple ServiceBrackets via ServiceTier.hasServiceBracket.
SHACL enforces sh:or three branches (lower-only, upper-only, or both bounds + matching operators); Malli stays open-world, consistent with the customDimensionProperty / customConditionProperty pattern.
v0.2.0 + 423e83f: contextual boundary definition for a ServiceTier. Carries the bounds + bound operators that previously lived inline on ServiceTier, plus optional appliesInSeason / referencesProfileAlternative qualifiers so a single logical tier (one ServiceTier, identified by serviceTierNumber) can carry season- or PA-specific bound variants by attaching multiple ServiceBrackets via ServiceTier.hasServiceBracket. SHACL enforces sh:or three branches (lower-only, upper-only, or both bounds + matching operators); Malli stays open-world, consistent with the customDimensionProperty / customConditionProperty pattern.
v0.2.0 + 423e83f: bounds moved off ServiceTier onto attached ServiceBracket instances (Decision #111). ServiceTier carries only the logical identity (serviceTierNumber + optional name); hasServiceBracket carries 1+ bound-bearing brackets, optionally qualified by season or ProfileAlternative for matrix-cell variants of the same logical tier.
v0.2.0 + 423e83f: bounds moved off ServiceTier onto attached ServiceBracket instances (Decision #111). ServiceTier carries only the logical identity (serviceTierNumber + optional name); hasServiceBracket carries 1+ bound-bearing brackets, optionally qualified by season or ProfileAlternative for matrix-cell variants of the same logical tier.
v0.2.0 + 0994aec: container holding the block-tier vector. Carries the referencesMetricInput pointer that used to live on individual ServiceTiers in v0.1.x.
:urpx/appliesInSeason allows seasonal grouping — a single ProfileAlternative-keyed ServiceTiers can be split into per-season containers (e.g., baseline-tier summer/winter pair) without nesting season into serviceTierNumber.
:urpx/referencesProfileAlternative wires a per-cell ServiceTiers to one ProfileAlternative within a matrix-style hasServiceTiers vector (e.g., territory × code combinations for the PG&E E-TOU-C baseline-tier modifier).
v0.2.0 + 0994aec: container holding the block-tier vector. Carries the referencesMetricInput pointer that used to live on individual ServiceTiers in v0.1.x. :urpx/appliesInSeason allows seasonal grouping — a single ProfileAlternative-keyed ServiceTiers can be split into per-season containers (e.g., baseline-tier summer/winter pair) without nesting season into serviceTierNumber. :urpx/referencesProfileAlternative wires a per-cell ServiceTiers to one ProfileAlternative within a matrix-style hasServiceTiers vector (e.g., territory × code combinations for the PG&E E-TOU-C baseline-tier modifier).
An external published source a URPX fact cites: a tariff book, a statement, a market price feed. Neither a super- nor a subclass of urpx:URPXPackage; they are siblings.
Dual-accept: the @type admits both the v0.5.1 urpx:SourcePublication and the
v0.2.x urpx:TariffPublication, because the corpus migrates utility by
utility and carries both at once. That is also why this schema has no DSL
builder: urpx.dsl/make-builder requires a [:= "..."] type entry and
throws on an :enum.
urpx-shacl:SourcePublicationShape has 23 paths and requires nothing. The entries below it are v0.2.1 TariffPublicationShape paths that v0.5.1 drops; the vendored PG&E fixtures carry hasRatePlan and hasRatePlanModifier, so omitting them would break the suite.
An external published source a URPX fact cites: a tariff book, a statement, a market price feed. Neither a super- nor a subclass of urpx:URPXPackage; they are siblings. Dual-accept: the @type admits both the v0.5.1 urpx:SourcePublication and the v0.2.x urpx:TariffPublication, because the corpus migrates utility by utility and carries both at once. That is also why this schema has no DSL builder: `urpx.dsl/make-builder` requires a `[:= "..."]` type entry and throws on an `:enum`. urpx-shacl:SourcePublicationShape has 23 paths and requires nothing. The entries below it are v0.2.1 TariffPublicationShape paths that v0.5.1 drops; the vendored PG&E fixtures carry hasRatePlan and hasRatePlanModifier, so omitting them would break the suite.
urpx:SourcePublicationTypeValue, 8 members, plus one legacy value.
The class was urpx:SourcePublicationType at the epic baseline and is Value-suffixed at 95eb8e22, same 8 members. Do NOT reuse the retired 10-member urpx:PublicationTypeValue, which has zero occurrences at v0.5.1.
urpx:regulatoryFiling is a member of that retired class and is the ONLY publicationType value the corpus uses: 8 occurrences across 6 filings. It has no successor among the 8, so enforcing the v0.5.1 list alone would reject those filings outright. It is accepted here as a documented legacy member and should be dropped once the last migration wave lands.
urpx:SourcePublicationTypeValue, 8 members, plus one legacy value. The class was urpx:SourcePublicationType at the epic baseline and is Value-suffixed at 95eb8e22, same 8 members. Do NOT reuse the retired 10-member urpx:PublicationTypeValue, which has zero occurrences at v0.5.1. urpx:regulatoryFiling is a member of that retired class and is the ONLY publicationType value the corpus uses: 8 occurrences across 6 filings. It has no successor among the 8, so enforcing the v0.5.1 list alone would reject those filings outright. It is accepted here as a documented legacy member and should be dropped once the last migration wave lands.
v0.2.x only. urpx:TariffBookReference was DELETED upstream in bbaea780 and has zero occurrences in the v0.5.1 ontology and SHACL; its fields moved inline onto urpx:DataSourceReference, whose shape is now sh:closed. Retained to validate v0.2.x filings, which is every filing in the corpus today. Remove only once the last migration wave lands.
v0.2.x only. urpx:TariffBookReference was DELETED upstream in bbaea780 and has zero occurrences in the v0.5.1 ontology and SHACL; its fields moved inline onto urpx:DataSourceReference, whose shape is now sh:closed. Retained to validate v0.2.x filings, which is every filing in the corpus today. Remove only once the last migration wave lands.
The URPX content unit of the v0.3.0 publication split, the half that carries pricing rather than citing a source. v0.5.1 only; there is no v0.2.x equivalent to dual-accept.
urpx:containsPricingModel is the shape's only required property and is unbounded. urpx:PricingModel is not modeled in clj-urpx, so it and the other entity-valued slots stay loose maps rather than typed schemas.
The URPX content unit of the v0.3.0 publication split, the half that carries pricing rather than citing a source. v0.5.1 only; there is no v0.2.x equivalent to dual-accept. urpx:containsPricingModel is the shape's only required property and is unbounded. urpx:PricingModel is not modeled in clj-urpx, so it and the other entity-valued slots stay loose maps rather than typed schemas.
URPX v0.2.0 Decision #103: every urpx:URPXDocument carries a required urpx:targetURPXVersion (xsd:anyURI) declaring the ontology version the document was authored against. URPXDocumentShape (SHACL) lists many optional metadata fields (dateCreated, version, hasRatePlan, hasRatePlanModifier, hasTariffPublication, …) — we model only the required field plus the headline payload pointers; additional metadata flows through unvalidated.
Documents that aren't URPXDocument-wrapped (raw RatePlan, raw
RatePlanModifier, or a JSON-LD @graph doc with no urpx:URPXDocument
@type) bypass this shape — its target is the v0.2.0 wrapper class
itself, not every URPX serialization.
URPX v0.2.0 Decision #103: every urpx:URPXDocument carries a required urpx:targetURPXVersion (xsd:anyURI) declaring the ontology version the document was authored against. URPXDocumentShape (SHACL) lists many optional metadata fields (dateCreated, version, hasRatePlan, hasRatePlanModifier, hasTariffPublication, …) — we model only the required field plus the headline payload pointers; additional metadata flows through unvalidated. Documents that aren't URPXDocument-wrapped (raw RatePlan, raw RatePlanModifier, or a JSON-LD `@graph` doc with no urpx:URPXDocument @type) bypass this shape — its target is the v0.2.0 wrapper class itself, not every URPX serialization.
v0.3.0 renamed urpx:URPXDocument to urpx:URPXPackage; v0.5.1 keeps the class. urpx:targetURPXVersion stays required. Against URPXDocument the shape drops urpx:hasTariffPublication and adds urpx:packages, the general containment pointer (range: RatePlan | RatePlanModifier | RatePlanVersion | RatePlanModifierVersion | PricingModel | TariffFiling | SourcePublication), while retaining urpx:hasRatePlan and urpx:hasRatePlanModifier. Read from urpx-shacl:URPXPackageShape at urpx-org/urpx 95eb8e22 (v0.5.1-candidate).
As with URPXDocument, only the required field and the payload pointers are modeled; other wrapper metadata flows through unvalidated.
v0.3.0 renamed urpx:URPXDocument to urpx:URPXPackage; v0.5.1 keeps the class. urpx:targetURPXVersion stays required. Against URPXDocument the shape drops urpx:hasTariffPublication and adds urpx:packages, the general containment pointer (range: RatePlan | RatePlanModifier | RatePlanVersion | RatePlanModifierVersion | PricingModel | TariffFiling | SourcePublication), while retaining urpx:hasRatePlan and urpx:hasRatePlanModifier. Read from urpx-shacl:URPXPackageShape at urpx-org/urpx 95eb8e22 (v0.5.1-candidate). As with URPXDocument, only the required field and the payload pointers are modeled; other wrapper metadata flows through unvalidated.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |