openepd 6.13.1__py3-none-any.whl → 7.0.0__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 (102) hide show
  1. openepd/__init__.py +4 -4
  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/m49/__init__.py +2 -0
  18. openepd/m49/const.py +5 -2
  19. openepd/m49/{geo_converter.py → utils.py} +24 -2
  20. openepd/model/base.py +60 -43
  21. openepd/model/category.py +13 -10
  22. openepd/model/common.py +100 -55
  23. openepd/model/declaration.py +93 -64
  24. openepd/model/epd.py +51 -43
  25. openepd/model/generic_estimate.py +28 -13
  26. openepd/model/industry_epd.py +15 -9
  27. openepd/model/lcia.py +132 -113
  28. openepd/model/org.py +54 -33
  29. openepd/model/pcr.py +38 -32
  30. openepd/model/specs/asphalt.py +31 -22
  31. openepd/model/specs/base.py +11 -9
  32. openepd/model/specs/concrete.py +60 -39
  33. openepd/model/specs/range/aggregates.py +9 -9
  34. openepd/model/specs/range/aluminium.py +7 -7
  35. openepd/model/specs/range/asphalt.py +22 -19
  36. openepd/model/specs/range/cladding.py +16 -16
  37. openepd/model/specs/range/cmu.py +10 -9
  38. openepd/model/specs/range/concrete.py +36 -27
  39. openepd/model/specs/range/conveying_equipment.py +16 -15
  40. openepd/model/specs/range/electrical.py +24 -22
  41. openepd/model/specs/range/finishes.py +109 -104
  42. openepd/model/specs/range/fire_and_smoke_protection.py +7 -7
  43. openepd/model/specs/range/furnishings.py +16 -12
  44. openepd/model/specs/range/manufacturing_inputs.py +16 -16
  45. openepd/model/specs/range/masonry.py +16 -16
  46. openepd/model/specs/range/mechanical.py +47 -47
  47. openepd/model/specs/range/mechanical_insulation.py +7 -7
  48. openepd/model/specs/range/network_infrastructure.py +54 -46
  49. openepd/model/specs/range/openings.py +36 -31
  50. openepd/model/specs/range/plumbing.py +15 -13
  51. openepd/model/specs/range/precast_concrete.py +20 -16
  52. openepd/model/specs/range/sheathing.py +18 -18
  53. openepd/model/specs/range/steel.py +25 -25
  54. openepd/model/specs/range/thermal_moisture_protection.py +20 -20
  55. openepd/model/specs/range/utility_piping.py +9 -9
  56. openepd/model/specs/range/wood.py +19 -19
  57. openepd/model/specs/range/wood_joists.py +8 -8
  58. openepd/model/specs/singular/__init__.py +9 -5
  59. openepd/model/specs/singular/aggregates.py +22 -15
  60. openepd/model/specs/singular/aluminium.py +20 -5
  61. openepd/model/specs/singular/asphalt.py +44 -20
  62. openepd/model/specs/singular/cladding.py +38 -23
  63. openepd/model/specs/singular/cmu.py +26 -11
  64. openepd/model/specs/singular/common.py +3 -2
  65. openepd/model/specs/singular/concrete.py +85 -48
  66. openepd/model/specs/singular/conveying_equipment.py +30 -17
  67. openepd/model/specs/singular/deprecated/__init__.py +3 -2
  68. openepd/model/specs/singular/deprecated/concrete.py +68 -33
  69. openepd/model/specs/singular/deprecated/steel.py +28 -15
  70. openepd/model/specs/singular/electrical.py +69 -41
  71. openepd/model/specs/singular/finishes.py +250 -140
  72. openepd/model/specs/singular/fire_and_smoke_protection.py +9 -6
  73. openepd/model/specs/singular/furnishings.py +16 -14
  74. openepd/model/specs/singular/manufacturing_inputs.py +23 -14
  75. openepd/model/specs/singular/masonry.py +66 -21
  76. openepd/model/specs/singular/mechanical.py +48 -47
  77. openepd/model/specs/singular/mechanical_insulation.py +7 -6
  78. openepd/model/specs/singular/mixins/conduit_mixin.py +13 -10
  79. openepd/model/specs/singular/network_infrastructure.py +111 -52
  80. openepd/model/specs/singular/openings.py +127 -95
  81. openepd/model/specs/singular/plumbing.py +15 -12
  82. openepd/model/specs/singular/precast_concrete.py +68 -54
  83. openepd/model/specs/singular/sheathing.py +47 -27
  84. openepd/model/specs/singular/steel.py +69 -45
  85. openepd/model/specs/singular/thermal_moisture_protection.py +36 -20
  86. openepd/model/specs/singular/utility_piping.py +11 -8
  87. openepd/model/specs/singular/wood.py +48 -24
  88. openepd/model/specs/singular/wood_joists.py +19 -6
  89. openepd/model/standard.py +15 -8
  90. openepd/model/validation/common.py +9 -3
  91. openepd/model/validation/numbers.py +0 -13
  92. openepd/model/validation/quantity.py +53 -25
  93. openepd/model/versioning.py +9 -6
  94. openepd/patch_pydantic.py +0 -93
  95. {openepd-6.13.1.dist-info → openepd-7.0.0.dist-info}/METADATA +1 -1
  96. openepd-7.0.0.dist-info/RECORD +142 -0
  97. openepd/compat/__init__.py +0 -15
  98. openepd/compat/compat_functional_validators.py +0 -25
  99. openepd/compat/pydantic.py +0 -30
  100. openepd-6.13.1.dist-info/RECORD +0 -145
  101. {openepd-6.13.1.dist-info → openepd-7.0.0.dist-info}/LICENSE +0 -0
  102. {openepd-6.13.1.dist-info → openepd-7.0.0.dist-info}/WHEEL +0 -0
@@ -21,13 +21,13 @@ __all__ = (
21
21
  "AluminiumRangeV1",
22
22
  )
23
23
 
24
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
25
-
24
+ import pydantic
26
25
 
27
- from openepd.compat.pydantic import pyd
28
26
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
29
27
  from openepd.model.specs.enums import AluminiumAlloy
30
28
 
29
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
30
+
31
31
 
32
32
  class AluminiumBilletsRangeV1(BaseOpenEpdHierarchicalSpec):
33
33
  """
@@ -51,7 +51,7 @@ class AluminiumExtrusionsRangeV1(BaseOpenEpdHierarchicalSpec):
51
51
 
52
52
  _EXT_VERSION = "1.0"
53
53
 
54
- thermally_improved: bool | None = pyd.Field(default=None, description="")
54
+ thermally_improved: bool | None = pydantic.Field(default=None, description="")
55
55
 
56
56
 
57
57
  class AluminiumSheetGoodsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -83,9 +83,9 @@ class AluminiumRangeV1(BaseOpenEpdHierarchicalSpec):
83
83
 
84
84
  _EXT_VERSION = "1.0"
85
85
 
86
- alloy: list[AluminiumAlloy] | None = pyd.Field(default=None, description="")
87
- anodized: bool | None = pyd.Field(default=None, description="")
88
- painted: bool | None = pyd.Field(default=None, description="")
86
+ alloy: list[AluminiumAlloy] | None = pydantic.Field(default=None, description="")
87
+ anodized: bool | None = pydantic.Field(default=None, description="")
88
+ painted: bool | None = pydantic.Field(default=None, description="")
89
89
  AluminiumBillets: AluminiumBilletsRangeV1 | None = None
90
90
  AluminiumExtrusions: AluminiumExtrusionsRangeV1 | None = None
91
91
  AluminiumSheetGoods: AluminiumSheetGoodsRangeV1 | None = None
@@ -15,15 +15,15 @@
15
15
  #
16
16
  __all__ = ("AsphaltRangeV1",)
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 RangeRatioFloat
23
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
22
  from openepd.model.specs.enums import AsphaltGradation, AsphaltMixType
25
23
  from openepd.model.validation.quantity import AmountRangeLengthMm, TemperatureCStr
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 AsphaltRangeV1(BaseOpenEpdHierarchicalSpec):
29
29
  """
@@ -34,28 +34,31 @@ class AsphaltRangeV1(BaseOpenEpdHierarchicalSpec):
34
34
 
35
35
  _EXT_VERSION = "1.0"
36
36
 
37
- aggregate_size_max: AmountRangeLengthMm | None = pyd.Field(default=None, description="Max aggregate size")
38
- rap: RangeRatioFloat | None = pyd.Field(
39
- default=None, description="Percent of mixture that has been replaced by recycled asphalt pavement (RAP)."
37
+ aggregate_size_max: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Max aggregate size")
38
+ rap: RangeRatioFloat | None = pydantic.Field(
39
+ default=None,
40
+ description="Percent of mixture that has been replaced by recycled asphalt pavement (RAP).",
40
41
  )
41
- ras: RangeRatioFloat | None = pyd.Field(
42
- default=None, description="Percent of mixture that has been replaced by recycled asphalt shingles (RAS)."
42
+ ras: RangeRatioFloat | None = pydantic.Field(
43
+ default=None,
44
+ description="Percent of mixture that has been replaced by recycled asphalt shingles (RAS).",
43
45
  )
44
- ground_tire_rubber: RangeRatioFloat | None = pyd.Field(
45
- default=None, description="Percent of mixture that has been replaced by ground tire rubber (GTR)."
46
+ ground_tire_rubber: RangeRatioFloat | None = pydantic.Field(
47
+ default=None,
48
+ description="Percent of mixture that has been replaced by ground tire rubber (GTR).",
46
49
  )
47
- max_temperature: TemperatureCStr | None = pyd.Field(
50
+ max_temperature: TemperatureCStr | None = pydantic.Field(
48
51
  default=None,
49
52
  description="The upper threshold temperature to which an asphalt binder can be heated preventing the asphalt mixture from rutting",
50
53
  )
51
- min_temperature: TemperatureCStr | None = pyd.Field(
54
+ min_temperature: TemperatureCStr | None = pydantic.Field(
52
55
  default=None,
53
56
  description="The lower threshold temperature for an asphalt binder to prevent thermal cracking of the asphalt mixture.",
54
57
  )
55
- mix_type: list[AsphaltMixType] | None = pyd.Field(default=None, description="Asphalt mix type")
56
- gradation: list[AsphaltGradation] | None = pyd.Field(default=None, description="Asphalt gradation")
57
- sbr: bool | None = pyd.Field(default=None, description="Styrene-butadiene rubber (SBR)")
58
- sbs: bool | None = pyd.Field(default=None, description="Styrene-butadiene-styrene (SBS)")
59
- ppa: bool | None = pyd.Field(default=None, description="Polyphosphoric acid (PPA)")
60
- gtr: bool | None = pyd.Field(default=None, description="Ground tire rubber (GTR)")
61
- pmb: bool | None = pyd.Field(default=None, description="Polymer modified bitumen (PMB)")
58
+ mix_type: list[AsphaltMixType] | None = pydantic.Field(default=None, description="Asphalt mix type")
59
+ gradation: list[AsphaltGradation] | None = pydantic.Field(default=None, description="Asphalt gradation")
60
+ sbr: bool | None = pydantic.Field(default=None, description="Styrene-butadiene rubber (SBR)")
61
+ sbs: bool | None = pydantic.Field(default=None, description="Styrene-butadiene-styrene (SBS)")
62
+ ppa: bool | None = pydantic.Field(default=None, description="Polyphosphoric acid (PPA)")
63
+ gtr: bool | None = pydantic.Field(default=None, description="Ground tire rubber (GTR)")
64
+ pmb: bool | None = pydantic.Field(default=None, description="Polymer modified bitumen (PMB)")
@@ -35,14 +35,14 @@ __all__ = (
35
35
  "CladdingRangeV1",
36
36
  )
37
37
 
38
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
39
-
38
+ import pydantic
40
39
 
41
- from openepd.compat.pydantic import pyd
42
40
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
43
41
  from openepd.model.specs.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
44
42
  from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeRValue
45
43
 
44
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
45
+
46
46
 
47
47
  class AluminiumSidingRangeV1(BaseOpenEpdHierarchicalSpec):
48
48
  """
@@ -127,7 +127,7 @@ class InsulatedVinylSidingRangeV1(BaseOpenEpdHierarchicalSpec):
127
127
 
128
128
  _EXT_VERSION = "1.0"
129
129
 
130
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
130
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
131
131
 
132
132
 
133
133
  class PlywoodSidingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -171,7 +171,7 @@ class VinylSidingRangeV1(BaseOpenEpdHierarchicalSpec):
171
171
 
172
172
  _EXT_VERSION = "1.0"
173
173
 
174
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
174
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
175
175
 
176
176
 
177
177
  class SidingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -185,11 +185,11 @@ class SidingRangeV1(BaseOpenEpdHierarchicalSpec):
185
185
 
186
186
  _EXT_VERSION = "1.0"
187
187
 
188
- insulated: bool | None = pyd.Field(default=None, description="")
189
- ventilated: bool | None = pyd.Field(default=None, description="")
190
- paint_or_stain_required: bool | None = pyd.Field(default=None, description="")
191
- r_value: AmountRangeRValue | None = pyd.Field(default=None, description="")
192
- form_factor: list[SidingFormFactor] | None = pyd.Field(default=None, description="")
188
+ insulated: bool | None = pydantic.Field(default=None, description="")
189
+ ventilated: bool | None = pydantic.Field(default=None, description="")
190
+ paint_or_stain_required: bool | None = pydantic.Field(default=None, description="")
191
+ r_value: AmountRangeRValue | None = pydantic.Field(default=None, description="")
192
+ form_factor: list[SidingFormFactor] | None = pydantic.Field(default=None, description="")
193
193
  MetalSiding: MetalSidingRangeV1 | None = None
194
194
  CompositionSiding: CompositionSidingRangeV1 | None = None
195
195
  FiberCementSiding: FiberCementSidingRangeV1 | None = None
@@ -209,8 +209,8 @@ class InsulatedRoofPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
209
209
 
210
210
  _EXT_VERSION = "1.0"
211
211
 
212
- r_value: AmountRangeRValue | None = pyd.Field(default=None, description="")
213
- insulating_material: list[CladdingInsulatingMaterial] | None = pyd.Field(default=None, description="")
212
+ r_value: AmountRangeRValue | None = pydantic.Field(default=None, description="")
213
+ insulating_material: list[CladdingInsulatingMaterial] | None = pydantic.Field(default=None, description="")
214
214
 
215
215
 
216
216
  class InsulatedWallPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -222,8 +222,8 @@ class InsulatedWallPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
222
222
 
223
223
  _EXT_VERSION = "1.0"
224
224
 
225
- r_value: AmountRangeRValue | None = pyd.Field(default=None, description="")
226
- insulating_material: list[CladdingInsulatingMaterial] | None = pyd.Field(default=None, description="")
225
+ r_value: AmountRangeRValue | None = pydantic.Field(default=None, description="")
226
+ insulating_material: list[CladdingInsulatingMaterial] | None = pydantic.Field(default=None, description="")
227
227
 
228
228
 
229
229
  class RoofPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -265,8 +265,8 @@ class CladdingRangeV1(BaseOpenEpdHierarchicalSpec):
265
265
 
266
266
  _EXT_VERSION = "1.0"
267
267
 
268
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
269
- facing_material: list[CladdingFacingMaterial] | None = pyd.Field(default=None, description="")
268
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
269
+ facing_material: list[CladdingFacingMaterial] | None = pydantic.Field(default=None, description="")
270
270
  Siding: SidingRangeV1 | None = None
271
271
  InsulatedRoofPanels: InsulatedRoofPanelsRangeV1 | None = None
272
272
  InsulatedWallPanels: InsulatedWallPanelsRangeV1 | None = None
@@ -20,7 +20,8 @@ __all__ = ("CMURangeV1",)
20
20
 
21
21
  from builtins import float
22
22
 
23
- from openepd.compat.pydantic import pyd
23
+ import pydantic
24
+
24
25
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
25
26
  from openepd.model.specs.enums import CmuBlockType, CmuWeightClassification
26
27
  from openepd.model.validation.quantity import AmountRangePressureMpa, GwpKgCo2eStr
@@ -35,11 +36,11 @@ class CMURangeV1(BaseOpenEpdHierarchicalSpec):
35
36
 
36
37
  _EXT_VERSION = "1.0"
37
38
 
38
- white_cement: bool | None = pyd.Field(default=None, description="")
39
- strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
40
- weight_classification: list[CmuWeightClassification] | None = pyd.Field(default=None, description="")
41
- block_type: list[CmuBlockType] | None = pyd.Field(default=None, description="")
42
- insulated: bool | None = pyd.Field(default=None, description="")
43
- sound_performance: bool | None = pyd.Field(default=None, description="")
44
- b1_recarbonation: GwpKgCo2eStr | None = pyd.Field(default=None, description="")
45
- b1_recarbonation_z: float | None = pyd.Field(default=None, description="")
39
+ white_cement: bool | None = pydantic.Field(default=None, description="")
40
+ strength_28d: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
41
+ weight_classification: list[CmuWeightClassification] | None = pydantic.Field(default=None, description="")
42
+ block_type: list[CmuBlockType] | None = pydantic.Field(default=None, description="")
43
+ insulated: bool | None = pydantic.Field(default=None, description="")
44
+ sound_performance: bool | None = pydantic.Field(default=None, description="")
45
+ b1_recarbonation: GwpKgCo2eStr | None = pydantic.Field(default=None, description="")
46
+ b1_recarbonation_z: float | None = pydantic.Field(default=None, description="")
@@ -28,7 +28,8 @@ __all__ = (
28
28
 
29
29
  from typing import Literal
30
30
 
31
- from openepd.compat.pydantic import pyd
31
+ import pydantic
32
+
32
33
  from openepd.model.common import RangeRatioFloat
33
34
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
34
35
  from openepd.model.specs.concrete import Cementitious, ConcreteTypicalApplication
@@ -65,7 +66,9 @@ class ConcretePavingRangeV1(BaseOpenEpdHierarchicalSpec):
65
66
 
66
67
  _EXT_VERSION = "1.0"
67
68
 
68
- flexion_strength: AmountRangePressureMpa | None = pyd.Field(default=None, description="Concrete flexural strength.")
69
+ flexion_strength: AmountRangePressureMpa | None = pydantic.Field(
70
+ default=None, description="Concrete flexural strength."
71
+ )
69
72
 
70
73
 
71
74
  class FlowableFillRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -133,44 +136,50 @@ class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
133
136
 
134
137
  _EXT_VERSION = "1.0"
135
138
 
136
- lightweight: bool | None = pyd.Field(default=None, description="Product is lightweight")
137
- strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="Concrete strength after 28 days")
138
- strength_other: AmountRangePressureMpa | None = pyd.Field(
139
- default=None, description="A strength spec which is to be reached later other 28 days (e.g. 42d)"
139
+ lightweight: bool | None = pydantic.Field(default=None, description="Product is lightweight")
140
+ strength_28d: AmountRangePressureMpa | None = pydantic.Field(
141
+ default=None, description="Concrete strength after 28 days"
142
+ )
143
+ strength_other: AmountRangePressureMpa | None = pydantic.Field(
144
+ default=None,
145
+ description="A strength spec which is to be reached later other 28 days (e.g. 42d)",
140
146
  )
141
- strength_other_d: Literal[3, 7, 14, 42, 56, 72, 96, 120] | None = pyd.Field(
147
+ strength_other_d: Literal[3, 7, 14, 42, 56, 72, 96, 120] | None = pydantic.Field(
142
148
  default=None, description="Test Day for strength_other"
143
149
  )
144
- slump: AmountRangeLengthInch | None = pyd.Field(default=None, description="")
145
- min_slump: AmountRangeLengthInch | None = pyd.Field(default=None, description="Minimum test slump")
146
- max_slump: AmountRangeLengthInch | None = pyd.Field(default=None, description="")
147
- min_pipeline_size: AmountRangeLengthMm | None = pyd.Field(default=None, description="Minimum pipeline size")
148
- w_c_ratio: RangeRatioFloat | None = pyd.Field(default=None, description="Ratio of water to cement")
149
- air_entrain: bool | None = pyd.Field(default=None, description="Air Entrainment")
150
- co2_entrain: bool | None = pyd.Field(default=None, description="CO2 Curing")
151
- self_consolidating: bool | None = pyd.Field(default=None, description="Self Compacting")
152
- white_cement: bool | None = pyd.Field(default=None, description="White Cement")
153
- plc: bool | None = pyd.Field(default=None, description="Portland Limestone Cement")
154
- finishable: bool | None = pyd.Field(default=None, description="Finishable")
155
- fiber_reinforced: bool | None = pyd.Field(default=None, description="fiber_reinforced")
156
- cementitious: Cementitious | None = pyd.Field(
157
- default=None, description="List of cementitious materials, and proportion by mass"
150
+ slump: AmountRangeLengthInch | None = pydantic.Field(default=None, description="")
151
+ min_slump: AmountRangeLengthInch | None = pydantic.Field(default=None, description="Minimum test slump")
152
+ max_slump: AmountRangeLengthInch | None = pydantic.Field(default=None, description="")
153
+ min_pipeline_size: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Minimum pipeline size")
154
+ w_c_ratio: RangeRatioFloat | None = pydantic.Field(default=None, description="Ratio of water to cement")
155
+ air_entrain: bool | None = pydantic.Field(default=None, description="Air Entrainment")
156
+ co2_entrain: bool | None = pydantic.Field(default=None, description="CO2 Curing")
157
+ self_consolidating: bool | None = pydantic.Field(default=None, description="Self Compacting")
158
+ white_cement: bool | None = pydantic.Field(default=None, description="White Cement")
159
+ plc: bool | None = pydantic.Field(default=None, description="Portland Limestone Cement")
160
+ finishable: bool | None = pydantic.Field(default=None, description="Finishable")
161
+ fiber_reinforced: bool | None = pydantic.Field(default=None, description="fiber_reinforced")
162
+ cementitious: Cementitious | None = pydantic.Field(
163
+ default=None,
164
+ description="List of cementitious materials, and proportion by mass",
158
165
  )
159
- aggregate_size_max: AmountRangeLengthMm | None = pyd.Field(
166
+ aggregate_size_max: AmountRangeLengthMm | None = pydantic.Field(
160
167
  default=None,
161
168
  description="The smallest sieve size for which the entire amount of aggregate is able to pass. Parameter describes diameter of aggregate",
162
169
  )
163
- cement_content: AmountRangeMass | None = pyd.Field(default=None)
164
- aci_exposure_classes: list[AciExposureClass] | None = pyd.Field(
170
+ cement_content: AmountRangeMass | None = pydantic.Field(default=None)
171
+ aci_exposure_classes: list[AciExposureClass] | None = pydantic.Field(
165
172
  default=None, description="List of ACI exposure classes"
166
173
  )
167
- csa_exposure_classes: list[CsaExposureClass] | None = pyd.Field(
174
+ csa_exposure_classes: list[CsaExposureClass] | None = pydantic.Field(
168
175
  default=None, description="List of CSA exposure classes"
169
176
  )
170
- en_exposure_classes: list[EnExposureClass] | None = pyd.Field(
177
+ en_exposure_classes: list[EnExposureClass] | None = pydantic.Field(
171
178
  default=None, description="List of EN exposure classes"
172
179
  )
173
- typical_application: ConcreteTypicalApplication | None = pyd.Field(default=None, description="Typical Application")
180
+ typical_application: ConcreteTypicalApplication | None = pydantic.Field(
181
+ default=None, description="Typical Application"
182
+ )
174
183
  CementGrout: CementGroutRangeV1 | None = None
175
184
  ConcretePaving: ConcretePavingRangeV1 | None = None
176
185
  FlowableFill: FlowableFillRangeV1 | None = None
@@ -19,10 +19,8 @@ __all__ = (
19
19
  "ConveyingEquipmentRangeV1",
20
20
  )
21
21
 
22
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
23
-
22
+ import pydantic
24
23
 
25
- from openepd.compat.pydantic import pyd
26
24
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
27
25
  from openepd.model.specs.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
28
26
  from openepd.model.validation.quantity import (
@@ -32,6 +30,8 @@ from openepd.model.validation.quantity import (
32
30
  AmountRangeSpeed,
33
31
  )
34
32
 
33
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
34
+
35
35
 
36
36
  class EscalatorsRangeV1(BaseOpenEpdHierarchicalSpec):
37
37
  """
@@ -45,16 +45,17 @@ class EscalatorsRangeV1(BaseOpenEpdHierarchicalSpec):
45
45
 
46
46
  _EXT_VERSION = "1.1"
47
47
 
48
- vertical_rise: AmountRangeLengthMm | None = pyd.Field(
49
- default=None, description="The vertical distance between the top and bottom landings of an escalator"
48
+ vertical_rise: AmountRangeLengthMm | None = pydantic.Field(
49
+ default=None,
50
+ description="The vertical distance between the top and bottom landings of an escalator",
50
51
  )
51
- speed: AmountRangeSpeed | None = pyd.Field(default=None, description="Reference speed of the escalator")
52
- step_width: AmountRangeLengthMm | None = pyd.Field(default=None, description="Width of the escalator steps")
53
- max_capacity: AmountRangeCapacityPerHour | None = pyd.Field(
52
+ speed: AmountRangeSpeed | None = pydantic.Field(default=None, description="Reference speed of the escalator")
53
+ step_width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Width of the escalator steps")
54
+ max_capacity: AmountRangeCapacityPerHour | None = pydantic.Field(
54
55
  default=None, description="Max capacity of escalator in persons per hour"
55
56
  )
56
- indoor: bool | None = pyd.Field(default=None, description="Escalator can be used for indoor applications")
57
- outdoor: bool | None = pyd.Field(default=None, description="Escalator can be used for outdoor applications")
57
+ indoor: bool | None = pydantic.Field(default=None, description="Escalator can be used for indoor applications")
58
+ outdoor: bool | None = pydantic.Field(default=None, description="Escalator can be used for outdoor applications")
58
59
 
59
60
 
60
61
  class ElevatorsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -66,11 +67,11 @@ class ElevatorsRangeV1(BaseOpenEpdHierarchicalSpec):
66
67
 
67
68
  _EXT_VERSION = "1.0"
68
69
 
69
- usage_intensity: list[ElevatorsUsageIntensity] | None = pyd.Field(default=None, description="")
70
- travel_length: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
71
- rated_load: AmountRangeMass | None = pyd.Field(default=None, description="")
72
- rated_speed: AmountRangeSpeed | None = pyd.Field(default=None, description="")
73
- building_rise: list[ElevatorsBuildingRise] | None = pyd.Field(default=None, description="")
70
+ usage_intensity: list[ElevatorsUsageIntensity] | None = pydantic.Field(default=None, description="")
71
+ travel_length: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
72
+ rated_load: AmountRangeMass | None = pydantic.Field(default=None, description="")
73
+ rated_speed: AmountRangeSpeed | None = pydantic.Field(default=None, description="")
74
+ building_rise: list[ElevatorsBuildingRise] | None = pydantic.Field(default=None, description="")
74
75
 
75
76
 
76
77
  class ConveyingEquipmentRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -45,10 +45,8 @@ __all__ = (
45
45
  "ElectricalRangeV1",
46
46
  )
47
47
 
48
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
49
-
48
+ import pydantic
50
49
 
51
- from openepd.compat.pydantic import pyd
52
50
  from openepd.model.common import RangeFloat
53
51
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
54
52
  from openepd.model.specs.enums import CableTraysMaterial, ConduitMaterial, EnergySource, RacewaysMaterial
@@ -61,6 +59,8 @@ from openepd.model.validation.quantity import (
61
59
  AmountRangeUtilization,
62
60
  )
63
61
 
62
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
63
+
64
64
 
65
65
  class LowVoltBusesRangeV1(BaseOpenEpdHierarchicalSpec):
66
66
  """
@@ -111,12 +111,14 @@ class CableTraysRangeV1(BaseOpenEpdHierarchicalSpec):
111
111
 
112
112
  _EXT_VERSION = "1.0"
113
113
 
114
- height: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
115
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
116
- depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
117
- static_load: AmountRangeMass | None = pyd.Field(default=None, description="")
118
- ventilated: bool | None = pyd.Field(default=None, description="At least 40% of the tray base is open to air flow")
119
- cable_trays_material: list[CableTraysMaterial] | None = pyd.Field(default=None, description="")
114
+ height: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
115
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
116
+ depth: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
117
+ static_load: AmountRangeMass | None = pydantic.Field(default=None, description="")
118
+ ventilated: bool | None = pydantic.Field(
119
+ default=None, description="At least 40% of the tray base is open to air flow"
120
+ )
121
+ cable_trays_material: list[CableTraysMaterial] | None = pydantic.Field(default=None, description="")
120
122
 
121
123
 
122
124
  class ElectricalBusesRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -164,11 +166,11 @@ class RacewaysRangeV1(BaseOpenEpdHierarchicalSpec):
164
166
 
165
167
  _EXT_VERSION = "1.0"
166
168
 
167
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
168
- depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
169
- painted: bool | None = pyd.Field(default=None, description="")
170
- divided: bool | None = pyd.Field(default=None, description="")
171
- raceways_material: list[RacewaysMaterial] | None = pyd.Field(default=None, description="")
169
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
170
+ depth: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
171
+ painted: bool | None = pydantic.Field(default=None, description="")
172
+ divided: bool | None = pydantic.Field(default=None, description="")
173
+ raceways_material: list[RacewaysMaterial] | None = pydantic.Field(default=None, description="")
172
174
 
173
175
 
174
176
  class FueledElectricalGeneratorsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -230,7 +232,7 @@ class ElectricityFromSpecificGeneratorRangeV1(BaseOpenEpdHierarchicalSpec):
230
232
 
231
233
  _EXT_VERSION = "1.0"
232
234
 
233
- energy_source: list[EnergySource] | None = pyd.Field(default=None, description="")
235
+ energy_source: list[EnergySource] | None = pydantic.Field(default=None, description="")
234
236
 
235
237
 
236
238
  class PowerPurchaseAgreementsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -244,7 +246,7 @@ class PowerPurchaseAgreementsRangeV1(BaseOpenEpdHierarchicalSpec):
244
246
 
245
247
  _EXT_VERSION = "1.0"
246
248
 
247
- energy_source: list[EnergySource] | None = pyd.Field(default=None, description="")
249
+ energy_source: list[EnergySource] | None = pydantic.Field(default=None, description="")
248
250
 
249
251
 
250
252
  class LightbulbsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -376,12 +378,12 @@ class LightingRangeV1(BaseOpenEpdHierarchicalSpec):
376
378
 
377
379
  _EXT_VERSION = "1.0"
378
380
 
379
- color_temperature: AmountRangeColorTemperature | None = pyd.Field(default=None, description="")
380
- typical_utilization: AmountRangeUtilization | None = pyd.Field(default=None, description="")
381
- luminosity: AmountRangeLuminosity | None = pyd.Field(default=None, description="")
382
- wattage: AmountRangePower | None = pyd.Field(default=None, description="")
383
- color_rendering_index: RangeFloat | None = pyd.Field(default=None, description="")
384
- dimmable: bool | None = pyd.Field(default=None, description="")
381
+ color_temperature: AmountRangeColorTemperature | None = pydantic.Field(default=None, description="")
382
+ typical_utilization: AmountRangeUtilization | None = pydantic.Field(default=None, description="")
383
+ luminosity: AmountRangeLuminosity | None = pydantic.Field(default=None, description="")
384
+ wattage: AmountRangePower | None = pydantic.Field(default=None, description="")
385
+ color_rendering_index: RangeFloat | None = pydantic.Field(default=None, description="")
386
+ dimmable: bool | None = pydantic.Field(default=None, description="")
385
387
  Lightbulbs: LightbulbsRangeV1 | None = None
386
388
  LightingControls: LightingControlsRangeV1 | None = None
387
389
  LightingFixtures: LightingFixturesRangeV1 | None = None