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.
- openepd/__init__.py +0 -6
- openepd/__version__.py +1 -1
- openepd/api/average_dataset/generic_estimate_sync_api.py +11 -10
- openepd/api/average_dataset/industry_epd_sync_api.py +9 -8
- openepd/api/base_sync_client.py +53 -9
- openepd/api/category/sync_api.py +1 -1
- openepd/api/dto/base.py +4 -4
- openepd/api/dto/common.py +24 -16
- openepd/api/dto/meta.py +15 -11
- openepd/api/dto/mf.py +9 -8
- openepd/api/epd/dto.py +43 -33
- openepd/api/epd/sync_api.py +9 -9
- openepd/api/pcr/sync_api.py +2 -2
- openepd/bundle/model.py +11 -10
- openepd/bundle/reader.py +12 -5
- openepd/bundle/writer.py +17 -6
- openepd/model/base.py +61 -44
- openepd/model/category.py +13 -10
- openepd/model/common.py +107 -59
- openepd/model/declaration.py +93 -64
- openepd/model/epd.py +51 -43
- openepd/model/generic_estimate.py +28 -13
- openepd/model/industry_epd.py +15 -9
- openepd/model/lcia.py +161 -136
- openepd/model/org.py +70 -37
- openepd/model/pcr.py +38 -32
- openepd/model/specs/asphalt.py +31 -22
- openepd/model/specs/base.py +14 -11
- openepd/model/specs/concrete.py +60 -39
- openepd/model/specs/range/aggregates.py +9 -9
- openepd/model/specs/range/aluminium.py +7 -7
- openepd/model/specs/range/asphalt.py +22 -19
- openepd/model/specs/range/cladding.py +16 -16
- openepd/model/specs/range/cmu.py +10 -9
- openepd/model/specs/range/concrete.py +36 -27
- openepd/model/specs/range/conveying_equipment.py +16 -15
- openepd/model/specs/range/electrical.py +24 -22
- openepd/model/specs/range/finishes.py +109 -104
- openepd/model/specs/range/fire_and_smoke_protection.py +7 -7
- openepd/model/specs/range/furnishings.py +16 -12
- openepd/model/specs/range/manufacturing_inputs.py +16 -16
- openepd/model/specs/range/masonry.py +16 -16
- openepd/model/specs/range/mechanical.py +47 -47
- openepd/model/specs/range/mechanical_insulation.py +7 -7
- openepd/model/specs/range/network_infrastructure.py +54 -46
- openepd/model/specs/range/openings.py +36 -31
- openepd/model/specs/range/plumbing.py +15 -13
- openepd/model/specs/range/precast_concrete.py +20 -16
- openepd/model/specs/range/sheathing.py +18 -18
- openepd/model/specs/range/steel.py +27 -25
- openepd/model/specs/range/thermal_moisture_protection.py +20 -20
- openepd/model/specs/range/utility_piping.py +9 -9
- openepd/model/specs/range/wood.py +19 -19
- openepd/model/specs/range/wood_joists.py +8 -8
- openepd/model/specs/singular/__init__.py +9 -5
- openepd/model/specs/singular/aggregates.py +22 -15
- openepd/model/specs/singular/aluminium.py +20 -5
- openepd/model/specs/singular/asphalt.py +44 -20
- openepd/model/specs/singular/cladding.py +38 -23
- openepd/model/specs/singular/cmu.py +26 -11
- openepd/model/specs/singular/common.py +3 -2
- openepd/model/specs/singular/concrete.py +85 -48
- openepd/model/specs/singular/conveying_equipment.py +30 -17
- openepd/model/specs/singular/deprecated/__init__.py +3 -2
- openepd/model/specs/singular/deprecated/concrete.py +68 -33
- openepd/model/specs/singular/deprecated/steel.py +28 -15
- openepd/model/specs/singular/electrical.py +69 -41
- openepd/model/specs/singular/finishes.py +250 -140
- openepd/model/specs/singular/fire_and_smoke_protection.py +9 -6
- openepd/model/specs/singular/furnishings.py +16 -14
- openepd/model/specs/singular/manufacturing_inputs.py +23 -14
- openepd/model/specs/singular/masonry.py +66 -21
- openepd/model/specs/singular/mechanical.py +48 -47
- openepd/model/specs/singular/mechanical_insulation.py +7 -6
- openepd/model/specs/singular/mixins/conduit_mixin.py +13 -10
- openepd/model/specs/singular/network_infrastructure.py +111 -52
- openepd/model/specs/singular/openings.py +127 -95
- openepd/model/specs/singular/plumbing.py +15 -12
- openepd/model/specs/singular/precast_concrete.py +68 -54
- openepd/model/specs/singular/sheathing.py +47 -27
- openepd/model/specs/singular/steel.py +69 -45
- openepd/model/specs/singular/thermal_moisture_protection.py +36 -20
- openepd/model/specs/singular/utility_piping.py +11 -8
- openepd/model/specs/singular/wood.py +48 -24
- openepd/model/specs/singular/wood_joists.py +19 -6
- openepd/model/standard.py +15 -8
- openepd/model/validation/common.py +9 -3
- openepd/model/validation/numbers.py +0 -13
- openepd/model/validation/quantity.py +88 -55
- openepd/model/versioning.py +9 -6
- {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/METADATA +2 -2
- openepd-7.0.1.dist-info/RECORD +141 -0
- openepd/compat/__init__.py +0 -15
- openepd/compat/compat_functional_validators.py +0 -25
- openepd/compat/pydantic.py +0 -30
- openepd/patch_pydantic.py +0 -108
- openepd-6.13.2.dist-info/RECORD +0 -145
- {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/LICENSE +0 -0
- {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/WHEEL +0 -0
@@ -21,10 +21,8 @@ __all__ = (
|
|
21
21
|
"PrecastConcreteRangeV1",
|
22
22
|
)
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
import pydantic
|
26
25
|
|
27
|
-
from openepd.compat.pydantic import pyd
|
28
26
|
from openepd.model.common import RangeRatioFloat
|
29
27
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
30
28
|
from openepd.model.specs.singular.precast_concrete import (
|
@@ -35,6 +33,8 @@ from openepd.model.specs.singular.precast_concrete import (
|
|
35
33
|
)
|
36
34
|
from openepd.model.validation.quantity import AmountRangePressureMpa
|
37
35
|
|
36
|
+
# NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
|
37
|
+
|
38
38
|
|
39
39
|
class ArchitecturalPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
|
40
40
|
"""
|
@@ -45,8 +45,9 @@ class ArchitecturalPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
45
45
|
|
46
46
|
_EXT_VERSION = "1.1"
|
47
47
|
|
48
|
-
element_type: ArchitecturalPrecastElementType | None =
|
49
|
-
default=None,
|
48
|
+
element_type: ArchitecturalPrecastElementType | None = pydantic.Field(
|
49
|
+
default=None,
|
50
|
+
description="Precast element type used for architectural applications.",
|
50
51
|
)
|
51
52
|
|
52
53
|
|
@@ -59,8 +60,9 @@ class StructuralPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
59
60
|
|
60
61
|
_EXT_VERSION = "1.1"
|
61
62
|
|
62
|
-
element_type: StructuralPrecastElementType | None =
|
63
|
-
default=None,
|
63
|
+
element_type: StructuralPrecastElementType | None = pydantic.Field(
|
64
|
+
default=None,
|
65
|
+
description="Precast element type used for structural applications.",
|
64
66
|
)
|
65
67
|
|
66
68
|
|
@@ -73,8 +75,9 @@ class UtilityUndergroundPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
73
75
|
|
74
76
|
_EXT_VERSION = "1.1"
|
75
77
|
|
76
|
-
element_type: UtilityPrecastElementType | None =
|
77
|
-
default=None,
|
78
|
+
element_type: UtilityPrecastElementType | None = pydantic.Field(
|
79
|
+
default=None,
|
80
|
+
description="Precast element type used for utility underground applications.",
|
78
81
|
)
|
79
82
|
|
80
83
|
|
@@ -87,8 +90,9 @@ class CivilPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
87
90
|
|
88
91
|
_EXT_VERSION = "1.0"
|
89
92
|
|
90
|
-
element_type: CivilPrecastElementType | None =
|
91
|
-
default=None,
|
93
|
+
element_type: CivilPrecastElementType | None = pydantic.Field(
|
94
|
+
default=None,
|
95
|
+
description="Precast element type used as civil engineering components.",
|
92
96
|
)
|
93
97
|
|
94
98
|
|
@@ -101,14 +105,14 @@ class PrecastConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
101
105
|
|
102
106
|
_EXT_VERSION = "1.1"
|
103
107
|
|
104
|
-
lightweight: bool | None =
|
105
|
-
concrete_compressive_strength_28d: AmountRangePressureMpa | None =
|
106
|
-
insulated: bool | None =
|
107
|
-
gfrc: bool | None =
|
108
|
+
lightweight: bool | None = pydantic.Field(default=None, description="")
|
109
|
+
concrete_compressive_strength_28d: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
|
110
|
+
insulated: bool | None = pydantic.Field(default=None, description="")
|
111
|
+
gfrc: bool | None = pydantic.Field(
|
108
112
|
default=None,
|
109
113
|
description="Glass Fiber Reinforced Concrete is fiber-reinforced concrete sometimes used in architectural panels",
|
110
114
|
)
|
111
|
-
steel_mass_percentage: RangeRatioFloat | None =
|
115
|
+
steel_mass_percentage: RangeRatioFloat | None = pydantic.Field(default=None, description="")
|
112
116
|
ArchitecturalPrecast: ArchitecturalPrecastRangeV1 | None = None
|
113
117
|
StructuralPrecast: StructuralPrecastRangeV1 | None = None
|
114
118
|
UtilityUndergroundPrecast: UtilityUndergroundPrecastRangeV1 | None = None
|
@@ -19,15 +19,15 @@ __all__ = (
|
|
19
19
|
"SheathingRangeV1",
|
20
20
|
)
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
import pydantic
|
24
23
|
|
25
|
-
from openepd.compat.pydantic import pyd
|
26
24
|
from openepd.model.common import RangeInt
|
27
25
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
28
26
|
from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
|
29
27
|
from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeRFactor
|
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 CementitiousSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
|
33
33
|
"""
|
@@ -41,7 +41,7 @@ class CementitiousSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
41
41
|
|
42
42
|
_EXT_VERSION = "1.0"
|
43
43
|
|
44
|
-
cement_board_thickness: AmountRangeLengthMm | None =
|
44
|
+
cement_board_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
45
45
|
|
46
46
|
|
47
47
|
class GypsumSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -55,20 +55,20 @@ class GypsumSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
55
55
|
|
56
56
|
_EXT_VERSION = "1.1"
|
57
57
|
|
58
|
-
fire_rating: list[GypsumFireRating] | None =
|
59
|
-
thickness: list[GypsumThickness] | None =
|
60
|
-
facing: list[GypsumFacing] | None =
|
61
|
-
r_factor: AmountRangeRFactor | None =
|
62
|
-
flame_spread_astm_e84: RangeInt | None =
|
63
|
-
smoke_production_astm_e84: RangeInt | None =
|
64
|
-
surface_abrasion_d4977: RangeInt | None =
|
65
|
-
indentation_d5420: RangeInt | None =
|
66
|
-
soft_body_impact_e695: RangeInt | None =
|
67
|
-
hard_body_impact_c1929: RangeInt | None =
|
68
|
-
mold_resistant: bool | None =
|
69
|
-
foil_backing: bool | None =
|
70
|
-
moisture_resistant: bool | None =
|
71
|
-
abuse_resistant: bool | None =
|
58
|
+
fire_rating: list[GypsumFireRating] | None = pydantic.Field(default=None, description="")
|
59
|
+
thickness: list[GypsumThickness] | None = pydantic.Field(default=None, description="")
|
60
|
+
facing: list[GypsumFacing] | None = pydantic.Field(default=None, description="")
|
61
|
+
r_factor: AmountRangeRFactor | None = pydantic.Field(default=None, description="")
|
62
|
+
flame_spread_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
|
63
|
+
smoke_production_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
|
64
|
+
surface_abrasion_d4977: RangeInt | None = pydantic.Field(default=None, description="")
|
65
|
+
indentation_d5420: RangeInt | None = pydantic.Field(default=None, description="")
|
66
|
+
soft_body_impact_e695: RangeInt | None = pydantic.Field(default=None, description="")
|
67
|
+
hard_body_impact_c1929: RangeInt | None = pydantic.Field(default=None, description="")
|
68
|
+
mold_resistant: bool | None = pydantic.Field(default=None, description="")
|
69
|
+
foil_backing: bool | None = pydantic.Field(default=None, description="")
|
70
|
+
moisture_resistant: bool | None = pydantic.Field(default=None, description="")
|
71
|
+
abuse_resistant: bool | None = pydantic.Field(default=None, description="")
|
72
72
|
|
73
73
|
|
74
74
|
class SheathingRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -35,10 +35,10 @@ __all__ = (
|
|
35
35
|
"SteelRangeV1",
|
36
36
|
)
|
37
37
|
|
38
|
-
|
38
|
+
from typing import ClassVar
|
39
39
|
|
40
|
+
import pydantic
|
40
41
|
|
41
|
-
from openepd.compat.pydantic import pyd
|
42
42
|
from openepd.model.common import RangeFloat, RangeRatioFloat
|
43
43
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
44
44
|
from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
|
@@ -51,6 +51,8 @@ from openepd.model.validation.quantity import (
|
|
51
51
|
AmountRangeThermalExpansion,
|
52
52
|
)
|
53
53
|
|
54
|
+
# NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
|
55
|
+
|
54
56
|
|
55
57
|
class ColdFormedFramingRangeV1(BaseOpenEpdHierarchicalSpec):
|
56
58
|
"""
|
@@ -226,15 +228,15 @@ class StructuralSteelRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
226
228
|
|
227
229
|
_EXT_VERSION = "1.0"
|
228
230
|
|
229
|
-
modulus_of_elasticity: AmountRangePressureMpa | None =
|
231
|
+
modulus_of_elasticity: AmountRangePressureMpa | None = pydantic.Field(
|
230
232
|
default=None,
|
231
233
|
description="Modulus of Elasticity, https://en.wikipedia.org/wiki/Elastic_modulus ",
|
232
234
|
)
|
233
|
-
thermal_expansion: AmountRangeThermalExpansion | None =
|
235
|
+
thermal_expansion: AmountRangeThermalExpansion | None = pydantic.Field(
|
234
236
|
default=None,
|
235
237
|
description="Thermal Expansion, https://en.wikipedia.org/wiki/Thermal_expansion",
|
236
238
|
)
|
237
|
-
thermal_conductivity: AmountRangeThermalConductivity | None =
|
239
|
+
thermal_conductivity: AmountRangeThermalConductivity | None = pydantic.Field(
|
238
240
|
default=None,
|
239
241
|
description="Thermal Conductivity, https://en.wikipedia.org/wiki/Thermal_conductivity_and_resistivity",
|
240
242
|
)
|
@@ -278,14 +280,14 @@ class RebarSteelRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
278
280
|
_EXT_VERSION = "1.0"
|
279
281
|
|
280
282
|
fabricated: bool | None = None
|
281
|
-
grade: list[SteelRebarGrade] | None =
|
282
|
-
diameter_min: AmountRangeLengthMm | None =
|
283
|
-
bending_pin_max: RangeFloat | None =
|
284
|
-
ts_ys_ratio_max: RangeFloat | None =
|
283
|
+
grade: list[SteelRebarGrade] | None = pydantic.Field(default=None)
|
284
|
+
diameter_min: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Minimal diameter")
|
285
|
+
bending_pin_max: RangeFloat | None = pydantic.Field(default=None)
|
286
|
+
ts_ys_ratio_max: RangeFloat | None = pydantic.Field(
|
285
287
|
default=None,
|
286
288
|
description="Max ratio of ultimate tensile to yield tensile strength",
|
287
289
|
)
|
288
|
-
epoxy_coated: bool | None =
|
290
|
+
epoxy_coated: bool | None = pydantic.Field(default=None)
|
289
291
|
|
290
292
|
|
291
293
|
class WireMeshSteelRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -313,31 +315,31 @@ class SteelRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
313
315
|
Range version.
|
314
316
|
"""
|
315
317
|
|
316
|
-
_EXT_VERSION = "1.1"
|
318
|
+
_EXT_VERSION: ClassVar[str] = "1.1"
|
317
319
|
|
318
|
-
yield_tensile_str: AmountRangePressureMpa | None =
|
320
|
+
yield_tensile_str: AmountRangePressureMpa | None = pydantic.Field(
|
319
321
|
default=None,
|
320
322
|
description="Yield Tensile strength (Mpa) per unit area. Yield strength is the point at which a material begins to permanently deform or change shape due to applied stress.",
|
321
323
|
)
|
322
|
-
bar_elongation: RangeFloat | None =
|
324
|
+
bar_elongation: RangeFloat | None = pydantic.Field(
|
323
325
|
default=None,
|
324
326
|
description="Increase in length at break, in percent. Typically 10%-20%",
|
325
327
|
)
|
326
|
-
recycled_content: RangeRatioFloat | None =
|
327
|
-
post_consumer_recycled_content: RangeRatioFloat | None =
|
328
|
+
recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
|
329
|
+
post_consumer_recycled_content: RangeRatioFloat | None = pydantic.Field(
|
328
330
|
default=None,
|
329
331
|
description="Should be a number between zero and the Recycled Content (steel_recycled_content)",
|
330
332
|
)
|
331
|
-
astm_marking: str | None =
|
332
|
-
euro_marking: str | None =
|
333
|
-
composition: list[SteelComposition] | None =
|
334
|
-
cold_finished: bool | None =
|
335
|
-
galvanized: bool | None =
|
336
|
-
stainless: bool | None =
|
337
|
-
making_route: SteelMakingRoute | None =
|
338
|
-
astm_standards: list[Standard] | None =
|
339
|
-
sae_standards: list[Standard] | None =
|
340
|
-
en_standards: list[Standard] | None =
|
333
|
+
astm_marking: str | None = pydantic.Field(default=None, description="The marking to be expected on the product.")
|
334
|
+
euro_marking: str | None = pydantic.Field(default=None, description="The marking to be expected on the product.")
|
335
|
+
composition: list[SteelComposition] | None = pydantic.Field(default=None, description="Basic chemical composition")
|
336
|
+
cold_finished: bool | None = pydantic.Field(default=None)
|
337
|
+
galvanized: bool | None = pydantic.Field(default=None)
|
338
|
+
stainless: bool | None = pydantic.Field(default=None)
|
339
|
+
making_route: SteelMakingRoute | None = pydantic.Field(default=None)
|
340
|
+
astm_standards: list[Standard] | None = pydantic.Field(default=None, description="List of ASTM standards")
|
341
|
+
sae_standards: list[Standard] | None = pydantic.Field(default=None, description="List of SAE standards")
|
342
|
+
en_standards: list[Standard] | None = pydantic.Field(default=None, description="List of EN standards")
|
341
343
|
MBQSteel: MBQSteelRangeV1 | None = None
|
342
344
|
CoilSteel: CoilSteelRangeV1 | None = None
|
343
345
|
ColdFormedSteel: ColdFormedSteelRangeV1 | None = None
|
@@ -38,10 +38,8 @@ __all__ = (
|
|
38
38
|
"ThermalMoistureProtectionRangeV1",
|
39
39
|
)
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
import pydantic
|
43
42
|
|
44
|
-
from openepd.compat.pydantic import pyd
|
45
43
|
from openepd.model.common import RangeFloat, RangeRatioFloat
|
46
44
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
47
45
|
from openepd.model.specs.enums import (
|
@@ -54,6 +52,8 @@ from openepd.model.specs.enums import (
|
|
54
52
|
)
|
55
53
|
from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa
|
56
54
|
|
55
|
+
# NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
|
56
|
+
|
57
57
|
|
58
58
|
class BituminousRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
|
59
59
|
"""
|
@@ -158,7 +158,7 @@ class BoardInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
158
158
|
|
159
159
|
_EXT_VERSION = "1.0"
|
160
160
|
|
161
|
-
compressive_strength: AmountRangePressureMpa | None =
|
161
|
+
compressive_strength: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
|
162
162
|
|
163
163
|
|
164
164
|
class FoamedInPlaceRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -170,7 +170,7 @@ class FoamedInPlaceRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
170
170
|
|
171
171
|
_EXT_VERSION = "1.0"
|
172
172
|
|
173
|
-
foam_type: list[FoamType] | None =
|
173
|
+
foam_type: list[FoamType] | None = pydantic.Field(default=None, description="")
|
174
174
|
|
175
175
|
|
176
176
|
class SprayedInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -207,14 +207,14 @@ class MembraneRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
207
207
|
|
208
208
|
_EXT_VERSION = "1.0"
|
209
209
|
|
210
|
-
thickness: AmountRangeLengthMm | None =
|
211
|
-
sri: RangeFloat | None =
|
212
|
-
total_recycled_content: RangeRatioFloat | None =
|
213
|
-
post_consumer_recycled_content: RangeRatioFloat | None =
|
214
|
-
reinforcement: list[MembraneRoofingReinforcement] | None =
|
215
|
-
felt_backing: bool | None =
|
216
|
-
nsf347: bool | None =
|
217
|
-
vantage_vinyl: bool | None =
|
210
|
+
thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
211
|
+
sri: RangeFloat | None = pydantic.Field(default=None, description="")
|
212
|
+
total_recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
|
213
|
+
post_consumer_recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
|
214
|
+
reinforcement: list[MembraneRoofingReinforcement] | None = pydantic.Field(default=None, description="")
|
215
|
+
felt_backing: bool | None = pydantic.Field(default=None, description="")
|
216
|
+
nsf347: bool | None = pydantic.Field(default=None, description="")
|
217
|
+
vantage_vinyl: bool | None = pydantic.Field(default=None, description="")
|
218
218
|
BituminousRoofing: BituminousRoofingRangeV1 | None = None
|
219
219
|
SinglePlyEPDM: SinglePlyEPDMRangeV1 | None = None
|
220
220
|
SinglePlyKEE: SinglePlyKEERangeV1 | None = None
|
@@ -233,10 +233,10 @@ class InsulationRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
233
233
|
|
234
234
|
_EXT_VERSION = "1.0"
|
235
235
|
|
236
|
-
r_value: RangeFloat | None =
|
237
|
-
material: list[InsulatingMaterial] | None =
|
238
|
-
intended_application: list[InsulationIntendedApplication] | None =
|
239
|
-
thickness_per_declared_unit: AmountRangeLengthMm | None =
|
236
|
+
r_value: RangeFloat | None = pydantic.Field(default=None, description="")
|
237
|
+
material: list[InsulatingMaterial] | None = pydantic.Field(default=None, description="")
|
238
|
+
intended_application: list[InsulationIntendedApplication] | None = pydantic.Field(default=None, description="")
|
239
|
+
thickness_per_declared_unit: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
240
240
|
BlanketInsulation: BlanketInsulationRangeV1 | None = None
|
241
241
|
BlownInsulation: BlownInsulationRangeV1 | None = None
|
242
242
|
BoardInsulation: BoardInsulationRangeV1 | None = None
|
@@ -288,9 +288,9 @@ class RoofCoverBoardsRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
288
288
|
|
289
289
|
_EXT_VERSION = "1.0"
|
290
290
|
|
291
|
-
material: list[RoofCoverBoardsMaterial] | None =
|
292
|
-
facing: list[RoofCoverBoardsFacing] | None =
|
293
|
-
thickness: AmountRangeLengthMm | None =
|
291
|
+
material: list[RoofCoverBoardsMaterial] | None = pydantic.Field(default=None, description="")
|
292
|
+
facing: list[RoofCoverBoardsFacing] | None = pydantic.Field(default=None, description="")
|
293
|
+
thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
294
294
|
|
295
295
|
|
296
296
|
class SteepSlopeRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -19,15 +19,15 @@ __all__ = (
|
|
19
19
|
"UtilityPipingRangeV1",
|
20
20
|
)
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
import pydantic
|
24
23
|
|
25
|
-
from openepd.compat.pydantic import pyd
|
26
24
|
from openepd.model.common import RangeAmount
|
27
25
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
28
26
|
from openepd.model.specs.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
|
29
27
|
from openepd.model.validation.quantity import AmountRangeLengthMm
|
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 BuildingHeatingPipingRangeV1(BaseOpenEpdHierarchicalSpec):
|
33
33
|
"""
|
@@ -51,7 +51,7 @@ class BuriedPipingRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
51
51
|
|
52
52
|
_EXT_VERSION = "1.0"
|
53
53
|
|
54
|
-
buried_piping_type: list[BuriedPipingType] | None =
|
54
|
+
buried_piping_type: list[BuriedPipingType] | None = pydantic.Field(default=None, description="")
|
55
55
|
|
56
56
|
|
57
57
|
class UtilityPipingRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -66,10 +66,10 @@ class UtilityPipingRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
66
66
|
|
67
67
|
_EXT_VERSION = "1.0"
|
68
68
|
|
69
|
-
thickness: AmountRangeLengthMm | None =
|
70
|
-
piping_diameter: AmountRangeLengthMm | None =
|
71
|
-
mass_per_unit_length: RangeAmount | None =
|
72
|
-
piping_ansi_schedule: list[PipingAnsiSchedule] | None =
|
73
|
-
utility_piping_material: list[UtilityPipingMaterial] | None =
|
69
|
+
thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
70
|
+
piping_diameter: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
71
|
+
mass_per_unit_length: RangeAmount | None = pydantic.Field(default=None, description="")
|
72
|
+
piping_ansi_schedule: list[PipingAnsiSchedule] | None = pydantic.Field(default=None, description="")
|
73
|
+
utility_piping_material: list[UtilityPipingMaterial] | None = pydantic.Field(default=None, description="")
|
74
74
|
BuildingHeatingPiping: BuildingHeatingPipingRangeV1 | None = None
|
75
75
|
BuriedPiping: BuriedPipingRangeV1 | None = None
|
@@ -34,7 +34,8 @@ __all__ = (
|
|
34
34
|
|
35
35
|
from builtins import float
|
36
36
|
|
37
|
-
|
37
|
+
import pydantic
|
38
|
+
|
38
39
|
from openepd.model.org import OrgRef
|
39
40
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
40
41
|
from openepd.model.specs.enums import (
|
@@ -46,7 +47,6 @@ from openepd.model.specs.enums import (
|
|
46
47
|
SawnTimberSpecies,
|
47
48
|
SheathingPanelsFabrication,
|
48
49
|
)
|
49
|
-
from openepd.model.validation.numbers import RatioFloat
|
50
50
|
from openepd.model.validation.quantity import AmountRangeLengthMm
|
51
51
|
|
52
52
|
|
@@ -105,8 +105,8 @@ class CompositeLumberRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
105
105
|
|
106
106
|
_EXT_VERSION = "1.0"
|
107
107
|
|
108
|
-
fabrication: list[CompositeLumberFabrication] | None =
|
109
|
-
timber_species: list[EngineeredTimberSpecies] | None =
|
108
|
+
fabrication: list[CompositeLumberFabrication] | None = pydantic.Field(default=None, description="")
|
109
|
+
timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
|
110
110
|
|
111
111
|
|
112
112
|
class DimensionLumberRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -118,7 +118,7 @@ class DimensionLumberRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
118
118
|
|
119
119
|
_EXT_VERSION = "1.0"
|
120
120
|
|
121
|
-
timber_species: list[SawnTimberSpecies] | None =
|
121
|
+
timber_species: list[SawnTimberSpecies] | None = pydantic.Field(default=None, description="")
|
122
122
|
WoodDecking: WoodDeckingRangeV1 | None = None
|
123
123
|
WoodFraming: WoodFramingRangeV1 | None = None
|
124
124
|
|
@@ -145,8 +145,8 @@ class MassTimberRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
145
145
|
|
146
146
|
_EXT_VERSION = "1.0"
|
147
147
|
|
148
|
-
fabrication: list[MassTimberFabrication] | None =
|
149
|
-
timber_species: list[EngineeredTimberSpecies] | None =
|
148
|
+
fabrication: list[MassTimberFabrication] | None = pydantic.Field(default=None, description="")
|
149
|
+
timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
|
150
150
|
|
151
151
|
|
152
152
|
class NonStructuralWoodRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -184,9 +184,9 @@ class SheathingPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
184
184
|
|
185
185
|
_EXT_VERSION = "1.0"
|
186
186
|
|
187
|
-
fabrication: list[SheathingPanelsFabrication] | None =
|
188
|
-
wood_board_thickness: AmountRangeLengthMm | None =
|
189
|
-
timber_species: list[EngineeredTimberSpecies] | None =
|
187
|
+
fabrication: list[SheathingPanelsFabrication] | None = pydantic.Field(default=None, description="")
|
188
|
+
wood_board_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
|
189
|
+
timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
|
190
190
|
|
191
191
|
|
192
192
|
class UnfinishedWoodRangeV1(BaseOpenEpdHierarchicalSpec):
|
@@ -209,17 +209,17 @@ class WoodRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
209
209
|
_EXT_VERSION = "1.0"
|
210
210
|
|
211
211
|
forest_practices_certifiers: list[OrgRef] | None = None
|
212
|
-
timber_species: list[AllTimberSpecies] | None =
|
213
|
-
fabrication: list[AllFabrication] | None =
|
214
|
-
weather_exposed: bool | None =
|
215
|
-
fire_retardant: bool | None =
|
216
|
-
decay_resistant: bool | None =
|
217
|
-
fsc_certified:
|
212
|
+
timber_species: list[AllTimberSpecies] | None = pydantic.Field(default=None, description="Timber species")
|
213
|
+
fabrication: list[AllFabrication] | None = pydantic.Field(default=None, description="Timber fabrication")
|
214
|
+
weather_exposed: bool | None = pydantic.Field(default=None, description="Weather exposed")
|
215
|
+
fire_retardant: bool | None = pydantic.Field(default=None, description="Fire retardant")
|
216
|
+
decay_resistant: bool | None = pydantic.Field(default=None, description="Decay resistant")
|
217
|
+
fsc_certified: float | None = pydantic.Field(
|
218
218
|
default=None, description="Forest Stewardship Council certified proportion"
|
219
219
|
)
|
220
|
-
fsc_certified_z: float | None =
|
221
|
-
recycled_content:
|
222
|
-
recycled_content_z: float | None =
|
220
|
+
fsc_certified_z: float | None = pydantic.Field(default=None, description="")
|
221
|
+
recycled_content: float | None = pydantic.Field(default=None, description="Recycled content")
|
222
|
+
recycled_content_z: float | None = pydantic.Field(default=None, description="")
|
223
223
|
CompositeLumber: CompositeLumberRangeV1 | None = None
|
224
224
|
DimensionLumber: DimensionLumberRangeV1 | None = None
|
225
225
|
HeavyTimber: HeavyTimberRangeV1 | None = None
|
@@ -15,14 +15,14 @@
|
|
15
15
|
#
|
16
16
|
__all__ = ("WoodJoistsRangeV1",)
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
import pydantic
|
20
19
|
|
21
|
-
from openepd.compat.pydantic import pyd
|
22
20
|
from openepd.model.org import OrgRef
|
23
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
24
22
|
from openepd.model.specs.enums import AllFabrication, AllTimberSpecies
|
25
23
|
|
24
|
+
# NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
|
25
|
+
|
26
26
|
|
27
27
|
class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
|
28
28
|
"""
|
@@ -37,8 +37,8 @@ class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
|
|
37
37
|
_EXT_VERSION = "1.0"
|
38
38
|
|
39
39
|
forest_practices_certifiers: list[OrgRef] | None = None
|
40
|
-
timber_species: list[AllTimberSpecies] | None =
|
41
|
-
fabrication: list[AllFabrication] | None =
|
42
|
-
weather_exposed: bool | None =
|
43
|
-
fire_retardant: bool | None =
|
44
|
-
decay_resistant: bool | None =
|
40
|
+
timber_species: list[AllTimberSpecies] | None = pydantic.Field(default=None, description="")
|
41
|
+
fabrication: list[AllFabrication] | None = pydantic.Field(default=None, description="")
|
42
|
+
weather_exposed: bool | None = pydantic.Field(default=None, description="")
|
43
|
+
fire_retardant: bool | None = pydantic.Field(default=None, description="")
|
44
|
+
decay_resistant: bool | None = pydantic.Field(default=None, description="")
|
@@ -15,7 +15,8 @@
|
|
15
15
|
#
|
16
16
|
from typing import Any, ClassVar
|
17
17
|
|
18
|
-
|
18
|
+
import pydantic
|
19
|
+
|
19
20
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
20
21
|
from openepd.model.specs.singular.accessories import AccessoriesV1
|
21
22
|
from openepd.model.specs.singular.aggregates import AggregatesV1
|
@@ -57,13 +58,16 @@ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
|
|
57
58
|
from openepd.model.specs.singular.wood import WoodV1
|
58
59
|
from openepd.model.specs.singular.wood_joists import WoodJoistsV1
|
59
60
|
|
60
|
-
__all__ = ("Specs",)
|
61
|
+
__all__ = ("Specs", "BaseCompatibilitySpec")
|
61
62
|
|
62
63
|
|
63
64
|
class Specs(BaseOpenEpdHierarchicalSpec):
|
64
65
|
"""Material specific specs."""
|
65
66
|
|
66
|
-
COMPATIBILITY_SPECS: ClassVar[list[type[BaseCompatibilitySpec]]] = [
|
67
|
+
COMPATIBILITY_SPECS: ClassVar[list[type[BaseCompatibilitySpec]]] = [
|
68
|
+
ConcreteOldSpec,
|
69
|
+
SteelOldSpec,
|
70
|
+
]
|
67
71
|
|
68
72
|
_EXT_VERSION = "1.0"
|
69
73
|
|
@@ -107,8 +111,8 @@ class Specs(BaseOpenEpdHierarchicalSpec):
|
|
107
111
|
concrete: ConcreteOldSpec | None = None
|
108
112
|
steel: SteelOldSpec | None = None
|
109
113
|
|
110
|
-
@
|
111
|
-
def
|
114
|
+
@pydantic.model_validator(mode="before")
|
115
|
+
def _ensure_backward_compatibility(cls, values: dict[str, Any]) -> dict[str, Any]:
|
112
116
|
"""
|
113
117
|
Restore the functionality for backward-compatible specs.
|
114
118
|
|
@@ -13,22 +13,25 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
import pydantic
|
17
|
+
|
17
18
|
from openepd.model.base import BaseOpenEpdSchema
|
18
19
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
19
20
|
from openepd.model.specs.enums import AggregateGradation, AggregateWeightClassification
|
20
|
-
from openepd.model.validation.numbers import RatioFloat
|
21
21
|
from openepd.model.validation.quantity import LengthMmStr
|
22
22
|
|
23
23
|
|
24
24
|
class AggregateApplication(BaseOpenEpdSchema):
|
25
25
|
"""Application for aggregates."""
|
26
26
|
|
27
|
-
concrete: bool | None =
|
28
|
-
|
29
|
-
|
27
|
+
concrete: bool | None = pydantic.Field(
|
28
|
+
default=None, description="Aggregates used in concrete and masonry applications"
|
29
|
+
)
|
30
|
+
asphalt: bool | None = pydantic.Field(
|
31
|
+
default=None,
|
32
|
+
description="Aggregates used in bituminous paving and surface applications",
|
30
33
|
)
|
31
|
-
unbound: bool | None =
|
34
|
+
unbound: bool | None = pydantic.Field(default=None)
|
32
35
|
|
33
36
|
|
34
37
|
class AggregatesV1(BaseOpenEpdHierarchicalSpec):
|
@@ -41,26 +44,30 @@ class AggregatesV1(BaseOpenEpdHierarchicalSpec):
|
|
41
44
|
_EXT_VERSION = "1.0"
|
42
45
|
|
43
46
|
# Own fields:
|
44
|
-
recycled_content:
|
45
|
-
|
47
|
+
recycled_content: float | None = pydantic.Field(
|
48
|
+
examples=[0.3],
|
49
|
+
default=None,
|
50
|
+
description="Percent of total mass that is recycled aggregate",
|
51
|
+
ge=0,
|
52
|
+
le=1,
|
46
53
|
)
|
47
|
-
nominal_max_size: LengthMmStr | None =
|
54
|
+
nominal_max_size: LengthMmStr | None = pydantic.Field(
|
48
55
|
default=None,
|
49
|
-
|
56
|
+
examples=["10 mm"],
|
50
57
|
description="Nominal maximum aggregate size is defined as one sieve size smaller than the maximum "
|
51
58
|
"aggregate size. "
|
52
59
|
"The maximum aggregate size is defined as the smallest sieve size that requires 100% passing.",
|
53
60
|
)
|
54
|
-
weight_classification: AggregateWeightClassification | None =
|
55
|
-
|
61
|
+
weight_classification: AggregateWeightClassification | None = pydantic.Field(
|
62
|
+
examples=[str(AggregateWeightClassification.HEAVY_WEIGHT)], default=None
|
56
63
|
)
|
57
|
-
gradation: AggregateGradation | None =
|
58
|
-
manufactured: bool | None =
|
64
|
+
gradation: AggregateGradation | None = pydantic.Field(examples=[str(AggregateGradation.GAP)], default=None)
|
65
|
+
manufactured: bool | None = pydantic.Field(
|
59
66
|
default=None,
|
60
67
|
description="Aggregate produced via expansion or sintering at high temperatures of the following materials: "
|
61
68
|
"clay, shale, slate, perlite, vermiculite, or slag. Typically used to produce lightweight aggregate",
|
62
69
|
)
|
63
|
-
slag: bool | None =
|
70
|
+
slag: bool | None = pydantic.Field(
|
64
71
|
default=None,
|
65
72
|
description="Pelletized, foamed, and granulated blast furnace slag can be used as construction aggregate.",
|
66
73
|
)
|