openepd 6.13.2__py3-none-any.whl → 7.0.1__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 (99) hide show
  1. openepd/__init__.py +0 -6
  2. openepd/__version__.py +1 -1
  3. openepd/api/average_dataset/generic_estimate_sync_api.py +11 -10
  4. openepd/api/average_dataset/industry_epd_sync_api.py +9 -8
  5. openepd/api/base_sync_client.py +53 -9
  6. openepd/api/category/sync_api.py +1 -1
  7. openepd/api/dto/base.py +4 -4
  8. openepd/api/dto/common.py +24 -16
  9. openepd/api/dto/meta.py +15 -11
  10. openepd/api/dto/mf.py +9 -8
  11. openepd/api/epd/dto.py +43 -33
  12. openepd/api/epd/sync_api.py +9 -9
  13. openepd/api/pcr/sync_api.py +2 -2
  14. openepd/bundle/model.py +11 -10
  15. openepd/bundle/reader.py +12 -5
  16. openepd/bundle/writer.py +17 -6
  17. openepd/model/base.py +61 -44
  18. openepd/model/category.py +13 -10
  19. openepd/model/common.py +107 -59
  20. openepd/model/declaration.py +93 -64
  21. openepd/model/epd.py +51 -43
  22. openepd/model/generic_estimate.py +28 -13
  23. openepd/model/industry_epd.py +15 -9
  24. openepd/model/lcia.py +161 -136
  25. openepd/model/org.py +70 -37
  26. openepd/model/pcr.py +38 -32
  27. openepd/model/specs/asphalt.py +31 -22
  28. openepd/model/specs/base.py +14 -11
  29. openepd/model/specs/concrete.py +60 -39
  30. openepd/model/specs/range/aggregates.py +9 -9
  31. openepd/model/specs/range/aluminium.py +7 -7
  32. openepd/model/specs/range/asphalt.py +22 -19
  33. openepd/model/specs/range/cladding.py +16 -16
  34. openepd/model/specs/range/cmu.py +10 -9
  35. openepd/model/specs/range/concrete.py +36 -27
  36. openepd/model/specs/range/conveying_equipment.py +16 -15
  37. openepd/model/specs/range/electrical.py +24 -22
  38. openepd/model/specs/range/finishes.py +109 -104
  39. openepd/model/specs/range/fire_and_smoke_protection.py +7 -7
  40. openepd/model/specs/range/furnishings.py +16 -12
  41. openepd/model/specs/range/manufacturing_inputs.py +16 -16
  42. openepd/model/specs/range/masonry.py +16 -16
  43. openepd/model/specs/range/mechanical.py +47 -47
  44. openepd/model/specs/range/mechanical_insulation.py +7 -7
  45. openepd/model/specs/range/network_infrastructure.py +54 -46
  46. openepd/model/specs/range/openings.py +36 -31
  47. openepd/model/specs/range/plumbing.py +15 -13
  48. openepd/model/specs/range/precast_concrete.py +20 -16
  49. openepd/model/specs/range/sheathing.py +18 -18
  50. openepd/model/specs/range/steel.py +27 -25
  51. openepd/model/specs/range/thermal_moisture_protection.py +20 -20
  52. openepd/model/specs/range/utility_piping.py +9 -9
  53. openepd/model/specs/range/wood.py +19 -19
  54. openepd/model/specs/range/wood_joists.py +8 -8
  55. openepd/model/specs/singular/__init__.py +9 -5
  56. openepd/model/specs/singular/aggregates.py +22 -15
  57. openepd/model/specs/singular/aluminium.py +20 -5
  58. openepd/model/specs/singular/asphalt.py +44 -20
  59. openepd/model/specs/singular/cladding.py +38 -23
  60. openepd/model/specs/singular/cmu.py +26 -11
  61. openepd/model/specs/singular/common.py +3 -2
  62. openepd/model/specs/singular/concrete.py +85 -48
  63. openepd/model/specs/singular/conveying_equipment.py +30 -17
  64. openepd/model/specs/singular/deprecated/__init__.py +3 -2
  65. openepd/model/specs/singular/deprecated/concrete.py +68 -33
  66. openepd/model/specs/singular/deprecated/steel.py +28 -15
  67. openepd/model/specs/singular/electrical.py +69 -41
  68. openepd/model/specs/singular/finishes.py +250 -140
  69. openepd/model/specs/singular/fire_and_smoke_protection.py +9 -6
  70. openepd/model/specs/singular/furnishings.py +16 -14
  71. openepd/model/specs/singular/manufacturing_inputs.py +23 -14
  72. openepd/model/specs/singular/masonry.py +66 -21
  73. openepd/model/specs/singular/mechanical.py +48 -47
  74. openepd/model/specs/singular/mechanical_insulation.py +7 -6
  75. openepd/model/specs/singular/mixins/conduit_mixin.py +13 -10
  76. openepd/model/specs/singular/network_infrastructure.py +111 -52
  77. openepd/model/specs/singular/openings.py +127 -95
  78. openepd/model/specs/singular/plumbing.py +15 -12
  79. openepd/model/specs/singular/precast_concrete.py +68 -54
  80. openepd/model/specs/singular/sheathing.py +47 -27
  81. openepd/model/specs/singular/steel.py +69 -45
  82. openepd/model/specs/singular/thermal_moisture_protection.py +36 -20
  83. openepd/model/specs/singular/utility_piping.py +11 -8
  84. openepd/model/specs/singular/wood.py +48 -24
  85. openepd/model/specs/singular/wood_joists.py +19 -6
  86. openepd/model/standard.py +15 -8
  87. openepd/model/validation/common.py +9 -3
  88. openepd/model/validation/numbers.py +0 -13
  89. openepd/model/validation/quantity.py +88 -55
  90. openepd/model/versioning.py +9 -6
  91. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/METADATA +2 -2
  92. openepd-7.0.1.dist-info/RECORD +141 -0
  93. openepd/compat/__init__.py +0 -15
  94. openepd/compat/compat_functional_validators.py +0 -25
  95. openepd/compat/pydantic.py +0 -30
  96. openepd/patch_pydantic.py +0 -108
  97. openepd-6.13.2.dist-info/RECORD +0 -145
  98. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/LICENSE +0 -0
  99. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/WHEEL +0 -0
@@ -32,10 +32,8 @@ __all__ = (
32
32
  "MechanicalRangeV1",
33
33
  )
34
34
 
35
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
36
-
35
+ import pydantic
37
36
 
38
- from openepd.compat.pydantic import pyd
39
37
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
40
38
  from openepd.model.specs.enums import (
41
39
  AhuAirflowControl,
@@ -60,6 +58,8 @@ from openepd.model.validation.quantity import (
60
58
  AmountRangeVolume,
61
59
  )
62
60
 
61
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
62
+
63
63
 
64
64
  class HvacVrfControlRangeV1(BaseOpenEpdHierarchicalSpec):
65
65
  """
@@ -80,11 +80,11 @@ class HvacVrfIndoorRangeV1(BaseOpenEpdHierarchicalSpec):
80
80
 
81
81
  _EXT_VERSION = "1.0"
82
82
 
83
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
84
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
85
- cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
86
- airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
87
- air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
83
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
84
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
85
+ cooling_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
86
+ airflow_rate: AmountRangeAirflow | None = pydantic.Field(default=None, description="")
87
+ air_volume: AmountRangeVolume | None = pydantic.Field(default=None, description="")
88
88
 
89
89
 
90
90
  class HvacVrfOutdoorRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -96,11 +96,11 @@ class HvacVrfOutdoorRangeV1(BaseOpenEpdHierarchicalSpec):
96
96
 
97
97
  _EXT_VERSION = "1.0"
98
98
 
99
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
100
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
101
- cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
102
- airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
103
- air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
99
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
100
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
101
+ cooling_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
102
+ airflow_rate: AmountRangeAirflow | None = pydantic.Field(default=None, description="")
103
+ air_volume: AmountRangeVolume | None = pydantic.Field(default=None, description="")
104
104
 
105
105
 
106
106
  class HvacAirDiffusersRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -122,8 +122,8 @@ class HvacAirFiltersRangeV1(BaseOpenEpdHierarchicalSpec):
122
122
 
123
123
  _EXT_VERSION = "1.0"
124
124
 
125
- merv_rating: list[AirFiltersMervRating] | None = pyd.Field(default=None, description="")
126
- media_type: list[AirFiltersMediaType] | None = pyd.Field(default=None, description="")
125
+ merv_rating: list[AirFiltersMervRating] | None = pydantic.Field(default=None, description="")
126
+ media_type: list[AirFiltersMediaType] | None = pydantic.Field(default=None, description="")
127
127
 
128
128
 
129
129
  class HvacAHUsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -138,14 +138,14 @@ class HvacAHUsRangeV1(BaseOpenEpdHierarchicalSpec):
138
138
 
139
139
  _EXT_VERSION = "1.0"
140
140
 
141
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
142
- installation: list[MechanicalInstallation] | None = pyd.Field(default=None, description="")
143
- airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
144
- air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
145
- cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
146
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
147
- airflow_control: list[AhuAirflowControl] | None = pyd.Field(default=None, description="")
148
- zone_control: list[AhuZoneControl] | None = pyd.Field(default=None, description="")
141
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
142
+ installation: list[MechanicalInstallation] | None = pydantic.Field(default=None, description="")
143
+ airflow_rate: AmountRangeAirflow | None = pydantic.Field(default=None, description="")
144
+ air_volume: AmountRangeVolume | None = pydantic.Field(default=None, description="")
145
+ cooling_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
146
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
147
+ airflow_control: list[AhuAirflowControl] | None = pydantic.Field(default=None, description="")
148
+ zone_control: list[AhuZoneControl] | None = pydantic.Field(default=None, description="")
149
149
 
150
150
 
151
151
  class HvacBoilersRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -157,10 +157,10 @@ class HvacBoilersRangeV1(BaseOpenEpdHierarchicalSpec):
157
157
 
158
158
  _EXT_VERSION = "1.0"
159
159
 
160
- flow_rate: AmountRangeAreaPerVolume | None = pyd.Field(default=None, description="")
161
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
162
- configuration: list[BoilerConfiguration] | None = pyd.Field(default=None, description="")
163
- fuel_type: list[BoilerEquipmentFuelType] | None = pyd.Field(default=None, description="")
160
+ flow_rate: AmountRangeAreaPerVolume | None = pydantic.Field(default=None, description="")
161
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
162
+ configuration: list[BoilerConfiguration] | None = pydantic.Field(default=None, description="")
163
+ fuel_type: list[BoilerEquipmentFuelType] | None = pydantic.Field(default=None, description="")
164
164
 
165
165
 
166
166
  class HvacChillersRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -175,12 +175,12 @@ class HvacChillersRangeV1(BaseOpenEpdHierarchicalSpec):
175
175
 
176
176
  _EXT_VERSION = "1.0"
177
177
 
178
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
179
- installation: list[MechanicalInstallation] | None = pyd.Field(default=None, description="")
180
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
181
- cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
182
- air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
183
- airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
178
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
179
+ installation: list[MechanicalInstallation] | None = pydantic.Field(default=None, description="")
180
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
181
+ cooling_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
182
+ air_volume: AmountRangeVolume | None = pydantic.Field(default=None, description="")
183
+ airflow_rate: AmountRangeAirflow | None = pydantic.Field(default=None, description="")
184
184
 
185
185
 
186
186
  class HvacFansRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -202,12 +202,12 @@ class HvacHeatPumpsRangeV1(BaseOpenEpdHierarchicalSpec):
202
202
 
203
203
  _EXT_VERSION = "1.0"
204
204
 
205
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
206
- cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
207
- heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
208
- air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
209
- airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
210
- heat_pumps_type: list[HeatPumpType] | None = pyd.Field(default=None, description="")
205
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
206
+ cooling_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
207
+ heating_capacity: AmountRangePower | None = pydantic.Field(default=None, description="")
208
+ air_volume: AmountRangeVolume | None = pydantic.Field(default=None, description="")
209
+ airflow_rate: AmountRangeAirflow | None = pydantic.Field(default=None, description="")
210
+ heat_pumps_type: list[HeatPumpType] | None = pydantic.Field(default=None, description="")
211
211
 
212
212
 
213
213
  class HvacHeatExRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -222,8 +222,8 @@ class HvacHeatExRangeV1(BaseOpenEpdHierarchicalSpec):
222
222
 
223
223
  _EXT_VERSION = "1.0"
224
224
 
225
- refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
226
- heat_exchangers_type: list[HvacHeatExchangersType] | None = pyd.Field(default=None, description="")
225
+ refrigerants: list[MechanicalRefrigerants] | None = pydantic.Field(default=None, description="")
226
+ heat_exchangers_type: list[HvacHeatExchangersType] | None = pydantic.Field(default=None, description="")
227
227
 
228
228
 
229
229
  class HvacPumpsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -238,9 +238,9 @@ class HvacPumpsRangeV1(BaseOpenEpdHierarchicalSpec):
238
238
 
239
239
  _EXT_VERSION = "1.0"
240
240
 
241
- flow_rate: AmountRangeAreaPerVolume | None = pyd.Field(default=None, description="")
242
- pump_discharge_pressure: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
243
- pump_horsepower: AmountRangePower | None = pyd.Field(default=None, description="")
241
+ flow_rate: AmountRangeAreaPerVolume | None = pydantic.Field(default=None, description="")
242
+ pump_discharge_pressure: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
243
+ pump_horsepower: AmountRangePower | None = pydantic.Field(default=None, description="")
244
244
 
245
245
 
246
246
  class HvacRTUsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -279,9 +279,9 @@ class HvacDuctsRangeV1(BaseOpenEpdHierarchicalSpec):
279
279
 
280
280
  _EXT_VERSION = "1.0"
281
281
 
282
- shape: list[HvacDuctShape] | None = pyd.Field(default=None, description="Hvac duct shape")
283
- material: list[HvacDuctMaterial] | None = pyd.Field(default=None, description="Hvac duct material")
284
- type: list[HvacDuctType] | None = pyd.Field(default=None, description="Hvac duct type")
282
+ shape: list[HvacDuctShape] | None = pydantic.Field(default=None, description="Hvac duct shape")
283
+ material: list[HvacDuctMaterial] | None = pydantic.Field(default=None, description="Hvac duct material")
284
+ type: list[HvacDuctType] | None = pydantic.Field(default=None, description="Hvac duct type")
285
285
 
286
286
 
287
287
  class MechanicalRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -15,15 +15,15 @@
15
15
  #
16
16
  __all__ = ("MechanicalInsulationRangeV1",)
17
17
 
18
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
19
-
18
+ import pydantic
20
19
 
21
- from openepd.compat.pydantic import pyd
22
20
  from openepd.model.common import RangeFloat
23
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
22
  from openepd.model.specs.enums import InsulatingMaterial, InsulationIntendedApplication
25
23
  from openepd.model.validation.quantity import AmountRangeLengthMm
26
24
 
25
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
26
+
27
27
 
28
28
  class MechanicalInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
29
29
  """
@@ -36,7 +36,7 @@ class MechanicalInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
36
36
 
37
37
  _EXT_VERSION = "1.0"
38
38
 
39
- r_value: RangeFloat | None = pyd.Field(default=None, description="")
40
- material: list[InsulatingMaterial] | None = pyd.Field(default=None, description="")
41
- intended_application: list[InsulationIntendedApplication] | None = pyd.Field(default=None, description="")
42
- thickness_per_declared_unit: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
39
+ r_value: RangeFloat | None = pydantic.Field(default=None, description="")
40
+ material: list[InsulatingMaterial] | None = pydantic.Field(default=None, description="")
41
+ intended_application: list[InsulationIntendedApplication] | None = pydantic.Field(default=None, description="")
42
+ thickness_per_declared_unit: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
@@ -24,10 +24,8 @@ __all__ = (
24
24
  "NetworkInfrastructureRangeV1",
25
25
  )
26
26
 
27
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
28
-
27
+ import pydantic
29
28
 
30
- from openepd.compat.pydantic import pyd
31
29
  from openepd.model.common import RangeInt
32
30
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
33
31
  from openepd.model.specs.enums import (
@@ -45,6 +43,8 @@ from openepd.model.specs.enums import (
45
43
  )
46
44
  from openepd.model.validation.quantity import AmountRangeElectricalCurrent, AmountRangeLengthMm, AmountRangeMass
47
45
 
46
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
47
+
48
48
 
49
49
  class PDURangeV1(BaseOpenEpdHierarchicalSpec):
50
50
  """
@@ -55,11 +55,11 @@ class PDURangeV1(BaseOpenEpdHierarchicalSpec):
55
55
 
56
56
  _EXT_VERSION = "1.0"
57
57
 
58
- amperage: AmountRangeElectricalCurrent | None = pyd.Field(default=None, description="")
59
- outlet_level_metering: bool | None = pyd.Field(default=None, description="")
60
- outlet_level_switching: bool | None = pyd.Field(default=None, description="")
61
- pdu_technology: list[PduTechnology] | None = pyd.Field(default=None, description="")
62
- pdu_outlets: RangeInt | None = pyd.Field(default=None, description="")
58
+ amperage: AmountRangeElectricalCurrent | None = pydantic.Field(default=None, description="")
59
+ outlet_level_metering: bool | None = pydantic.Field(default=None, description="")
60
+ outlet_level_switching: bool | None = pydantic.Field(default=None, description="")
61
+ pdu_technology: list[PduTechnology] | None = pydantic.Field(default=None, description="")
62
+ pdu_outlets: RangeInt | None = pydantic.Field(default=None, description="")
63
63
 
64
64
 
65
65
  class CabinetsRacksAndEnclosuresRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -71,9 +71,9 @@ class CabinetsRacksAndEnclosuresRangeV1(BaseOpenEpdHierarchicalSpec):
71
71
 
72
72
  _EXT_VERSION = "1.0"
73
73
 
74
- static_load: AmountRangeMass | None = pyd.Field(default=None, description="")
75
- total_racking_units: RangeInt | None = pyd.Field(default=None, description="")
76
- rack_type: list[RackType] | None = pyd.Field(default=None, description="")
74
+ static_load: AmountRangeMass | None = pydantic.Field(default=None, description="")
75
+ total_racking_units: RangeInt | None = pydantic.Field(default=None, description="")
76
+ rack_type: list[RackType] | None = pydantic.Field(default=None, description="")
77
77
 
78
78
 
79
79
  class DataCablingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -85,20 +85,20 @@ class DataCablingRangeV1(BaseOpenEpdHierarchicalSpec):
85
85
 
86
86
  _EXT_VERSION = "1.0"
87
87
 
88
- outdoor: bool | None = pyd.Field(default=None, description="")
89
- cabling_category: list[CablingCategory] | None = pyd.Field(default=None, description="")
90
- fire_rating: list[CablingFireRating] | None = pyd.Field(default=None, description="")
91
- jacket_material: list[CablingJacketMaterial] | None = pyd.Field(default=None, description="")
92
- shielded: bool | None = pyd.Field(default=None, description="Foil or similar electromagnetic shielding")
93
- armored: bool | None = pyd.Field(default=None, description="Steel or similar physical armor jacket")
94
- rohs: bool | None = pyd.Field(default=None, description="Certified ROHS Compliant")
95
- reach: bool | None = pyd.Field(default=None, description="Certified REACH compliant")
96
- zwtl: bool | None = pyd.Field(default=None, description="Certified ZWTL compliant")
97
- connectorized: bool | None = pyd.Field(
88
+ outdoor: bool | None = pydantic.Field(default=None, description="")
89
+ cabling_category: list[CablingCategory] | None = pydantic.Field(default=None, description="")
90
+ fire_rating: list[CablingFireRating] | None = pydantic.Field(default=None, description="")
91
+ jacket_material: list[CablingJacketMaterial] | None = pydantic.Field(default=None, description="")
92
+ shielded: bool | None = pydantic.Field(default=None, description="Foil or similar electromagnetic shielding")
93
+ armored: bool | None = pydantic.Field(default=None, description="Steel or similar physical armor jacket")
94
+ rohs: bool | None = pydantic.Field(default=None, description="Certified ROHS Compliant")
95
+ reach: bool | None = pydantic.Field(default=None, description="Certified REACH compliant")
96
+ zwtl: bool | None = pydantic.Field(default=None, description="Certified ZWTL compliant")
97
+ connectorized: bool | None = pydantic.Field(
98
98
  default=None,
99
99
  description="This cable is shipped as a specific length with integrated connectors. Impacts include the connectors for the specific cable length. Connectors add impact similar to 0.1-0.5 additional meters of cable",
100
100
  )
101
- thin_ethernet: bool | None = pyd.Field(
101
+ thin_ethernet: bool | None = pydantic.Field(
102
102
  default=None,
103
103
  description="At least part of this cable has a reduced outer diameter and thinner wires. Thin ethernet cables have handling advantages and tend to have a reduced impact, but also reduced channel length. See TIA 568.2-D Annex G.",
104
104
  )
@@ -115,23 +115,28 @@ class FloorBoxesAndAccessoriesRangeV1(BaseOpenEpdHierarchicalSpec):
115
115
 
116
116
  _EXT_VERSION = "1.0"
117
117
 
118
- painted: bool | None = pyd.Field(default=None, description="")
119
- fire_classified: bool | None = pyd.Field(
120
- default=None, description="Includes hardware to maintain fire rating of the floor"
118
+ painted: bool | None = pydantic.Field(default=None, description="")
119
+ fire_classified: bool | None = pydantic.Field(
120
+ default=None,
121
+ description="Includes hardware to maintain fire rating of the floor",
121
122
  )
122
- outdoor: bool | None = pyd.Field(default=None, description="Floor boxes installed in the ground")
123
- raised: bool | None = pyd.Field(default=None, description="Used in raised or computer style flooring")
124
- poke_through: bool | None = pyd.Field(
125
- default=None, description="Used primarily in retrofit or renovation and will maintain fire rating of the floor"
123
+ outdoor: bool | None = pydantic.Field(default=None, description="Floor boxes installed in the ground")
124
+ raised: bool | None = pydantic.Field(default=None, description="Used in raised or computer style flooring")
125
+ poke_through: bool | None = pydantic.Field(
126
+ default=None,
127
+ description="Used primarily in retrofit or renovation and will maintain fire rating of the floor",
128
+ )
129
+ cover: bool | None = pydantic.Field(
130
+ default=None,
131
+ description="Floor box cover or lid for use with a separate floor box",
126
132
  )
127
- cover: bool | None = pyd.Field(default=None, description="Floor box cover or lid for use with a separate floor box")
128
- outlets: RangeInt | None = pyd.Field(
133
+ outlets: RangeInt | None = pydantic.Field(
129
134
  default=None,
130
135
  description="Number of outlet ports from floor box, including power, data, video, and other connections",
131
136
  )
132
- material: list[FloorBoxMaterial] | None = pyd.Field(default=None, description="")
133
- cover_material: list[FloorBoxCoverMaterial] | None = pyd.Field(default=None, description="")
134
- floor_material: list[FloorBoxFloorMaterial] | None = pyd.Field(default=None, description="")
137
+ material: list[FloorBoxMaterial] | None = pydantic.Field(default=None, description="")
138
+ cover_material: list[FloorBoxCoverMaterial] | None = pydantic.Field(default=None, description="")
139
+ floor_material: list[FloorBoxFloorMaterial] | None = pydantic.Field(default=None, description="")
135
140
 
136
141
 
137
142
  class NetworkingCableTraysRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -146,12 +151,14 @@ class NetworkingCableTraysRangeV1(BaseOpenEpdHierarchicalSpec):
146
151
 
147
152
  _EXT_VERSION = "1.0"
148
153
 
149
- height: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
150
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
151
- depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="Depth of enclosure system")
152
- static_load: AmountRangeMass | None = pyd.Field(default=None, description="Mass that the unit can hold")
153
- ventilated: bool | None = pyd.Field(default=None, description="At least 40% of the tray base is open to air flow")
154
- material: list[CableTraysMaterial] | None = pyd.Field(default=None, description="")
154
+ height: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
155
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
156
+ depth: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Depth of enclosure system")
157
+ static_load: AmountRangeMass | None = pydantic.Field(default=None, description="Mass that the unit can hold")
158
+ ventilated: bool | None = pydantic.Field(
159
+ default=None, description="At least 40% of the tray base is open to air flow"
160
+ )
161
+ material: list[CableTraysMaterial] | None = pydantic.Field(default=None, description="")
155
162
 
156
163
 
157
164
  class NetworkingRacewaysRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -165,13 +172,14 @@ class NetworkingRacewaysRangeV1(BaseOpenEpdHierarchicalSpec):
165
172
 
166
173
  _EXT_VERSION = "1.0"
167
174
 
168
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
169
- depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="Depth of enclosure system")
170
- painted: bool | None = pyd.Field(default=None, description="")
171
- divided: bool | None = pyd.Field(
172
- default=None, description="Dual service raceway for high and low voltage data and power applications"
175
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
176
+ depth: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Depth of enclosure system")
177
+ painted: bool | None = pydantic.Field(default=None, description="")
178
+ divided: bool | None = pydantic.Field(
179
+ default=None,
180
+ description="Dual service raceway for high and low voltage data and power applications",
173
181
  )
174
- raceways_material: list[RacewaysMaterial] | None = pyd.Field(default=None, description="")
182
+ raceways_material: list[RacewaysMaterial] | None = pydantic.Field(default=None, description="")
175
183
 
176
184
 
177
185
  class CommunicationsConduitRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -44,10 +44,8 @@ __all__ = (
44
44
  "OpeningsRangeV1",
45
45
  )
46
46
 
47
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
48
-
47
+ import pydantic
49
48
 
50
- from openepd.compat.pydantic import pyd
51
49
  from openepd.model.common import RangeInt, RangeRatioFloat
52
50
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
53
51
  from openepd.model.specs.enums import (
@@ -66,6 +64,8 @@ from openepd.model.validation.quantity import (
66
64
  AmountRangeUFactor,
67
65
  )
68
66
 
67
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
68
+
69
69
 
70
70
  class PanelDoorsRangeV1(BaseOpenEpdHierarchicalSpec):
71
71
  """
@@ -137,8 +137,8 @@ class FenestrationFramingRangeV1(BaseOpenEpdHierarchicalSpec):
137
137
 
138
138
  _EXT_VERSION = "1.0"
139
139
 
140
- thermal_separation: list[ThermalSeparation] | None = pyd.Field(default=None)
141
- material: list[FrameMaterial] | None = pyd.Field(default=None)
140
+ thermal_separation: list[ThermalSeparation] | None = pydantic.Field(default=None)
141
+ material: list[FrameMaterial] | None = pydantic.Field(default=None)
142
142
 
143
143
 
144
144
  class FenestrationHardwareRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -150,7 +150,7 @@ class FenestrationHardwareRangeV1(BaseOpenEpdHierarchicalSpec):
150
150
 
151
151
  _EXT_VERSION = "1.0"
152
152
 
153
- function: list[HardwareFunction] | None = pyd.Field(default=None, description="")
153
+ function: list[HardwareFunction] | None = pydantic.Field(default=None, description="")
154
154
 
155
155
 
156
156
  class FlatGlassPanesRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -162,7 +162,7 @@ class FlatGlassPanesRangeV1(BaseOpenEpdHierarchicalSpec):
162
162
 
163
163
  _EXT_VERSION = "1.0"
164
164
 
165
- thickness: list[FlatGlassPanesThickness] | None = pyd.Field(default=None)
165
+ thickness: list[FlatGlassPanesThickness] | None = pydantic.Field(default=None)
166
166
 
167
167
 
168
168
  class ProcessedNonInsulatingGlassPanesRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -289,7 +289,7 @@ class FenestrationPartsRangeV1(BaseOpenEpdHierarchicalSpec):
289
289
 
290
290
  _EXT_VERSION = "1.0"
291
291
 
292
- intended_application: GlazingIntendedApplication | None = pyd.Field(
292
+ intended_application: GlazingIntendedApplication | None = pydantic.Field(
293
293
  default=None, description="Intended application."
294
294
  )
295
295
  FenestrationAccessories: FenestrationAccessoriesRangeV1 | None = None
@@ -330,25 +330,28 @@ class NAFSFenestrationRangeV1(BaseOpenEpdHierarchicalSpec):
330
330
  pyrolytic_coated: bool | None = None
331
331
  sputter_coat: bool | None = None
332
332
  solar_heat_gain: RangeRatioFloat | None = None
333
- hurricane_resistant: bool | None = pyd.Field(
334
- default=None, description="The product has been designed to resist windborne debris."
333
+ hurricane_resistant: bool | None = pydantic.Field(
334
+ default=None,
335
+ description="The product has been designed to resist windborne debris.",
335
336
  )
336
- assembly_u_factor: AmountRangeUFactor | None = pyd.Field(
337
- default=None, description="Weighted average conductance of heat across assembly (including frame)."
337
+ assembly_u_factor: AmountRangeUFactor | None = pydantic.Field(
338
+ default=None,
339
+ description="Weighted average conductance of heat across assembly (including frame).",
338
340
  )
339
- air_infiltration: AmountRangeSpeed | None = pyd.Field(
340
- default=None, description="Air infiltration, measured at a certain level of Differential Pressure."
341
+ air_infiltration: AmountRangeSpeed | None = pydantic.Field(
342
+ default=None,
343
+ description="Air infiltration, measured at a certain level of Differential Pressure.",
341
344
  )
342
- thermal_separation: list[ThermalSeparation] | None = pyd.Field(default=None)
343
- dp_rating: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
344
- glass_panes: RangeInt | None = pyd.Field(
345
+ thermal_separation: list[ThermalSeparation] | None = pydantic.Field(default=None)
346
+ dp_rating: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
347
+ glass_panes: RangeInt | None = pydantic.Field(
345
348
  default=None,
346
349
  description="Number of panes, each separated by a cavity. A 3 pane unit has 2 cavities. example: 3",
347
350
  )
348
- performance_class: NAFSPerformanceClass | None = pyd.Field(
351
+ performance_class: NAFSPerformanceClass | None = pydantic.Field(
349
352
  default=None, description="Performance class according to NAFS."
350
353
  )
351
- performance_grade: list[NAFSPerformanceGrade] | None = pyd.Field(
354
+ performance_grade: list[NAFSPerformanceGrade] | None = pydantic.Field(
352
355
  default=None,
353
356
  description="NAFS Performance Grade. The NAFS Performance Grade is a number that represents the performance of the glazing product. The higher the number, the better the performance. The NAFS Performance Grade is calculated using the NAFS Performance Class, the NAFS Performance Index, and the NAFS Performance Factor. While it is expressed as pressure, there are specific values which are allowed. The values are listed in the enum.",
354
357
  )
@@ -377,24 +380,26 @@ class InsulatingGlazingUnitsRangeV1(BaseOpenEpdHierarchicalSpec):
377
380
  pyrolytic_coated: bool | None = None
378
381
  sputter_coat: bool | None = None
379
382
  solar_heat_gain: RangeRatioFloat | None = None
380
- intended_application: GlazingIntendedApplication | None = pyd.Field(
383
+ intended_application: GlazingIntendedApplication | None = pydantic.Field(
381
384
  default=None, description="Intended application for IGUs."
382
385
  )
383
- hurricane_resistant: bool | None = pyd.Field(default=None)
384
- dp_rating: AmountRangePressureMpa | None = pyd.Field(
385
- default=None, description="Maximum Differential Pressure, a measure of wind tolerance."
386
+ hurricane_resistant: bool | None = pydantic.Field(default=None)
387
+ dp_rating: AmountRangePressureMpa | None = pydantic.Field(
388
+ default=None,
389
+ description="Maximum Differential Pressure, a measure of wind tolerance.",
386
390
  )
387
- air_infiltration: AmountRangeSpeed | None = pyd.Field(
388
- default=None, description="Air infiltration, measured at a certain level of Differential Pressure."
391
+ air_infiltration: AmountRangeSpeed | None = pydantic.Field(
392
+ default=None,
393
+ description="Air infiltration, measured at a certain level of Differential Pressure.",
389
394
  )
390
- glass_panes: RangeInt | None = pyd.Field(
395
+ glass_panes: RangeInt | None = pydantic.Field(
391
396
  default=None,
392
397
  description="Number of panes, each separated by a cavity. A 3 pane unit has 2 cavities. example: 3",
393
398
  )
394
- cog_u_factor: AmountRangeUFactor | None = pyd.Field(
399
+ cog_u_factor: AmountRangeUFactor | None = pydantic.Field(
395
400
  default=None, description="Conductance of heat at center of glass."
396
401
  )
397
- spacer: list[Spacer] | None = pyd.Field(default=None, description="Spacer material for Integrated Glass Unit.")
402
+ spacer: list[Spacer] | None = pydantic.Field(default=None, description="Spacer material for Integrated Glass Unit.")
398
403
 
399
404
 
400
405
  class CurtainWallsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -422,8 +427,8 @@ class DoorsAndFramesRangeV1(BaseOpenEpdHierarchicalSpec):
422
427
 
423
428
  _EXT_VERSION = "1.0"
424
429
 
425
- height: AmountRangeLengthMm | None = pyd.Field(default=None)
426
- width: AmountRangeLengthMm | None = pyd.Field(default=None)
430
+ height: AmountRangeLengthMm | None = pydantic.Field(default=None)
431
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None)
427
432
  IntegratedDoorsOpeningAssemblies: IntegratedDoorsOpeningAssembliesRangeV1 | None = None
428
433
  MetalDoorAndFrames: MetalDoorAndFramesRangeV1 | None = None
429
434
  SpecialtyDoorsAndFrames: SpecialtyDoorsAndFramesRangeV1 | None = None
@@ -509,7 +514,7 @@ class OpeningsRangeV1(BaseOpenEpdHierarchicalSpec):
509
514
 
510
515
  _EXT_VERSION = "1.0"
511
516
 
512
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None)
517
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None)
513
518
  CurtainWalls: CurtainWallsRangeV1 | None = None
514
519
  DoorsAndFrames: DoorsAndFramesRangeV1 | None = None
515
520
  Entrances: EntrancesRangeV1 | None = None
@@ -29,15 +29,15 @@ __all__ = (
29
29
  "PlumbingRangeV1",
30
30
  )
31
31
 
32
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
33
-
32
+ import pydantic
34
33
 
35
- from openepd.compat.pydantic import pyd
36
34
  from openepd.model.common import RangeAmount
37
35
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
38
36
  from openepd.model.specs.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
39
37
  from openepd.model.validation.quantity import AmountRangeLengthMm
40
38
 
39
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
40
+
41
41
 
42
42
  class BathtubsRangeV1(BaseOpenEpdHierarchicalSpec):
43
43
  """
@@ -88,11 +88,13 @@ class FireProtectionPipingRangeV1(BaseOpenEpdHierarchicalSpec):
88
88
 
89
89
  _EXT_VERSION = "1.0"
90
90
 
91
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
92
- piping_diameter: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
93
- mass_per_unit_length: RangeAmount | None = pyd.Field(default=None, description="")
94
- piping_ansi_schedule: list[PipingAnsiSchedule] | None = pyd.Field(default=None, description="")
95
- fire_protection_piping_material: list[FireProtectionPipingMaterial] | None = pyd.Field(default=None, description="")
91
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
92
+ piping_diameter: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
93
+ mass_per_unit_length: RangeAmount | None = pydantic.Field(default=None, description="")
94
+ piping_ansi_schedule: list[PipingAnsiSchedule] | None = pydantic.Field(default=None, description="")
95
+ fire_protection_piping_material: list[FireProtectionPipingMaterial] | None = pydantic.Field(
96
+ default=None, description=""
97
+ )
96
98
 
97
99
 
98
100
  class FireSprinklersRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -165,11 +167,11 @@ class PipingRangeV1(BaseOpenEpdHierarchicalSpec):
165
167
 
166
168
  _EXT_VERSION = "1.0"
167
169
 
168
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
169
- piping_diameter: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
170
- mass_per_unit_length: RangeAmount | None = pyd.Field(default=None, description="")
171
- piping_ansi_schedule: list[PipingAnsiSchedule] | None = pyd.Field(default=None, description="")
172
- plumbing_piping_material: list[PlumbingPipingMaterial] | None = pyd.Field(default=None, description="")
170
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
171
+ piping_diameter: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
172
+ mass_per_unit_length: RangeAmount | None = pydantic.Field(default=None, description="")
173
+ piping_ansi_schedule: list[PipingAnsiSchedule] | None = pydantic.Field(default=None, description="")
174
+ plumbing_piping_material: list[PlumbingPipingMaterial] | None = pydantic.Field(default=None, description="")
173
175
 
174
176
 
175
177
  class PlumbingEquipmentRangeV1(BaseOpenEpdHierarchicalSpec):