openepd 3.1.2__py3-none-any.whl → 3.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/compat/compat_functional_validators.py +29 -0
  3. openepd/compat/pydantic.py +6 -1
  4. openepd/model/specs/concrete.py +1 -157
  5. openepd/model/specs/generated/asphalt.py +1 -11
  6. openepd/model/specs/generated/cladding.py +4 -16
  7. openepd/model/specs/generated/cmu.py +1 -8
  8. openepd/model/specs/generated/concrete.py +0 -19
  9. openepd/model/specs/generated/conveying_equipment.py +2 -12
  10. openepd/model/specs/generated/electrical.py +9 -12
  11. openepd/model/specs/generated/finishes.py +2 -36
  12. openepd/model/specs/generated/fire_and_smoke_protection.py +1 -3
  13. openepd/model/specs/generated/furnishings.py +1 -3
  14. openepd/model/specs/generated/masonry.py +5 -4
  15. openepd/model/specs/generated/mechanical.py +25 -93
  16. openepd/model/specs/generated/mechanical_insulation.py +1 -5
  17. openepd/model/specs/generated/network_infrastructure.py +2 -12
  18. openepd/model/specs/generated/openings.py +5 -17
  19. openepd/model/specs/generated/plumbing.py +3 -19
  20. openepd/model/specs/generated/precast_concrete.py +1 -5
  21. openepd/model/specs/generated/steel.py +9 -12
  22. openepd/model/specs/generated/thermal_moisture_protection.py +1 -15
  23. openepd/model/specs/generated/utility_piping.py +2 -10
  24. openepd/model/specs/generated/wood.py +1 -5
  25. openepd/model/validation/quantity.py +158 -16
  26. {openepd-3.1.2.dist-info → openepd-3.1.3.dist-info}/METADATA +1 -1
  27. {openepd-3.1.2.dist-info → openepd-3.1.3.dist-info}/RECORD +29 -32
  28. openepd/model/specs/aluminium.py +0 -67
  29. openepd/model/specs/glass.py +0 -360
  30. openepd/model/specs/steel.py +0 -184
  31. openepd/model/specs/wood.py +0 -130
  32. {openepd-3.1.2.dist-info → openepd-3.1.3.dist-info}/LICENSE +0 -0
  33. {openepd-3.1.2.dist-info → openepd-3.1.3.dist-info}/WHEEL +0 -0
@@ -31,7 +31,7 @@ from openepd.model.specs.generated.enums import (
31
31
  MechanicalInstallation,
32
32
  MechanicalRefrigerants,
33
33
  )
34
- from openepd.model.validation.quantity import PressureMPaStr, validate_unit_factory
34
+ from openepd.model.validation.quantity import AirflowStr, FlowRateStr, PowerStr, PressureMPaStr, VolumeStr
35
35
 
36
36
 
37
37
  class HvacVrfControlV1(BaseOpenEpdHierarchicalSpec):
@@ -47,21 +47,10 @@ class HvacVrfIndoorV1(BaseOpenEpdHierarchicalSpec):
47
47
 
48
48
  # Own fields:
49
49
  refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="", example=["R11"])
50
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
51
- cooling_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
52
- airflow_rate: str | None = pyd.Field(default=None, description="", example="1 m3 / s")
53
- air_volume: str | None = pyd.Field(default=None, description="", example="1 m3")
54
-
55
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
56
- validate_unit_factory("W")
57
- )
58
- _cooling_capacity_is_quantity_validator = pyd.validator("cooling_capacity", allow_reuse=True)(
59
- validate_unit_factory("W")
60
- )
61
- _airflow_rate_is_quantity_validator = pyd.validator("airflow_rate", allow_reuse=True)(
62
- validate_unit_factory("m3 / s")
63
- )
64
- _air_volume_is_quantity_validator = pyd.validator("air_volume", allow_reuse=True)(validate_unit_factory("m3"))
50
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
51
+ cooling_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
52
+ airflow_rate: AirflowStr | None = pyd.Field(default=None, description="", example="1 m3 / s")
53
+ air_volume: VolumeStr | None = pyd.Field(default=None, description="", example="1 m3")
65
54
 
66
55
 
67
56
  class HvacVrfOutdoorV1(BaseOpenEpdHierarchicalSpec):
@@ -71,21 +60,10 @@ class HvacVrfOutdoorV1(BaseOpenEpdHierarchicalSpec):
71
60
 
72
61
  # Own fields:
73
62
  refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="", example=["R11"])
74
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
75
- cooling_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
76
- airflow_rate: str | None = pyd.Field(default=None, description="", example="1 m3 / s")
77
- air_volume: str | None = pyd.Field(default=None, description="", example="1 m3")
78
-
79
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
80
- validate_unit_factory("W")
81
- )
82
- _cooling_capacity_is_quantity_validator = pyd.validator("cooling_capacity", allow_reuse=True)(
83
- validate_unit_factory("W")
84
- )
85
- _airflow_rate_is_quantity_validator = pyd.validator("airflow_rate", allow_reuse=True)(
86
- validate_unit_factory("m3 / s")
87
- )
88
- _air_volume_is_quantity_validator = pyd.validator("air_volume", allow_reuse=True)(validate_unit_factory("m3"))
63
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
64
+ cooling_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
65
+ airflow_rate: AirflowStr | None = pyd.Field(default=None, description="", example="1 m3 / s")
66
+ air_volume: VolumeStr | None = pyd.Field(default=None, description="", example="1 m3")
89
67
 
90
68
 
91
69
  class HvacAirDiffusersV1(BaseOpenEpdHierarchicalSpec):
@@ -112,24 +90,13 @@ class HvacAHUsV1(BaseOpenEpdHierarchicalSpec):
112
90
  # Own fields:
113
91
  refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="", example=["R11"])
114
92
  installation: MechanicalInstallation | None = pyd.Field(default=None, description="", example="Indoor")
115
- airflow_rate: str | None = pyd.Field(default=None, description="", example="1 m3 / s")
116
- air_volume: str | None = pyd.Field(default=None, description="", example="1 m3")
117
- cooling_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
118
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
93
+ airflow_rate: AirflowStr | None = pyd.Field(default=None, description="", example="1 m3 / s")
94
+ air_volume: VolumeStr | None = pyd.Field(default=None, description="", example="1 m3")
95
+ cooling_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
96
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
119
97
  airflow_control: AhuAirflowControl | None = pyd.Field(default=None, description="", example="CAV")
120
98
  zone_control: AhuZoneControl | None = pyd.Field(default=None, description="", example="Single Zone")
121
99
 
122
- _airflow_rate_is_quantity_validator = pyd.validator("airflow_rate", allow_reuse=True)(
123
- validate_unit_factory("m3 / s")
124
- )
125
- _air_volume_is_quantity_validator = pyd.validator("air_volume", allow_reuse=True)(validate_unit_factory("m3"))
126
- _cooling_capacity_is_quantity_validator = pyd.validator("cooling_capacity", allow_reuse=True)(
127
- validate_unit_factory("W")
128
- )
129
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
130
- validate_unit_factory("W")
131
- )
132
-
133
100
 
134
101
  class HvacBoilersV1(BaseOpenEpdHierarchicalSpec):
135
102
  """Hvac boilers performance specification."""
@@ -137,16 +104,11 @@ class HvacBoilersV1(BaseOpenEpdHierarchicalSpec):
137
104
  _EXT_VERSION = "1.0"
138
105
 
139
106
  # Own fields:
140
- flow_rate: str | None = pyd.Field(default=None, description="", example="1 l / min")
141
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
107
+ flow_rate: FlowRateStr | None = pyd.Field(default=None, description="", example="1 l / min")
108
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
142
109
  configuration: BoilerConfiguration | None = pyd.Field(default=None, description="", example="Hot water")
143
110
  fuel_type: BoilerEquipmentFuelType | None = pyd.Field(default=None, description="", example="Coal")
144
111
 
145
- _flow_rate_is_quantity_validator = pyd.validator("flow_rate", allow_reuse=True)(validate_unit_factory("l / min"))
146
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
147
- validate_unit_factory("W")
148
- )
149
-
150
112
 
151
113
  class HvacChillersV1(BaseOpenEpdHierarchicalSpec):
152
114
  """Hvac chillers performance specification."""
@@ -156,21 +118,10 @@ class HvacChillersV1(BaseOpenEpdHierarchicalSpec):
156
118
  # Own fields:
157
119
  refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="", example=["R11"])
158
120
  installation: MechanicalInstallation | None = pyd.Field(default=None, description="", example="Indoor")
159
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
160
- cooling_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
161
- air_volume: str | None = pyd.Field(default=None, description="", example="1 m3")
162
- airflow_rate: str | None = pyd.Field(default=None, description="", example="1 m3 / s")
163
-
164
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
165
- validate_unit_factory("W")
166
- )
167
- _cooling_capacity_is_quantity_validator = pyd.validator("cooling_capacity", allow_reuse=True)(
168
- validate_unit_factory("W")
169
- )
170
- _air_volume_is_quantity_validator = pyd.validator("air_volume", allow_reuse=True)(validate_unit_factory("m3"))
171
- _airflow_rate_is_quantity_validator = pyd.validator("airflow_rate", allow_reuse=True)(
172
- validate_unit_factory("m3 / s")
173
- )
121
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
122
+ cooling_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
123
+ air_volume: VolumeStr | None = pyd.Field(default=None, description="", example="1 m3")
124
+ airflow_rate: AirflowStr | None = pyd.Field(default=None, description="", example="1 m3 / s")
174
125
 
175
126
 
176
127
  class HvacFansV1(BaseOpenEpdHierarchicalSpec):
@@ -186,23 +137,12 @@ class HvacHeatPumpsV1(BaseOpenEpdHierarchicalSpec):
186
137
 
187
138
  # Own fields:
188
139
  refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="", example=["R11"])
189
- cooling_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
190
- heating_capacity: str | None = pyd.Field(default=None, description="", example="1000.0 W")
191
- air_volume: str | None = pyd.Field(default=None, description="", example="1 m3")
192
- airflow_rate: str | None = pyd.Field(default=None, description="", example="1 m3 / s")
140
+ cooling_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
141
+ heating_capacity: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
142
+ air_volume: VolumeStr | None = pyd.Field(default=None, description="", example="1 m3")
143
+ airflow_rate: AirflowStr | None = pyd.Field(default=None, description="", example="1 m3 / s")
193
144
  heat_pumps_type: HeatPumpType | None = pyd.Field(default=None, description="", example="Air-to-Water")
194
145
 
195
- _cooling_capacity_is_quantity_validator = pyd.validator("cooling_capacity", allow_reuse=True)(
196
- validate_unit_factory("W")
197
- )
198
- _heating_capacity_is_quantity_validator = pyd.validator("heating_capacity", allow_reuse=True)(
199
- validate_unit_factory("W")
200
- )
201
- _air_volume_is_quantity_validator = pyd.validator("air_volume", allow_reuse=True)(validate_unit_factory("m3"))
202
- _airflow_rate_is_quantity_validator = pyd.validator("airflow_rate", allow_reuse=True)(
203
- validate_unit_factory("m3 / s")
204
- )
205
-
206
146
 
207
147
  class HvacHeatExV1(BaseOpenEpdHierarchicalSpec):
208
148
  """Hvac heat exchangers performance specification."""
@@ -222,17 +162,9 @@ class HvacPumpsV1(BaseOpenEpdHierarchicalSpec):
222
162
  _EXT_VERSION = "1.0"
223
163
 
224
164
  # Own fields:
225
- flow_rate: str | None = pyd.Field(default=None, description="", example="1 l / min")
165
+ flow_rate: FlowRateStr | None = pyd.Field(default=None, description="", example="1 l / min")
226
166
  pump_discharge_pressure: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
227
- pump_horsepower: str | None = pyd.Field(default=None, description="", example="1000.0 W")
228
-
229
- _flow_rate_is_quantity_validator = pyd.validator("flow_rate", allow_reuse=True)(validate_unit_factory("l / min"))
230
- _pump_discharge_pressure_is_quantity_validator = pyd.validator("pump_discharge_pressure", allow_reuse=True)(
231
- validate_unit_factory("MPa")
232
- )
233
- _pump_horsepower_is_quantity_validator = pyd.validator("pump_horsepower", allow_reuse=True)(
234
- validate_unit_factory("W")
235
- )
167
+ pump_horsepower: PowerStr | None = pyd.Field(default=None, description="", example="1000.0 W")
236
168
 
237
169
 
238
170
  class HvacRTUsV1(BaseOpenEpdHierarchicalSpec):
@@ -20,7 +20,7 @@
20
20
  from openepd.compat.pydantic import pyd
21
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
22
  from openepd.model.specs.generated.enums import InsulatingMaterial, InsulationIntendedApplication
23
- from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
23
+ from openepd.model.validation.quantity import LengthMmStr
24
24
 
25
25
 
26
26
  class MechanicalInsulationV1(BaseOpenEpdHierarchicalSpec):
@@ -35,7 +35,3 @@ class MechanicalInsulationV1(BaseOpenEpdHierarchicalSpec):
35
35
  default=None, description="", example=["Wall & General"]
36
36
  )
37
37
  thickness_per_declared_unit: LengthMmStr | None = pyd.Field(default=None, description="", example="20 mm")
38
-
39
- _thickness_per_declared_unit_is_quantity_validator = pyd.validator("thickness_per_declared_unit", allow_reuse=True)(
40
- validate_unit_factory("m")
41
- )
@@ -31,7 +31,7 @@ from openepd.model.specs.generated.enums import (
31
31
  RacewaysMaterial,
32
32
  RackType,
33
33
  )
34
- from openepd.model.validation.quantity import LengthMmStr, MassKgStr, validate_unit_factory
34
+ from openepd.model.validation.quantity import ElectricalCurrentStr, LengthMmStr, MassKgStr, validate_unit_factory
35
35
 
36
36
 
37
37
  class PDUV1(BaseOpenEpdHierarchicalSpec):
@@ -40,7 +40,7 @@ class PDUV1(BaseOpenEpdHierarchicalSpec):
40
40
  _EXT_VERSION = "1.0"
41
41
 
42
42
  # Own fields:
43
- amperage: str | None = pyd.Field(default=None, description="", example="1 A")
43
+ amperage: ElectricalCurrentStr | None = pyd.Field(default=None, description="", example="1 A")
44
44
  outlet_level_metering: bool | None = pyd.Field(default=None, description="", example=True)
45
45
  outlet_level_switching: bool | None = pyd.Field(default=None, description="", example=True)
46
46
  pdu_technology: PduTechnology | None = pyd.Field(default=None, description="", example="Basic")
@@ -59,8 +59,6 @@ class CabinetsRacksAndEnclosuresV1(BaseOpenEpdHierarchicalSpec):
59
59
  total_racking_units: int | None = pyd.Field(default=None, description="", example=3)
60
60
  rack_type: RackType | None = pyd.Field(default=None, description="", example="Cabinet")
61
61
 
62
- _static_load_is_quantity_validator = pyd.validator("static_load", allow_reuse=True)(validate_unit_factory("kg"))
63
-
64
62
 
65
63
  class DataCablingV1(BaseOpenEpdHierarchicalSpec):
66
64
  """Data cabling performance specification."""
@@ -141,11 +139,6 @@ class NetworkingCableTraysV1(BaseOpenEpdHierarchicalSpec):
141
139
  )
142
140
  material: CableTraysMaterial | None = pyd.Field(default=None, description="", example="Stainless Steel")
143
141
 
144
- _height_is_quantity_validator = pyd.validator("height", allow_reuse=True)(validate_unit_factory("m"))
145
- _width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
146
- _depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
147
- _static_load_is_quantity_validator = pyd.validator("static_load", allow_reuse=True)(validate_unit_factory("kg"))
148
-
149
142
 
150
143
  class NetworkingRacewaysV1(BaseOpenEpdHierarchicalSpec):
151
144
  """Networking raceways performance specification."""
@@ -163,9 +156,6 @@ class NetworkingRacewaysV1(BaseOpenEpdHierarchicalSpec):
163
156
  )
164
157
  raceways_material: RacewaysMaterial | None = pyd.Field(default=None, description="", example="Aluminum")
165
158
 
166
- _width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
167
- _depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
168
-
169
159
 
170
160
  class NetworkInfrastructureV1(BaseOpenEpdHierarchicalSpec):
171
161
  """Network infrastructure performance specification."""
@@ -30,7 +30,7 @@ from openepd.model.specs.generated.enums import (
30
30
  ThermalSeparation,
31
31
  )
32
32
  from openepd.model.validation.numbers import RatioFloat
33
- from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
33
+ from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, SpeedStr, validate_unit_factory
34
34
 
35
35
 
36
36
  class GlazingIntendedApplication(BaseOpenEpdSchema):
@@ -355,10 +355,10 @@ class NAFSFenestrationV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin):
355
355
  description="Weighted average conductance of heat across assembly (including frame).",
356
356
  example="1 USI",
357
357
  )
358
- air_infiltration: str | None = pyd.Field(
358
+ air_infiltration: SpeedStr | None = pyd.Field(
359
359
  default=None,
360
360
  description="Air infiltration, measured at a certain level of Differential Pressure.",
361
- example="1 m / s",
361
+ example="1 m3 / m2 / s",
362
362
  )
363
363
 
364
364
  thermal_separation: ThermalSeparation | None = pyd.Field(default=None, example="Aluminium")
@@ -386,10 +386,6 @@ class NAFSFenestrationV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin):
386
386
  _assembly_u_factor_is_quantity_validator = pyd.validator("assembly_u_factor", allow_reuse=True)(
387
387
  validate_unit_factory("USI")
388
388
  )
389
- _air_infiltration_is_quantity_validator = pyd.validator("air_infiltration", allow_reuse=True)(
390
- validate_unit_factory("m / s")
391
- )
392
- _dp_rating_is_quantity_validator = pyd.validator("dp_rating", allow_reuse=True)(validate_unit_factory("MPa"))
393
389
  _nafs_performance_grade_is_quantity_validator = pyd.validator("performance_grade", allow_reuse=True)(
394
390
  validate_unit_factory("psf")
395
391
  )
@@ -415,10 +411,10 @@ class InsulatingGlazingUnitsV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin)
415
411
  dp_rating: PressureMPaStr | None = pyd.Field(
416
412
  default=None, description="Maximum Differential Pressure, a measure of wind tolerance.", example="1 MPa"
417
413
  )
418
- air_infiltration: str | None = pyd.Field(
414
+ air_infiltration: SpeedStr | None = pyd.Field(
419
415
  default=None,
420
416
  description="Air infiltration, measured at a certain level of Differential Pressure.",
421
- example="1 m / s",
417
+ example="1 m3 / m2 / s",
422
418
  )
423
419
  glass_panes: int | None = pyd.Field(
424
420
  default=None,
@@ -432,9 +428,6 @@ class InsulatingGlazingUnitsV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin)
432
428
  default=None, description="Spacer material for Integrated Glass Unit.", example="Aluminium"
433
429
  )
434
430
 
435
- _air_infiltration_is_quantity_validator = pyd.validator("air_infiltration", allow_reuse=True)(
436
- validate_unit_factory("m / s")
437
- )
438
431
  _dp_rating_is_quantity_validator = pyd.validator("dp_rating", allow_reuse=True)(validate_unit_factory("MPa"))
439
432
  _cog_u_factor_is_quantity_validator = pyd.validator("cog_u_factor", allow_reuse=True)(validate_unit_factory("USI"))
440
433
 
@@ -462,9 +455,6 @@ class DoorsAndFramesV1(BaseOpenEpdHierarchicalSpec):
462
455
  height: LengthMmStr | None = pyd.Field(default=None, example="1200 mm")
463
456
  width: LengthMmStr | None = pyd.Field(default=None, example="600 mm")
464
457
 
465
- _height_is_quantity_validator = pyd.validator("height", allow_reuse=True)(validate_unit_factory("m"))
466
- _width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
467
-
468
458
  # Nested specs:
469
459
  IntegratedDoorsOpeningAssemblies: IntegratedDoorsOpeningAssembliesV1 | None = None
470
460
  MetalDoorAndFrames: MetalDoorAndFramesV1 | None = None
@@ -541,8 +531,6 @@ class OpeningsV1(BaseOpenEpdHierarchicalSpec):
541
531
  # Own fields:
542
532
  thickness: LengthMmStr | None = pyd.Field(default=None, example="80 mm")
543
533
 
544
- _thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
545
-
546
534
  # Nested specs:
547
535
  CurtainWalls: CurtainWallsV1 | None = None
548
536
  DoorsAndFrames: DoorsAndFramesV1 | None = None
@@ -20,7 +20,7 @@
20
20
  from openepd.compat.pydantic import pyd
21
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
22
  from openepd.model.specs.generated.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
23
- from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
23
+ from openepd.model.validation.quantity import LengthMmStr, MassPerLengthStr
24
24
 
25
25
 
26
26
  class BathtubsV1(BaseOpenEpdHierarchicalSpec):
@@ -55,20 +55,12 @@ class FireProtectionPipingV1(BaseOpenEpdHierarchicalSpec):
55
55
  # Own fields:
56
56
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="6 mm")
57
57
  piping_diameter: LengthMmStr | None = pyd.Field(default=None, description="", example="120 mm")
58
- mass_per_unit_length: str | None = pyd.Field(default=None, description="", example="1 kg / m")
58
+ mass_per_unit_length: MassPerLengthStr | None = pyd.Field(default=None, description="", example="1 kg / m")
59
59
  piping_ansi_schedule: PipingAnsiSchedule | None = pyd.Field(default=None, description="", example="5")
60
60
  fire_protection_piping_material: FireProtectionPipingMaterial | None = pyd.Field(
61
61
  default=None, description="", example="PVC"
62
62
  )
63
63
 
64
- _thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
65
- _piping_diameter_is_quantity_validator = pyd.validator("piping_diameter", allow_reuse=True)(
66
- validate_unit_factory("m")
67
- )
68
- _mass_per_unit_length_is_quantity_validator = pyd.validator("mass_per_unit_length", allow_reuse=True)(
69
- validate_unit_factory("kg / m")
70
- )
71
-
72
64
 
73
65
  class FireSprinklersV1(BaseOpenEpdHierarchicalSpec):
74
66
  """Fire sprinklers performance specification."""
@@ -118,18 +110,10 @@ class PipingV1(BaseOpenEpdHierarchicalSpec):
118
110
  # Own fields:
119
111
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="6 mm")
120
112
  piping_diameter: LengthMmStr | None = pyd.Field(default=None, description="", example="120 mm")
121
- mass_per_unit_length: str | None = pyd.Field(default=None, description="", example="1 kg / m")
113
+ mass_per_unit_length: MassPerLengthStr | None = pyd.Field(default=None, description="", example="1 kg / m")
122
114
  piping_ansi_schedule: PipingAnsiSchedule | None = pyd.Field(default=None, description="", example="5")
123
115
  plumbing_piping_material: PlumbingPipingMaterial | None = pyd.Field(default=None, description="", example="PVC")
124
116
 
125
- _thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
126
- _piping_diameter_is_quantity_validator = pyd.validator("piping_diameter", allow_reuse=True)(
127
- validate_unit_factory("m")
128
- )
129
- _mass_per_unit_length_is_quantity_validator = pyd.validator("mass_per_unit_length", allow_reuse=True)(
130
- validate_unit_factory("kg / m")
131
- )
132
-
133
117
 
134
118
  class PlumbingEquipmentV1(BaseOpenEpdHierarchicalSpec):
135
119
  """Plumbing equipment performance specification."""
@@ -20,7 +20,7 @@
20
20
  from openepd.compat.pydantic import pyd
21
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
22
  from openepd.model.validation.numbers import RatioFloat
23
- from openepd.model.validation.quantity import PressureMPaStr, validate_unit_factory
23
+ from openepd.model.validation.quantity import PressureMPaStr
24
24
 
25
25
 
26
26
  class ArchitecturalPrecastV1(BaseOpenEpdHierarchicalSpec):
@@ -58,10 +58,6 @@ class PrecastConcreteV1(BaseOpenEpdHierarchicalSpec):
58
58
  )
59
59
  steel_mass_percentage: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
60
60
 
61
- _concrete_compressive_strength_28d_is_quantity_validator = pyd.validator(
62
- "concrete_compressive_strength_28d", allow_reuse=True
63
- )(validate_unit_factory("MPa"))
64
-
65
61
  # Nested specs:
66
62
  ArchitecturalPrecast: ArchitecturalPrecastV1 | None = None
67
63
  StructuralPrecast: StructuralPrecastV1 | None = None
@@ -18,14 +18,22 @@
18
18
  # Find out more at www.BuildingTransparency.org
19
19
  #
20
20
  from openepd.compat.pydantic import pyd
21
+ from openepd.model.base import BaseOpenEpdSchema
21
22
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, BaseOpenEpdSpec
22
23
  from openepd.model.specs.generated.enums import SteelComposition, SteelRebarGrade
23
- from openepd.model.specs.steel import SteelMakingRoute
24
24
  from openepd.model.standard import Standard
25
25
  from openepd.model.validation.numbers import RatioFloat
26
26
  from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
27
27
 
28
28
 
29
+ class SteelMakingRoute(BaseOpenEpdSchema):
30
+ """Steel making route."""
31
+
32
+ bof: bool | None = pyd.Field(default=None, description="Basic oxygen furnace")
33
+ eaf: bool | None = pyd.Field(default=None, description="Electric arc furnace")
34
+ ohf: bool | None = pyd.Field(default=None, description="Open hearth furnace")
35
+
36
+
29
37
  class SteelFabricatedMixin(BaseOpenEpdSpec):
30
38
  """Class with fabricated property used in different parts of steel hierarchy."""
31
39
 
@@ -180,9 +188,6 @@ class StructuralSteelV1(BaseOpenEpdHierarchicalSpec):
180
188
  example="1.45E-5 W / (m * K)",
181
189
  )
182
190
 
183
- _steel_modulus_of_elasticity_is_quantity_validator = pyd.validator("modulus_of_elasticity", allow_reuse=True)(
184
- validate_unit_factory("MPa")
185
- )
186
191
  _steel_thermal_expansion_is_quantity_validator = pyd.validator("thermal_expansion", allow_reuse=True)(
187
192
  validate_unit_factory("1 / K")
188
193
  )
@@ -228,10 +233,6 @@ class RebarSteelV1(BaseOpenEpdHierarchicalSpec, SteelFabricatedMixin):
228
233
  )
229
234
  epoxy_coated: bool | None = pyd.Field(default=None, example=True)
230
235
 
231
- _steel_rebar_diameter_min_is_quantity_validator = pyd.validator("diameter_min", allow_reuse=True)(
232
- validate_unit_factory("m")
233
- )
234
-
235
236
 
236
237
  class WireMeshSteelV1(BaseOpenEpdHierarchicalSpec, SteelFabricatedMixin):
237
238
  """Mild steel wire for reinforcement, connections, and meshes."""
@@ -276,10 +277,6 @@ class SteelV1(BaseOpenEpdHierarchicalSpec):
276
277
  sae_standards: list[Standard] | None = pyd.Field(default=None, description="List of SAE standards")
277
278
  en_standards: list[Standard] | None = pyd.Field(default=None, description="List of EN standards")
278
279
 
279
- _steel_yield_tensile_str_is_quantity_validator = pyd.validator("yield_tensile_str", allow_reuse=True)(
280
- validate_unit_factory("MPa")
281
- )
282
-
283
280
  # Nested specs:
284
281
  MBQSteel: MBQSteelV1 | None = None
285
282
  CoilSteel: CoilSteelV1 | None = None
@@ -28,7 +28,7 @@ from openepd.model.specs.generated.enums import (
28
28
  RoofCoverBoardsMaterial,
29
29
  )
30
30
  from openepd.model.validation.numbers import RatioFloat
31
- from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
31
+ from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr
32
32
 
33
33
 
34
34
  class BituminousRoofingV1(BaseOpenEpdHierarchicalSpec):
@@ -93,10 +93,6 @@ class BoardInsulationV1(BaseOpenEpdHierarchicalSpec):
93
93
  # Own fields:
94
94
  compressive_strength: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
95
95
 
96
- _compressive_strength_is_quantity_validator = pyd.validator("compressive_strength", allow_reuse=True)(
97
- validate_unit_factory("MPa")
98
- )
99
-
100
96
 
101
97
  class FoamedInPlaceV1(BaseOpenEpdHierarchicalSpec):
102
98
  """Foamed in place performance specification."""
@@ -134,8 +130,6 @@ class MembraneRoofingV1(BaseOpenEpdHierarchicalSpec):
134
130
  nsf347: bool | None = pyd.Field(default=None, description="", example=True)
135
131
  vantage_vinyl: bool | None = pyd.Field(default=None, description="", example=True)
136
132
 
137
- _thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
138
-
139
133
  # Nested specs:
140
134
  BituminousRoofing: BituminousRoofingV1 | None = None
141
135
  SinglePlyEPDM: SinglePlyEPDMV1 | None = None
@@ -159,10 +153,6 @@ class InsulationV1(BaseOpenEpdHierarchicalSpec):
159
153
  )
160
154
  thickness_per_declared_unit: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
161
155
 
162
- _thickness_per_declared_unit_is_quantity_validator = pyd.validator("thickness_per_declared_unit", allow_reuse=True)(
163
- validate_unit_factory("m")
164
- )
165
-
166
156
  # Nested specs:
167
157
  BlanketInsulation: BlanketInsulationV1 | None = None
168
158
  BlownInsulation: BlownInsulationV1 | None = None
@@ -199,10 +189,6 @@ class RoofCoverBoardsV1(BaseOpenEpdHierarchicalSpec):
199
189
  facing: list[RoofCoverBoardsFacing] | None = pyd.Field(default=None, description="", example=["Paper"])
200
190
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
201
191
 
202
- _roof_cover_boards_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(
203
- validate_unit_factory("m")
204
- )
205
-
206
192
 
207
193
  class SteepSlopeRoofingV1(BaseOpenEpdHierarchicalSpec):
208
194
  """Steep slope roofing performance specification."""
@@ -20,7 +20,7 @@
20
20
  from openepd.compat.pydantic import pyd
21
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
22
  from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
23
- from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
23
+ from openepd.model.validation.quantity import LengthMmStr, MassPerLengthStr
24
24
 
25
25
 
26
26
  class BuildingHeatingPipingV1(BaseOpenEpdHierarchicalSpec):
@@ -48,18 +48,10 @@ class UtilityPipingV1(BaseOpenEpdHierarchicalSpec):
48
48
  # Own fields:
49
49
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="6 m")
50
50
  piping_diameter: LengthMmStr | None = pyd.Field(default=None, description="", example="200 mm")
51
- mass_per_unit_length: str | None = pyd.Field(default=None, description="", example="1 kg / m")
51
+ mass_per_unit_length: MassPerLengthStr | None = pyd.Field(default=None, description="", example="1 kg / m")
52
52
  piping_ansi_schedule: PipingAnsiSchedule | None = pyd.Field(default=None, description="", example="5")
53
53
  utility_piping_material: UtilityPipingMaterial | None = pyd.Field(default=None, description="", example="PVC")
54
54
 
55
- _thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
56
- _piping_diameter_is_quantity_validator = pyd.validator("piping_diameter", allow_reuse=True)(
57
- validate_unit_factory("m")
58
- )
59
- _mass_per_unit_length_is_quantity_validator = pyd.validator("mass_per_unit_length", allow_reuse=True)(
60
- validate_unit_factory("kg / m")
61
- )
62
-
63
55
  # Nested specs:
64
56
  BuildingHeatingPiping: BuildingHeatingPipingV1 | None = None
65
57
  BuriedPiping: BuriedPipingV1 | None = None
@@ -31,7 +31,7 @@ from openepd.model.specs.generated.enums import (
31
31
  SheathingPanelsFabrication,
32
32
  )
33
33
  from openepd.model.validation.numbers import RatioFloat
34
- from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
34
+ from openepd.model.validation.quantity import LengthMmStr
35
35
 
36
36
 
37
37
  class WoodDeckingV1(BaseOpenEpdHierarchicalSpec):
@@ -119,10 +119,6 @@ class SheathingPanelsV1(BaseOpenEpdHierarchicalSpec):
119
119
  wood_board_thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
120
120
  timber_species: EngineeredTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
121
121
 
122
- _wood_board_thickness_is_quantity_validator = pyd.validator("wood_board_thickness", allow_reuse=True)(
123
- validate_unit_factory("m")
124
- )
125
-
126
122
 
127
123
  class UnfinishedWoodV1(BaseOpenEpdHierarchicalSpec):
128
124
  """Unfinished or 'green' timber."""