diff --git a/docs/user-guide/resources-construction.md b/docs/user-guide/resources-construction.md index 1119711c..03d84986 100644 --- a/docs/user-guide/resources-construction.md +++ b/docs/user-guide/resources-construction.md @@ -59,7 +59,7 @@ snapshot_structure_def = { "max": "1", "type": [{"code": "string"}], "definition": "A legacy patient's full name", - "base": {"path": "Resource", "min": 0, "max": "*"}, + "base": {"path": "Element", "min": 0, "max": "1"}, } ] } diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/age.py b/fhircraft/fhir/resources/datatypes/R4/complex/age.py index 23833744..5fd01ad0 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/age.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/age.py @@ -13,7 +13,7 @@ class Age(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_age_1_constraint_model_validator(self): + def FHIR_age_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (value.empty() or value.hasValue().not() or value > 0)", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/attachment.py b/fhircraft/fhir/resources/datatypes/R4/complex/attachment.py index a1ad4bd8..4f5a4224 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/attachment.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/attachment.py @@ -88,7 +88,7 @@ class Attachment(Element): ) @model_validator(mode="after") - def FHIR_att_1_constraint_model_validator(self): + def FHIR_att_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or contentType.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/contact_point.py b/fhircraft/fhir/resources/datatypes/R4/complex/contact_point.py index faaad52e..e7f51868 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/contact_point.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/contact_point.py @@ -56,7 +56,7 @@ class ContactPoint(Element): ) @model_validator(mode="after") - def FHIR_cpt_2_constraint_model_validator(self): + def FHIR_cpt_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/count.py b/fhircraft/fhir/resources/datatypes/R4/complex/count.py index f6942608..af6eaa91 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/count.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/count.py @@ -14,7 +14,7 @@ class Count(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_cnt_3_constraint_model_validator(self): + def FHIR_cnt_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (code.empty() or code = '1') and (value.empty() or value.hasValue().not() or value.toString().contains('.').not())", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/distance.py b/fhircraft/fhir/resources/datatypes/R4/complex/distance.py index 06bdcfcc..74f40b9b 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/distance.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/distance.py @@ -14,7 +14,7 @@ class Distance(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_dis_1_constraint_model_validator(self): + def FHIR_dis_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum)", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/duration.py b/fhircraft/fhir/resources/datatypes/R4/complex/duration.py index b708f446..fb846688 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/duration.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/duration.py @@ -14,7 +14,7 @@ class Duration(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_drt_1_constraint_model_validator(self): + def FHIR_drt_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.exists() implies ((system = %ucum) and value.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/element.py b/fhircraft/fhir/resources/datatypes/R4/complex/element.py index 44abb3d4..fa5252e8 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/element.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/element.py @@ -29,7 +29,7 @@ class Element(FHIRBaseModel): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return fhir_validators.validate_element_constraint( self, elements=(list(self.__class__.model_fields.keys())), diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/element_definition.py b/fhircraft/fhir/resources/datatypes/R4/complex/element_definition.py index fd8b71b1..2d1e57e0 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/element_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/element_definition.py @@ -2109,7 +2109,7 @@ def FHIR_eld_12_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return validate_model_constraint( self, expression="hasValue() or (children().count() > id.count())", @@ -2342,7 +2342,7 @@ def maxValue_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_eld_2_constraint_model_validator(self): + def FHIR_eld_2_constraint_validator(self): return validate_model_constraint( self, expression="min.empty() or max.empty() or (max = '*') or iif(max != '*', min <= max.toInteger())", @@ -2352,7 +2352,7 @@ def FHIR_eld_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_5_constraint_model_validator(self): + def FHIR_eld_5_constraint_validator(self): return validate_model_constraint( self, expression="contentReference.empty() or (type.empty() and defaultValue.empty() and fixed.empty() and pattern.empty() and example.empty() and minValue.empty() and maxValue.empty() and maxLength.empty() and binding.empty())", @@ -2362,7 +2362,7 @@ def FHIR_eld_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_6_constraint_model_validator(self): + def FHIR_eld_6_constraint_validator(self): return validate_model_constraint( self, expression="fixed.empty() or (type.count() <= 1)", @@ -2372,7 +2372,7 @@ def FHIR_eld_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_7_constraint_model_validator(self): + def FHIR_eld_7_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or (type.count() <= 1)", @@ -2382,7 +2382,7 @@ def FHIR_eld_7_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_8_constraint_model_validator(self): + def FHIR_eld_8_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or fixed.empty()", @@ -2392,7 +2392,7 @@ def FHIR_eld_8_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_11_constraint_model_validator(self): + def FHIR_eld_11_constraint_validator(self): return validate_model_constraint( self, expression="binding.empty() or type.code.empty() or type.select((code = 'code') or (code = 'Coding') or (code='CodeableConcept') or (code = 'Quantity') or (code = 'string') or (code = 'uri')).exists()", @@ -2402,7 +2402,7 @@ def FHIR_eld_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_13_constraint_model_validator(self): + def FHIR_eld_13_constraint_validator(self): return validate_model_constraint( self, expression="type.select(code).isDistinct()", @@ -2412,7 +2412,7 @@ def FHIR_eld_13_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_14_constraint_model_validator(self): + def FHIR_eld_14_constraint_validator(self): return validate_model_constraint( self, expression="constraint.select(key).isDistinct()", @@ -2422,7 +2422,7 @@ def FHIR_eld_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_15_constraint_model_validator(self): + def FHIR_eld_15_constraint_validator(self): return validate_model_constraint( self, expression="defaultValue.empty() or meaningWhenMissing.empty()", @@ -2432,7 +2432,7 @@ def FHIR_eld_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_16_constraint_model_validator(self): + def FHIR_eld_16_constraint_validator(self): return validate_model_constraint( self, expression="sliceName.empty() or sliceName.matches('^[a-zA-Z0-9\\/\\-_\\[\\]\\@]+$')", @@ -2442,7 +2442,7 @@ def FHIR_eld_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_18_constraint_model_validator(self): + def FHIR_eld_18_constraint_validator(self): return validate_model_constraint( self, expression="(isModifier.exists() and isModifier) implies isModifierReason.exists()", @@ -2452,7 +2452,7 @@ def FHIR_eld_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_19_constraint_model_validator(self): + def FHIR_eld_19_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\.[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\[x\\])?(\\:[^\\s\\.]+)?)*$')""", @@ -2462,7 +2462,7 @@ def FHIR_eld_19_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_20_constraint_model_validator(self): + def FHIR_eld_20_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[A-Za-z][A-Za-z0-9]*(\\.[a-z][A-Za-z0-9]*(\\[x])?)*$')""", @@ -2472,7 +2472,7 @@ def FHIR_eld_20_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_22_constraint_model_validator(self): + def FHIR_eld_22_constraint_validator(self): return validate_model_constraint( self, expression="sliceIsConstraining.exists() implies sliceName.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/expression.py b/fhircraft/fhir/resources/datatypes/R4/complex/expression.py index 0d0977fd..c2f95ac4 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/expression.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/expression.py @@ -62,7 +62,7 @@ class Expression(Element): ) @model_validator(mode="after") - def FHIR_exp_1_constraint_model_validator(self): + def FHIR_exp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="expression.exists() or reference.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/extension.py b/fhircraft/fhir/resources/datatypes/R4/complex/extension.py index a87dc003..0e475ee7 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/extension.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/extension.py @@ -417,7 +417,7 @@ def value(self): ) @model_validator(mode="after") - def FHIR_ext_1_constraint_model_validator(self): + def FHIR_ext_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="extension.exists() != value.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/money_quantity.py b/fhircraft/fhir/resources/datatypes/R4/complex/money_quantity.py index 9c810f71..7406ed24 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/money_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/money_quantity.py @@ -13,7 +13,7 @@ class MoneyQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_mqty_1_constraint_model_validator(self): + def FHIR_mqty_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = 'urn:iso:std:iso:4217')", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/period.py b/fhircraft/fhir/resources/datatypes/R4/complex/period.py index bd44352a..8fd6e18c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/period.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/period.py @@ -35,7 +35,7 @@ class Period(Element): ) @model_validator(mode="after") - def FHIR_per_1_constraint_model_validator(self): + def FHIR_per_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.hasValue().not() or end.hasValue().not() or (start <= end)", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/quantity.py b/fhircraft/fhir/resources/datatypes/R4/complex/quantity.py index d5840ec2..b1373cca 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/quantity.py @@ -61,7 +61,7 @@ class Quantity(Element): ) @model_validator(mode="after") - def FHIR_qty_3_constraint_model_validator(self): + def FHIR_qty_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/range.py b/fhircraft/fhir/resources/datatypes/R4/complex/range.py index 20bc9ea6..8035a1ae 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/range.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/range.py @@ -26,7 +26,7 @@ class Range(Element): ) @model_validator(mode="after") - def FHIR_rng_2_constraint_model_validator(self): + def FHIR_rng_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="low.empty() or high.empty() or (low <= high)", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/ratio.py b/fhircraft/fhir/resources/datatypes/R4/complex/ratio.py index 4ae5908c..b0d6511b 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/ratio.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/ratio.py @@ -26,7 +26,7 @@ class Ratio(Element): ) @model_validator(mode="after") - def FHIR_rat_1_constraint_model_validator(self): + def FHIR_rat_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(numerator.empty() xor denominator.exists()) and (numerator.exists() or extension.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/reference.py b/fhircraft/fhir/resources/datatypes/R4/complex/reference.py index ec3faee1..3f673a41 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/reference.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/reference.py @@ -51,7 +51,7 @@ class Reference(Element): ) @model_validator(mode="after") - def FHIR_ref_1_constraint_model_validator(self): + def FHIR_ref_1_constraint_validator(self): if not self._root_resource or not self._resource: return self return fhir_validators.validate_model_constraint( diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/simple_quantity.py b/fhircraft/fhir/resources/datatypes/R4/complex/simple_quantity.py index 759949ee..991c95d1 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/simple_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/simple_quantity.py @@ -13,7 +13,7 @@ class SimpleQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_sqty_1_constraint_model_validator(self): + def FHIR_sqty_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="comparator.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/complex/trigger_definition.py b/fhircraft/fhir/resources/datatypes/R4/complex/trigger_definition.py index 9a2f4139..5b8c0d18 100644 --- a/fhircraft/fhir/resources/datatypes/R4/complex/trigger_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/complex/trigger_definition.py @@ -71,7 +71,7 @@ def timing_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_trd_1_constraint_model_validator(self): + def FHIR_trd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or timing.empty()", @@ -81,7 +81,7 @@ def FHIR_trd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_2_constraint_model_validator(self): + def FHIR_trd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="condition.exists() implies data.exists()", @@ -91,7 +91,7 @@ def FHIR_trd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_3_constraint_model_validator(self): + def FHIR_trd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'named-event' implies name.exists()) and (type = 'periodic' implies timing.exists()) and (type.startsWith('data-') implies data.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/activity_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/activity_definition.py index 5d632101..b84b4613 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/activity_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/activity_definition.py @@ -483,7 +483,7 @@ def product_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_adf_0_constraint_model_validator(self): + def FHIR_adf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/allergy_intolerance.py b/fhircraft/fhir/resources/datatypes/R4/core/allergy_intolerance.py index 5f66df3a..8040a051 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/allergy_intolerance.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/allergy_intolerance.py @@ -227,7 +227,7 @@ def onset_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_ait_1_constraint_model_validator(self): + def FHIR_ait_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="verificationStatus.coding.where(system = 'http://terminology.hl7.org/CodeSystem/allergyintolerance-verification' and code = 'entered-in-error').exists() or clinicalStatus.exists()", @@ -237,7 +237,7 @@ def FHIR_ait_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ait_2_constraint_model_validator(self): + def FHIR_ait_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="verificationStatus.coding.where(system = 'http://terminology.hl7.org/CodeSystem/allergyintolerance-verification' and code = 'entered-in-error').empty() or clinicalStatus.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/appointment.py b/fhircraft/fhir/resources/datatypes/R4/core/appointment.py index 9a3da60c..83a3eb13 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/appointment.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/appointment.py @@ -233,7 +233,7 @@ def FHIR_app_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_app_2_constraint_model_validator(self): + def FHIR_app_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.exists() = end.exists()", @@ -243,7 +243,7 @@ def FHIR_app_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_3_constraint_model_validator(self): + def FHIR_app_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(start.exists() and end.exists()) or (status in ('proposed' | 'cancelled' | 'waitlist'))", @@ -253,7 +253,7 @@ def FHIR_app_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_4_constraint_model_validator(self): + def FHIR_app_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="Appointment.cancelationReason.exists() implies (Appointment.status='no-show' or Appointment.status='cancelled')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/appointment_response.py b/fhircraft/fhir/resources/datatypes/R4/core/appointment_response.py index 15f4973c..0bb5f128 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/appointment_response.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/appointment_response.py @@ -95,7 +95,7 @@ class AppointmentResponse(DomainResource): ) @model_validator(mode="after") - def FHIR_apr_1_constraint_model_validator(self): + def FHIR_apr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="participantType.exists() or actor.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/bundle.py b/fhircraft/fhir/resources/datatypes/R4/core/bundle.py index 5613e41d..15083b60 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/bundle.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/bundle.py @@ -298,7 +298,7 @@ class Bundle(Resource): ) @model_validator(mode="after") - def FHIR_bdl_1_constraint_model_validator(self): + def FHIR_bdl_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="total.empty() or (type = 'searchset') or (type = 'history')", @@ -308,7 +308,7 @@ def FHIR_bdl_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_2_constraint_model_validator(self): + def FHIR_bdl_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.search.empty() or (type = 'searchset')", @@ -318,7 +318,7 @@ def FHIR_bdl_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3_constraint_model_validator(self): + def FHIR_bdl_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.all(request.exists() = (%resource.type = 'batch' or %resource.type = 'transaction' or %resource.type = 'history'))", @@ -328,7 +328,7 @@ def FHIR_bdl_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_4_constraint_model_validator(self): + def FHIR_bdl_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.all(response.exists() = (%resource.type = 'batch-response' or %resource.type = 'transaction-response' or %resource.type = 'history'))", @@ -349,7 +349,7 @@ def FHIR_bdl_5_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_7_constraint_model_validator(self): + def FHIR_bdl_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'history') or entry.where(fullUrl.exists()).select(fullUrl&resource.meta.versionId).isDistinct()", @@ -370,7 +370,7 @@ def FHIR_bdl_8_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_9_constraint_model_validator(self): + def FHIR_bdl_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (identifier.system.exists() and identifier.value.exists())", @@ -380,7 +380,7 @@ def FHIR_bdl_9_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_10_constraint_model_validator(self): + def FHIR_bdl_10_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (timestamp.hasValue())", @@ -390,7 +390,7 @@ def FHIR_bdl_10_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_11_constraint_model_validator(self): + def FHIR_bdl_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies entry.first().resource.is(Composition)", @@ -400,7 +400,7 @@ def FHIR_bdl_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_12_constraint_model_validator(self): + def FHIR_bdl_12_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'message' implies entry.first().resource.is(MessageHeader)", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/capability_statement.py b/fhircraft/fhir/resources/datatypes/R4/core/capability_statement.py index 2c54b022..a55e4b0e 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/capability_statement.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/capability_statement.py @@ -869,7 +869,7 @@ def FHIR_cpb_9_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_0_constraint_model_validator(self): + def FHIR_cpb_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -879,7 +879,7 @@ def FHIR_cpb_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_1_constraint_model_validator(self): + def FHIR_cpb_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="rest.exists() or messaging.exists() or document.exists()", @@ -889,7 +889,7 @@ def FHIR_cpb_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_2_constraint_model_validator(self): + def FHIR_cpb_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -899,7 +899,7 @@ def FHIR_cpb_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_3_constraint_model_validator(self): + def FHIR_cpb_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="messaging.endpoint.empty() or kind = 'instance'", @@ -909,7 +909,7 @@ def FHIR_cpb_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_7_constraint_model_validator(self): + def FHIR_cpb_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="document.select(profile&mode).isDistinct()", @@ -930,7 +930,7 @@ def FHIR_cpb_12_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_14_constraint_model_validator(self): + def FHIR_cpb_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -940,7 +940,7 @@ def FHIR_cpb_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_15_constraint_model_validator(self): + def FHIR_cpb_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -950,7 +950,7 @@ def FHIR_cpb_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_16_constraint_model_validator(self): + def FHIR_cpb_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/charge_item_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/charge_item_definition.py index edcc7fc3..8f5f1a0c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/charge_item_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/charge_item_definition.py @@ -331,7 +331,7 @@ class ChargeItemDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cid_0_constraint_model_validator(self): + def FHIR_cid_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/code_system.py b/fhircraft/fhir/resources/datatypes/R4/core/code_system.py index 2f46488f..6045b0b4 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/code_system.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/code_system.py @@ -504,7 +504,7 @@ class CodeSystem(DomainResource): ) @model_validator(mode="after") - def FHIR_csd_0_constraint_model_validator(self): + def FHIR_csd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -514,7 +514,7 @@ def FHIR_csd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_1_constraint_model_validator(self): + def FHIR_csd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="concept.code.combine($this.descendants().concept.code).isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/compartment_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/compartment_definition.py index 2c8bf055..66999efa 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/compartment_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/compartment_definition.py @@ -194,7 +194,7 @@ class CompartmentDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cpd_0_constraint_model_validator(self): + def FHIR_cpd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/concept_map.py b/fhircraft/fhir/resources/datatypes/R4/core/concept_map.py index b17e59bb..a8352f3a 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/concept_map.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/concept_map.py @@ -500,7 +500,7 @@ def target_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cmd_0_constraint_model_validator(self): + def FHIR_cmd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/condition.py b/fhircraft/fhir/resources/datatypes/R4/core/condition.py index 41b0b87e..86283df6 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/condition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/condition.py @@ -260,7 +260,7 @@ def FHIR_con_2_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_con_3_constraint_model_validator(self): + def FHIR_con_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="clinicalStatus.exists() or verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-ver-status' and code = 'entered-in-error').exists() or category.select($this='problem-list-item').empty()", @@ -270,7 +270,7 @@ def FHIR_con_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_con_4_constraint_model_validator(self): + def FHIR_con_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abatement.empty() or clinicalStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-clinical' and (code='resolved' or code='remission' or code='inactive')).exists()", @@ -280,7 +280,7 @@ def FHIR_con_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_con_5_constraint_model_validator(self): + def FHIR_con_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-ver-status' and code='entered-in-error').empty() or clinicalStatus.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/consent.py b/fhircraft/fhir/resources/datatypes/R4/core/consent.py index 337ece03..e197b346 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/consent.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/consent.py @@ -280,7 +280,7 @@ def source_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_1_constraint_model_validator(self): + def FHIR_ppc_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="policy.exists() or policyRule.exists()", @@ -290,7 +290,7 @@ def FHIR_ppc_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_2_constraint_model_validator(self): + def FHIR_ppc_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='patient-privacy').exists().not()", @@ -300,7 +300,7 @@ def FHIR_ppc_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_3_constraint_model_validator(self): + def FHIR_ppc_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='research').exists().not()", @@ -310,7 +310,7 @@ def FHIR_ppc_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_4_constraint_model_validator(self): + def FHIR_ppc_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='adr').exists().not()", @@ -320,7 +320,7 @@ def FHIR_ppc_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_5_constraint_model_validator(self): + def FHIR_ppc_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='treatment').exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/domain_resource.py b/fhircraft/fhir/resources/datatypes/R4/core/domain_resource.py index b1c0a456..ae83855e 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/domain_resource.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/domain_resource.py @@ -8,6 +8,7 @@ from fhircraft.fhir.resources.datatypes.R4.complex import Extension, Narrative + class DomainResource(Resource): """ A resource with narrative, extensions, and contained resources @@ -37,7 +38,7 @@ class DomainResource(Resource): ) @model_validator(mode="after") - def FHIR_dom_2_constraint_model_validator(self): + def FHIR_dom_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.contained.empty()", @@ -47,7 +48,7 @@ def FHIR_dom_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_3_constraint_model_validator(self): + def FHIR_dom_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().ofType(canonical) | %resource.descendants().ofType(uri) | %resource.descendants().ofType(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()", @@ -57,7 +58,7 @@ def FHIR_dom_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_4_constraint_model_validator(self): + def FHIR_dom_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()", @@ -67,7 +68,7 @@ def FHIR_dom_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_5_constraint_model_validator(self): + def FHIR_dom_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.security.empty()", @@ -77,7 +78,7 @@ def FHIR_dom_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_6_constraint_model_validator(self): + def FHIR_dom_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="text.`div`.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/effect_evidence_synthesis.py b/fhircraft/fhir/resources/datatypes/R4/core/effect_evidence_synthesis.py index a10e700d..e31903bf 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/effect_evidence_synthesis.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/effect_evidence_synthesis.py @@ -435,7 +435,7 @@ class EffectEvidenceSynthesis(DomainResource): ) @model_validator(mode="after") - def FHIR_ees_0_constraint_model_validator(self): + def FHIR_ees_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/event_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/event_definition.py index 60c1b80a..ab89ec84 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/event_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/event_definition.py @@ -262,7 +262,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_evd_0_constraint_model_validator(self): + def FHIR_evd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/evidence.py b/fhircraft/fhir/resources/datatypes/R4/core/evidence.py index 7c2ae454..7fc9b457 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/evidence.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/evidence.py @@ -231,7 +231,7 @@ class Evidence(DomainResource): ) @model_validator(mode="after") - def FHIR_evi_0_constraint_model_validator(self): + def FHIR_evi_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/evidence_variable.py b/fhircraft/fhir/resources/datatypes/R4/core/evidence_variable.py index 92ef6309..8b530244 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/evidence_variable.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/evidence_variable.py @@ -371,7 +371,7 @@ class EvidenceVariable(DomainResource): ) @model_validator(mode="after") - def FHIR_evv_0_constraint_model_validator(self): + def FHIR_evv_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/example_scenario.py b/fhircraft/fhir/resources/datatypes/R4/core/example_scenario.py index 6047a0cc..46b84a3c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/example_scenario.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/example_scenario.py @@ -532,7 +532,7 @@ class ExampleScenario(DomainResource): ) @model_validator(mode="after") - def FHIR_esc_0_constraint_model_validator(self): + def FHIR_esc_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/family_member_history.py b/fhircraft/fhir/resources/datatypes/R4/core/family_member_history.py index f1d18b8a..d3c50d05 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/family_member_history.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/family_member_history.py @@ -332,7 +332,7 @@ def deceased_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_1_constraint_model_validator(self): + def FHIR_fhs_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.empty() or born.empty()", @@ -342,7 +342,7 @@ def FHIR_fhs_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_2_constraint_model_validator(self): + def FHIR_fhs_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.exists() or estimatedAge.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/graph_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/graph_definition.py index fe2c8bc7..ca6c86ee 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/graph_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/graph_definition.py @@ -317,7 +317,7 @@ class GraphDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_gdf_0_constraint_model_validator(self): + def FHIR_gdf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/group.py b/fhircraft/fhir/resources/datatypes/R4/core/group.py index da666453..6bd8dfa7 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/group.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/group.py @@ -206,7 +206,7 @@ class Group(DomainResource): ) @model_validator(mode="after") - def FHIR_grp_1_constraint_model_validator(self): + def FHIR_grp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="member.empty() or (actual = true)", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/implementation_guide.py b/fhircraft/fhir/resources/datatypes/R4/core/implementation_guide.py index 5a7a6b13..ff89b92f 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/implementation_guide.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/implementation_guide.py @@ -639,7 +639,7 @@ class ImplementationGuide(DomainResource): ) @model_validator(mode="after") - def FHIR_ig_0_constraint_model_validator(self): + def FHIR_ig_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -660,7 +660,7 @@ def FHIR_ig_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_ig_2_constraint_model_validator(self): + def FHIR_ig_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="definition.resource.fhirVersion.all(%context.fhirVersion contains $this)", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/insurance_plan.py b/fhircraft/fhir/resources/datatypes/R4/core/insurance_plan.py index 9851bd2d..c2bd944c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/insurance_plan.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/insurance_plan.py @@ -318,7 +318,7 @@ class InsurancePlan(DomainResource): ) @model_validator(mode="after") - def FHIR_ipn_1_constraint_model_validator(self): + def FHIR_ipn_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/library.py b/fhircraft/fhir/resources/datatypes/R4/core/library.py index 50e66276..2f985b5e 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/library.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/library.py @@ -276,7 +276,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_lib_0_constraint_model_validator(self): + def FHIR_lib_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/linkage.py b/fhircraft/fhir/resources/datatypes/R4/core/linkage.py index e0700b19..146bd3bc 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/linkage.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/linkage.py @@ -78,7 +78,7 @@ class Linkage(DomainResource): ) @model_validator(mode="after") - def FHIR_lnk_1_constraint_model_validator(self): + def FHIR_lnk_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="item.count()>1", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/list.py b/fhircraft/fhir/resources/datatypes/R4/core/list.py index ca192142..0e164bcd 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/list.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/list.py @@ -155,7 +155,7 @@ class List(DomainResource): ) @model_validator(mode="after") - def FHIR_lst_1_constraint_model_validator(self): + def FHIR_lst_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="emptyReason.empty() or entry.empty()", @@ -165,7 +165,7 @@ def FHIR_lst_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_lst_2_constraint_model_validator(self): + def FHIR_lst_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="mode = 'changes' or entry.deleted.empty()", @@ -175,7 +175,7 @@ def FHIR_lst_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_lst_3_constraint_model_validator(self): + def FHIR_lst_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="mode = 'working' or entry.date.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/measure.py b/fhircraft/fhir/resources/datatypes/R4/core/measure.py index 8bfa3468..d0b4da3f 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/measure.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/measure.py @@ -488,7 +488,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_mea_0_constraint_model_validator(self): + def FHIR_mea_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -498,7 +498,7 @@ def FHIR_mea_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_mea_1_constraint_model_validator(self): + def FHIR_mea_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.all((code | description | criteria).exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/measure_report.py b/fhircraft/fhir/resources/datatypes/R4/core/measure_report.py index d48e5e37..d93d954f 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/measure_report.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/measure_report.py @@ -242,7 +242,7 @@ class MeasureReport(DomainResource): ) @model_validator(mode="after") - def FHIR_mrp_1_constraint_model_validator(self): + def FHIR_mrp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type != 'data-collection') or group.exists().not()", @@ -252,7 +252,7 @@ def FHIR_mrp_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_mrp_2_constraint_model_validator(self): + def FHIR_mrp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.stratum.all(value.exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/medication_dispense.py b/fhircraft/fhir/resources/datatypes/R4/core/medication_dispense.py index d83dc508..45322f2f 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/medication_dispense.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/medication_dispense.py @@ -246,7 +246,7 @@ def medication_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_mdd_1_constraint_model_validator(self): + def FHIR_mdd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="whenHandedOver.empty() or whenPrepared.empty() or whenHandedOver >= whenPrepared", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/message_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/message_definition.py index 3845559a..0ee21d0a 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/message_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/message_definition.py @@ -339,7 +339,7 @@ def FHIR_md_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_msd_0_constraint_model_validator(self): + def FHIR_msd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/molecular_sequence.py b/fhircraft/fhir/resources/datatypes/R4/core/molecular_sequence.py index 50c19079..cd40de48 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/molecular_sequence.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/molecular_sequence.py @@ -604,7 +604,7 @@ class MolecularSequence(DomainResource): ) @model_validator(mode="after") - def FHIR_msq_3_constraint_model_validator(self): + def FHIR_msq_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="coordinateSystem = 1 or coordinateSystem = 0", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/naming_system.py b/fhircraft/fhir/resources/datatypes/R4/core/naming_system.py index c92a03a3..fbc9620b 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/naming_system.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/naming_system.py @@ -190,7 +190,7 @@ class NamingSystem(DomainResource): ) @model_validator(mode="after") - def FHIR_nsd_0_constraint_model_validator(self): + def FHIR_nsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -200,7 +200,7 @@ def FHIR_nsd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_1_constraint_model_validator(self): + def FHIR_nsd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'root' or uniqueId.all(type != 'uuid')", @@ -210,7 +210,7 @@ def FHIR_nsd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_2_constraint_model_validator(self): + def FHIR_nsd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="uniqueId.where(preferred = true).select(type).isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/nutrition_order.py b/fhircraft/fhir/resources/datatypes/R4/core/nutrition_order.py index 1809a491..ae2da3fc 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/nutrition_order.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/nutrition_order.py @@ -353,7 +353,7 @@ class NutritionOrder(DomainResource): ) @model_validator(mode="after") - def FHIR_nor_1_constraint_model_validator(self): + def FHIR_nor_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="oralDiet.exists() or supplement.exists() or enteralFormula.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/observation.py b/fhircraft/fhir/resources/datatypes/R4/core/observation.py index 1d80a39d..dd5a0f0c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/observation.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/observation.py @@ -499,7 +499,7 @@ def FHIR_obs_3_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_obs_6_constraint_model_validator(self): + def FHIR_obs_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="dataAbsentReason.empty() or value.empty()", @@ -509,7 +509,7 @@ def FHIR_obs_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_obs_7_constraint_model_validator(self): + def FHIR_obs_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/operation_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/operation_definition.py index 266bce24..54c2e9da 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/operation_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/operation_definition.py @@ -429,7 +429,7 @@ class OperationDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_opd_0_constraint_model_validator(self): + def FHIR_opd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/organization.py b/fhircraft/fhir/resources/datatypes/R4/core/organization.py index eb88038b..c2e72cbd 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/organization.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/organization.py @@ -124,7 +124,7 @@ class Organization(DomainResource): ) @model_validator(mode="after") - def FHIR_org_1_constraint_model_validator(self): + def FHIR_org_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/plan_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/plan_definition.py index 84b936e3..817ff0eb 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/plan_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/plan_definition.py @@ -742,7 +742,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_pdf_0_constraint_model_validator(self): + def FHIR_pdf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/questionnaire.py b/fhircraft/fhir/resources/datatypes/R4/core/questionnaire.py index 0b2aab28..2b6c1774 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/questionnaire.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/questionnaire.py @@ -677,7 +677,7 @@ class Questionnaire(DomainResource): ) @model_validator(mode="after") - def FHIR_que_0_constraint_model_validator(self): + def FHIR_que_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -698,7 +698,7 @@ def FHIR_que_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_que_2_constraint_model_validator(self): + def FHIR_que_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="descendants().linkId.isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/research_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/research_definition.py index e9a69391..8d2d2dc9 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/research_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/research_definition.py @@ -301,7 +301,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_rsd_0_constraint_model_validator(self): + def FHIR_rsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/research_element_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/research_element_definition.py index 63ed4908..a333d9af 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/research_element_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/research_element_definition.py @@ -491,7 +491,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_red_0_constraint_model_validator(self): + def FHIR_red_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/resource.py b/fhircraft/fhir/resources/datatypes/R4/core/resource.py index 701cd5b6..04d6f0fd 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/resource.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/resource.py @@ -48,7 +48,7 @@ class Resource(FHIRBaseModel): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return fhir_validators.validate_element_constraint( self, elements=(list(self.__class__.model_fields.keys())), diff --git a/fhircraft/fhir/resources/datatypes/R4/core/risk_evidence_synthesis.py b/fhircraft/fhir/resources/datatypes/R4/core/risk_evidence_synthesis.py index d2a6371f..23285df2 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/risk_evidence_synthesis.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/risk_evidence_synthesis.py @@ -406,7 +406,7 @@ class RiskEvidenceSynthesis(DomainResource): ) @model_validator(mode="after") - def FHIR_rvs_0_constraint_model_validator(self): + def FHIR_rvs_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/search_parameter.py b/fhircraft/fhir/resources/datatypes/R4/core/search_parameter.py index 4721e4fd..ce01883c 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/search_parameter.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/search_parameter.py @@ -290,7 +290,7 @@ class SearchParameter(DomainResource): ) @model_validator(mode="after") - def FHIR_spd_0_constraint_model_validator(self): + def FHIR_spd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -300,7 +300,7 @@ def FHIR_spd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_1_constraint_model_validator(self): + def FHIR_spd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="xpath.empty() or xpathUsage.exists()", @@ -310,7 +310,7 @@ def FHIR_spd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_2_constraint_model_validator(self): + def FHIR_spd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="chain.empty() or type = 'reference'", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/service_request.py b/fhircraft/fhir/resources/datatypes/R4/core/service_request.py index 868621d7..68813de5 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/service_request.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/service_request.py @@ -305,7 +305,7 @@ def asNeeded_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_prr_1_constraint_model_validator(self): + def FHIR_prr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="orderDetail.empty() or code.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/structure_definition.py b/fhircraft/fhir/resources/datatypes/R4/core/structure_definition.py index 52ad5037..c0cb8ec1 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/structure_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/structure_definition.py @@ -409,7 +409,7 @@ def FHIR_sdf_8a_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_0_constraint_model_validator(self): + def FHIR_sdf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -419,7 +419,7 @@ def FHIR_sdf_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_1_constraint_model_validator(self): + def FHIR_sdf_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="derivation = 'constraint' or snapshot.element.select(path).isDistinct()", @@ -429,7 +429,7 @@ def FHIR_sdf_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_4_constraint_model_validator(self): + def FHIR_sdf_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abstract = true or baseDefinition.exists()", @@ -439,7 +439,7 @@ def FHIR_sdf_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_5_constraint_model_validator(self): + def FHIR_sdf_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type != 'Extension' or derivation = 'specialization' or (context.exists())", @@ -449,7 +449,7 @@ def FHIR_sdf_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_6_constraint_model_validator(self): + def FHIR_sdf_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.exists() or differential.exists()", @@ -459,7 +459,7 @@ def FHIR_sdf_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_9_constraint_model_validator(self): + def FHIR_sdf_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="children().element.where(path.contains('.').not()).label.empty() and children().element.where(path.contains('.').not()).code.empty() and children().element.where(path.contains('.').not()).requirements.empty()", @@ -480,7 +480,7 @@ def FHIR_sdf_10_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_11_constraint_model_validator(self): + def FHIR_sdf_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'logical' implies snapshot.empty() or snapshot.element.first().path = type", @@ -490,7 +490,7 @@ def FHIR_sdf_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_14_constraint_model_validator(self): + def FHIR_sdf_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and differential.element.all(id.exists())", @@ -500,7 +500,7 @@ def FHIR_sdf_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15_constraint_model_validator(self): + def FHIR_sdf_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind!='logical' implies snapshot.element.first().type.empty()", @@ -510,7 +510,7 @@ def FHIR_sdf_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15a_constraint_model_validator(self): + def FHIR_sdf_15a_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='logical' and differential.element.first().path.contains('.').not()) implies differential.element.first().type.empty()", @@ -520,7 +520,7 @@ def FHIR_sdf_15a_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_16_constraint_model_validator(self): + def FHIR_sdf_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and snapshot.element.id.trace('ids').isDistinct()", @@ -530,7 +530,7 @@ def FHIR_sdf_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_17_constraint_model_validator(self): + def FHIR_sdf_17_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.all(id.exists()) and differential.element.id.trace('ids').isDistinct()", @@ -540,7 +540,7 @@ def FHIR_sdf_17_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_18_constraint_model_validator(self): + def FHIR_sdf_18_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contextInvariant.exists() implies type = 'Extension'", @@ -550,7 +550,7 @@ def FHIR_sdf_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_19_constraint_model_validator(self): + def FHIR_sdf_19_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (differential.element.type.code.all(matches('^[a-zA-Z0-9]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')) and snapshot.element.type.code.all(matches('^[a-zA-Z0-9\\.]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')))", @@ -560,7 +560,7 @@ def FHIR_sdf_19_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_21_constraint_model_validator(self): + def FHIR_sdf_21_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.defaultValue.exists() implies (derivation = 'specialization')", @@ -570,7 +570,7 @@ def FHIR_sdf_21_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_22_constraint_model_validator(self): + def FHIR_sdf_22_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (snapshot.element.defaultValue.empty() and differential.element.defaultValue.empty())", @@ -580,7 +580,7 @@ def FHIR_sdf_22_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_23_constraint_model_validator(self): + def FHIR_sdf_23_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(snapshot | differential).element.all(path.contains('.').not() implies sliceName.empty())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/structure_map.py b/fhircraft/fhir/resources/datatypes/R4/core/structure_map.py index c5f83084..fc068297 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/structure_map.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/structure_map.py @@ -1027,7 +1027,7 @@ class StructureMap(DomainResource): ) @model_validator(mode="after") - def FHIR_smp_0_constraint_model_validator(self): + def FHIR_smp_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/task.py b/fhircraft/fhir/resources/datatypes/R4/core/task.py index bf11a8e4..d73d49f7 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/task.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/task.py @@ -1025,7 +1025,7 @@ class Task(DomainResource): ) @model_validator(mode="after") - def FHIR_inv_1_constraint_model_validator(self): + def FHIR_inv_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="lastModified.exists().not() or authoredOn.exists().not() or lastModified >= authoredOn", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/terminology_capabilities.py b/fhircraft/fhir/resources/datatypes/R4/core/terminology_capabilities.py index 4ee2bc86..b2edadaf 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/terminology_capabilities.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/terminology_capabilities.py @@ -506,7 +506,7 @@ def FHIR_tcp_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_0_constraint_model_validator(self): + def FHIR_tcp_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -516,7 +516,7 @@ def FHIR_tcp_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_2_constraint_model_validator(self): + def FHIR_tcp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -526,7 +526,7 @@ def FHIR_tcp_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_3_constraint_model_validator(self): + def FHIR_tcp_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -536,7 +536,7 @@ def FHIR_tcp_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_4_constraint_model_validator(self): + def FHIR_tcp_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -546,7 +546,7 @@ def FHIR_tcp_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_5_constraint_model_validator(self): + def FHIR_tcp_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/test_script.py b/fhircraft/fhir/resources/datatypes/R4/core/test_script.py index b4cf1590..75f302eb 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/test_script.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/test_script.py @@ -1298,7 +1298,7 @@ class TestScript(DomainResource): ) @model_validator(mode="after") - def FHIR_tst_0_constraint_model_validator(self): + def FHIR_tst_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4/core/value_set.py b/fhircraft/fhir/resources/datatypes/R4/core/value_set.py index 0ad420f6..a9c118f1 100644 --- a/fhircraft/fhir/resources/datatypes/R4/core/value_set.py +++ b/fhircraft/fhir/resources/datatypes/R4/core/value_set.py @@ -634,7 +634,7 @@ class ValueSet(DomainResource): ) @model_validator(mode="after") - def FHIR_vsd_0_constraint_model_validator(self): + def FHIR_vsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/age.py b/fhircraft/fhir/resources/datatypes/R4B/complex/age.py index 77a489df..9442dae2 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/age.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/age.py @@ -16,7 +16,7 @@ class Age(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_age_1_constraint_model_validator(self): + def FHIR_age_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (value.empty() or value.hasValue().not() or value > 0)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/attachment.py b/fhircraft/fhir/resources/datatypes/R4B/complex/attachment.py index e3d276fb..247411a3 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/attachment.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/attachment.py @@ -88,7 +88,7 @@ class Attachment(Element): ) @model_validator(mode="after") - def FHIR_att_1_constraint_model_validator(self): + def FHIR_att_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or contentType.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/contact_point.py b/fhircraft/fhir/resources/datatypes/R4B/complex/contact_point.py index 474881e1..b4b2deb5 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/contact_point.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/contact_point.py @@ -56,7 +56,7 @@ class ContactPoint(Element): ) @model_validator(mode="after") - def FHIR_cpt_2_constraint_model_validator(self): + def FHIR_cpt_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/count.py b/fhircraft/fhir/resources/datatypes/R4B/complex/count.py index dde96191..33518467 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/count.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/count.py @@ -13,7 +13,7 @@ class Count(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_cnt_3_constraint_model_validator(self): + def FHIR_cnt_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (code.empty() or code = '1') and (value.empty() or value.hasValue().not() or value.toString().contains('.').not())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/distance.py b/fhircraft/fhir/resources/datatypes/R4B/complex/distance.py index f0fe2aa3..4eddebe6 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/distance.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/distance.py @@ -13,7 +13,7 @@ class Distance(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_dis_1_constraint_model_validator(self): + def FHIR_dis_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/duration.py b/fhircraft/fhir/resources/datatypes/R4B/complex/duration.py index efce0ae3..a5f17b1b 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/duration.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/duration.py @@ -13,7 +13,7 @@ class Duration(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_drt_1_constraint_model_validator(self): + def FHIR_drt_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.exists() implies ((system = %ucum) and code.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/element.py b/fhircraft/fhir/resources/datatypes/R4B/complex/element.py index d776677a..50450ad1 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/element.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/element.py @@ -29,7 +29,7 @@ class Element(FHIRBaseModel): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return fhir_validators.validate_element_constraint( self, elements=(list(self.__class__.model_fields.keys())), diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/element_definition.py b/fhircraft/fhir/resources/datatypes/R4B/complex/element_definition.py index cef9f3b1..f6fabf2d 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/element_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/element_definition.py @@ -2354,7 +2354,7 @@ def maxValue_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_eld_2_constraint_model_validator(self): + def FHIR_eld_2_constraint_validator(self): return validate_model_constraint( self, expression="min.empty() or max.empty() or (max = '*') or iif(max != '*', min <= max.toInteger())", @@ -2364,7 +2364,7 @@ def FHIR_eld_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_5_constraint_model_validator(self): + def FHIR_eld_5_constraint_validator(self): return validate_model_constraint( self, expression="contentReference.empty() or (type.empty() and defaultValue.empty() and fixed.empty() and pattern.empty() and example.empty() and minValue.empty() and maxValue.empty() and maxLength.empty() and binding.empty())", @@ -2374,7 +2374,7 @@ def FHIR_eld_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_6_constraint_model_validator(self): + def FHIR_eld_6_constraint_validator(self): return validate_model_constraint( self, expression="fixed.empty() or (type.count() <= 1)", @@ -2384,7 +2384,7 @@ def FHIR_eld_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_7_constraint_model_validator(self): + def FHIR_eld_7_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or (type.count() <= 1)", @@ -2394,7 +2394,7 @@ def FHIR_eld_7_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_8_constraint_model_validator(self): + def FHIR_eld_8_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or fixed.empty()", @@ -2404,7 +2404,7 @@ def FHIR_eld_8_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_11_constraint_model_validator(self): + def FHIR_eld_11_constraint_validator(self): return validate_model_constraint( self, expression="binding.empty() or type.code.empty() or type.select((code = 'code') or (code = 'Coding') or (code='CodeableConcept') or (code = 'Quantity') or (code = 'string') or (code = 'uri') or (code = 'Duration')).exists()", @@ -2414,7 +2414,7 @@ def FHIR_eld_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_13_constraint_model_validator(self): + def FHIR_eld_13_constraint_validator(self): return validate_model_constraint( self, expression="type.select(code).isDistinct()", @@ -2424,7 +2424,7 @@ def FHIR_eld_13_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_14_constraint_model_validator(self): + def FHIR_eld_14_constraint_validator(self): return validate_model_constraint( self, expression="constraint.select(key).isDistinct()", @@ -2434,7 +2434,7 @@ def FHIR_eld_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_15_constraint_model_validator(self): + def FHIR_eld_15_constraint_validator(self): return validate_model_constraint( self, expression="defaultValue.empty() or meaningWhenMissing.empty()", @@ -2444,7 +2444,7 @@ def FHIR_eld_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_16_constraint_model_validator(self): + def FHIR_eld_16_constraint_validator(self): return validate_model_constraint( self, expression="sliceName.empty() or sliceName.matches('^[a-zA-Z0-9\\/\\-_\\[\\]\\@]+$')", @@ -2454,7 +2454,7 @@ def FHIR_eld_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_18_constraint_model_validator(self): + def FHIR_eld_18_constraint_validator(self): return validate_model_constraint( self, expression="(isModifier.exists() and isModifier) implies isModifierReason.exists()", @@ -2464,7 +2464,7 @@ def FHIR_eld_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_19_constraint_model_validator(self): + def FHIR_eld_19_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\.[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\[x\\])?(\\:[^\\s\\.]+)?)*$')""", @@ -2474,7 +2474,7 @@ def FHIR_eld_19_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_20_constraint_model_validator(self): + def FHIR_eld_20_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[A-Za-z][A-Za-z0-9]*(\\.[a-z][A-Za-z0-9]*(\\[x])?)*$')""", @@ -2484,7 +2484,7 @@ def FHIR_eld_20_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_22_constraint_model_validator(self): + def FHIR_eld_22_constraint_validator(self): return validate_model_constraint( self, expression="sliceIsConstraining.exists() implies sliceName.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/expression.py b/fhircraft/fhir/resources/datatypes/R4B/complex/expression.py index 8bba4abc..547dbc92 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/expression.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/expression.py @@ -61,7 +61,7 @@ class Expression(Element): ) @model_validator(mode="after") - def FHIR_exp_1_constraint_model_validator(self): + def FHIR_exp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="expression.exists() or reference.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/extension.py b/fhircraft/fhir/resources/datatypes/R4B/complex/extension.py index 3b95604e..d219447f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/extension.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/extension.py @@ -355,17 +355,6 @@ class Extension(Element): default=None, ) - @model_validator(mode="after") - def FHIR_ext_1_constraint_validator(self): - return fhir_validators.validate_element_constraint( - self, - elements=("extension",), - expression="extension.exists() != value.exists()", - human="Must have either extensions or value[x], not both", - key="ext-1", - severity="error", - ) - @model_validator(mode="after") def value_type_choice_validator(self): return fhir_validators.validate_type_choice_element( @@ -434,7 +423,7 @@ def value(self): ) @model_validator(mode="after") - def FHIR_ext_1_constraint_model_validator(self): + def FHIR_ext_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="extension.exists() != value.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/money_quantity.py b/fhircraft/fhir/resources/datatypes/R4B/complex/money_quantity.py index 0a36e24f..ffa404f1 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/money_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/money_quantity.py @@ -13,7 +13,7 @@ class MoneyQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_mqty_1_constraint_model_validator(self): + def FHIR_mqty_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = 'urn:iso:std:iso:4217')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/period.py b/fhircraft/fhir/resources/datatypes/R4B/complex/period.py index 191a435f..90dbcae7 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/period.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/period.py @@ -34,7 +34,7 @@ class Period(Element): ) @model_validator(mode="after") - def FHIR_per_1_constraint_model_validator(self): + def FHIR_per_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.hasValue().not() or end.hasValue().not() or (start <= end)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/quantity.py b/fhircraft/fhir/resources/datatypes/R4B/complex/quantity.py index 28a9d26c..9bec1878 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/quantity.py @@ -61,7 +61,7 @@ class Quantity(Element): ) @model_validator(mode="after") - def FHIR_qty_3_constraint_model_validator(self): + def FHIR_qty_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/range.py b/fhircraft/fhir/resources/datatypes/R4B/complex/range.py index 8b8c6a5a..6edf1159 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/range.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/range.py @@ -24,7 +24,7 @@ class Range(Element): ) @model_validator(mode="after") - def FHIR_rng_2_constraint_model_validator(self): + def FHIR_rng_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="low.empty() or high.empty() or (low <= high)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/ratio.py b/fhircraft/fhir/resources/datatypes/R4B/complex/ratio.py index e4def2ad..e863bcf8 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/ratio.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/ratio.py @@ -24,7 +24,7 @@ class Ratio(Element): ) @model_validator(mode="after") - def FHIR_rat_1_constraint_model_validator(self): + def FHIR_rat_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(numerator.exists() and denominator.exists()) or (numerator.empty() and denominator.empty() and extension.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/ratio_range.py b/fhircraft/fhir/resources/datatypes/R4B/complex/ratio_range.py index 7c629dbb..57a8f350 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/ratio_range.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/ratio_range.py @@ -28,7 +28,7 @@ class RatioRange(Element): ) @model_validator(mode="after") - def FHIR_inv_1_constraint_model_validator(self): + def FHIR_inv_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="((lowNumerator.exists() or highNumerator.exists()) and denominator.exists()) or (lowNumerator.empty() and highNumerator.empty() and denominator.empty() and extension.exists())", @@ -38,7 +38,7 @@ def FHIR_inv_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_inv_2_constraint_model_validator(self): + def FHIR_inv_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="lowNumerator.empty() or highNumerator.empty() or (lowNumerator <= highNumerator)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/reference.py b/fhircraft/fhir/resources/datatypes/R4B/complex/reference.py index 475fa4c5..779a25db 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/reference.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/reference.py @@ -50,7 +50,7 @@ class Reference(Element): ) @model_validator(mode="after") - def FHIR_ref_1_constraint_model_validator(self): + def FHIR_ref_1_constraint_validator(self): if not self._root_resource or not self._resource: return self return fhir_validators.validate_model_constraint( diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/simple_quantity.py b/fhircraft/fhir/resources/datatypes/R4B/complex/simple_quantity.py index 69099f53..0bd3d19e 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/simple_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/simple_quantity.py @@ -13,7 +13,7 @@ class SimpleQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_sqty_1_constraint_model_validator(self): + def FHIR_sqty_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="comparator.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/complex/trigger_definition.py b/fhircraft/fhir/resources/datatypes/R4B/complex/trigger_definition.py index 4a045d92..4cd3aad4 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/complex/trigger_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/complex/trigger_definition.py @@ -64,7 +64,7 @@ class TriggerDefinition(Element): ) @model_validator(mode="after") - def FHIR_trd_1_constraint_model_validator(self): + def FHIR_trd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or timing.empty()", @@ -74,7 +74,7 @@ def FHIR_trd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_2_constraint_model_validator(self): + def FHIR_trd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="condition.exists() implies data.exists()", @@ -84,7 +84,7 @@ def FHIR_trd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_3_constraint_model_validator(self): + def FHIR_trd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'named-event' implies name.exists()) and (type = 'periodic' implies timing.exists()) and (type.startsWith('data-') implies data.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/activity_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/activity_definition.py index 79df3b12..85274132 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/activity_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/activity_definition.py @@ -487,7 +487,7 @@ def product_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/administrable_product_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/administrable_product_definition.py index 09955177..1fdde572 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/administrable_product_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/administrable_product_definition.py @@ -246,7 +246,7 @@ class AdministrableProductDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_apd_1_constraint_model_validator(self): + def FHIR_apd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(AdministrableProductDefinition.routeOfAdministration.code.count() + AdministrableProductDefinition.formOf.resolve().route.count()) < 2", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/allergy_intolerance.py b/fhircraft/fhir/resources/datatypes/R4B/core/allergy_intolerance.py index 9596d768..33b0906f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/allergy_intolerance.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/allergy_intolerance.py @@ -228,7 +228,7 @@ def onset_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_ait_1_constraint_model_validator(self): + def FHIR_ait_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(verificationStatus.exists() and verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/allergyintolerance-verification' and code='entered-in-error').exists().not()) implies clinicalStatus.exists()", @@ -238,7 +238,7 @@ def FHIR_ait_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ait_2_constraint_model_validator(self): + def FHIR_ait_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/allergyintolerance-verification' and code='entered-in-error').exists()) implies clinicalStatus.exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/appointment.py b/fhircraft/fhir/resources/datatypes/R4B/core/appointment.py index e14f2beb..bfc6c95f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/appointment.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/appointment.py @@ -233,7 +233,7 @@ def FHIR_app_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_app_2_constraint_model_validator(self): + def FHIR_app_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.exists() = end.exists()", @@ -243,7 +243,7 @@ def FHIR_app_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_3_constraint_model_validator(self): + def FHIR_app_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(start.exists() and end.exists()) or (status in ('proposed' | 'cancelled' | 'waitlist'))", @@ -253,7 +253,7 @@ def FHIR_app_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_4_constraint_model_validator(self): + def FHIR_app_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="Appointment.cancelationReason.exists() implies (Appointment.status='no-show' or Appointment.status='cancelled')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/appointment_response.py b/fhircraft/fhir/resources/datatypes/R4B/core/appointment_response.py index dd18cf05..1a7d16d2 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/appointment_response.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/appointment_response.py @@ -94,7 +94,7 @@ class AppointmentResponse(DomainResource): ) @model_validator(mode="after") - def FHIR_apr_1_constraint_model_validator(self): + def FHIR_apr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="participantType.exists() or actor.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/bundle.py b/fhircraft/fhir/resources/datatypes/R4B/core/bundle.py index 190fa55d..5fffa3e9 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/bundle.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/bundle.py @@ -296,7 +296,7 @@ class Bundle(Resource): ) @model_validator(mode="after") - def FHIR_bdl_1_constraint_model_validator(self): + def FHIR_bdl_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="total.empty() or (type = 'searchset') or (type = 'history')", @@ -306,7 +306,7 @@ def FHIR_bdl_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_2_constraint_model_validator(self): + def FHIR_bdl_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.search.empty() or (type = 'searchset')", @@ -316,7 +316,7 @@ def FHIR_bdl_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3_constraint_model_validator(self): + def FHIR_bdl_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.all(request.exists() = (%resource.type = 'batch' or %resource.type = 'transaction' or %resource.type = 'history'))", @@ -326,7 +326,7 @@ def FHIR_bdl_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_4_constraint_model_validator(self): + def FHIR_bdl_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="entry.all(response.exists() = (%resource.type = 'batch-response' or %resource.type = 'transaction-response' or %resource.type = 'history'))", @@ -347,7 +347,7 @@ def FHIR_bdl_5_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_7_constraint_model_validator(self): + def FHIR_bdl_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'history') or entry.where(fullUrl.exists()).select(fullUrl&resource.meta.versionId).isDistinct()", @@ -368,7 +368,7 @@ def FHIR_bdl_8_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_9_constraint_model_validator(self): + def FHIR_bdl_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (identifier.system.exists() and identifier.value.exists())", @@ -378,7 +378,7 @@ def FHIR_bdl_9_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_10_constraint_model_validator(self): + def FHIR_bdl_10_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (timestamp.hasValue())", @@ -388,7 +388,7 @@ def FHIR_bdl_10_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_11_constraint_model_validator(self): + def FHIR_bdl_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies entry.first().resource.is(Composition)", @@ -398,7 +398,7 @@ def FHIR_bdl_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_12_constraint_model_validator(self): + def FHIR_bdl_12_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'message' implies entry.first().resource.is(MessageHeader)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/capability_statement.py b/fhircraft/fhir/resources/datatypes/R4B/core/capability_statement.py index d78d31a5..e2e1e5f8 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/capability_statement.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/capability_statement.py @@ -858,7 +858,7 @@ class CapabilityStatement(DomainResource): ) @model_validator(mode="after") - def FHIR_cpb_0_constraint_model_validator(self): + def FHIR_cpb_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -868,7 +868,7 @@ def FHIR_cpb_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_1_constraint_model_validator(self): + def FHIR_cpb_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="rest.exists() or messaging.exists() or document.exists()", @@ -878,7 +878,7 @@ def FHIR_cpb_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_2_constraint_model_validator(self): + def FHIR_cpb_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -888,7 +888,7 @@ def FHIR_cpb_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_3_constraint_model_validator(self): + def FHIR_cpb_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="messaging.endpoint.empty() or kind = 'instance'", @@ -898,7 +898,7 @@ def FHIR_cpb_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_7_constraint_model_validator(self): + def FHIR_cpb_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="document.select(profile&mode).isDistinct()", @@ -930,7 +930,7 @@ def FHIR_cpb_12_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_14_constraint_model_validator(self): + def FHIR_cpb_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -940,7 +940,7 @@ def FHIR_cpb_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_15_constraint_model_validator(self): + def FHIR_cpb_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -950,7 +950,7 @@ def FHIR_cpb_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_16_constraint_model_validator(self): + def FHIR_cpb_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/charge_item_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/charge_item_definition.py index b6a9ce2d..a40fe361 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/charge_item_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/charge_item_definition.py @@ -331,7 +331,7 @@ class ChargeItemDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cid_0_constraint_model_validator(self): + def FHIR_cid_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/citation.py b/fhircraft/fhir/resources/datatypes/R4B/core/citation.py index b32b20f5..73a7daee 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/citation.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/citation.py @@ -1085,7 +1085,7 @@ class Citation(DomainResource): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/clinical_use_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/clinical_use_definition.py index 465c673c..ad3e5605 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/clinical_use_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/clinical_use_definition.py @@ -314,7 +314,7 @@ class ClinicalUseDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cud_1_constraint_model_validator(self): + def FHIR_cud_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(ClinicalUseDefinition.indication.count() + ClinicalUseDefinition.contraindication.count() + ClinicalUseDefinition.interaction.count() + ClinicalUseDefinition.undesirableEffect.count() + ClinicalUseDefinition.warning.count()) < 2", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/code_system.py b/fhircraft/fhir/resources/datatypes/R4B/core/code_system.py index 8a724dc2..f07ef7db 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/code_system.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/code_system.py @@ -502,7 +502,7 @@ class CodeSystem(DomainResource): ) @model_validator(mode="after") - def FHIR_csd_0_constraint_model_validator(self): + def FHIR_csd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -512,7 +512,7 @@ def FHIR_csd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_1_constraint_model_validator(self): + def FHIR_csd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="concept.code.combine($this.descendants().concept.code).isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/compartment_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/compartment_definition.py index bcb9902c..7ed0698f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/compartment_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/compartment_definition.py @@ -194,7 +194,7 @@ class CompartmentDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cpd_0_constraint_model_validator(self): + def FHIR_cpd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/concept_map.py b/fhircraft/fhir/resources/datatypes/R4B/core/concept_map.py index 87348901..f907977d 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/concept_map.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/concept_map.py @@ -501,7 +501,7 @@ def target_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cmd_0_constraint_model_validator(self): + def FHIR_cmd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/condition.py b/fhircraft/fhir/resources/datatypes/R4B/core/condition.py index 89670738..60f43b0c 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/condition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/condition.py @@ -260,7 +260,7 @@ def FHIR_con_2_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_con_3_constraint_model_validator(self): + def FHIR_con_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="verificationStatus.empty().not() and verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-ver-status' and code='entered-in-error').exists().not() and category.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-category' and code='problem-list-item').exists() implies clinicalStatus.empty().not()", @@ -270,7 +270,7 @@ def FHIR_con_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_con_4_constraint_model_validator(self): + def FHIR_con_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abatement.empty() or clinicalStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-clinical' and (code='resolved' or code='remission' or code='inactive')).exists()", @@ -280,7 +280,7 @@ def FHIR_con_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_con_5_constraint_model_validator(self): + def FHIR_con_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="verificationStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-ver-status' and code='entered-in-error').empty() or clinicalStatus.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/consent.py b/fhircraft/fhir/resources/datatypes/R4B/core/consent.py index 6ab50a8b..8e6a5969 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/consent.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/consent.py @@ -280,7 +280,7 @@ def source_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_1_constraint_model_validator(self): + def FHIR_ppc_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="policy.exists() or policyRule.exists()", @@ -290,7 +290,7 @@ def FHIR_ppc_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_2_constraint_model_validator(self): + def FHIR_ppc_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='patient-privacy').exists().not()", @@ -300,7 +300,7 @@ def FHIR_ppc_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_3_constraint_model_validator(self): + def FHIR_ppc_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='research').exists().not()", @@ -310,7 +310,7 @@ def FHIR_ppc_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_4_constraint_model_validator(self): + def FHIR_ppc_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='adr').exists().not()", @@ -320,7 +320,7 @@ def FHIR_ppc_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ppc_5_constraint_model_validator(self): + def FHIR_ppc_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="patient.exists() or scope.coding.where(system='something' and code='treatment').exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/domain_resource.py b/fhircraft/fhir/resources/datatypes/R4B/core/domain_resource.py index 4a28a097..b393c6b1 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/domain_resource.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/domain_resource.py @@ -10,6 +10,7 @@ ) from .resource import Resource + class DomainResource(Resource): """ A resource with narrative, extensions, and contained resources @@ -48,7 +49,7 @@ def FHIR_dom_r4b_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_dom_2_constraint_model_validator(self): + def FHIR_dom_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.contained.empty()", @@ -58,7 +59,7 @@ def FHIR_dom_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_3_constraint_model_validator(self): + def FHIR_dom_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.where(((id.exists() and ('#'+id in (%resource.descendants().reference | %resource.descendants().ofType(canonical) | %resource.descendants().ofType(uri) | %resource.descendants().ofType(url)))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(uri) = '#').exists()).not()).trace('unmatched', id).empty()", @@ -68,7 +69,7 @@ def FHIR_dom_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_4_constraint_model_validator(self): + def FHIR_dom_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()", @@ -78,7 +79,7 @@ def FHIR_dom_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_5_constraint_model_validator(self): + def FHIR_dom_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.security.empty()", @@ -88,7 +89,7 @@ def FHIR_dom_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_6_constraint_model_validator(self): + def FHIR_dom_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="text.`div`.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/event_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/event_definition.py index 08c696e9..3b3dd019 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/event_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/event_definition.py @@ -262,7 +262,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_evd_0_constraint_model_validator(self): + def FHIR_evd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/evidence.py b/fhircraft/fhir/resources/datatypes/R4B/core/evidence.py index bcf6da6e..6d09a43e 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/evidence.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/evidence.py @@ -568,7 +568,7 @@ def citeAs_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/evidence_report.py b/fhircraft/fhir/resources/datatypes/R4B/core/evidence_report.py index 4f14dd0e..8baf1d2f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/evidence_report.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/evidence_report.py @@ -353,7 +353,7 @@ def citeAs_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/evidence_variable.py b/fhircraft/fhir/resources/datatypes/R4B/core/evidence_variable.py index 76a463ba..27b333f7 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/evidence_variable.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/evidence_variable.py @@ -374,7 +374,7 @@ class EvidenceVariable(DomainResource): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/example_scenario.py b/fhircraft/fhir/resources/datatypes/R4B/core/example_scenario.py index 5016eb78..9e6e2812 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/example_scenario.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/example_scenario.py @@ -530,7 +530,7 @@ class ExampleScenario(DomainResource): ) @model_validator(mode="after") - def FHIR_esc_0_constraint_model_validator(self): + def FHIR_esc_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/family_member_history.py b/fhircraft/fhir/resources/datatypes/R4B/core/family_member_history.py index 4d4fb1c4..2a9e5750 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/family_member_history.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/family_member_history.py @@ -332,7 +332,7 @@ def deceased_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_1_constraint_model_validator(self): + def FHIR_fhs_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.empty() or born.empty()", @@ -342,7 +342,7 @@ def FHIR_fhs_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_2_constraint_model_validator(self): + def FHIR_fhs_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.exists() or estimatedAge.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/graph_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/graph_definition.py index b8546f72..32833185 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/graph_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/graph_definition.py @@ -317,7 +317,7 @@ class GraphDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_gdf_0_constraint_model_validator(self): + def FHIR_gdf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/group.py b/fhircraft/fhir/resources/datatypes/R4B/core/group.py index d6fc2a6e..5aa0ba60 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/group.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/group.py @@ -206,7 +206,7 @@ class Group(DomainResource): ) @model_validator(mode="after") - def FHIR_grp_1_constraint_model_validator(self): + def FHIR_grp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="member.empty() or (actual = true)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/implementation_guide.py b/fhircraft/fhir/resources/datatypes/R4B/core/implementation_guide.py index 6015826a..b97e85c5 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/implementation_guide.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/implementation_guide.py @@ -639,7 +639,7 @@ class ImplementationGuide(DomainResource): ) @model_validator(mode="after") - def FHIR_ig_0_constraint_model_validator(self): + def FHIR_ig_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -660,7 +660,7 @@ def FHIR_ig_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_ig_2_constraint_model_validator(self): + def FHIR_ig_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="definition.resource.fhirVersion.all(%context.fhirVersion contains $this)", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/ingredient.py b/fhircraft/fhir/resources/datatypes/R4B/core/ingredient.py index a5a0859d..40205a3d 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/ingredient.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/ingredient.py @@ -264,7 +264,7 @@ class Ingredient(DomainResource): ) @model_validator(mode="after") - def FHIR_ing_1_constraint_model_validator(self): + def FHIR_ing_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(Ingredient.allergenicIndicator.where(value='true').count() + Ingredient.substance.code.reference.count()) < 2", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/insurance_plan.py b/fhircraft/fhir/resources/datatypes/R4B/core/insurance_plan.py index 4e0b955b..e578a3a1 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/insurance_plan.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/insurance_plan.py @@ -318,7 +318,7 @@ class InsurancePlan(DomainResource): ) @model_validator(mode="after") - def FHIR_ipn_1_constraint_model_validator(self): + def FHIR_ipn_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/library.py b/fhircraft/fhir/resources/datatypes/R4B/core/library.py index 54822102..2e21f24d 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/library.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/library.py @@ -276,7 +276,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/linkage.py b/fhircraft/fhir/resources/datatypes/R4B/core/linkage.py index f4000de9..8f78650e 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/linkage.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/linkage.py @@ -78,7 +78,7 @@ class Linkage(DomainResource): ) @model_validator(mode="after") - def FHIR_lnk_1_constraint_model_validator(self): + def FHIR_lnk_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="item.count()>1", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/list.py b/fhircraft/fhir/resources/datatypes/R4B/core/list.py index a039eed0..922f0f56 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/list.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/list.py @@ -154,7 +154,7 @@ class List(DomainResource): ) @model_validator(mode="after") - def FHIR_lst_1_constraint_model_validator(self): + def FHIR_lst_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="emptyReason.empty() or entry.empty()", @@ -164,7 +164,7 @@ def FHIR_lst_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_lst_2_constraint_model_validator(self): + def FHIR_lst_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="mode = 'changes' or entry.deleted.empty()", @@ -174,7 +174,7 @@ def FHIR_lst_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_lst_3_constraint_model_validator(self): + def FHIR_lst_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="mode = 'working' or entry.date.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/measure.py b/fhircraft/fhir/resources/datatypes/R4B/core/measure.py index 8c4eb573..64ea2d08 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/measure.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/measure.py @@ -488,7 +488,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -498,7 +498,7 @@ def FHIR_cnl_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_mea_1_constraint_model_validator(self): + def FHIR_mea_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.all((code | description | criteria).exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/measure_report.py b/fhircraft/fhir/resources/datatypes/R4B/core/measure_report.py index 9f19db08..1cabb7d9 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/measure_report.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/measure_report.py @@ -242,7 +242,7 @@ class MeasureReport(DomainResource): ) @model_validator(mode="after") - def FHIR_mrp_1_constraint_model_validator(self): + def FHIR_mrp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type != 'data-collection') or group.exists().not()", @@ -252,7 +252,7 @@ def FHIR_mrp_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_mrp_2_constraint_model_validator(self): + def FHIR_mrp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.stratum.all(value.exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/medication_dispense.py b/fhircraft/fhir/resources/datatypes/R4B/core/medication_dispense.py index ef1bcae5..b655a960 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/medication_dispense.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/medication_dispense.py @@ -246,7 +246,7 @@ def medication_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_mdd_1_constraint_model_validator(self): + def FHIR_mdd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="whenHandedOver.empty() or whenPrepared.empty() or whenHandedOver >= whenPrepared", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/message_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/message_definition.py index dfee1a59..a3b51acd 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/message_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/message_definition.py @@ -339,7 +339,7 @@ def FHIR_md_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_msd_0_constraint_model_validator(self): + def FHIR_msd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/molecular_sequence.py b/fhircraft/fhir/resources/datatypes/R4B/core/molecular_sequence.py index de8720d1..2e8ca2b9 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/molecular_sequence.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/molecular_sequence.py @@ -604,7 +604,7 @@ class MolecularSequence(DomainResource): ) @model_validator(mode="after") - def FHIR_msq_3_constraint_model_validator(self): + def FHIR_msq_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="coordinateSystem = 1 or coordinateSystem = 0", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/naming_system.py b/fhircraft/fhir/resources/datatypes/R4B/core/naming_system.py index 0763f948..71c21e55 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/naming_system.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/naming_system.py @@ -190,7 +190,7 @@ class NamingSystem(DomainResource): ) @model_validator(mode="after") - def FHIR_nsd_0_constraint_model_validator(self): + def FHIR_nsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -200,7 +200,7 @@ def FHIR_nsd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_1_constraint_model_validator(self): + def FHIR_nsd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'root' or uniqueId.all(type != 'uuid')", @@ -210,7 +210,7 @@ def FHIR_nsd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_2_constraint_model_validator(self): + def FHIR_nsd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="uniqueId.where(preferred = true).select(type).isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/nutrition_order.py b/fhircraft/fhir/resources/datatypes/R4B/core/nutrition_order.py index 29bf4282..106a01b1 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/nutrition_order.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/nutrition_order.py @@ -353,7 +353,7 @@ class NutritionOrder(DomainResource): ) @model_validator(mode="after") - def FHIR_nor_1_constraint_model_validator(self): + def FHIR_nor_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="oralDiet.exists() or supplement.exists() or enteralFormula.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/observation.py b/fhircraft/fhir/resources/datatypes/R4B/core/observation.py index 4414bd56..6ec2792a 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/observation.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/observation.py @@ -499,7 +499,7 @@ def FHIR_obs_3_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_obs_6_constraint_model_validator(self): + def FHIR_obs_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="dataAbsentReason.empty() or value.empty()", @@ -509,7 +509,7 @@ def FHIR_obs_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_obs_7_constraint_model_validator(self): + def FHIR_obs_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/operation_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/operation_definition.py index 5571164b..4fa26f79 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/operation_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/operation_definition.py @@ -429,7 +429,7 @@ class OperationDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_opd_0_constraint_model_validator(self): + def FHIR_opd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/organization.py b/fhircraft/fhir/resources/datatypes/R4B/core/organization.py index b405cfc1..010957ac 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/organization.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/organization.py @@ -124,7 +124,7 @@ class Organization(DomainResource): ) @model_validator(mode="after") - def FHIR_org_1_constraint_model_validator(self): + def FHIR_org_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/plan_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/plan_definition.py index 682ce1d1..a324b684 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/plan_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/plan_definition.py @@ -760,7 +760,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/questionnaire.py b/fhircraft/fhir/resources/datatypes/R4B/core/questionnaire.py index 5075ed9b..467528da 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/questionnaire.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/questionnaire.py @@ -677,7 +677,7 @@ class Questionnaire(DomainResource): ) @model_validator(mode="after") - def FHIR_que_0_constraint_model_validator(self): + def FHIR_que_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -720,7 +720,7 @@ def FHIR_que_1c_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_que_2_constraint_model_validator(self): + def FHIR_que_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="descendants().linkId.isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/research_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/research_definition.py index 69d9635a..32704dc5 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/research_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/research_definition.py @@ -301,7 +301,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_rsd_0_constraint_model_validator(self): + def FHIR_rsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/research_element_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/research_element_definition.py index c7ef9f64..aaa9ade5 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/research_element_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/research_element_definition.py @@ -491,7 +491,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_red_0_constraint_model_validator(self): + def FHIR_red_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/resource.py b/fhircraft/fhir/resources/datatypes/R4B/core/resource.py index f2471716..8220dd76 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/resource.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/resource.py @@ -7,6 +7,7 @@ from fhircraft.fhir.resources.datatypes.primitives import * from fhircraft.fhir.resources.datatypes.R4B.complex import Element, Meta + class Resource(FHIRBaseModel): """ Base Resource @@ -46,7 +47,7 @@ class Resource(FHIRBaseModel): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return fhir_validators.validate_element_constraint( self, elements=(list(self.__class__.model_fields.keys())), diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/search_parameter.py b/fhircraft/fhir/resources/datatypes/R4B/core/search_parameter.py index caba0e20..4dfc8e1c 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/search_parameter.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/search_parameter.py @@ -290,7 +290,7 @@ class SearchParameter(DomainResource): ) @model_validator(mode="after") - def FHIR_spd_0_constraint_model_validator(self): + def FHIR_spd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -300,7 +300,7 @@ def FHIR_spd_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_1_constraint_model_validator(self): + def FHIR_spd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="xpath.empty() or xpathUsage.exists()", @@ -310,7 +310,7 @@ def FHIR_spd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_2_constraint_model_validator(self): + def FHIR_spd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="chain.empty() or type = 'reference'", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/service_request.py b/fhircraft/fhir/resources/datatypes/R4B/core/service_request.py index 2d34007c..4ca9aebd 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/service_request.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/service_request.py @@ -305,7 +305,7 @@ def asNeeded_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_prr_1_constraint_model_validator(self): + def FHIR_prr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="orderDetail.empty() or code.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/structure_definition.py b/fhircraft/fhir/resources/datatypes/R4B/core/structure_definition.py index 73a4164e..5f9eaa29 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/structure_definition.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/structure_definition.py @@ -431,7 +431,7 @@ def FHIR_sdf_8a_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_0_constraint_model_validator(self): + def FHIR_sdf_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -441,7 +441,7 @@ def FHIR_sdf_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_1_constraint_model_validator(self): + def FHIR_sdf_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="derivation = 'constraint' or snapshot.element.select(path).isDistinct()", @@ -451,7 +451,7 @@ def FHIR_sdf_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15a_constraint_model_validator(self): + def FHIR_sdf_15a_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='logical' and differential.element.first().path.contains('.').not()) implies differential.element.first().type.empty()", @@ -461,7 +461,7 @@ def FHIR_sdf_15a_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_4_constraint_model_validator(self): + def FHIR_sdf_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abstract = true or baseDefinition.exists()", @@ -471,7 +471,7 @@ def FHIR_sdf_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_5_constraint_model_validator(self): + def FHIR_sdf_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type != 'Extension' or derivation = 'specialization' or (context.exists())", @@ -481,7 +481,7 @@ def FHIR_sdf_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_6_constraint_model_validator(self): + def FHIR_sdf_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.exists() or differential.exists()", @@ -491,7 +491,7 @@ def FHIR_sdf_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_9_constraint_model_validator(self): + def FHIR_sdf_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="children().element.where(path.contains('.').not()).label.empty() and children().element.where(path.contains('.').not()).code.empty() and children().element.where(path.contains('.').not()).requirements.empty()", @@ -512,7 +512,7 @@ def FHIR_sdf_10_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_11_constraint_model_validator(self): + def FHIR_sdf_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'logical' implies snapshot.empty() or snapshot.element.first().path = type", @@ -522,7 +522,7 @@ def FHIR_sdf_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_14_constraint_model_validator(self): + def FHIR_sdf_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and differential.element.all(id.exists())", @@ -532,7 +532,7 @@ def FHIR_sdf_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15_constraint_model_validator(self): + def FHIR_sdf_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind!='logical' implies snapshot.element.first().type.empty()", @@ -542,7 +542,7 @@ def FHIR_sdf_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_16_constraint_model_validator(self): + def FHIR_sdf_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and snapshot.element.id.trace('ids').isDistinct()", @@ -552,7 +552,7 @@ def FHIR_sdf_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_17_constraint_model_validator(self): + def FHIR_sdf_17_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.all(id.exists()) and differential.element.id.trace('ids').isDistinct()", @@ -562,7 +562,7 @@ def FHIR_sdf_17_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_18_constraint_model_validator(self): + def FHIR_sdf_18_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contextInvariant.exists() implies type = 'Extension'", @@ -572,7 +572,7 @@ def FHIR_sdf_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_19_constraint_model_validator(self): + def FHIR_sdf_19_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (differential.element.type.code.all(matches('^[a-zA-Z0-9]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')) and snapshot.element.type.code.all(matches('^[a-zA-Z0-9\\.]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')))", @@ -582,7 +582,7 @@ def FHIR_sdf_19_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_21_constraint_model_validator(self): + def FHIR_sdf_21_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.defaultValue.exists() implies (derivation = 'specialization')", @@ -592,7 +592,7 @@ def FHIR_sdf_21_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_22_constraint_model_validator(self): + def FHIR_sdf_22_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (snapshot.element.defaultValue.empty() and differential.element.defaultValue.empty())", @@ -602,7 +602,7 @@ def FHIR_sdf_22_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_23_constraint_model_validator(self): + def FHIR_sdf_23_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(snapshot | differential).element.all(path.contains('.').not() implies sliceName.empty())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/structure_map.py b/fhircraft/fhir/resources/datatypes/R4B/core/structure_map.py index 6a179efe..1ee125f6 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/structure_map.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/structure_map.py @@ -1027,7 +1027,7 @@ class StructureMap(DomainResource): ) @model_validator(mode="after") - def FHIR_smp_0_constraint_model_validator(self): + def FHIR_smp_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/subscription_status.py b/fhircraft/fhir/resources/datatypes/R4B/core/subscription_status.py index ae06144d..02a624db 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/subscription_status.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/subscription_status.py @@ -129,7 +129,7 @@ class SubscriptionStatus(DomainResource): ) @model_validator(mode="after") - def FHIR_sst_1_constraint_model_validator(self): + def FHIR_sst_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'event-notification' implies (notificationEvent.exists() and notificationEvent.first().exists())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/task.py b/fhircraft/fhir/resources/datatypes/R4B/core/task.py index 8432e4a6..8d08d906 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/task.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/task.py @@ -1025,7 +1025,7 @@ class Task(DomainResource): ) @model_validator(mode="after") - def FHIR_inv_1_constraint_model_validator(self): + def FHIR_inv_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="lastModified.exists().not() or authoredOn.exists().not() or lastModified >= authoredOn", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/terminology_capabilities.py b/fhircraft/fhir/resources/datatypes/R4B/core/terminology_capabilities.py index 45d02a3e..c5158d0f 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/terminology_capabilities.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/terminology_capabilities.py @@ -506,7 +506,7 @@ def FHIR_tcp_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_0_constraint_model_validator(self): + def FHIR_tcp_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", @@ -516,7 +516,7 @@ def FHIR_tcp_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_2_constraint_model_validator(self): + def FHIR_tcp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -526,7 +526,7 @@ def FHIR_tcp_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_3_constraint_model_validator(self): + def FHIR_tcp_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -536,7 +536,7 @@ def FHIR_tcp_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_4_constraint_model_validator(self): + def FHIR_tcp_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -546,7 +546,7 @@ def FHIR_tcp_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_5_constraint_model_validator(self): + def FHIR_tcp_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/test_script.py b/fhircraft/fhir/resources/datatypes/R4B/core/test_script.py index 6dac1d3e..3e2a012d 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/test_script.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/test_script.py @@ -1298,7 +1298,7 @@ class TestScript(DomainResource): ) @model_validator(mode="after") - def FHIR_tst_0_constraint_model_validator(self): + def FHIR_tst_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R4B/core/value_set.py b/fhircraft/fhir/resources/datatypes/R4B/core/value_set.py index 4ad833e1..7e6fb4f8 100644 --- a/fhircraft/fhir/resources/datatypes/R4B/core/value_set.py +++ b/fhircraft/fhir/resources/datatypes/R4B/core/value_set.py @@ -634,7 +634,7 @@ class ValueSet(DomainResource): ) @model_validator(mode="after") - def FHIR_vsd_0_constraint_model_validator(self): + def FHIR_vsd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}')", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/age.py b/fhircraft/fhir/resources/datatypes/R5/complex/age.py index 19c62161..60916762 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/age.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/age.py @@ -13,7 +13,7 @@ class Age(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_age_1_constraint_model_validator(self): + def FHIR_age_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (value.empty() or value.hasValue().not() or value > 0)", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/attachment.py b/fhircraft/fhir/resources/datatypes/R5/complex/attachment.py index bb0f50a8..4112075f 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/attachment.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/attachment.py @@ -133,7 +133,7 @@ class Attachment(Element): ) @model_validator(mode="after") - def FHIR_att_1_constraint_model_validator(self): + def FHIR_att_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or contentType.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/base.py b/fhircraft/fhir/resources/datatypes/R5/complex/base.py index 3dc46699..a94115dd 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/base.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/base.py @@ -16,7 +16,7 @@ class Base(FHIRBaseModel): _fhir_release = "R5" @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return fhir_validators.validate_element_constraint( self, elements=(list(self.__class__.model_fields.keys())), diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/coding.py b/fhircraft/fhir/resources/datatypes/R5/complex/coding.py index 147aa29e..0d7cfd86 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/coding.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/coding.py @@ -61,7 +61,7 @@ class Coding(Element): ) @model_validator(mode="after") - def FHIR_cod_1_constraint_model_validator(self): + def FHIR_cod_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.exists().not() implies display.exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/contact_point.py b/fhircraft/fhir/resources/datatypes/R5/complex/contact_point.py index 02194498..ada99697 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/contact_point.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/contact_point.py @@ -56,7 +56,7 @@ class ContactPoint(Element): ) @model_validator(mode="after") - def FHIR_cpt_2_constraint_model_validator(self): + def FHIR_cpt_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/count.py b/fhircraft/fhir/resources/datatypes/R5/complex/count.py index a28245ed..caefc60c 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/count.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/count.py @@ -13,7 +13,7 @@ class Count(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_cnt_3_constraint_model_validator(self): + def FHIR_cnt_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum) and (code.empty() or code = '1') and (value.empty() or value.hasValue().not() or value.toString().contains('.').not())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/distance.py b/fhircraft/fhir/resources/datatypes/R5/complex/distance.py index dbfd0acb..3dac75e5 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/distance.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/distance.py @@ -13,7 +13,7 @@ class Distance(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_dis_1_constraint_model_validator(self): + def FHIR_dis_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = %ucum)", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/dosage.py b/fhircraft/fhir/resources/datatypes/R5/complex/dosage.py index 495f898c..1213ad53 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/dosage.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/dosage.py @@ -163,7 +163,7 @@ class Dosage(BackboneType): ) @model_validator(mode="after") - def FHIR_dos_1_constraint_model_validator(self): + def FHIR_dos_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="asNeededFor.empty() or asNeeded.empty() or asNeeded", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/duration.py b/fhircraft/fhir/resources/datatypes/R5/complex/duration.py index 21792ecc..53c855e2 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/duration.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/duration.py @@ -13,7 +13,7 @@ class Duration(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_drt_1_constraint_model_validator(self): + def FHIR_drt_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.exists() implies ((system = %ucum) and value.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/element_definition.py b/fhircraft/fhir/resources/datatypes/R5/complex/element_definition.py index 4acc8e07..1321238a 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/element_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/element_definition.py @@ -2546,7 +2546,7 @@ def maxValue_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_eld_2_constraint_model_validator(self): + def FHIR_eld_2_constraint_validator(self): return validate_model_constraint( self, expression="min.empty() or max.empty() or (max = '*') or iif(max != '*', min <= max.toInteger())", @@ -2556,7 +2556,7 @@ def FHIR_eld_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_5_constraint_model_validator(self): + def FHIR_eld_5_constraint_validator(self): return validate_model_constraint( self, expression="contentReference.empty() or (type.empty() and defaultValue.empty() and fixed.empty() and pattern.empty() and example.empty() and minValue.empty() and maxValue.empty() and maxLength.empty() and binding.empty())", @@ -2566,7 +2566,7 @@ def FHIR_eld_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_6_constraint_model_validator(self): + def FHIR_eld_6_constraint_validator(self): return validate_model_constraint( self, expression="fixed.empty() or (type.count() <= 1)", @@ -2576,7 +2576,7 @@ def FHIR_eld_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_7_constraint_model_validator(self): + def FHIR_eld_7_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or (type.count() <= 1)", @@ -2586,7 +2586,7 @@ def FHIR_eld_7_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_8_constraint_model_validator(self): + def FHIR_eld_8_constraint_validator(self): return validate_model_constraint( self, expression="pattern.empty() or fixed.empty()", @@ -2596,7 +2596,7 @@ def FHIR_eld_8_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_11_constraint_model_validator(self): + def FHIR_eld_11_constraint_validator(self): return validate_model_constraint( self, expression="binding.empty() or type.code.empty() or type.select(code.contains(':')).exists() or type.select((code = 'code') or (code = 'Coding') or (code='CodeableConcept') or (code = 'Quantity') or (code = 'string') or (code = 'uri') or (code = 'Duration')).exists()", @@ -2606,7 +2606,7 @@ def FHIR_eld_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_13_constraint_model_validator(self): + def FHIR_eld_13_constraint_validator(self): return validate_model_constraint( self, expression="type.select(code).isDistinct()", @@ -2616,7 +2616,7 @@ def FHIR_eld_13_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_14_constraint_model_validator(self): + def FHIR_eld_14_constraint_validator(self): return validate_model_constraint( self, expression="constraint.select(key).isDistinct()", @@ -2626,7 +2626,7 @@ def FHIR_eld_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_15_constraint_model_validator(self): + def FHIR_eld_15_constraint_validator(self): return validate_model_constraint( self, expression="defaultValue.empty() or meaningWhenMissing.empty()", @@ -2636,7 +2636,7 @@ def FHIR_eld_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_16_constraint_model_validator(self): + def FHIR_eld_16_constraint_validator(self): return validate_model_constraint( self, expression="sliceName.empty() or sliceName.matches('^[a-zA-Z0-9\\/\\-_\\[\\]\\@]+$')", @@ -2646,7 +2646,7 @@ def FHIR_eld_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_18_constraint_model_validator(self): + def FHIR_eld_18_constraint_validator(self): return validate_model_constraint( self, expression="(isModifier.exists() and isModifier) implies isModifierReason.exists()", @@ -2656,7 +2656,7 @@ def FHIR_eld_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_19_constraint_model_validator(self): + def FHIR_eld_19_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\.[^\\s\\.,:;\\\'"\\/|?!@#$%&*()\\[\\]{}]{1,64}(\\[x\\])?(\\:[^\\s\\.]+)?)*$')""", @@ -2666,7 +2666,7 @@ def FHIR_eld_19_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_20_constraint_model_validator(self): + def FHIR_eld_20_constraint_validator(self): return validate_model_constraint( self, expression="""path.matches('^[A-Za-z][A-Za-z0-9]{0,63}(\\.[a-z][A-Za-z0-9]{0,63}(\\[x])?)*$')""", @@ -2676,7 +2676,7 @@ def FHIR_eld_20_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_22_constraint_model_validator(self): + def FHIR_eld_22_constraint_validator(self): return validate_model_constraint( self, expression="sliceIsConstraining.exists() implies sliceName.exists()", @@ -2686,7 +2686,7 @@ def FHIR_eld_22_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_24_constraint_model_validator(self): + def FHIR_eld_24_constraint_validator(self): return validate_model_constraint( self, expression="fixed.exists().not()", @@ -2696,7 +2696,7 @@ def FHIR_eld_24_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_25_constraint_model_validator(self): + def FHIR_eld_25_constraint_validator(self): return validate_model_constraint( self, expression="orderMeaning.empty() implies slicing.where(rules='openAtEnd' or ordered).exists().not()", @@ -2706,7 +2706,7 @@ def FHIR_eld_25_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_27_constraint_model_validator(self): + def FHIR_eld_27_constraint_validator(self): return validate_model_constraint( self, expression="mapping.select(identity).isDistinct()", @@ -2716,7 +2716,7 @@ def FHIR_eld_27_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_eld_28_constraint_model_validator(self): + def FHIR_eld_28_constraint_validator(self): return validate_model_constraint( self, expression="mustHaveValue.value implies valueAlternatives.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/expression.py b/fhircraft/fhir/resources/datatypes/R5/complex/expression.py index 3f97b952..392cb84c 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/expression.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/expression.py @@ -61,7 +61,7 @@ class Expression(DataType): ) @model_validator(mode="after") - def FHIR_exp_1_constraint_model_validator(self): + def FHIR_exp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="expression.exists() or reference.exists()", @@ -71,7 +71,7 @@ def FHIR_exp_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_exp_2_constraint_model_validator(self): + def FHIR_exp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.hasValue() implies name.matches('[A-Za-z][A-Za-z0-9\\_]{0,63}')", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/extension.py b/fhircraft/fhir/resources/datatypes/R5/complex/extension.py index f4b95f25..72f940d9 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/extension.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/extension.py @@ -375,16 +375,6 @@ class Extension(DataType): default=None, ) - @model_validator(mode="after") - def FHIR_ext_1_constraint_validator(self): - return fhir_validators.validate_model_constraint( - self, - expression="extension.exists() != value.exists()", - human="Must have either extensions or value[x], not both", - key="ext-1", - severity="error", - ) - @model_validator(mode="after") def value_type_choice_validator(self): return fhir_validators.validate_type_choice_element( @@ -449,7 +439,7 @@ def value_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_ext_1_constraint_model_validator(self): + def FHIR_ext_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="extension.exists() != value.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/identifier.py b/fhircraft/fhir/resources/datatypes/R5/complex/identifier.py index 96e471ba..c9635e38 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/identifier.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/identifier.py @@ -61,7 +61,7 @@ class Identifier(DataType): ) @model_validator(mode="after") - def FHIR_ident_1_constraint_model_validator(self): + def FHIR_ident_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/money_quantity.py b/fhircraft/fhir/resources/datatypes/R5/complex/money_quantity.py index 602179d7..79644b09 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/money_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/money_quantity.py @@ -13,7 +13,7 @@ class MoneyQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_mtqy_1_constraint_model_validator(self): + def FHIR_mtqy_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(code.exists() or value.empty()) and (system.empty() or system = 'urn:iso:std:iso:4217')", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/period.py b/fhircraft/fhir/resources/datatypes/R5/complex/period.py index 55b2007f..467f4180 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/period.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/period.py @@ -34,7 +34,7 @@ class Period(DataType): ) @model_validator(mode="after") - def FHIR_per_1_constraint_model_validator(self): + def FHIR_per_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.hasValue().not() or end.hasValue().not() or (start.lowBoundary() <= end.highBoundary())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/quantity.py b/fhircraft/fhir/resources/datatypes/R5/complex/quantity.py index 2e1b7796..fd817851 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/quantity.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/quantity.py @@ -61,7 +61,7 @@ class Quantity(DataType): ) @model_validator(mode="after") - def FHIR_qty_3_constraint_model_validator(self): + def FHIR_qty_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="code.empty() or system.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/range.py b/fhircraft/fhir/resources/datatypes/R5/complex/range.py index 47ebe8e0..620aa028 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/range.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/range.py @@ -24,7 +24,7 @@ class Range(DataType): ) @model_validator(mode="after") - def FHIR_rng_2_constraint_model_validator(self): + def FHIR_rng_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="low.value.empty() or high.value.empty() or low.lowBoundary().comparable(high.highBoundary()).not() or (low.lowBoundary() <= high.highBoundary())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/ratio.py b/fhircraft/fhir/resources/datatypes/R5/complex/ratio.py index ef538c31..52084ee5 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/ratio.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/ratio.py @@ -24,7 +24,7 @@ class Ratio(DataType): ) @model_validator(mode="after") - def FHIR_rat_1_constraint_model_validator(self): + def FHIR_rat_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(numerator.exists() and denominator.exists()) or (numerator.empty() and denominator.empty() and extension.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/ratio_range.py b/fhircraft/fhir/resources/datatypes/R5/complex/ratio_range.py index 1a6ea229..a384a168 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/ratio_range.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/ratio_range.py @@ -28,7 +28,7 @@ class RatioRange(DataType): ) @model_validator(mode="after") - def FHIR_ratrng_1_constraint_model_validator(self): + def FHIR_ratrng_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="((lowNumerator.exists() or highNumerator.exists()) and denominator.exists()) or (lowNumerator.empty() and highNumerator.empty() and denominator.empty() and extension.exists())", @@ -38,7 +38,7 @@ def FHIR_ratrng_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ratrng_2_constraint_model_validator(self): + def FHIR_ratrng_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="lowNumerator.hasValue().not() or highNumerator.hasValue().not() or (lowNumerator.lowBoundary() <= highNumerator.highBoundary())", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/reference.py b/fhircraft/fhir/resources/datatypes/R5/complex/reference.py index c34c2b89..8c7a6ece 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/reference.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/reference.py @@ -50,7 +50,7 @@ class Reference(DataType): ) @model_validator(mode="after") - def FHIR_ref_1_constraint_model_validator(self): + def FHIR_ref_1_constraint_validator(self): if not self._root_resource or not self._resource: return self return fhir_validators.validate_model_constraint( @@ -62,7 +62,7 @@ def FHIR_ref_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_ref_2_constraint_model_validator(self): + def FHIR_ref_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="reference.exists() or identifier.exists() or display.exists() or extension.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/sampled_data.py b/fhircraft/fhir/resources/datatypes/R5/complex/sampled_data.py index 0443b500..b422bb70 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/sampled_data.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/sampled_data.py @@ -101,7 +101,7 @@ class SampledData(DataType): ) @model_validator(mode="after") - def FHIR_sdd_1_constraint_model_validator(self): + def FHIR_sdd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="interval.exists().not() xor offsets.exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/simple_quantity.py b/fhircraft/fhir/resources/datatypes/R5/complex/simple_quantity.py index 4c08ea9e..d84bb5fd 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/simple_quantity.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/simple_quantity.py @@ -13,7 +13,7 @@ class SimpleQuantity(Quantity): _type = "Quantity" @model_validator(mode="after") - def FHIR_sqty_1_constraint_model_validator(self): + def FHIR_sqty_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="comparator.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/complex/trigger_definition.py b/fhircraft/fhir/resources/datatypes/R5/complex/trigger_definition.py index 46d6254d..40242581 100644 --- a/fhircraft/fhir/resources/datatypes/R5/complex/trigger_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/complex/trigger_definition.py @@ -87,7 +87,7 @@ def timing_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_trd_1_constraint_model_validator(self): + def FHIR_trd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="data.empty() or timing.empty()", @@ -97,7 +97,7 @@ def FHIR_trd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_2_constraint_model_validator(self): + def FHIR_trd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="condition.exists() implies data.exists()", @@ -107,7 +107,7 @@ def FHIR_trd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_trd_3_constraint_model_validator(self): + def FHIR_trd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'named-event' implies name.exists()) and (type = 'periodic' implies timing.exists()) and (type.startsWith('data-') implies data.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/activity_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/activity_definition.py index d01263b3..335bca9d 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/activity_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/activity_definition.py @@ -560,7 +560,7 @@ def product_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/actor_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/actor_definition.py index 3fd1719c..dd677540 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/actor_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/actor_definition.py @@ -236,7 +236,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/administrable_product_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/administrable_product_definition.py index 2139de1c..ca5404fc 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/administrable_product_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/administrable_product_definition.py @@ -262,7 +262,7 @@ class AdministrableProductDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_apd_1_constraint_model_validator(self): + def FHIR_apd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="AdministrableProductDefinition.formOf.resolve().route.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/appointment.py b/fhircraft/fhir/resources/datatypes/R5/core/appointment.py index 6a34371a..4dc78aad 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/appointment.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/appointment.py @@ -468,7 +468,7 @@ def FHIR_app_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_app_2_constraint_model_validator(self): + def FHIR_app_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.exists() = end.exists()", @@ -478,7 +478,7 @@ def FHIR_app_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_3_constraint_model_validator(self): + def FHIR_app_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(start.exists() and end.exists()) or (status in ('proposed' | 'cancelled' | 'waitlist'))", @@ -488,7 +488,7 @@ def FHIR_app_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_4_constraint_model_validator(self): + def FHIR_app_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="cancellationReason.exists() implies (status='noshow' or status='cancelled')", @@ -498,7 +498,7 @@ def FHIR_app_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_5_constraint_model_validator(self): + def FHIR_app_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="start.exists() implies start <= end", @@ -508,7 +508,7 @@ def FHIR_app_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_6_constraint_model_validator(self): + def FHIR_app_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="originatingAppointment.exists().not() or recurrenceTemplate.exists().not()", @@ -518,7 +518,7 @@ def FHIR_app_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_app_7_constraint_model_validator(self): + def FHIR_app_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="cancellationDate.exists() implies (status='noshow' or status='cancelled')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/appointment_response.py b/fhircraft/fhir/resources/datatypes/R5/core/appointment_response.py index 57f20d7c..ded3afac 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/appointment_response.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/appointment_response.py @@ -128,7 +128,7 @@ class AppointmentResponse(DomainResource): ) @model_validator(mode="after") - def FHIR_apr_1_constraint_model_validator(self): + def FHIR_apr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="participantType.exists() or actor.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/bundle.py b/fhircraft/fhir/resources/datatypes/R5/core/bundle.py index 4650b625..8ff4c2f3 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/bundle.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/bundle.py @@ -299,7 +299,7 @@ class Bundle(Resource): ) @model_validator(mode="after") - def FHIR_bdl_1_constraint_model_validator(self): + def FHIR_bdl_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="total.empty() or (type = 'searchset') or (type = 'history')", @@ -309,7 +309,7 @@ def FHIR_bdl_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_2_constraint_model_validator(self): + def FHIR_bdl_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'searchset') or entry.search.empty()", @@ -319,7 +319,7 @@ def FHIR_bdl_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3a_constraint_model_validator(self): + def FHIR_bdl_3a_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type in ('document' | 'message' | 'searchset' | 'collection') implies entry.all(resource.exists() and request.empty() and response.empty())", @@ -329,7 +329,7 @@ def FHIR_bdl_3a_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3b_constraint_model_validator(self): + def FHIR_bdl_3b_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'history' implies entry.all(request.exists() and response.exists() and ((request.method in ('POST' | 'PATCH' | 'PUT')) = resource.exists()))", @@ -339,7 +339,7 @@ def FHIR_bdl_3b_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3c_constraint_model_validator(self): + def FHIR_bdl_3c_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type in ('transaction' | 'batch') implies entry.all(request.method.exists() and ((request.method in ('POST' | 'PATCH' | 'PUT')) = resource.exists()))", @@ -349,7 +349,7 @@ def FHIR_bdl_3c_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_3d_constraint_model_validator(self): + def FHIR_bdl_3d_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type in ('transaction-response' | 'batch-response') implies entry.all(response.exists())", @@ -370,7 +370,7 @@ def FHIR_bdl_5_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_7_constraint_model_validator(self): + def FHIR_bdl_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'history') or entry.where(fullUrl.exists()).select(fullUrl&iif(resource.meta.versionId.exists(), resource.meta.versionId, '')).isDistinct()", @@ -391,7 +391,7 @@ def FHIR_bdl_8_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_9_constraint_model_validator(self): + def FHIR_bdl_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (identifier.system.exists() and identifier.value.exists())", @@ -401,7 +401,7 @@ def FHIR_bdl_9_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_10_constraint_model_validator(self): + def FHIR_bdl_10_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies (timestamp.hasValue())", @@ -411,7 +411,7 @@ def FHIR_bdl_10_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_11_constraint_model_validator(self): + def FHIR_bdl_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies entry.first().resource.is(Composition)", @@ -421,7 +421,7 @@ def FHIR_bdl_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_12_constraint_model_validator(self): + def FHIR_bdl_12_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'message' implies entry.first().resource.is(MessageHeader)", @@ -431,7 +431,7 @@ def FHIR_bdl_12_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_13_constraint_model_validator(self): + def FHIR_bdl_13_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'subscription-notification' implies entry.first().resource.is(SubscriptionStatus)", @@ -441,7 +441,7 @@ def FHIR_bdl_13_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_14_constraint_model_validator(self): + def FHIR_bdl_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'history' implies entry.request.method != 'PATCH'", @@ -451,7 +451,7 @@ def FHIR_bdl_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_15_constraint_model_validator(self): + def FHIR_bdl_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type='transaction' or type='transaction-response' or type='batch' or type='batch-response' or entry.all(fullUrl.exists() or request.method='POST')", @@ -461,7 +461,7 @@ def FHIR_bdl_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_16_constraint_model_validator(self): + def FHIR_bdl_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="issues.exists() implies (issues.issue.severity = 'information' or issues.issue.severity = 'warning')", @@ -471,7 +471,7 @@ def FHIR_bdl_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_17_constraint_model_validator(self): + def FHIR_bdl_17_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'document' implies issues.empty()", @@ -481,7 +481,7 @@ def FHIR_bdl_17_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_bdl_18_constraint_model_validator(self): + def FHIR_bdl_18_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'searchset' implies link.where(relation = 'self' and url.exists()).exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/canonical_resource.py b/fhircraft/fhir/resources/datatypes/R5/core/canonical_resource.py index 0d77ad5e..19f5658b 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/canonical_resource.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/canonical_resource.py @@ -199,7 +199,7 @@ def versionAlgorithm(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/capability_statement.py b/fhircraft/fhir/resources/datatypes/R5/core/capability_statement.py index a857b15f..29534be2 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/capability_statement.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/capability_statement.py @@ -899,7 +899,7 @@ def versionAlgorithm(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -929,7 +929,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_1_constraint_model_validator(self): + def FHIR_cpb_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="rest.exists() or messaging.exists() or document.exists()", @@ -939,7 +939,7 @@ def FHIR_cpb_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_2_constraint_model_validator(self): + def FHIR_cpb_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -949,7 +949,7 @@ def FHIR_cpb_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_3_constraint_model_validator(self): + def FHIR_cpb_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="messaging.endpoint.empty() or kind = 'instance'", @@ -959,7 +959,7 @@ def FHIR_cpb_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_4_constraint_model_validator(self): + def FHIR_cpb_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="rest.mode.isDistinct()", @@ -969,7 +969,7 @@ def FHIR_cpb_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_7_constraint_model_validator(self): + def FHIR_cpb_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="document.select(profile&mode).isDistinct()", @@ -1001,7 +1001,7 @@ def FHIR_cpb_12_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_14_constraint_model_validator(self): + def FHIR_cpb_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -1011,7 +1011,7 @@ def FHIR_cpb_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_15_constraint_model_validator(self): + def FHIR_cpb_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -1021,7 +1021,7 @@ def FHIR_cpb_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_cpb_16_constraint_model_validator(self): + def FHIR_cpb_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/charge_item_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/charge_item_definition.py index 1b943956..eebc350d 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/charge_item_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/charge_item_definition.py @@ -317,7 +317,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/citation.py b/fhircraft/fhir/resources/datatypes/R5/core/citation.py index 20f903ce..8170c47b 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/citation.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/citation.py @@ -925,7 +925,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/clinical_use_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/clinical_use_definition.py index 4442b415..9e61c7fa 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/clinical_use_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/clinical_use_definition.py @@ -327,7 +327,7 @@ class ClinicalUseDefinition(DomainResource): ) @model_validator(mode="after") - def FHIR_cud_1_constraint_model_validator(self): + def FHIR_cud_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(ClinicalUseDefinition.indication.count() + ClinicalUseDefinition.contraindication.count() + ClinicalUseDefinition.interaction.count() + ClinicalUseDefinition.undesirableEffect.count() + ClinicalUseDefinition.warning.count()) < 2", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/code_system.py b/fhircraft/fhir/resources/datatypes/R5/core/code_system.py index 5014e96d..cabcefcd 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/code_system.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/code_system.py @@ -595,7 +595,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -605,7 +605,7 @@ def FHIR_cnl_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_1_constraint_model_validator(self): + def FHIR_csd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="concept.exists() implies concept.code.combine(%resource.concept.descendants().concept.code).isDistinct()", @@ -615,7 +615,7 @@ def FHIR_csd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_2_constraint_model_validator(self): + def FHIR_csd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="concept.concept.exists() implies hierarchyMeaning.exists()", @@ -625,7 +625,7 @@ def FHIR_csd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_3_constraint_model_validator(self): + def FHIR_csd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="concept.where(property.code = 'parent' or property.code = 'child').exists() implies hierarchyMeaning.exists()", @@ -635,7 +635,7 @@ def FHIR_csd_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_csd_4_constraint_model_validator(self): + def FHIR_csd_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="CodeSystem.content = 'supplement' implies CodeSystem.supplements.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/compartment_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/compartment_definition.py index 16c63353..e0f5c68e 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/compartment_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/compartment_definition.py @@ -251,7 +251,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/concept_map.py b/fhircraft/fhir/resources/datatypes/R5/core/concept_map.py index 7f1352a8..d9c6adb5 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/concept_map.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/concept_map.py @@ -871,7 +871,7 @@ def targetScope_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/condition.py b/fhircraft/fhir/resources/datatypes/R5/core/condition.py index 959262ea..83c44af6 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/condition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/condition.py @@ -235,7 +235,7 @@ def FHIR_con_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_con_2_constraint_model_validator(self): + def FHIR_con_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="category.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-category' and code='problem-list-item').exists() implies clinicalStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-clinical' and code='unknown').exists().not()", @@ -245,7 +245,7 @@ def FHIR_con_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_con_3_constraint_model_validator(self): + def FHIR_con_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abatement.exists() implies (clinicalStatus.coding.where(system='http://terminology.hl7.org/CodeSystem/condition-clinical' and (code='inactive' or code='resolved' or code='remission')).exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/condition_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/condition_definition.py index 723490a8..26164e3f 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/condition_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/condition_definition.py @@ -363,7 +363,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/device.py b/fhircraft/fhir/resources/datatypes/R5/core/device.py index fee723dd..56e9f970 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/device.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/device.py @@ -457,7 +457,7 @@ class Device(DomainResource): ) @model_validator(mode="after") - def FHIR_dev_1_constraint_model_validator(self): + def FHIR_dev_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.where(display=true).count() <= 1", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/diagnostic_report.py b/fhircraft/fhir/resources/datatypes/R5/core/diagnostic_report.py index 18a4a512..42851645 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/diagnostic_report.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/diagnostic_report.py @@ -201,7 +201,7 @@ def effective_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_dgr_1_constraint_model_validator(self): + def FHIR_dgr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="composition.exists() implies (composition.resolve().section.entry.reference.where(resolve() is Observation) in (result.reference|result.reference.resolve().hasMember.reference))", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/document_reference.py b/fhircraft/fhir/resources/datatypes/R5/core/document_reference.py index dbb5ad9e..db524879 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/document_reference.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/document_reference.py @@ -260,7 +260,7 @@ class DocumentReference(DomainResource): ) @model_validator(mode="after") - def FHIR_docRef_1_constraint_model_validator(self): + def FHIR_docRef_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="facilityType.empty() or context.where(resolve() is Encounter).empty()", @@ -270,7 +270,7 @@ def FHIR_docRef_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_docRef_2_constraint_model_validator(self): + def FHIR_docRef_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="practiceSetting.empty() or context.where(resolve() is Encounter).empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/domain_resource.py b/fhircraft/fhir/resources/datatypes/R5/core/domain_resource.py index e2fc5c00..59eb1fa7 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/domain_resource.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/domain_resource.py @@ -7,6 +7,7 @@ from fhircraft.fhir.resources.datatypes.R5.complex import Extension, Narrative from .resource import Resource + class DomainResource(Resource): """ A resource with narrative, extensions, and contained resources @@ -34,7 +35,7 @@ class DomainResource(Resource): ) @model_validator(mode="after") - def FHIR_dom_2_constraint_model_validator(self): + def FHIR_dom_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.contained.empty()", @@ -44,7 +45,7 @@ def FHIR_dom_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_3_constraint_model_validator(self): + def FHIR_dom_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().ofType(canonical) | %resource.descendants().ofType(uri) | %resource.descendants().ofType(url))) or descendants().where(reference = '#').exists() or descendants().where(ofType(canonical) = '#').exists() or descendants().where(ofType(canonical) = '#').exists()).not()).trace('unmatched', id).empty()", @@ -54,7 +55,7 @@ def FHIR_dom_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_4_constraint_model_validator(self): + def FHIR_dom_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()", @@ -64,7 +65,7 @@ def FHIR_dom_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_5_constraint_model_validator(self): + def FHIR_dom_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contained.meta.security.empty()", @@ -74,7 +75,7 @@ def FHIR_dom_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_dom_6_constraint_model_validator(self): + def FHIR_dom_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="text.`div`.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/event_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/event_definition.py index c20fe99d..46852427 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/event_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/event_definition.py @@ -301,7 +301,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/evidence.py b/fhircraft/fhir/resources/datatypes/R5/core/evidence.py index 6e7b94af..7de02de4 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/evidence.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/evidence.py @@ -633,7 +633,7 @@ def citeAs_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/evidence_variable.py b/fhircraft/fhir/resources/datatypes/R5/core/evidence_variable.py index 3bfd8c13..0927d433 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/evidence_variable.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/evidence_variable.py @@ -632,7 +632,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/example_scenario.py b/fhircraft/fhir/resources/datatypes/R5/core/example_scenario.py index ed62e684..c35602ba 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/example_scenario.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/example_scenario.py @@ -629,7 +629,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -672,7 +672,7 @@ def FHIR_exs_2_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_exs_3_constraint_model_validator(self): + def FHIR_exs_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="status='active' or status='retired' implies actor.exists()", @@ -682,7 +682,7 @@ def FHIR_exs_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_exs_4_constraint_model_validator(self): + def FHIR_exs_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="status='active' or status='retired' implies process.exists()", @@ -703,7 +703,7 @@ def FHIR_exs_5_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_exs_6_constraint_model_validator(self): + def FHIR_exs_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="actor.key.count() = actor.key.distinct().count()", @@ -713,7 +713,7 @@ def FHIR_exs_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_exs_7_constraint_model_validator(self): + def FHIR_exs_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="actor.title.count() = actor.title.distinct().count()", @@ -723,7 +723,7 @@ def FHIR_exs_7_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_exs_8_constraint_model_validator(self): + def FHIR_exs_8_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="instance.key.count() = instance.key.distinct().count()", @@ -733,7 +733,7 @@ def FHIR_exs_8_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_exs_9_constraint_model_validator(self): + def FHIR_exs_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="instance.title.count() = instance.title.distinct().count()", @@ -765,7 +765,7 @@ def FHIR_exs_11_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_exs_12_constraint_model_validator(self): + def FHIR_exs_12_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="process.title.count() = process.title.distinct().count()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/family_member_history.py b/fhircraft/fhir/resources/datatypes/R5/core/family_member_history.py index 1c4bf92b..9303fa32 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/family_member_history.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/family_member_history.py @@ -415,7 +415,7 @@ def deceased_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_1_constraint_model_validator(self): + def FHIR_fhs_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.empty() or born.empty()", @@ -425,7 +425,7 @@ def FHIR_fhs_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_2_constraint_model_validator(self): + def FHIR_fhs_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.exists() or estimatedAge.empty()", @@ -435,7 +435,7 @@ def FHIR_fhs_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_fhs_3_constraint_model_validator(self): + def FHIR_fhs_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="age.empty() or deceased.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/graph_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/graph_definition.py index ba63dc47..ed17c975 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/graph_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/graph_definition.py @@ -392,7 +392,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/implementation_guide.py b/fhircraft/fhir/resources/datatypes/R5/core/implementation_guide.py index aff0d379..2f92e0d1 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/implementation_guide.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/implementation_guide.py @@ -676,7 +676,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -708,7 +708,7 @@ def FHIR_ig_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_ig_2_constraint_model_validator(self): + def FHIR_ig_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="definition.resource.fhirVersion.all(%context.fhirVersion contains $this)", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/ingredient.py b/fhircraft/fhir/resources/datatypes/R5/core/ingredient.py index 5365abf0..af69b596 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/ingredient.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/ingredient.py @@ -297,7 +297,7 @@ class Ingredient(DomainResource): ) @model_validator(mode="after") - def FHIR_ing_1_constraint_model_validator(self): + def FHIR_ing_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="Ingredient.where(allergenicIndicator=true).count() + Ingredient.substance.code.reference.count() < 2", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/insurance_plan.py b/fhircraft/fhir/resources/datatypes/R5/core/insurance_plan.py index a50281e3..2e0ebfa6 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/insurance_plan.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/insurance_plan.py @@ -282,7 +282,7 @@ class InsurancePlan(DomainResource): ) @model_validator(mode="after") - def FHIR_ipn_1_constraint_model_validator(self): + def FHIR_ipn_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/library.py b/fhircraft/fhir/resources/datatypes/R5/core/library.py index e783f11f..5648f61f 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/library.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/library.py @@ -304,7 +304,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/linkage.py b/fhircraft/fhir/resources/datatypes/R5/core/linkage.py index 7a56c40f..49964241 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/linkage.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/linkage.py @@ -67,7 +67,7 @@ class Linkage(DomainResource): ) @model_validator(mode="after") - def FHIR_lnk_1_constraint_model_validator(self): + def FHIR_lnk_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="item.count()>1", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/list.py b/fhircraft/fhir/resources/datatypes/R5/core/list.py index 87988792..cf810c72 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/list.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/list.py @@ -153,7 +153,7 @@ class List(DomainResource): ) @model_validator(mode="after") - def FHIR_lst_1_constraint_model_validator(self): + def FHIR_lst_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="emptyReason.empty() or entry.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/measure.py b/fhircraft/fhir/resources/datatypes/R5/core/measure.py index d3c89d79..6bbdd02f 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/measure.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/measure.py @@ -681,7 +681,7 @@ def subject_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -702,7 +702,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_mea_1_constraint_model_validator(self): + def FHIR_mea_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.all((code | description | criteria).exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/measure_report.py b/fhircraft/fhir/resources/datatypes/R5/core/measure_report.py index 61662b55..b6f1bc30 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/measure_report.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/measure_report.py @@ -484,7 +484,7 @@ class MeasureReport(DomainResource): ) @model_validator(mode="after") - def FHIR_mrp_1_constraint_model_validator(self): + def FHIR_mrp_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type != 'data-exchange') or group.exists().not()", @@ -494,7 +494,7 @@ def FHIR_mrp_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_mrp_2_constraint_model_validator(self): + def FHIR_mrp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="group.stratifier.stratum.all(value.exists() xor component.exists())", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/medication_dispense.py b/fhircraft/fhir/resources/datatypes/R5/core/medication_dispense.py index b6abe9f0..a7e81cfd 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/medication_dispense.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/medication_dispense.py @@ -224,7 +224,7 @@ class MedicationDispense(DomainResource): ) @model_validator(mode="after") - def FHIR_mdd_1_constraint_model_validator(self): + def FHIR_mdd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="whenHandedOver.empty() or whenPrepared.empty() or whenHandedOver >= whenPrepared", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/message_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/message_definition.py index 5f204294..4c1b5905 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/message_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/message_definition.py @@ -355,7 +355,7 @@ def event_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/naming_system.py b/fhircraft/fhir/resources/datatypes/R5/core/naming_system.py index 52f4c6e1..5f696b40 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/naming_system.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/naming_system.py @@ -334,7 +334,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -355,7 +355,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_1_constraint_model_validator(self): + def FHIR_nsd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'root' or uniqueId.all(type != 'uuid')", @@ -365,7 +365,7 @@ def FHIR_nsd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_2_constraint_model_validator(self): + def FHIR_nsd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="uniqueId.where(preferred = true).select(type).isDistinct()", @@ -375,7 +375,7 @@ def FHIR_nsd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_nsd_3_constraint_model_validator(self): + def FHIR_nsd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="uniqueId.where(authoritative = 'true').select(type.toString() & period.start.toString() & period.end.toString()).isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/nutrition_order.py b/fhircraft/fhir/resources/datatypes/R5/core/nutrition_order.py index e9ecdd9f..86a2a5d5 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/nutrition_order.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/nutrition_order.py @@ -470,7 +470,7 @@ class NutritionOrder(DomainResource): ) @model_validator(mode="after") - def FHIR_nor_1_constraint_model_validator(self): + def FHIR_nor_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="oralDiet.exists() or supplement.exists() or enteralFormula.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/observation.py b/fhircraft/fhir/resources/datatypes/R5/core/observation.py index 7cc4f83e..45d78f01 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/observation.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/observation.py @@ -585,7 +585,7 @@ def FHIR_obs_3_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_obs_6_constraint_model_validator(self): + def FHIR_obs_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="dataAbsentReason.empty() or value.empty()", @@ -595,7 +595,7 @@ def FHIR_obs_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_obs_7_constraint_model_validator(self): + def FHIR_obs_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()", @@ -605,7 +605,7 @@ def FHIR_obs_7_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_obs_8_constraint_model_validator(self): + def FHIR_obs_8_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="bodySite.exists() implies bodyStructure.empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/observation_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/observation_definition.py index e9dad2c2..2c34d687 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/observation_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/observation_definition.py @@ -524,7 +524,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -534,7 +534,7 @@ def FHIR_cnl_0_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_obd_0_constraint_model_validator(self): + def FHIR_obd_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="permittedUnit.exists() implies (permittedDataType = 'Quantity').exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/operation_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/operation_definition.py index f3a38f68..46db00e4 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/operation_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/operation_definition.py @@ -489,7 +489,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -554,7 +554,7 @@ def FHIR_opd_4_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_opd_5_constraint_model_validator(self): + def FHIR_opd_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind = 'query') implies (instance = false)", @@ -564,7 +564,7 @@ def FHIR_opd_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_opd_6_constraint_model_validator(self): + def FHIR_opd_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind = 'query') implies (parameter.all((use = 'in' and searchType.exists()) or (use != 'in')))", @@ -574,7 +574,7 @@ def FHIR_opd_6_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_opd_7_constraint_model_validator(self): + def FHIR_opd_7_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind = 'query') implies ((parameter.where(use = 'out').count() = 1) and (parameter.where(use = 'out').all(name = 'result' and type = 'Bundle')))", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/organization.py b/fhircraft/fhir/resources/datatypes/R5/core/organization.py index 7d7959fe..06bda518 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/organization.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/organization.py @@ -125,7 +125,7 @@ class Organization(DomainResource): ) @model_validator(mode="after") - def FHIR_org_1_constraint_model_validator(self): + def FHIR_org_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(identifier.count() + name.count()) > 0", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/plan_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/plan_definition.py index 307d6383..1156e21d 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/plan_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/plan_definition.py @@ -1018,7 +1018,7 @@ def asNeeded_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -1061,7 +1061,7 @@ def FHIR_pld_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_pld_3_constraint_model_validator(self): + def FHIR_pld_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="%context.repeat(action).where((goalId in %context.goal.id).not()).exists().not()", @@ -1071,7 +1071,7 @@ def FHIR_pld_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_pld_4_constraint_model_validator(self): + def FHIR_pld_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="%context.repeat(action).relatedAction.where((targetId in %context.repeat(action).id).not()).exists().not()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/questionnaire.py b/fhircraft/fhir/resources/datatypes/R5/core/questionnaire.py index 7d15e158..70532c62 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/questionnaire.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/questionnaire.py @@ -722,7 +722,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -743,7 +743,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_que_2_constraint_model_validator(self): + def FHIR_que_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="descendants().linkId.isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/requirements.py b/fhircraft/fhir/resources/datatypes/R5/core/requirements.py index 54acdc4a..ccd84c73 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/requirements.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/requirements.py @@ -321,7 +321,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/search_parameter.py b/fhircraft/fhir/resources/datatypes/R5/core/search_parameter.py index 8568fe1c..d8239ab0 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/search_parameter.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/search_parameter.py @@ -341,7 +341,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -362,7 +362,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_spd_1_constraint_model_validator(self): + def FHIR_spd_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="expression.empty() or processingMode.exists()", @@ -372,7 +372,7 @@ def FHIR_spd_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_2_constraint_model_validator(self): + def FHIR_spd_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="chain.empty() or type = 'reference'", @@ -382,7 +382,7 @@ def FHIR_spd_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_spd_3_constraint_model_validator(self): + def FHIR_spd_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="comparator.empty() or (type in ('number' | 'date' | 'quantity' | 'special'))", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/service_request.py b/fhircraft/fhir/resources/datatypes/R5/core/service_request.py index 20484116..dc6fafda 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/service_request.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/service_request.py @@ -416,7 +416,7 @@ def asNeeded_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_bdystr_1_constraint_model_validator(self): + def FHIR_bdystr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="bodySite.exists() implies bodyStructure.empty()", @@ -426,7 +426,7 @@ def FHIR_bdystr_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_prr_1_constraint_model_validator(self): + def FHIR_prr_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="orderDetail.empty() or code.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/structure_definition.py b/fhircraft/fhir/resources/datatypes/R5/core/structure_definition.py index f2a6148b..a6462748 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/structure_definition.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/structure_definition.py @@ -370,7 +370,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -391,7 +391,7 @@ def FHIR_cnl_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_1_constraint_model_validator(self): + def FHIR_sdf_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="derivation = 'constraint' or snapshot.element.select(path).isDistinct()", @@ -423,7 +423,7 @@ def FHIR_sdf_3_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_4_constraint_model_validator(self): + def FHIR_sdf_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="abstract = true or baseDefinition.exists()", @@ -433,7 +433,7 @@ def FHIR_sdf_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_5_constraint_model_validator(self): + def FHIR_sdf_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type != 'Extension' or derivation = 'specialization' or (context.exists())", @@ -443,7 +443,7 @@ def FHIR_sdf_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_6_constraint_model_validator(self): + def FHIR_sdf_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.exists() or differential.exists()", @@ -486,7 +486,7 @@ def FHIR_sdf_8b_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_9_constraint_model_validator(self): + def FHIR_sdf_9_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="children().element.where(path.contains('.').not()).label.empty() and children().element.where(path.contains('.').not()).code.empty() and children().element.where(path.contains('.').not()).requirements.empty()", @@ -507,7 +507,7 @@ def FHIR_sdf_10_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_11_constraint_model_validator(self): + def FHIR_sdf_11_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind != 'logical' implies snapshot.empty() or snapshot.element.first().path = type", @@ -517,7 +517,7 @@ def FHIR_sdf_11_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_14_constraint_model_validator(self): + def FHIR_sdf_14_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and differential.element.all(id.exists())", @@ -527,7 +527,7 @@ def FHIR_sdf_14_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15_constraint_model_validator(self): + def FHIR_sdf_15_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="kind!='logical' implies snapshot.element.first().type.empty()", @@ -537,7 +537,7 @@ def FHIR_sdf_15_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_15a_constraint_model_validator(self): + def FHIR_sdf_15a_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='logical' and differential.element.first().path.contains('.').not()) implies differential.element.first().type.empty()", @@ -547,7 +547,7 @@ def FHIR_sdf_15a_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_16_constraint_model_validator(self): + def FHIR_sdf_16_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="snapshot.element.all(id.exists()) and snapshot.element.id.trace('ids').isDistinct()", @@ -557,7 +557,7 @@ def FHIR_sdf_16_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_17_constraint_model_validator(self): + def FHIR_sdf_17_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.all(id.exists()) and differential.element.id.trace('ids').isDistinct()", @@ -567,7 +567,7 @@ def FHIR_sdf_17_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_18_constraint_model_validator(self): + def FHIR_sdf_18_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="contextInvariant.exists() implies type = 'Extension'", @@ -577,7 +577,7 @@ def FHIR_sdf_18_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_19_constraint_model_validator(self): + def FHIR_sdf_19_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (differential | snapshot).element.type.code.all(matches('^[a-zA-Z0-9]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$'))", @@ -598,7 +598,7 @@ def FHIR_sdf_20_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_21_constraint_model_validator(self): + def FHIR_sdf_21_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="differential.element.defaultValue.exists() implies (derivation = 'specialization')", @@ -608,7 +608,7 @@ def FHIR_sdf_21_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_22_constraint_model_validator(self): + def FHIR_sdf_22_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (snapshot.element.defaultValue.empty() and differential.element.defaultValue.empty())", @@ -618,7 +618,7 @@ def FHIR_sdf_22_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_23_constraint_model_validator(self): + def FHIR_sdf_23_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(snapshot | differential).element.all(path.contains('.').not() implies sliceName.empty())", @@ -661,7 +661,7 @@ def FHIR_sdf_26_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_27_constraint_model_validator(self): + def FHIR_sdf_27_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="baseDefinition.exists() implies derivation.exists()", @@ -682,7 +682,7 @@ def FHIR_sdf_28_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_sdf_29_constraint_model_validator(self): + def FHIR_sdf_29_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="((kind in 'resource' | 'complex-type') and (derivation = 'specialization')) implies differential.element.where((min != 0 and min != 1) or (max != '1' and max != '*')).empty()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/structure_map.py b/fhircraft/fhir/resources/datatypes/R5/core/structure_map.py index fa71306f..db7dffb9 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/structure_map.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/structure_map.py @@ -806,7 +806,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/subscription_status.py b/fhircraft/fhir/resources/datatypes/R5/core/subscription_status.py index e59511a7..adfcb3ba 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/subscription_status.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/subscription_status.py @@ -119,7 +119,7 @@ class SubscriptionStatus(DomainResource): ) @model_validator(mode="after") - def FHIR_sst_1_constraint_model_validator(self): + def FHIR_sst_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(type = 'event-notification' or type = 'query-event') implies notificationEvent.exists()", @@ -129,7 +129,7 @@ def FHIR_sst_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_sst_2_constraint_model_validator(self): + def FHIR_sst_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="type = 'query-status' implies status.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/task.py b/fhircraft/fhir/resources/datatypes/R5/core/task.py index 1882be77..a7541c2d 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/task.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/task.py @@ -1086,7 +1086,7 @@ class Task(DomainResource): ) @model_validator(mode="after") - def FHIR_inv_1_constraint_model_validator(self): + def FHIR_inv_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="lastModified.exists().not() or authoredOn.exists().not() or lastModified >= authoredOn", @@ -1096,7 +1096,7 @@ def FHIR_inv_1_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tsk_1_constraint_model_validator(self): + def FHIR_tsk_1_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="restriction.exists() implies code.coding.where(code='fulfill' and system='http://hl7.org/fhir/CodeSystem/task-code').exists() and focus.exists()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/terminology_capabilities.py b/fhircraft/fhir/resources/datatypes/R5/core/terminology_capabilities.py index 471d0224..ea03312b 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/terminology_capabilities.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/terminology_capabilities.py @@ -541,7 +541,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", @@ -573,7 +573,7 @@ def FHIR_tcp_1_constraint_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_2_constraint_model_validator(self): + def FHIR_tcp_2_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(description.count() + software.count() + implementation.count()) > 0", @@ -583,7 +583,7 @@ def FHIR_tcp_2_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_3_constraint_model_validator(self): + def FHIR_tcp_3_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'instance') or implementation.exists()", @@ -593,7 +593,7 @@ def FHIR_tcp_3_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_4_constraint_model_validator(self): + def FHIR_tcp_4_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind != 'capability') or (implementation.exists().not() and software.exists())", @@ -603,7 +603,7 @@ def FHIR_tcp_4_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_5_constraint_model_validator(self): + def FHIR_tcp_5_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="(kind!='requirements') or (implementation.exists().not() and software.exists().not())", @@ -613,7 +613,7 @@ def FHIR_tcp_5_constraint_model_validator(self): ) @model_validator(mode="after") - def FHIR_tcp_6_constraint_model_validator(self): + def FHIR_tcp_6_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="codeSystem.uri.isDistinct()", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/test_plan.py b/fhircraft/fhir/resources/datatypes/R5/core/test_plan.py index c49d3943..12ca7f7e 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/test_plan.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/test_plan.py @@ -430,7 +430,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/test_script.py b/fhircraft/fhir/resources/datatypes/R5/core/test_script.py index cf085d3d..343940ec 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/test_script.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/test_script.py @@ -1462,7 +1462,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/datatypes/R5/core/value_set.py b/fhircraft/fhir/resources/datatypes/R5/core/value_set.py index b338af5f..4a8a9615 100644 --- a/fhircraft/fhir/resources/datatypes/R5/core/value_set.py +++ b/fhircraft/fhir/resources/datatypes/R5/core/value_set.py @@ -1004,7 +1004,7 @@ def versionAlgorithm_type_choice_validator(self): ) @model_validator(mode="after") - def FHIR_cnl_0_constraint_model_validator(self): + def FHIR_cnl_0_constraint_validator(self): return fhir_validators.validate_model_constraint( self, expression="name.exists() implies name.matches('^[A-Z]([A-Za-z0-9_]){1,254}$')", diff --git a/fhircraft/fhir/resources/factory/builders/backbone.py b/fhircraft/fhir/resources/factory/builders/backbone.py index 4123075c..82b9ef2a 100644 --- a/fhircraft/fhir/resources/factory/builders/backbone.py +++ b/fhircraft/fhir/resources/factory/builders/backbone.py @@ -1,5 +1,5 @@ from fhircraft.fhir.resources.factory.builders.base import Build, Builder -from fhircraft.fhir.resources.factory.element_node import ElementNode +from fhircraft.fhir.resources.factory.element_node import ElementNode, BACKBONE_CODES from fhircraft.fhir.resources.factory.index import DefinitionIndex from fhircraft.fhir.resources.base import FHIRBaseModel @@ -11,7 +11,25 @@ class BackboneFieldBuilder(Builder): def can_handle(self, node: ElementNode, index: DefinitionIndex) -> bool: has_children = bool(index.get_children(node.id)) - return has_children + if has_children: + return True + if node.type_codes and any(code in BACKBONE_CODES for code in node.type_codes): + if self.context.base and node.name in self.context.base.model_fields: + backbone_base = next( + ( + m + for m in _get_deepest_args( + self.context.base.model_fields[node.name].annotation + ) + if isinstance(m, type) + and issubclass(m, BaseModel) + and m is not type(None) + ), + None, + ) + if backbone_base is not None: + return True + return False def build(self, node: ElementNode, index: DefinitionIndex) -> Build: from fhircraft.fhir.resources.factory.assembler import ModelAssembler @@ -49,6 +67,19 @@ def build(self, node: ElementNode, index: DefinitionIndex) -> Build: ) ) + # When no child elements are constrained, use the resolved backbone type directly instead of creating an empty wrapper subclass. + if not index.get_children(node.id): + build.fields.append( + self.build_field_information( + safe_name, + node, + backbone_base, + validation_alias=val_alias, + ) + ) + build.validators = self.build_field_validators(node, safe_name) + return build + # Build the backbone model name from the element path path_parts = node.path.split(".")[1:] # strip resource prefix backbone_name = self.context.resource_name + "".join( diff --git a/fhircraft/fhir/resources/factory/builders/base.py b/fhircraft/fhir/resources/factory/builders/base.py index 723db947..b1f1ed86 100644 --- a/fhircraft/fhir/resources/factory/builders/base.py +++ b/fhircraft/fhir/resources/factory/builders/base.py @@ -59,7 +59,6 @@ ElementDefinitionConstraint as R5_ElementDefinitionConstraint, ) -_type = type # Class-level attribute names that collide with Pydantic's metaclass machinery CLASS_RESERVED_KEYWORDS: frozenset[str] = frozenset( @@ -280,15 +279,20 @@ def build_field_information( else: default = None - if node.is_array and default is not None: + effective_is_array = ( + node.base_is_array if node.base_is_array is not None else node.is_array + ) + if effective_is_array and default is not None: default = ensure_list(default) annotation = type - if node.is_array: + if effective_is_array: annotation = List[annotation] - # Enforce optionality for all fields - annotation = Optional[annotation] + if node.is_prohibited: + annotation = None + else: + annotation = Optional[annotation] return FieldInformation( name=name, @@ -297,9 +301,9 @@ def build_field_information( alias=alias, validation_alias=validation_alias, description=description or node.documentation, - min_length=node.min_cardinality if node.is_array else None, + min_length=node.min_cardinality if effective_is_array else None, max_length=node.max_length - or (node.max_cardinality if node.is_array else None), + or (node.max_cardinality if effective_is_array else None), min_value=node.min_value, max_value=node.max_value, ) diff --git a/fhircraft/fhir/resources/factory/builders/slices.py b/fhircraft/fhir/resources/factory/builders/slices.py index a683262f..3abeb96d 100644 --- a/fhircraft/fhir/resources/factory/builders/slices.py +++ b/fhircraft/fhir/resources/factory/builders/slices.py @@ -57,6 +57,7 @@ def build(self, node: ElementNode, index: DefinitionIndex) -> Build: # Build a slice model for each named slice slice_models: list[type] = [] + slice_base = None for slice_node in index.get_slices(node.id): slice_name: str = slice_node.slice_name # type: ignore[union-attr] slice_model_name = ( @@ -125,7 +126,7 @@ def build(self, node: ElementNode, index: DefinitionIndex) -> Build: safe_name, node, annotation, - alias=node.name, + alias=node.name if safe_name != node.name else None, validation_alias=val_alias, description=getattr(node.definition, "short", None), ) diff --git a/fhircraft/fhir/resources/factory/builders/type_choice.py b/fhircraft/fhir/resources/factory/builders/type_choice.py index ed1f1347..a183910d 100644 --- a/fhircraft/fhir/resources/factory/builders/type_choice.py +++ b/fhircraft/fhir/resources/factory/builders/type_choice.py @@ -21,10 +21,10 @@ class TypeChoiceFieldBuilder(Builder): - def can_handle(self, node: ElementNode, _: DefinitionIndex) -> bool: + def can_handle(self, node: ElementNode, index: DefinitionIndex) -> bool: return node.is_polymorphic_type - def build(self, node: ElementNode, _: DefinitionIndex) -> Build: + def build(self, node: ElementNode, index: DefinitionIndex) -> Build: build = Build() base_name = node.name diff --git a/fhircraft/fhir/resources/factory/element_node.py b/fhircraft/fhir/resources/factory/element_node.py index 1c640bb2..9035b019 100644 --- a/fhircraft/fhir/resources/factory/element_node.py +++ b/fhircraft/fhir/resources/factory/element_node.py @@ -6,11 +6,11 @@ the definition's own fields; no external state is required. """ -from __future__ import annotations - import re from dataclasses import dataclass -from typing import TYPE_CHECKING, Literal, Sequence +from typing import TYPE_CHECKING, Any, Literal, Sequence + +from pydantic_core import PydanticUndefined if TYPE_CHECKING: from fhircraft.fhir.resources.datatypes.R4.complex.element_definition import ( @@ -26,6 +26,8 @@ ElementDefinitionType as R5ElementDefinitionType, ) +_Unset: Any = PydanticUndefined + POLYMORPHIC_PATH_SUFFIX = "[x]" BACKBONE_CODES = frozenset({"BackboneElement", "Element"}) @@ -138,15 +140,36 @@ def is_root(self) -> bool: """ return self.depth == 0 + @property + def is_type_choice_slice(self) -> bool: + """ + True when this element is a type-choice type-slice. + + Per the FHIR spec, when a polymorphic element (path ends in ``[x]``) is + constrained to a specific type, the id reflects that type with a colon + suffix directly after the ``[x]``, e.g. + ``Patient.deceased[x]:deceasedBoolean``. + + This is distinct from a named list-slice such as + ``Observation.component:systolic`` where the colon follows a plain + element name. + """ + return bool(re.search(r"\[x\]:[A-Za-z]", self.local_id)) + @property def is_slice(self) -> bool: """ True when this element *is* a named slice definition. - A named slice has a colon in its :attr:`local_id`, e.g. + A named slice has a colon in its :attr:`local_id` that is **not** + immediately preceded by ``[x]``, e.g. ``Observation.component:systolic`` → ``local_id = "component:systolic"``. + + Type-choice type-slices such as ``Patient.deceased[x]:deceasedBoolean`` + are **not** considered named slices; use :attr:`is_type_choice_slice` for + those. """ - return ":" in self.local_id + return ":" in self.local_id and not self.is_type_choice_slice @property def is_slice_entry(self) -> bool: @@ -157,9 +180,15 @@ def is_slice_entry(self) -> bool: @property def is_slice_child(self) -> bool: - """True when *any* ancestor segment of the id contains ``:`` — this element lives - inside a slice sub-tree.""" - return any(":" in seg for seg in self.id.split(".")) + """True when *any* ancestor segment of the id contains a **named-slice** + colon — this element lives inside a named-slice sub-tree. + + Type-choice colon suffixes (``[x]:TypeName``) are excluded; they are not + a slice ancestry boundary. + """ + return any( + ":" in seg and not re.search(r"\[x\]:", seg) for seg in self.id.split(".") + ) @property def is_content_reference(self) -> bool: @@ -174,10 +203,10 @@ def is_content_reference(self) -> bool: def slice_name(self) -> str | None: """ The slice name (part after ``:`` in :attr:`local_id`), or ``None`` if this - element is not itself a named slice. + element is not a named slice or type-choice type-slice. """ - if not self.is_slice: - raise ValueError("Only slices have slice names") + if not self.is_slice and not self.is_type_choice_slice: + raise ValueError("Only slices and type-choice slices have slice names") return self.definition.sliceName or self.local_id.split(":", 1)[1] @property @@ -209,11 +238,14 @@ def slicing_rules(self) -> Literal["openAtEnd", "open", "closed"]: @property def slice_ancestry(self) -> list[str]: """ - Names of all ancestor slices in outermost-first order. + Names of all **named** ancestor slices in outermost-first order. + + Type-choice colon suffixes (``[x]:TypeName``) are excluded because they + denote a type specialisation, not a named list-slice boundary. """ names: list[str] = [] for seg in self.id.split("."): - if ":" in seg: + if ":" in seg and not re.search(r"\[x\]:", seg): names.append(seg.split(":", 1)[1]) return names @@ -221,6 +253,41 @@ def slice_ancestry(self) -> list[str]: # Cardinality # ------------------------------------------------------------------ + @property + def base_min_cardinality(self) -> int | None: + """ + Minimum cardinality of the base element when this node was produced by merging a differential element with its base. ``None`` means this node was not produced by a merge (snapshot or root element). + """ + return self.definition.base.min if self.definition.base else None + + @property + def base_max_cardinality(self) -> int | None: + """ + Maximum cardinality of the base element when this node was produced by merging a differential element with its base. ``None`` means unbounded (``*``).). + """ + if not self.definition.base: + return _Unset + val = getattr(self.definition.base, "max", None) + if val is None: + return None + s = str(val) + if s == "*": + return None + try: + return int(s) + except (ValueError, TypeError): + return None + + @property + def base_is_array(self) -> bool | None: + """ + Whether the base element is multi-valued and represented as a list (``max`` > 1 or ``*``) when this node was produced by merging a differential element with its base. ``None`` means this node was not produced by a merge (snapshot or root element). + """ + max_cardinality = self.base_max_cardinality + if max_cardinality is _Unset: + return None + return max_cardinality is None or max_cardinality > 1 + @property def min_cardinality(self) -> int: """ @@ -236,9 +303,7 @@ def min_cardinality(self) -> int: def max_cardinality(self) -> int | None: """Maximum cardinality. ``None`` means unbounded (``*``).""" if (val := getattr(self.definition, "max", None)) is None: - raise ValueError( - "ElementDefinition.max is required and must be an integer or valid string." - ) + return _Unset s = str(val) if s == "*": return None @@ -258,10 +323,12 @@ def is_prohibited(self) -> bool: return self.max_cardinality == 0 @property - def is_array(self) -> bool: + def is_array(self) -> bool | None: """ - Whether this element is multi-valued and represented as a list (``max`` > 1 or ``*``). + Whether this element is multi-valued and represented as a list (``max`` > 1 or ``*``). Returns ``None`` if cardinality is not specified. """ + if self.max_cardinality is _Unset: + return None return (self.max_cardinality is None) or (self.max_cardinality > 1) # ------------------------------------------------------------------ @@ -287,7 +354,13 @@ def is_polymorphic_type(self) -> bool: Note: If the element is polymorphic (has more than one datatype), then the end of the path for the element SHALL be "[x]" to designate that the name of the element may vary when serialized. + + Type-choice slice nodes (e.g. ``Patient.deceased[x]:deceasedBoolean``) are + **not** considered polymorphic — they represent a single concrete type + constraint and must not trigger type-choice synthesis in the index. """ + if self.is_type_choice_slice: + return False return self.path.endswith(POLYMORPHIC_PATH_SUFFIX) or len(self.type_codes) > 1 @property @@ -308,13 +381,21 @@ def documentation(self) -> str: """ Full combination of the elemments's `short`, `definition`, and `comment` fields, in that order of preference. Returns an empty string if none of those fields are set. + + Strings that contain no alphanumeric characters are treated as absent and the next candidate is tried instead. """ - return ( - self.definition.definition - or self.definition.short - or self.definition.comment - or "" - ) + + def _has_content(value: str | None) -> bool: + return bool(value and re.search(r"[A-Za-z0-9]", value)) + + for candidate in ( + self.definition.definition, + self.definition.short, + self.definition.comment, + ): + if _has_content(candidate): + return str(candidate) + return "" # ------------------------------------------------------------------ # Constraint values diff --git a/fhircraft/fhir/resources/factory/index.py b/fhircraft/fhir/resources/factory/index.py index d6538fbe..f300f743 100644 --- a/fhircraft/fhir/resources/factory/index.py +++ b/fhircraft/fhir/resources/factory/index.py @@ -19,6 +19,7 @@ class DefinitionIndex: def __init__(self, nodes: list[ElementNode]) -> None: self._nodes_by_id: dict[str, ElementNode] = {} self._nodes_by_path: dict[str, List[ElementNode]] = {} + self._synthetic_ids: set[str] = set() for node in nodes: self.add(node, replace=True) @@ -63,10 +64,12 @@ def add(self, node: ElementNode, replace: bool = False) -> None: "id": node.id.replace("[x]", capitalize(type_code)), "path": node.path.replace("[x]", capitalize(type_code)), "type": [node.definition.type[0].model_copy(update={"code": type_code})], # type: ignore + "slicing": None, } ) ) if type_node.id not in self: + self._synthetic_ids.add(type_node.id) self.add(type_node) def update(self, nodes: list[ElementNode], replace: bool = False) -> None: @@ -150,7 +153,7 @@ def get_by_path( else: nodes = self._nodes_by_path.get(path, []) if nodes and ignore_slices: - nodes = [n for n in nodes if not n.is_slice] + nodes = [n for n in nodes if not n.is_slice and not n.is_type_choice_slice] if not nodes: raise DefinitionIndexError(f"Element path {path!r} not found in index.") return nodes @@ -222,8 +225,20 @@ def get_parent(self, id: str) -> ElementNode: def get_children(self, id: str) -> list[ElementNode]: """ Return immediate non-slice children of *id*. + + Synthetic type-expansion nodes (e.g. ``Observation.valueQuantity`` + generated from ``Observation.value[x]``) are excluded — the + :class:`TypeChoiceFieldBuilder` already handles the canonical + ``value[x]`` element and emits one typed field per type. """ - return [n for n in self.nodes if n.parent_id == id and not n.is_slice] + return [ + n + for n in self.nodes + if n.parent_id == id + and not n.is_slice + and not n.is_type_choice_slice + and n.id not in self._synthetic_ids + ] def get_slices(self, id: str) -> list[ElementNode]: """ @@ -286,6 +301,8 @@ def _rewrite_path(original_path_value: str) -> str: subtree_nodes = [] for node in self.nodes: node_id = node.id + if node_id in self._synthetic_ids: + continue if ( node_id != id and not node_id.startswith(prefix_dot) diff --git a/fhircraft/fhir/resources/factory/resolver.py b/fhircraft/fhir/resources/factory/resolver.py index 495875cf..8a536a9d 100644 --- a/fhircraft/fhir/resources/factory/resolver.py +++ b/fhircraft/fhir/resources/factory/resolver.py @@ -36,7 +36,7 @@ StructureDefinition as R5_StructureDefinition, ) -_BASE_MERGE_FIELDS = {"min", "max", "type", "short", "definition", "comment"} +_BASE_MERGE_FIELDS = {"min", "max", "type", "short", "definition", "comment", "slicing"} class SnapshotResolver: @@ -126,7 +126,13 @@ def resolve( ) base_index.update(partial_base_index.nodes, replace=True) else: - base_index = partial_base_index + + ancestor_base_index = self._build_full_ancestor_index(base_definition) + if ancestor_base_index.root().id == partial_base_index.root().id: + ancestor_base_index.update(partial_base_index.nodes, replace=True) + base_index = ancestor_base_index + else: + base_index = partial_base_index # Merge differential over base snapshot to produce a synthetic snapshot resolved_index = self._resolve_differential( sd.differential.element, base_index @@ -146,6 +152,41 @@ def resolve( # Differential resolution # ------------------------------------------------------------------ + def _build_full_ancestor_index( + self, + sd: "R4_StructureDefinition | R4B_StructureDefinition | R5_StructureDefinition", + ) -> DefinitionIndex: + """ + Walk the ``baseDefinition`` chain of *sd* until an ancestor with a complete + snapshot is found, and return a :class:`DefinitionIndex` built from that snapshot. + + This is used when an intermediate base ``StructureDefinition`` carries no snapshot + of its own (i.e. it is a differential-only custom profile). The caller is + responsible for subsequently applying the intermediate profile's own resolved + differential nodes on top of the returned index via :meth:`DefinitionIndex.update`. + + Args: + sd: The differential-only StructureDefinition whose ancestor chain should be walked. + + Returns: + DefinitionIndex: Index built from the nearest ancestor snapshot. + + Raises: + DefinitionResolutionError: If the ancestor chain is exhausted without finding + a definition that has a snapshot. + """ + current = sd + while True: + if not current.baseDefinition: + raise DefinitionResolutionError( + f"StructureDefinition '{getattr(current, 'name', '?')}' has neither a " + "snapshot nor a baseDefinition — cannot reconstruct full ancestor index." + ) + ancestor = self._registry.get(current.baseDefinition) + if ancestor.snapshot and ancestor.snapshot.element: + return DefinitionIndex.from_elements(ancestor.snapshot.element) + current = ancestor + def _resolve_differential( self, diff_elements: "Sequence[R4_ElementDefinition] | Sequence[R4B_ElementDefinition] | Sequence[R5_ElementDefinition]", @@ -258,10 +299,30 @@ def _build_intermediate_node( if root_name else base_node.path ) + merge_fields = base_node.definition.model_dump(include=set(_BASE_MERGE_FIELDS)) + # For type-choice type-slices (e.g. value[x]:valueQuantity) narrow the + # inherited type list to the single concrete type indicated by the suffix. + candidate = ElementNode( + definition=base_node.definition.__class__( + id=id, path=new_path, **merge_fields + ) + ) + if candidate.is_type_choice_slice and base_node.types: + concrete_suffix = id.rsplit(":", 1)[1].lower() + matched_type = next( + ( + t + for t in base_node.types + if t.code and concrete_suffix.endswith(str(t.code).lower()) + ), + None, + ) + if matched_type is not None: + merge_fields["type"] = [matched_type] new_definition = base_node.definition.__class__( id=id, path=new_path, - **base_node.definition.model_dump(include=set(_BASE_MERGE_FIELDS)), + **merge_fields, ) return ElementNode(definition=new_definition) @@ -278,7 +339,10 @@ def _build_type_node( matching element definition from its snapshot. Args: - datatypes: A sequence of datatype names to expand. Must contain exactly one type. + datatypes: A sequence of datatype names to expand. When multiple types are + provided (e.g. for a polymorphic ``value[x]`` element), each type + is tried in order and the first one that contains a matching + sub-element is used. id: The unique identifier for the element node to be created. base_index: A DefinitionIndex used to check for existing elements. @@ -290,7 +354,8 @@ def _build_type_node( Notes: - This method is used during differential StructureDefinition resolution. - - Only complex types are supported for expansion. + - Only complex types are supported for expansion; primitive and FHIRPath types + are skipped when iterating over multiple candidates. - The generated element id is checked against the base index to prevent conflicts. """ if not self._registry: @@ -298,51 +363,56 @@ def _build_type_node( "Repository is required for type expansion during differential resolution." ) - if len(datatypes) != 1: - raise DefinitionResolutionError( - "Type expansion is only supported for elements with a single type." - ) - datatype = datatypes[0] - if datatype.startswith(FHIRPATH_TYPE_PREFIX): + if not datatypes: raise DefinitionResolutionError( - f"Type expansion is not supported for FHIRPath types. Found type '{datatype}'." + f"Type expansion failed for element '{id}'. No type codes provided." ) - type_structure_definition = self._registry.get(f"{FHIR_TYPE_PREFIX}{datatype}") - if type_structure_definition.kind != "complex-type": - raise DefinitionResolutionError( - f"Type expansion is only supported for complex types. Type '{datatype}' has kind '{type_structure_definition.kind}'." - ) - if not type_structure_definition: - raise DefinitionResolutionError( - f"Type expansion failed: StructureDefinition for type '{datatype}' not found in repository." - ) - snapshot = type_structure_definition.snapshot - if not snapshot or not snapshot.element: - raise DefinitionResolutionError( - f"Type expansion failed: StructureDefinition for type '{datatype}' has no snapshot or snapshot elements." - ) local_id = id.rsplit(".", 1)[-1] - matching_node = next( - (n for e in snapshot.element if (n := ElementNode(e)).local_id == local_id), - None, - ) - if not matching_node: - raise DefinitionResolutionError( - f"Type expansion failed: no matching element with local id '{local_id}' found in snapshot of type '{datatype}'." - ) id_path = ".".join([seg.split(":")[0] for seg in id.split(".")]) if id in base_index: raise DefinitionResolutionError( f"Type expansion failed: generated intermediate node id '{id}' already exists in base index." ) - # Determine unsliced path for newly synthesised element - return ElementNode( - definition=matching_node.definition.__class__( - id=id, - path=id_path, - **matching_node.definition.model_dump(include=set(_BASE_MERGE_FIELDS)), + + for datatype in datatypes: + if datatype.startswith(FHIRPATH_TYPE_PREFIX): + continue + try: + type_structure_definition = self._registry.get( + f"{FHIR_TYPE_PREFIX}{datatype}" + ) + except FileNotFoundError: + continue + if type_structure_definition.kind != "complex-type": + continue + snapshot = type_structure_definition.snapshot + if not snapshot or not snapshot.element: + continue + matching_node = next( + ( + n + for e in snapshot.element + if (n := ElementNode(e)).local_id == local_id + ), + None, ) + if matching_node is None: + continue + # Determine unsliced path for newly synthesised element + return ElementNode( + definition=matching_node.definition.__class__( + id=id, + path=id_path, + **matching_node.definition.model_dump( + include=set(_BASE_MERGE_FIELDS) + ), + ) + ) + + raise DefinitionResolutionError( + f"Type expansion failed for element '{id}'. No matching element with local id " + f"'{local_id}' found in any of the provided types: {list(datatypes)}." ) def _merge_node_with_base( @@ -366,14 +436,30 @@ def _merge_node_with_base( path=node.path or base_node.path, **{ **base_node.definition.model_dump( - exclude_none=True, exclude={"id", "path", "contentReference"} + exclude_none=True, + exclude={"id", "path", "contentReference"}, ), **node.definition.model_dump( - exclude_none=True, exclude={"id", "path", "contentReference"} + exclude_none=True, + exclude={"id", "path", "contentReference"}, + ), + "base": ( + node.definition.base + if node.definition.base is not None + else { + "path": base_node.path, + "min": base_node.definition.min, + "max": base_node.definition.max, + } ), }, ) - return ElementNode(definition=merged_definition) + merged_node = ElementNode(definition=merged_definition) + if merged_node.is_array == True and merged_node.base_is_array == False: + raise DefinitionResolutionError( + f"Invalid cardinality change in element '{node.id}': cannot change from non-array to array cardinality when merging with base element." + ) + return merged_node def _resolve_content_references(self, index: DefinitionIndex) -> DefinitionIndex: """ diff --git a/fhircraft/fhir/resources/generator.py b/fhircraft/fhir/resources/generator.py index 4125011a..fa1f274a 100644 --- a/fhircraft/fhir/resources/generator.py +++ b/fhircraft/fhir/resources/generator.py @@ -385,7 +385,11 @@ def _serialize_model(self, model: type[BaseModel]) -> None: ): continue self._recursively_import_annotation_types(info.annotation) - annotation_string = repr(info.annotation) + # type(None) (NoneType) renders as "" via repr(); map it to "None" + if info.annotation is type(None): + annotation_string = "None" + else: + annotation_string = repr(info.annotation) # Handle forward references if "ForwardRef" in annotation_string: diff --git a/fhircraft/fhir/resources/resource_template.py.j2 b/fhircraft/fhir/resources/resource_template.py.j2 index f706769f..ecb66d9b 100644 --- a/fhircraft/fhir/resources/resource_template.py.j2 +++ b/fhircraft/fhir/resources/resource_template.py.j2 @@ -16,7 +16,7 @@ class {{ model.__name__ }}({% for base in model.__bases__ %}{{ base.__name__ }}{ {% endif %} {% if model.__bases__ | selectattr("__name__", "equalto", "FHIRSliceModel") | list | length > 0 %} min_cardinality: ClassVar[int] = {{model.min_cardinality}} - max_cardinality: ClassVar[int] = {{model.max_cardinality}} + max_cardinality: ClassVar[int | None] = {{model.max_cardinality}} {% endif %} {% if model._fhir_release and (model.__bases__|selectattr("_fhir_release", "eq", model._fhir_release) | list | length == 0) %} diff --git a/test/test_fhir_resources_factory.py b/test/test_fhir_resources_factory.py index 9c2bc2e5..16636e93 100644 --- a/test/test_fhir_resources_factory.py +++ b/test/test_fhir_resources_factory.py @@ -1018,7 +1018,7 @@ def test_factory__caches_differential_model(factory: FHIRModelFactory): "definition": "Base definition of Patient", "base": {"path": "Patient", "min": 0, "max": "*"}, }, - {"id": "Patient.id", "path": "Patient.id", "min": 1, "max": "*"}, + {"id": "Patient.id", "path": "Patient.id", "min": 1, "max": "1"}, ] }, } @@ -1049,7 +1049,7 @@ def test_factory__differential_inherits_from_base(factory: FHIRModelFactory): "differential": { "element": [ {"id": "Patient", "path": "Patient", "min": 0, "max": "*"}, - {"id": "Patient.id", "path": "Patient.id", "min": 1, "max": "*"}, + {"id": "Patient.id", "path": "Patient.id", "min": 1, "max": "1"}, ] }, } @@ -1089,7 +1089,7 @@ def test_factory__constructs_model_from_snapshot_auto_mode(factory: FHIRModelFac "id": "Patient.id", "path": "Patient.id", "min": 1, - "max": "*", + "max": "1", "type": [{"code": "string"}], "definition": "Patient identifier", "base": {"path": "Patient.id", "min": 0, "max": "*"}, @@ -1168,9 +1168,9 @@ def test_factory__construct_diff_min_cardinality(factory: FHIRModelFactory): "id": "Resource.id", "path": "Resource.id", "min": 1, - "max": "*", + "max": "1", "definition": "Required element", - "base": {"path": "Resource.id", "min": 0, "max": "*"}, + "base": {"path": "Resource.id", "min": 0, "max": "1"}, } ] }, @@ -1183,24 +1183,20 @@ def test_factory__construct_diff_min_cardinality(factory: FHIRModelFactory): element = mock_resource.model_fields.get("id") assert element is not None, "Profiled element field not found in model fields" assert ( - element.annotation == Optional[List[primitives.String]] + element.annotation == Optional[primitives.String] ), "Profiled element field does not have correct type annotation" # Assert metadata element_metadata = element.metadata assert element_metadata is not None, "No metadata found for profiled element" - assert ( - next((meta for meta in element_metadata if isinstance(meta, MinLen))).min_length - == 1 - ), "Profiled min. cardinality has not been correctly set" # Test valid dataset assert ( - mock_resource.model_validate({"id": ["test"]}) is not None + mock_resource.model_validate({"id": "test"}) is not None ), "Valid dataset did not validate correctly" # Test invalid dataset with pytest.raises(ValidationError): - mock_resource.model_validate({"id": []}) + mock_resource.model_validate({"id": ["test"]}) def test_factory__construct_diff_fixed_value_constraint(factory: FHIRModelFactory): diff --git a/test/test_fhir_resources_factory_builders_backbone.py b/test/test_fhir_resources_factory_builders_backbone.py index 338bbcd1..b23b3e7a 100644 --- a/test/test_fhir_resources_factory_builders_backbone.py +++ b/test/test_fhir_resources_factory_builders_backbone.py @@ -43,6 +43,7 @@ def make_node( max_length=None, min_value=None, max_value=None, + is_prohibited: bool = False, ): node = MagicMock(name="mock-node") node.name = name @@ -59,6 +60,7 @@ def make_node( node.max_length = max_length node.min_value = min_value node.max_value = max_value + node.is_prohibited = is_prohibited node.types = [make_type_definition(type_code, fhir_release)] return node @@ -132,6 +134,66 @@ def test_can_handle__queries_index_with_node_id(builder, index): index.get_children.assert_called_with("Observation.component") +def test_can_handle__returns_true_when_backbone_type_has_specific_base_field(): + class SpecificBackbone(BaseModel): + pass + + class ParentModel(BaseModel): + referenceRange: Optional[List[SpecificBackbone]] = None + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + node.type_codes = ["BackboneElement"] + index = make_index(children=[]) + assert builder.can_handle(node, index) is True + + +def test_can_handle__returns_false_when_backbone_type_code_but_no_context_base(): + builder = make_builder(resource_name="TestResource", base=None) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + node.type_codes = ["BackboneElement"] + index = make_index(children=[]) + assert builder.can_handle(node, index) is False + + +def test_can_handle__returns_false_when_backbone_type_code_but_field_not_in_base(): + class ParentModel(BaseModel): + pass # no referenceRange field + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + node.type_codes = ["BackboneElement"] + index = make_index(children=[]) + assert builder.can_handle(node, index) is False + + +def test_can_handle__returns_false_when_backbone_type_code_but_base_field_has_no_model_subclass(): + class ParentModel(BaseModel): + referenceRange: Optional[str] = None # no BaseModel subclass in annotation + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + node.type_codes = ["BackboneElement"] + index = make_index(children=[]) + assert builder.can_handle(node, index) is False + + # =========================================================================== # BackboneFieldBuilder.build # =========================================================================== @@ -161,7 +223,7 @@ def test_build__field_name_matches_node_name(builder, index, mock_assembler): def test_build__field_annotation_is_assembled_model(builder, index, mock_assembler): node = make_node() result = builder.build(node, index) - assert get_args(result.fields[0].annotation)[0] is FakeBackboneModel + assert get_args(get_args(result.fields[0].annotation)[0])[0] is FakeBackboneModel assert mock_assembler.return_value.assemble.called @@ -319,3 +381,66 @@ def test_build__non_keyword_field_has_no_validation_alias( result = builder.build(node, index) assert result.fields[0].validation_alias is None assert mock_assembler.return_value.assemble.called + + +def test_build__uses_backbone_base_directly_when_no_children(): + class SpecificBackbone(BaseModel): + pass + + class ParentModel(BaseModel): + referenceRange: Optional[List[SpecificBackbone]] = None + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + index = make_index(children=[]) + + result = builder.build(node, index) + + # The field annotation should wrap SpecificBackbone directly + item = get_args(get_args(result.fields[0].annotation)[0])[0] + assert item is SpecificBackbone + + +def test_build__does_not_call_assembler_when_no_children(mock_assembler): + class SpecificBackbone(BaseModel): + pass + + class ParentModel(BaseModel): + component: Optional[SpecificBackbone] = None + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="component", + path="Resource.component", + type_code="BackboneElement", + ) + index = make_index(children=[]) + + builder.build(node, index) + + mock_assembler.return_value.assemble.assert_not_called() + + +def test_build__no_children_returns_single_field_with_correct_name(): + class SpecificBackbone(BaseModel): + pass + + class ParentModel(BaseModel): + referenceRange: Optional[List[SpecificBackbone]] = None + + builder = make_builder(resource_name="TestResource", base=ParentModel) + node = make_node( + name="referenceRange", + path="Observation.referenceRange", + type_code="BackboneElement", + ) + index = make_index(children=[]) + + result = builder.build(node, index) + + assert len(result.fields) == 1 + assert result.fields[0].name == "referenceRange" diff --git a/test/test_fhir_resources_factory_builders_base.py b/test/test_fhir_resources_factory_builders_base.py index 9bcaad7b..cc13b1f1 100644 --- a/test/test_fhir_resources_factory_builders_base.py +++ b/test/test_fhir_resources_factory_builders_base.py @@ -1,5 +1,5 @@ import keyword -from typing_extensions import get_args +from typing_extensions import get_args, get_origin from unittest.mock import MagicMock import pytest from typing import Any, List, Optional @@ -49,6 +49,8 @@ def make_node( max_cardinality: int | None = None, documentation: str | None = None, default_value: Any = None, + base_is_array: Optional[bool] = None, + is_prohibited: bool = False, ): """Return a minimal mock of ElementNode.""" node = MagicMock() @@ -58,8 +60,11 @@ def make_node( node.max_cardinality = max_cardinality node.documentation = documentation node.default_value = default_value + node.base_is_array = base_is_array + node.is_prohibited = is_prohibited node.fixed = None node.pattern = None + node.max_length = None return node @@ -104,11 +109,11 @@ def builder() -> Builder: class _ConcreteBuilder(Builder): # Not needed for these tests - def can_handle(self, *args, **kwargs): + def can_handle(self, *args, **kwargs): # type: ignore[override] pass # Not needed for these tests - def build(self, *args, **kwargs): + def build(self, *args, **kwargs): # type: ignore[override] pass # Mock helper @@ -417,26 +422,77 @@ def test_build_field_information__returns_field_information_instance(): @pytest.mark.parametrize( - "default, is_array, type, expected_default, expected_annotation", + "default, is_array, is_prohibited, type, expected_default, expected_annotation", [ - (None, False, str, None, Optional[str]), - ("active", False, str, "active", Optional[str]), - (None, True, str, None, Optional[List[str]]), - ("active", True, str, ["active"], Optional[List[str]]), - (["active"], True, str, ["active"], Optional[List[str]]), - (["active", "final"], True, str, ["active", "final"], Optional[List[str]]), + (None, False, False, str, None, Optional[str]), + ("active", False, False, str, "active", Optional[str]), + (None, True, False, str, None, Optional[List[str]]), + ("active", True, False, str, ["active"], Optional[List[str]]), + (["active"], True, False, str, ["active"], Optional[List[str]]), + (None, False, True, str, None, None), + ( + ["active", "final"], + True, + False, + str, + ["active", "final"], + Optional[List[str]], + ), ], ) def test_build_field_information__defaults( - default, is_array, type, expected_default, expected_annotation + default, is_array, is_prohibited, type, expected_default, expected_annotation ): - node = make_node(is_array=is_array, default_value=default) + node = make_node( + is_array=is_array, default_value=default, is_prohibited=is_prohibited + ) info = Builder.build_field_information("status", node, type) assert info.name == "status" assert info.annotation == expected_annotation assert info.default == expected_default +@pytest.mark.parametrize( + "is_array, base_is_array, expected", + [ + # Normal (no merge): base_is_array=None → fallback to is_array + (False, None, False), + (True, None, True), + # Narrowing 1..* → 1..1: base was array, merged node is not + (False, True, True), + # Widening 1..1 → 1..* (invalid, graceful): base was scalar, merged node is array + (True, False, False), + ], +) +def test_build_field_information__base_is_array_governs_type_annotation( + is_array, base_is_array, expected +): + node = make_node(is_array=is_array, base_is_array=base_is_array) + info = Builder.build_field_information("field", node, str) + # info.annotation is Optional[List[str]] or Optional[str] + inner = next(a for a in get_args(info.annotation) if a is not type(None)) + is_list_annotation = get_origin(inner) is list + assert is_list_annotation == expected + + +def test_build_field_information__narrowing_still_applies_cardinality_constraints(): + node = make_node( + is_array=False, base_is_array=True, min_cardinality=1, max_cardinality=1 + ) + info = Builder.build_field_information("field", node, str) + assert info.min_length == 1 + assert info.max_length == 1 + + +def test_build_field_information__widening_no_list_constraints(): + node = make_node( + is_array=True, base_is_array=False, min_cardinality=0, max_cardinality=None + ) + info = Builder.build_field_information("field", node, str) + assert info.min_length is None + assert info.max_length is None + + # =========================================================================== # Builder.build_primitive_extension_placeholder # =========================================================================== diff --git a/test/test_fhir_resources_factory_builders_simple.py b/test/test_fhir_resources_factory_builders_simple.py index 2719af28..5e2985bb 100644 --- a/test/test_fhir_resources_factory_builders_simple.py +++ b/test/test_fhir_resources_factory_builders_simple.py @@ -36,12 +36,14 @@ def make_node( is_array: bool = False, min_cardinality: int = 0, max_cardinality: int | None = None, + base_is_array: bool | None = None, documentation: str | None = None, fixed=None, pattern=None, constraints=None, default_value=None, path: str | None = None, + is_prohibited: bool = False, ): node = MagicMock() node.name = name @@ -58,6 +60,8 @@ def make_node( node.pattern = pattern node.default_value = default_value node.definition.constraint = constraints or [] + node.base_is_array = base_is_array + node.is_prohibited = is_prohibited node.max_length = None node.min_value = None node.max_value = None @@ -204,7 +208,13 @@ def test_build__normal_name_has_no_validation_alias(builder: Builder, index): def test_build__non_array_annotation_is_optional(builder: Builder, index): - node = make_node("status", type_codes=["CodeableConcept"], is_array=False) + node = make_node( + "status", + type_codes=["CodeableConcept"], + is_array=False, + base_is_array=False, + max_cardinality=1, + ) ti = make_type_info(r4_complex.CodeableConcept, "complex-type", False) with patch.object(builder, "resolve_type", return_value=ti): result = builder.build(node, index) diff --git a/test/test_fhir_resources_factory_builders_slices.py b/test/test_fhir_resources_factory_builders_slices.py index 50975725..8288e1c9 100644 --- a/test/test_fhir_resources_factory_builders_slices.py +++ b/test/test_fhir_resources_factory_builders_slices.py @@ -91,6 +91,7 @@ def make_entry_node( pattern=None, constraints=None, default_value=None, + is_prohibited: bool = False, ): node = MagicMock(name="mock-entry-node") node.name = name @@ -107,6 +108,7 @@ def make_entry_node( node.pattern = pattern node.default_value = default_value node.slicing_rules = slicing_rules + node.is_prohibited = is_prohibited node.max_length = None node.min_value = None node.max_value = None @@ -243,10 +245,24 @@ def test_build__field_name_matches_node_name(builder: Builder, index, assembler) assert build.fields[0].name == "category" -def test_build__field_alias_is_node_raw_name(builder: Builder, index, assembler): +def test_build__non_keyword_field_has_no_alias(builder: Builder, index, assembler): node = make_entry_node(name="category") build = builder.build(node, index) - assert build.fields[0].alias == "category" + assert build.fields[0].alias is None + + +def test_build__python_keyword_field_gets_alias(index, assembler, monkeypatch): + builder = make_builder() + original_name = "class" + node = make_entry_node(name=original_name) + val_alias = AliasChoices(original_name, "class_") + monkeypatch.setattr( + builder, + "handle_python_keyword", + lambda name: ("class_", val_alias), + ) + build = builder.build(node, index) + assert build.fields[0].alias == original_name def test_build__field_description_is_definition_short( diff --git a/test/test_fhir_resources_factory_builders_type_choice.py b/test/test_fhir_resources_factory_builders_type_choice.py index 5a986115..df86c45b 100644 --- a/test/test_fhir_resources_factory_builders_type_choice.py +++ b/test/test_fhir_resources_factory_builders_type_choice.py @@ -42,6 +42,7 @@ def make_node( constraints=None, default_value=None, path: str | None = None, + is_prohibited: bool = False, ): node = MagicMock() node.name = name @@ -55,10 +56,12 @@ def make_node( node.min_cardinality = min_cardinality node.max_cardinality = max_cardinality node.documentation = documentation + node.is_prohibited = is_prohibited node.fixed = fixed node.pattern = pattern node.default_value = default_value node.definition.constraint = constraints or [] + node.base_is_array = None node.max_length = None node.min_value = None node.max_value = None diff --git a/test/test_fhir_resources_factory_index.py b/test/test_fhir_resources_factory_index.py index 6b736b15..3ee3390f 100644 --- a/test/test_fhir_resources_factory_index.py +++ b/test/test_fhir_resources_factory_index.py @@ -199,6 +199,23 @@ def test_index_get_by_path_ignore_slices(slicing_index, id, expected, count): assert expected in {n.path for n in nodes} +def test_index_get_by_path_ignore_slices_excludes_type_choice_nodes(): + index = DefinitionIndex( + [ + make_node("Observation", "Observation"), + make_node("Observation.value[x]", "Observation.value[x]"), + make_node("Observation.value[x]:valueQuantity", "Observation.value[x]"), + make_node("Observation.value[x]:valueString", "Observation.value[x]"), + ] + ) + nodes = index.get_by_path("Observation.value[x]", ignore_slices=True) + ids = {n.id for n in nodes} + assert "Observation.value[x]:valueQuantity" not in ids + assert "Observation.value[x]:valueString" not in ids + assert "Observation.value[x]" in ids + assert len(nodes) == 1 + + def test_index_get_by_path_raises_for_missing(simple_index): with pytest.raises(DefinitionIndexError): simple_index.get_by_path("Observation.missing") @@ -302,6 +319,26 @@ def test_get_children_empty_for_leaf(simple_index): assert simple_index.get_children("Observation.code") == [] +def test_get_children_excludes_type_choice_slice_nodes(): + index = DefinitionIndex( + [ + make_node("Observation", "Observation"), + make_node( + "Observation.value[x]", "Observation.value[x]", slicing=MagicMock() + ), + make_node("Observation.value[x]:valueQuantity", "Observation.value[x]"), + make_node("Observation.value[x]:valueString", "Observation.value[x]"), + make_node("Observation.code", "Observation.code"), + ] + ) + children = index.get_children("Observation") + ids = {n.id for n in children} + assert "Observation.value[x]:valueQuantity" not in ids + assert "Observation.value[x]:valueString" not in ids + assert "Observation.value[x]" in ids + assert "Observation.code" in ids + + # ------------------------------------------------------------------ # Navigation — get_slices # ------------------------------------------------------------------ @@ -313,6 +350,24 @@ def test_get_slices_returns_named_slices(slicing_index): assert ids == {"Observation.component:systolic", "Observation.component:diastolic"} +def test_get_slices_excludes_type_choice_slice_nodes(): + index = DefinitionIndex( + [ + make_node("Observation", "Observation"), + make_node( + "Observation.value[x]", "Observation.value[x]", slicing=MagicMock() + ), + make_node("Observation.value[x]:valueQuantity", "Observation.value[x]"), + make_node("Observation.value[x]:valueString", "Observation.value[x]"), + ] + ) + slices = index.get_slices("Observation.value[x]") + ids = {n.id for n in slices} + assert "Observation.value[x]:valueQuantity" not in ids + assert "Observation.value[x]:valueString" not in ids + assert ids == set() + + def test_get_slices_raises_for_non_slice_entry(simple_index): with pytest.raises(DefinitionIndexError): simple_index.get_slices("Observation.code") @@ -347,8 +402,6 @@ def test_get_slice_children_returns_children_of_slice(slicing_index): assert ids == { "Observation.component:systolic.code", "Observation.component:systolic.value[x]", - "Observation.component:systolic.valueString", - "Observation.component:systolic.valueCodeableConcept", } diff --git a/test/test_fhir_resources_factory_node.py b/test/test_fhir_resources_factory_node.py index 1b2913dc..154c6401 100644 --- a/test/test_fhir_resources_factory_node.py +++ b/test/test_fhir_resources_factory_node.py @@ -195,9 +195,10 @@ def test_element_node_local_and_parent_id(element, id, expected_parent, expected assert node.parent_id == expected_parent assert node.local_id == expected_local - # ------------------------------------------------------------------ - # Structural flags - # ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# Structural flags +# ------------------------------------------------------------------ @pytest.mark.parametrize( @@ -221,7 +222,8 @@ def test_element_node_is_root(element, path, expected): ("Resource.name", False), ("Resource.name:surname", True), ("Resource.value[x]", False), - ("Resource.value[x]:valueString", True), + ("Resource.value[x]:valueString", False), + ("Resource.component.value[x]:valueQuantity", False), ], ) def test_element_node_is_slice(element, id, expected): @@ -230,6 +232,23 @@ def test_element_node_is_slice(element, id, expected): assert node.is_slice == expected +@pytest.mark.parametrize( + "id, expected", + [ + ("Resource.name", False), + ("Resource.name[x]", False), + ("Resource.value[x]:valueString", True), + ("Resource.component.value[x]:valueQuantity", True), + ("Resource.name:surname", False), + ("Patient.deceased[x]:deceasedBoolean", True), + ], +) +def test_element_node_is_type_choice_slice(element, id, expected): + element.id = id + node = ElementNode(definition=element) + assert node.is_type_choice_slice == expected + + @pytest.mark.parametrize( "slicing, expected", [ @@ -243,6 +262,24 @@ def test_element_node_is_slice_entry(element, slicing, expected): assert node.is_slice_entry == expected +@pytest.mark.parametrize( + "id, expected", + [ + ("Observation.component:systolic.code", True), + ("Observation.component:systolic", True), + ("Observation.value[x]:valueQuantity", False), + ("Observation.component.value[x]:valueBoolean", False), + ("Observation.component:slice.value[x]:valueQuantity", True), + ("Observation.code", False), + ("Observation.component.value[x]", False), + ], +) +def test_element_node_is_slice_child_type_choice(element, id, expected): + element.id = id + node = ElementNode(definition=element) + assert node.is_slice_child == expected + + @pytest.mark.parametrize( "reference, expected", [ @@ -279,9 +316,9 @@ def test_element_node_slice_name(element, id, expected): "id, expected", [ ("Resource.name:surname", ["surname"]), - ("Resource.value[x]:valueString", ["valueString"]), - ("Resource.extension.value[x]:valueString", ["valueString"]), - ("Resource.extension:slice.value[x]:valueString", ["slice", "valueString"]), + ("Resource.value[x]:valueString", []), + ("Resource.extension.value[x]:valueString", []), + ("Resource.extension:slice.value[x]:valueString", ["slice"]), ], ) def test_element_node_slice_ancestry(element, id, expected): @@ -379,6 +416,35 @@ def test_cardinality_is_array(element, expected): assert node.is_array == expected +@pytest.mark.parametrize( + "base, expected_min, expected_max", + [ + (MagicMock(min=0, max="0"), 0, 0), + (MagicMock(min=0, max="1"), 0, 1), + (MagicMock(min=1, max="2"), 1, 2), + (MagicMock(min=0, max="*"), 0, None), + ], +) +def test_cardinality_base(base, expected_min, expected_max): + node = ElementNode(definition=MagicMock(base=base)) + assert node.base_min_cardinality == expected_min + assert node.base_max_cardinality == expected_max + + +@pytest.mark.parametrize( + "base, expected", + [ + (MagicMock(max="0"), False), + (MagicMock(max="1"), False), + (MagicMock(max="2"), True), + (MagicMock(max="*"), True), + ], +) +def test_cardinality_base_is_array(base, expected): + node = ElementNode(definition=MagicMock(base=base)) + assert node.base_is_array == expected + + # ------------------------------------------------------------------ # Type helpers # ------------------------------------------------------------------ @@ -399,3 +465,89 @@ def test_element_node_is_polymorphic_type(element, path, expected): element.path = path node = ElementNode(definition=element) assert node.is_polymorphic_type == expected + + +@pytest.mark.parametrize( + "id, path, expected", + [ + ("Observation.value[x]:valueQuantity", "Observation.value[x]", False), + ("Patient.deceased[x]:deceasedBoolean", "Patient.deceased[x]", False), + ( + "Observation.component.value[x]:valueCodeableConcept", + "Observation.component.value[x]", + False, + ), + ], +) +def test_element_node_is_polymorphic_type_false_for_type_choice_slice( + element, id, path, expected +): + element.id = id + element.path = path + node = ElementNode(definition=element) + assert node.is_polymorphic_type == expected + + +# ------------------------------------------------------------------ +# Documentation +# ------------------------------------------------------------------ + + +def test_documentation__returns_definition_when_it_has_content(element): + element.definition = "A real definition." + element.short = "Short text" + element.comment = "A comment" + node = ElementNode(definition=element) + assert node.documentation == "A real definition." + + +def test_documentation__falls_back_to_short_when_definition_has_no_alphanumeric( + element, +): + element.definition = r"\-" + element.short = "Short text" + element.comment = "A comment" + node = ElementNode(definition=element) + assert node.documentation == "Short text" + + +def test_documentation__falls_back_to_comment_when_definition_and_short_are_placeholders( + element, +): + element.definition = r"\-" + element.short = "---" + element.comment = "Useful comment" + node = ElementNode(definition=element) + assert node.documentation == "Useful comment" + + +def test_documentation__returns_empty_string_when_all_fields_are_placeholders(element): + element.definition = r"\-" + element.short = "---" + element.comment = "***" + node = ElementNode(definition=element) + assert node.documentation == "" + + +def test_documentation__returns_empty_string_when_all_fields_are_none(element): + element.definition = None + element.short = None + element.comment = None + node = ElementNode(definition=element) + assert node.documentation == "" + + +def test_documentation__returns_short_when_definition_is_none(element): + element.definition = None + element.short = "Short text" + element.comment = "A comment" + node = ElementNode(definition=element) + assert node.documentation == "Short text" + + +def test_documentation__returns_comment_when_definition_and_short_are_none(element): + element.definition = None + element.short = None + element.comment = "A comment" + node = ElementNode(definition=element) + assert node.documentation == "A comment" diff --git a/test/test_fhir_resources_factory_resolver.py b/test/test_fhir_resources_factory_resolver.py index aca58012..e951a0d9 100644 --- a/test/test_fhir_resources_factory_resolver.py +++ b/test/test_fhir_resources_factory_resolver.py @@ -6,6 +6,12 @@ ElementDefinition, ElementDefinitionType, ) + +from fhircraft.fhir.resources.datatypes.R4.complex.element_definition import ( + ElementDefinitionSlicing, + ElementDefinitionSlicingDiscriminator, +) + from fhircraft.fhir.resources.definitions import StructureDefinitionRegistry from fhircraft.fhir.resources.factory.element_node import ElementNode from fhircraft.fhir.resources.factory.exceptions import ( @@ -62,6 +68,18 @@ def make_structure_def( return sd +def make_url_slicing() -> ElementDefinitionSlicing: + """Return the canonical open-sliced-by-url discriminator found on extension elements.""" + return ElementDefinitionSlicing.model_construct( + discriminator=[ + ElementDefinitionSlicingDiscriminator.model_construct( + type="value", path="url" + ) + ], + rules="open", + ) + + # ------------------------------------------------------------------ # Fixtures # ------------------------------------------------------------------ @@ -168,6 +186,81 @@ def test_build_type_node__ignores_fhirpath_type_nodes(base_index, resolver, type resolver._build_type_node([type], "Observation.value", base_index) +def test_build_type_node__raises_error_for_empty_datatypes(base_index, resolver): + with pytest.raises(DefinitionResolutionError): + resolver._build_type_node([], "Observation.value", base_index) + + +def test_build_type_node__returns_first_matching_for_multiple_types( + base_index, resolver +): + node = resolver._build_type_node( + ["Quantity", "CodeableConcept"], + "Observation.value.coding", + base_index, + ) + assert isinstance(node, ElementNode) + assert node.id == "Observation.value.coding" + assert node.path == "Observation.value.coding" + + +def test_build_type_node__skips_non_matching_first_type_for_multiple_types( + base_index, resolver +): + node = resolver._build_type_node( + ["Quantity", "CodeableConcept"], + "Observation.value.coding", + base_index, + ) + # coding is defined on CodeableConcept — verify cardinality comes from that definition + assert node.min_cardinality == 0 + assert node.max_cardinality is None # max="*" on CodeableConcept.coding + + +def test_build_type_node__raises_error_for_all_fhirpath_types(base_index, resolver): + with pytest.raises(DefinitionResolutionError): + resolver._build_type_node( + [ + "http://hl7.org/fhirpath/System.String", + "http://hl7.org/fhirpath/System.Integer", + ], + "Observation.value", + base_index, + ) + + +def test_build_type_node__raises_error_for_all_primitive_types(base_index, resolver): + with pytest.raises(DefinitionResolutionError): + resolver._build_type_node( + ["string", "integer", "boolean"], + "Observation.value.text", + base_index, + ) + + +def test_build_type_node__raises_error_for_no_type_matches(base_index, resolver): + with pytest.raises(DefinitionResolutionError): + resolver._build_type_node( + ["Quantity", "CodeableConcept"], + "Observation.value.nonExistentField", + base_index, + ) + + +def test_build_type_node__preserves_slicing_from_base_type(resolver): + node = resolver._build_type_node( + ["CodeableConcept"], + "Observation.code.extension", + make_base_index(make_element("Observation", "Observation")), + ) + + assert node is not None + assert ( + node.definition.slicing is not None + ), "_build_type_node stripped slicing from CodeableConcept.extension" + assert node.is_slice_entry, "Type-expanded extension node should be a slice entry" + + # ------------------------------------------------------------------ # SnapshotResolver._build_intermediate_node # ------------------------------------------------------------------ @@ -238,6 +331,115 @@ def test_build_intermediate_node__return_inherited_from_type(resolver, base_inde assert node.definition.short == "Unique id for inter-element referencing" +def test_build_intermediate_node__polymorphic_parent_expands_via_first_matching_type( + resolver, +): + # Build a base_index that contains a polymorphic value[x] parent + base_index_with_poly = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.value[x]", + "Observation.value[x]", + min=0, + max="1", + short="Measurement value", + type=[ + ElementDefinitionType(code="Quantity"), + ElementDefinitionType(code="CodeableConcept"), + ], + ), + ) + node = resolver._build_intermediate_node( + "Observation.value[x].coding", base_index_with_poly + ) + assert isinstance(node, ElementNode) + assert node.id == "Observation.value[x].coding" + assert node.path == "Observation.value[x].coding" + + +def test_build_intermediate_node__type_choice_id_returns_element_node(resolver): + base_index_with_poly = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.value[x]", + "Observation.value[x]", + min=0, + max="1", + short="Measurement value", + type=[ + ElementDefinitionType(code="Quantity"), + ElementDefinitionType(code="CodeableConcept"), + ], + ), + ) + node = resolver._build_intermediate_node( + "Observation.value[x]:valueQuantity", base_index_with_poly + ) + assert isinstance(node, ElementNode) + assert node.id == "Observation.value[x]:valueQuantity" + + +def test_build_intermediate_node__type_choice_id_has_correct_path(resolver): + base_index_with_poly = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.value[x]", + "Observation.value[x]", + min=0, + max="1", + type=[ + ElementDefinitionType(code="Quantity"), + ElementDefinitionType(code="CodeableConcept"), + ], + ), + ) + node = resolver._build_intermediate_node( + "Observation.value[x]:valueQuantity", base_index_with_poly + ) + assert node.path == "Observation.value[x]" + + +def test_build_intermediate_node__type_choice_id_narrows_type_list(resolver): + base_index_with_poly = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.value[x]", + "Observation.value[x]", + min=0, + max="1", + type=[ + ElementDefinitionType(code="Quantity"), + ElementDefinitionType(code="CodeableConcept"), + ], + ), + ) + node = resolver._build_intermediate_node( + "Observation.value[x]:valueQuantity", base_index_with_poly + ) + assert node.type_codes == ["Quantity"] + + +def test_build_intermediate_node__type_choice_id_is_not_polymorphic(resolver): + base_index_with_poly = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.value[x]", + "Observation.value[x]", + min=0, + max="1", + type=[ + ElementDefinitionType(code="Quantity"), + ElementDefinitionType(code="CodeableConcept"), + ], + ), + ) + node = resolver._build_intermediate_node( + "Observation.value[x]:valueQuantity", base_index_with_poly + ) + assert node.is_polymorphic_type is False + assert node.is_type_choice_slice is True + + def test_build_intermediate_node__path_lookup_ignores_slices(resolver, base_index): base_index.add( make_node(id="BaseResource.component:sliceA", path="BaseResource.component") @@ -255,6 +457,35 @@ def test_build_intermediate_node__definition_class_is_same_as_base( assert type(node.definition) is type(base_node.definition) +def test_build_intermediate_node__preserves_slicing_from_base(resolver): + """_build_intermediate_node expands Observation.code.extension from CodeableConcept + (the parent type) — the resulting node must retain the slicing discriminator.""" + # Base index contains Observation.code typed as CodeableConcept; no .extension entry. + base_with_code = make_base_index( + make_element("Observation", "Observation"), + make_element( + "Observation.code", + "Observation.code", + min=0, + max="1", + type=[ElementDefinitionType(code="CodeableConcept")], + ), + ) + + node = resolver._build_intermediate_node( + "Observation.code.extension", base_with_code + ) + + assert node is not None + assert node.definition.slicing is not None, ( + "_build_intermediate_node stripped slicing when expanding " + "Observation.code.extension from CodeableConcept" + ) + assert node.is_slice_entry, ( + "Synthesised Observation.code.extension node should be a slice entry" + ) + + # ------------------------------------------------------------------ # SnapshotResolver._merge_node_with_base # ------------------------------------------------------------------ @@ -325,6 +556,23 @@ def test_merge_node_with_base__base_type_kept_when_diff_has_none(resolver): assert result.type_codes == ["code"] +@pytest.mark.parametrize( + "min, max, base_min, base_max, expected_min, expected_max", + [ + (None, None, 0, "1", 0, "1"), + (1, None, 0, "1", 0, "1"), + ], +) +def test_merge_node_with_base__base_is_constructued( + resolver, min, max, base_min, base_max, expected_min, expected_max +): + diff = make_node(id="MyProfile.status", min=min, max=max) + base = make_node(id="BaseResource.status", min=base_min, max=base_max) + result = resolver._merge_node_with_base(diff, base) + assert result.definition.base.min == expected_min + assert result.definition.base.max == expected_max + + # ------------------------------------------------------------------ # SnapshotResolver._resolve_differential # ------------------------------------------------------------------ @@ -372,7 +620,10 @@ def test_resolve_differential__intermediate_nodes_filled_from_base( ): diff = [ make_element("MyProfile", "MyProfile"), - make_element("MyProfile.component.code", "MyProfile.component.code", max="*"), + make_element( + "MyProfile.component.code", + "MyProfile.component.code", + ), ] index = resolver._resolve_differential(diff, base_index) assert (node := index.get("MyProfile.component")) @@ -380,7 +631,7 @@ def test_resolve_differential__intermediate_nodes_filled_from_base( assert node.max_cardinality == None assert (node := index.get("MyProfile.component.code")) assert node.min_cardinality == 0 - assert node.max_cardinality == None + assert node.max_cardinality == 1 def test_resolve_differential__multiple_diff_elements_all_in_result( @@ -517,6 +768,89 @@ def test_resolve_differential__merge_result_is_stored_not_diff_node( assert stored is merged_sentinel +def test_resolve_differential__extension_slice_on_complex_field_is_present(resolver): + # Build a minimal Observation snapshot — only the top-level 'code' field. + obs_snapshot = [ + make_element("Observation", "Observation"), + make_element( + "Observation.code", + "Observation.code", + min=0, + max="1", + type=[ElementDefinitionType(code="CodeableConcept")], + ), + ] + base_index = make_base_index(*obs_snapshot) + + # The differential introduces a slice on Observation.code.extension. + diff = [ + make_element("Observation", "Observation"), + make_element("Observation.code", "Observation.code"), + make_element("Observation.code.extension", "Observation.code.extension"), + make_element( + "Observation.code.extension:mySlice", + "Observation.code.extension", + min=0, + max="1", + type=[ElementDefinitionType(code="Extension")], + ), + ] + + result = resolver._resolve_differential(diff, base_index) + + # The slice entry node must be present and must be recognised as such. + ext_node = result.get("Observation.code.extension") + assert ( + ext_node is not None + ), "Observation.code.extension missing from resolved index" + assert ( + ext_node.is_slice_entry + ), "Observation.code.extension must be a slice entry so SlicedFieldBuilder handles it" + + # The named slice must be present in the index. + assert ( + "Observation.code.extension:mySlice" in result + ), "Observation.code.extension:mySlice missing — slice was silently dropped" + + +def test_resolve_differential__slicing_preserved_on_intermediate_complex_type_node( + resolver, +): + obs_snapshot = [ + make_element("Observation", "Observation"), + make_element( + "Observation.code", + "Observation.code", + min=0, + max="1", + type=[ElementDefinitionType(code="CodeableConcept")], + ), + ] + base_index = make_base_index(*obs_snapshot) + + diff = [ + make_element("Observation", "Observation"), + make_element("Observation.code", "Observation.code"), + make_element("Observation.code.extension", "Observation.code.extension"), + make_element( + "Observation.code.extension:mySlice", + "Observation.code.extension", + min=1, + max="1", + type=[ElementDefinitionType(code="Extension")], + ), + ] + + result = resolver._resolve_differential(diff, base_index) + + ext_node = result.get("Observation.code.extension") + assert ext_node is not None + assert ext_node.definition.slicing is not None, ( + "slicing was stripped when building the intermediate " + "Observation.code.extension node from CodeableConcept" + ) + + # ================================================================== # SnapshotResolver._resolve_content_references # ================================================================== @@ -845,8 +1179,6 @@ def test_resolve__auto_mode_is_default(resolver, base_index): def test_resolve__differential_resolves_base_via_registry(resolver, base_index): - """resolve() fetches the base StructureDefinition from the registry and recursively - resolves it to build the base_index used for differential merging.""" diff_elements = [ make_element("MyProfile", "MyProfile"), make_element("MyProfile.status", "MyProfile.status", min=1), @@ -869,8 +1201,6 @@ def test_resolve__differential_resolves_base_via_registry(resolver, base_index): def test_resolve__differential_recursive_chain(resolver, base_index): - """resolve() recursively resolves a chain of differential definitions until a - snapshot is found, without requiring any intermediate snapshot.""" # Deepest base — provides the snapshot for the whole chain. root_sd = make_structure_def( snapshot_elements=[n.definition for n in base_index.nodes] @@ -911,7 +1241,6 @@ def test_resolve__differential_recursive_chain(resolver, base_index): def test_resolve__differential_raises_when_base_definition_is_missing(resolver): - """resolve() raises DefinitionResolutionError when the SD has no baseDefinition.""" sd = make_structure_def( differential_elements=[ make_element("MyProfile", "MyProfile"), @@ -921,3 +1250,239 @@ def test_resolve__differential_raises_when_base_definition_is_missing(resolver): with pytest.raises(DefinitionResolutionError): resolver.resolve(sd, mode="differential") + + +def test_resolve__differential_no_snapshot_mismatched_root_falls_back_to_partial( + resolver, base_index +): + # Snapshot uses 'BaseResource' as the root. + root_sd = make_structure_def( + snapshot_elements=[n.definition for n in base_index.nodes] + ) + + # Mid profile uses a *different* root name ('MidProfile'), which is the + # non-standard scenario covered by the guard clause. + mid_diff = [ + make_element("MidProfile", "MidProfile"), + make_element("MidProfile.status", "MidProfile.status", min=1), + ] + mid_sd = make_structure_def( + differential_elements=mid_diff, + base_definition="http://example.org/BaseResource", + ) + + top_diff = [ + make_element("TopProfile", "TopProfile"), + make_element("TopProfile.status", "TopProfile.status", max="0"), + ] + top_sd = make_structure_def( + differential_elements=top_diff, + base_definition="http://example.org/MidProfile", + ) + + resolver._registry.get = MagicMock( + side_effect=lambda url: { + "http://example.org/MidProfile": mid_sd, + "http://example.org/BaseResource": root_sd, + }[url] + ) + + # Must not raise a DefinitionIndexError about multiple root candidates. + result = resolver.resolve(top_sd, mode="differential") + + assert isinstance(result, DefinitionIndex) + node = result.get("TopProfile.status") + assert node is not None + assert node.max_cardinality == 0 + + +def test_resolve__differential_no_snapshot_base_uses_ancestor_snapshot( + resolver, base_index +): + # Bottom of the chain — has a real snapshot that includes 'category'. + root_sd = make_structure_def( + snapshot_elements=[ + make_element("BaseResource", "BaseResource"), + make_element( + "BaseResource.status", + "BaseResource.status", + min=0, + max="1", + type=[ElementDefinitionType(code="code")], + ), + make_element( + "BaseResource.category", + "BaseResource.category", + min=0, + max="*", + type=[ElementDefinitionType(code="CodeableConcept")], + ), + ] + ) + + # Mid-level: diff-only, only mentions 'status', never mentions 'category'. + mid_sd = make_structure_def( + differential_elements=[ + make_element("BaseResource", "BaseResource"), + make_element("BaseResource.status", "BaseResource.status", min=1), + ], + base_definition="http://example.org/BaseResource", + ) + + # Top-level: constrains 'category', which MidProfile never mentioned. + top_sd = make_structure_def( + differential_elements=[ + make_element("BaseResource", "BaseResource"), + make_element("BaseResource.category", "BaseResource.category", min=1), + ], + base_definition="http://example.org/MidProfile", + ) + + resolver._registry.get = MagicMock( + side_effect=lambda url: { + "http://example.org/MidProfile": mid_sd, + "http://example.org/BaseResource": root_sd, + }[url] + ) + + result = resolver.resolve(top_sd, mode="differential") + + assert isinstance(result, DefinitionIndex) + # category must be present and carry its type from the ancestor snapshot + category_node = result.get("BaseResource.category") + assert category_node is not None + assert category_node.min_cardinality == 1 # overridden by top diff + + +def test_resolve__differential_no_snapshot_base_preserves_mid_constraints( + resolver, base_index +): + root_sd = make_structure_def( + snapshot_elements=[ + make_element("BaseResource", "BaseResource"), + make_element( + "BaseResource.status", + "BaseResource.status", + min=0, + max="1", + type=[ElementDefinitionType(code="code")], + ), + make_element( + "BaseResource.category", + "BaseResource.category", + min=0, + max="*", + type=[ElementDefinitionType(code="CodeableConcept")], + ), + ] + ) + + # MidProfile raises min on 'status' to 1, never mentions 'category'. + mid_sd = make_structure_def( + differential_elements=[ + make_element("BaseResource", "BaseResource"), + make_element("BaseResource.status", "BaseResource.status", min=1), + ], + base_definition="http://example.org/BaseResource", + ) + + # TopProfile restricts 'category' to max="1"; doesn't mention 'status'. + top_sd = make_structure_def( + differential_elements=[ + make_element("BaseResource", "BaseResource"), + make_element("BaseResource.category", "BaseResource.category", max="1"), + ], + base_definition="http://example.org/MidProfile", + ) + + resolver._registry.get = MagicMock( + side_effect=lambda url: { + "http://example.org/MidProfile": mid_sd, + "http://example.org/BaseResource": root_sd, + }[url] + ) + + result = resolver.resolve(top_sd, mode="differential") + + # category must appear with TopProfile's max=1 applied on top of the ancestor + # type definition (CodeableConcept) which MidProfile never touched. + category_node = result.get("BaseResource.category") + assert category_node is not None + assert category_node.max_cardinality == 1 + # Type must be resolved from the ancestor snapshot, not be empty. + assert ( + category_node.types + ), "category node has no types — ancestor snapshot was not used" + assert any(str(t.code) == "CodeableConcept" for t in category_node.types) + + +# ================================================================== +# SnapshotResolver._build_full_ancestor_index +# ================================================================== + + +def test_build_full_ancestor_index__returns_index_from_nearest_snapshot( + resolver, base_index +): + snapshot_sd = make_structure_def( + snapshot_elements=[n.definition for n in base_index.nodes] + ) + diff_only_sd = make_structure_def( + differential_elements=[ + make_element("BaseResource", "BaseResource"), + ], + base_definition="http://example.org/RootResource", + ) + + resolver._registry.get = MagicMock(return_value=snapshot_sd) + + result = resolver._build_full_ancestor_index(diff_only_sd) + + assert isinstance(result, DefinitionIndex) + assert result.root().id == "BaseResource" + assert result.get("BaseResource.status") is not None + + +def test_build_full_ancestor_index__skips_multiple_snapshotless_ancestors( + resolver, base_index +): + # Three-level chain: A (diff-only) → B (diff-only) → C (has snapshot) + sd_c = make_structure_def( + snapshot_elements=[n.definition for n in base_index.nodes] + ) + sd_b = make_structure_def( + differential_elements=[make_element("BaseResource", "BaseResource")], + base_definition="http://example.org/C", + ) + sd_a = make_structure_def( + differential_elements=[make_element("BaseResource", "BaseResource")], + base_definition="http://example.org/B", + ) + + resolver._registry.get = MagicMock( + side_effect=lambda url: { + "http://example.org/B": sd_b, + "http://example.org/C": sd_c, + }[url] + ) + + result = resolver._build_full_ancestor_index(sd_a) + + assert isinstance(result, DefinitionIndex) + assert result.root().id == "BaseResource" + + +def test_build_full_ancestor_index__raises_when_chain_has_no_snapshot(resolver): + sd_b = make_structure_def( + differential_elements=[make_element("MyProfile", "MyProfile")], + base_definition=None, # chain terminates here with no snapshot + ) + sd_a = make_structure_def( + differential_elements=[make_element("MyProfile", "MyProfile")], + base_definition="http://example.org/B", + ) + + resolver._registry.get = MagicMock(return_value=sd_b) + + with pytest.raises(DefinitionResolutionError): + resolver._build_full_ancestor_index(sd_a) diff --git a/test/test_fhir_resources_generator.py b/test/test_fhir_resources_generator.py index 7ad6e329..f5d5a5e9 100644 --- a/test/test_fhir_resources_generator.py +++ b/test/test_fhir_resources_generator.py @@ -214,7 +214,7 @@ def test_model_with_model_validator(self): ), ), __validators__={ - "FHIR_ele_1_constraint_model_validator": ( + "FHIR_ele_1_constraint_validator": ( model_validator(mode="after")( partial( fhir_validators.validate_model_constraint, @@ -235,7 +235,7 @@ class ModelWithModelValidator(BaseModel): ) @model_validator(mode="after") - def FHIR_ele_1_constraint_model_validator(self): + def FHIR_ele_1_constraint_validator(self): return validate_model_constraint( self, expression="hasValue() or (children().count() > id.count()) or $this is Parameters", @@ -259,7 +259,7 @@ def test_inherited_validators_not_included(self): ), ), __validators__={ - "FHIR_custom_1_constraint_model_validator": ( + "FHIR_custom_1_constraint_validator": ( model_validator(mode="after")( partial( fhir_validators.validate_model_constraint, @@ -280,7 +280,7 @@ class ModelWithModelValidator(DomainResource): ) @model_validator(mode="after") - def FHIR_custom_1_constraint_model_validator(self): + def FHIR_custom_1_constraint_validator(self): return validate_model_constraint( self, expression="exists()", @@ -445,7 +445,7 @@ def test_model_with_sliced_field(self): expected_block = """ class Slice(FHIRSliceModel): min_cardinality: ClassVar[int] = 0 - max_cardinality: ClassVar[int] = 2 + max_cardinality: ClassVar[int | None] = 2 valueString: str = Field( description="A string value", @@ -472,7 +472,7 @@ def test_model_with_multiple_inheritance_slice(self): expected_block = """ class ExtensionSlice(Extension, FHIRSliceModel): min_cardinality: ClassVar[int] = 1 - max_cardinality: ClassVar[int] = 1 + max_cardinality: ClassVar[int | None] = 1 url: str = Field( description="Extension URL", @@ -531,7 +531,7 @@ def test_model_with_multiline_expression(self): Field(description="A code field with multiline constraint."), ), __validators__={ - "FHIR_TechniquesForProtonBeamModality_constraint_model_validator": ( + "FHIR_TechniquesForProtonBeamModality_constraint_validator": ( model_validator(mode="after")( partial( fhir_validators.validate_model_constraint, @@ -688,7 +688,7 @@ def test_profile_with_multiple_ancestors(self): ), ), __validators__={ - "FHIR_child_1_constraint_model_validator": ( + "FHIR_child_1_constraint_validator": ( model_validator(mode="after")( partial( fhir_validators.validate_model_constraint, @@ -711,7 +711,7 @@ def test_profile_with_multiple_ancestors(self): ), ), __validators__={ - "FHIR_grandchild_1_constraint_model_validator": ( + "FHIR_grandchild_1_constraint_validator": ( model_validator(mode="after")( partial( fhir_validators.validate_model_constraint, @@ -733,7 +733,7 @@ class ChildModel(DomainResource): ) @model_validator(mode="after") - def FHIR_child_1_constraint_model_validator(self): + def FHIR_child_1_constraint_validator(self): return validate_model_constraint( self, expression="exists()", @@ -749,7 +749,7 @@ class GrandChildModel(ChildModel): ) @model_validator(mode="after") - def FHIR_grandchild_1_constraint_model_validator(self): + def FHIR_grandchild_1_constraint_validator(self): return validate_model_constraint( self, expression="exists()", @@ -949,6 +949,29 @@ def test_property_inheritance_multiple_levels(self): "Inherited property should not appear in child class", ) + def test_model_with_prohibited_field_renders_none_annotation(self): + """A field with annotation=type(None) (0..0 cardinality) must render as 'None', not \"\".""" + model = create_model( + "ModelWithProhibitedField", + active=( + primitives.Boolean, + Field(default=None, description="Active flag."), + ), + prohibited=( + type(None), + Field(default=None, description="Prohibited field."), + ), + ) + expected_block = """ + prohibited: None = Field( + description="Prohibited field.", + default=None, + ) + """ + self.assertBlockInCode(expected_block, model) + code = generate_resource_model_code(model) + self.assertNotIn("", code) + @pytest.mark.parametrize( "model", diff --git a/test/test_fhir_resources_regression.py b/test/test_fhir_resources_regression.py index c672adc8..6fb20022 100644 --- a/test/test_fhir_resources_regression.py +++ b/test/test_fhir_resources_regression.py @@ -1,4 +1,8 @@ +from typing_extensions import get_args, get_origin + import pytest +from pydantic import ValidationError +from fhircraft.fhir.resources.datatypes.registry import get_fhir_type from fhircraft.fhir.resources.factory import FHIRModelFactory from fhircraft.fhir.resources.generator import CodeGenerator from fhircraft.config import override_config @@ -1229,7 +1233,7 @@ def test_regression_issue_277(factory: FHIRModelFactory): # ----------------------------------------------------------------------- assert model.__name__ == "MyAdverseEvent" assert ( - model._canonical_url + model._canonical_url # type: ignore == "http://example.org/fhir/StructureDefinition/my-adverse-event" ) assert "suspectEntity" in model.model_fields @@ -1255,3 +1259,292 @@ def test_regression_issue_277(factory: FHIRModelFactory): 0 ] assert issubclass(se_model, base_se_item) + + +def test_regression_issue_331__narrowing_cardinality_preserves_list_type(factory): + """Narrowing 1..* → 1..1 must NOT unwrap List[T] to T.""" + + struct_def = { + "resourceType": "StructureDefinition", + "id": "narrowing-cardinality", + "url": "http://example.org/fhir/StructureDefinition/narrowing-cardinality", + "name": "NarrowingCardinality", + "status": "draft", + "kind": "resource", + "abstract": False, + "fhirVersion": "4.0.1", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "type": "Observation", + "derivation": "constraint", + "differential": { + "element": [ + {"id": "Observation", "path": "Observation", "min": 1, "max": "*"}, + # Narrow: base is 1..*, profile constrains to 1..1 + { + "id": "Observation.category", + "path": "Observation.category", + "min": 1, + "max": "1", + }, + ] + }, + } + + model = factory.build(struct_def) + original = get_fhir_type("Observation", "R4") + + # The annotation must still be Optional[List[...]], not Optional[CodeableConcept] + annotation = model.model_fields["category"].annotation + inner = next(a for a in get_args(annotation) if a is not type(None)) + assert ( + get_origin(inner) is list + ), f"Expected List[...] annotation for narrowed field, got {annotation}" + + # A bare dict (not a list) is invalid for both base and profiled model + invalid_payload = { + "resourceType": "Observation", + "id": "test", + "category": { + "coding": [ + { + "system": "http://hl7.org/fhir/observation-category", + "code": "laboratory", + } + ] + }, + } + + with pytest.raises(ValidationError): + model.model_validate(invalid_payload) + + with pytest.raises(ValidationError): + original.model_validate(invalid_payload) + + +def test_regression_issue_333__backbone_element_differential_uses_specific_type( + factory, +): + from fhircraft.fhir.resources.datatypes.R5.core import ObservationReferenceRange + + structure_definition = { + "resourceType": "StructureDefinition", + "id": "example-profile-referencerange", + "url": "http://hl7.org/fhir/StructureDefinition/example-profile-referencerange", + "version": "5.0.0", + "name": "ExampleProfileReferenceRange", + "status": "draft", + "fhirVersion": "5.0.0", + "kind": "resource", + "abstract": False, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + {"id": "Observation", "path": "Observation"}, + { + "id": "Observation.referenceRange", + "path": "Observation.referenceRange", + "min": 1, + }, + ] + }, + } + + with override_config(validation_mode="skip"): + model = factory.build( + structure_definition=structure_definition, mode="differential" + ) + + from typing import get_args + + annotation = model.model_fields["referenceRange"].annotation + # Unwrap Optional[List[X]] → X + inner_list = next(a for a in get_args(annotation) if a is not type(None)) + item_type = get_args(inner_list)[0] + + assert item_type is ObservationReferenceRange + + +def test_regression_issue_334__chained_profile_differential_resolves_all_base_elements( + factory, +): + structure_definition_1 = { + "resourceType": "StructureDefinition", + "id": "example-chained-profile-1", + "url": "http://hl7.org/fhir/StructureDefinition/example-chained-profile-1", + "version": "5.0.0", + "name": "ExampleChainedProfile1", + "status": "draft", + "fhirVersion": "5.0.0", + "kind": "resource", + "abstract": False, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + {"id": "Observation", "path": "Observation"}, + {"id": "Observation.id", "path": "Observation.id", "min": 1}, + ] + }, + } + + structure_definition_2 = { + "resourceType": "StructureDefinition", + "id": "example-chained-profile-2", + "url": "http://hl7.org/fhir/StructureDefinition/example-chained-profile-2", + "version": "5.0.0", + "name": "ExampleChainedProfile2", + "status": "draft", + "fhirVersion": "5.0.0", + "kind": "resource", + "abstract": False, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/example-chained-profile-1", + "derivation": "constraint", + "differential": { + "element": [ + {"id": "Observation", "path": "Observation"}, + {"id": "Observation.category", "path": "Observation.category"}, + ] + }, + } + + factory.definition_registry.from_dict(structure_definition_1) + factory.definition_registry.from_dict(structure_definition_2) + + with override_config(validation_mode="skip"): + # This must not raise TypeResolutionError / AssemblerError + model = factory.build( + structure_definition=structure_definition_2, mode="differential" + ) + + from typing import get_args + from fhircraft.fhir.resources.datatypes.R5.complex import CodeableConcept + + assert ( + "category" in model.model_fields + ), "Observation.category missing from the built model." + + annotation = model.model_fields["category"].annotation + inner_list = next(a for a in get_args(annotation) if a is not type(None)) + item_type = get_args(inner_list)[0] + + assert issubclass(item_type, CodeableConcept) + + +def test_regression_issue_335__extension_slice_on_complex_type_field(factory): + """Extension slice on a complex-type sub-field (e.g. Observation.code.extension) + must produce a typed slice model, not plain Optional[List[Extension]].""" + + structure_definition = { + "resourceType": "StructureDefinition", + "id": "example-profile-ext-on-complex", + "url": "http://hl7.org/fhir/StructureDefinition/example-profile-ext-on-complex", + "version": "5.0.0", + "name": "ExampleProfileExtOnComplex", + "status": "draft", + "fhirVersion": "5.0.0", + "kind": "resource", + "abstract": False, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + {"id": "Observation.code", "path": "Observation.code"}, + { + "id": "Observation.code.extension", + "path": "Observation.code.extension", + }, + { + "id": "Observation.code.extension:mySlice", + "path": "Observation.code.extension", + "sliceName": "mySlice", + "type": [ + { + "code": "Extension", + "profile": [ + "http://example.org/fhir/StructureDefinition/my-ext-on-complex" + ], + } + ], + }, + ] + }, + } + + extension_sd = { + "resourceType": "StructureDefinition", + "id": "my-ext-on-complex", + "url": "http://example.org/fhir/StructureDefinition/my-ext-on-complex", + "version": "0.1.0", + "name": "MyExtOnComplex", + "status": "active", + "fhirVersion": "5.0.0", + "kind": "complex-type", + "abstract": False, + "context": [{"type": "element", "expression": "Observation.code.extension"}], + "type": "Extension", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Extension", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Extension.url", + "path": "Extension.url", + "fixedUri": "http://example.org/fhir/StructureDefinition/my-ext-on-complex", + }, + { + "id": "Extension.value[x]", + "path": "Extension.value[x]", + "type": [{"code": "string"}], + "min": 1, + "max": "1", + }, + ] + }, + } + + factory.definition_registry.from_dict(structure_definition) + factory.definition_registry.from_dict(extension_sd) + + with override_config(validation_mode="skip"): + model = factory.build( + structure_definition=structure_definition, mode="differential" + ) + + from typing import Annotated, get_args + + from fhircraft.fhir.resources.base import FHIRSliceModel + from fhircraft.fhir.resources.datatypes.R5.complex import CodeableConcept, Extension + + # Observation.code should be a CodeableConcept subclass + code_annotation = model.model_fields["code"].annotation + code_type = next(a for a in get_args(code_annotation) if a is not type(None)) + assert issubclass(code_type, CodeableConcept) + + # code.extension must be a sliced union containing the MySlice model + ext_annotation = code_type.model_fields["extension"].annotation + list_type = next(a for a in get_args(ext_annotation) if a is not type(None)) + annotated_item = get_args(list_type)[0] + union_type = get_args(annotated_item)[0] + union_members = get_args(union_type) + + slice_models = [ + m + for m in union_members + if isinstance(m, type) and issubclass(m, FHIRSliceModel) + ] + assert slice_models, ( + "Expected at least one FHIRSliceModel in code.extension union, " + f"got {union_members}" + ) + slice_model = slice_models[0] + assert issubclass(slice_model, Extension) + assert ( + slice_model._canonical_url + == "http://example.org/fhir/StructureDefinition/my-ext-on-complex" + ) + assert "valueString" in slice_model.model_fields