openepd 3.0.0__py3-none-any.whl → 3.1.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/__version__.py +1 -1
- openepd/model/specs/__init__.py +71 -19
- openepd/model/specs/aluminium.py +1 -1
- openepd/model/specs/concrete.py +19 -177
- openepd/model/specs/generated/accessories.py +63 -0
- openepd/model/specs/generated/aggregates.py +71 -0
- openepd/model/specs/generated/aluminium.py +66 -0
- openepd/model/specs/generated/asphalt.py +86 -0
- openepd/model/specs/generated/bulk_materials.py +26 -0
- openepd/model/specs/generated/cast_decks_and_underlayment.py +26 -0
- openepd/model/specs/generated/cladding.py +214 -0
- openepd/model/specs/generated/cmu.py +46 -0
- openepd/model/specs/generated/common.py +27 -0
- openepd/model/specs/generated/concrete.py +151 -0
- openepd/model/specs/generated/conveying_equipment.py +57 -0
- openepd/model/specs/generated/electrical.py +297 -0
- openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +63 -0
- openepd/model/specs/generated/electricity.py +26 -0
- openepd/model/specs/generated/enums.py +2420 -0
- openepd/model/specs/generated/finishes.py +519 -0
- openepd/model/specs/generated/fire_and_smoke_protection.py +79 -0
- openepd/model/specs/generated/furnishings.py +95 -0
- openepd/model/specs/generated/grouting.py +26 -0
- openepd/model/specs/generated/manufacturing_inputs.py +131 -0
- openepd/model/specs/generated/masonry.py +77 -0
- openepd/model/specs/generated/material_handling.py +35 -0
- openepd/model/specs/generated/mechanical.py +271 -0
- openepd/model/specs/generated/mechanical_insulation.py +41 -0
- openepd/model/specs/generated/network_infrastructure.py +181 -0
- openepd/model/specs/generated/openings.py +423 -0
- openepd/model/specs/generated/other_electrical_equipment.py +26 -0
- openepd/model/specs/generated/other_materials.py +123 -0
- openepd/model/specs/generated/plumbing.py +153 -0
- openepd/model/specs/generated/precast_concrete.py +68 -0
- openepd/model/specs/generated/sheathing.py +74 -0
- openepd/model/specs/generated/steel.py +224 -0
- openepd/model/specs/generated/thermal_moisture_protection.py +233 -0
- openepd/model/specs/generated/utility_piping.py +65 -0
- openepd/model/specs/generated/wood.py +167 -0
- openepd/model/specs/generated/wood_joists.py +38 -0
- openepd/model/specs/glass.py +1 -45
- openepd/model/specs/steel.py +1 -10
- openepd/model/validation/quantity.py +4 -3
- {openepd-3.0.0.dist-info → openepd-3.1.1.dist-info}/METADATA +1 -1
- openepd-3.1.1.dist-info/RECORD +95 -0
- openepd-3.0.0.dist-info/RECORD +0 -59
- {openepd-3.0.0.dist-info → openepd-3.1.1.dist-info}/LICENSE +0 -0
- {openepd-3.0.0.dist-info → openepd-3.1.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,233 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.compat.pydantic import pyd
|
21
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
|
+
from openepd.model.specs.generated.enums import (
|
23
|
+
FoamType,
|
24
|
+
InsulatingMaterial,
|
25
|
+
InsulationIntendedApplication,
|
26
|
+
MembraneRoofingReinforcement,
|
27
|
+
RoofCoverBoardsFacing,
|
28
|
+
RoofCoverBoardsMaterial,
|
29
|
+
)
|
30
|
+
from openepd.model.validation.numbers import RatioFloat
|
31
|
+
from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
|
32
|
+
|
33
|
+
|
34
|
+
class BituminousRoofingV1(BaseOpenEpdHierarchicalSpec):
|
35
|
+
"""Bituminous roofing performance specification."""
|
36
|
+
|
37
|
+
_EXT_VERSION = "1.0"
|
38
|
+
|
39
|
+
|
40
|
+
class SinglePlyEPDMV1(BaseOpenEpdHierarchicalSpec):
|
41
|
+
"""Single ply e p d m performance specification."""
|
42
|
+
|
43
|
+
_EXT_VERSION = "1.0"
|
44
|
+
|
45
|
+
|
46
|
+
class SinglePlyKEEV1(BaseOpenEpdHierarchicalSpec):
|
47
|
+
"""Single ply k e e performance specification."""
|
48
|
+
|
49
|
+
_EXT_VERSION = "1.0"
|
50
|
+
|
51
|
+
|
52
|
+
class SinglePlyOtherV1(BaseOpenEpdHierarchicalSpec):
|
53
|
+
"""Single ply other performance specification."""
|
54
|
+
|
55
|
+
_EXT_VERSION = "1.0"
|
56
|
+
|
57
|
+
|
58
|
+
class SinglePlyPolyurethaneV1(BaseOpenEpdHierarchicalSpec):
|
59
|
+
"""Single ply polyurethane performance specification."""
|
60
|
+
|
61
|
+
_EXT_VERSION = "1.0"
|
62
|
+
|
63
|
+
|
64
|
+
class SinglePlyPVCV1(BaseOpenEpdHierarchicalSpec):
|
65
|
+
"""Single ply p v c performance specification."""
|
66
|
+
|
67
|
+
_EXT_VERSION = "1.0"
|
68
|
+
|
69
|
+
|
70
|
+
class SinglePlyTPOV1(BaseOpenEpdHierarchicalSpec):
|
71
|
+
"""Single ply t p o performance specification."""
|
72
|
+
|
73
|
+
_EXT_VERSION = "1.0"
|
74
|
+
|
75
|
+
|
76
|
+
class BlanketInsulationV1(BaseOpenEpdHierarchicalSpec):
|
77
|
+
"""Blanket insulation performance specification."""
|
78
|
+
|
79
|
+
_EXT_VERSION = "1.0"
|
80
|
+
|
81
|
+
|
82
|
+
class BlownInsulationV1(BaseOpenEpdHierarchicalSpec):
|
83
|
+
"""Blown insulation performance specification."""
|
84
|
+
|
85
|
+
_EXT_VERSION = "1.0"
|
86
|
+
|
87
|
+
|
88
|
+
class BoardInsulationV1(BaseOpenEpdHierarchicalSpec):
|
89
|
+
"""Board insulation performance specification."""
|
90
|
+
|
91
|
+
_EXT_VERSION = "1.0"
|
92
|
+
|
93
|
+
# Own fields:
|
94
|
+
compressive_strength: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
|
95
|
+
|
96
|
+
_compressive_strength_is_quantity_validator = pyd.validator("compressive_strength", allow_reuse=True)(
|
97
|
+
validate_unit_factory("MPa")
|
98
|
+
)
|
99
|
+
|
100
|
+
|
101
|
+
class FoamedInPlaceV1(BaseOpenEpdHierarchicalSpec):
|
102
|
+
"""Foamed in place performance specification."""
|
103
|
+
|
104
|
+
_EXT_VERSION = "1.0"
|
105
|
+
|
106
|
+
# Own fields:
|
107
|
+
foam_type: FoamType | None = pyd.Field(default=None, description="", example="Open-Cell")
|
108
|
+
|
109
|
+
|
110
|
+
class SprayedInsulationV1(BaseOpenEpdHierarchicalSpec):
|
111
|
+
"""Sprayed insulation performance specification."""
|
112
|
+
|
113
|
+
_EXT_VERSION = "1.0"
|
114
|
+
|
115
|
+
|
116
|
+
class AirBarriersV1(BaseOpenEpdHierarchicalSpec):
|
117
|
+
"""Air barriers performance specification."""
|
118
|
+
|
119
|
+
_EXT_VERSION = "1.0"
|
120
|
+
|
121
|
+
|
122
|
+
class MembraneRoofingV1(BaseOpenEpdHierarchicalSpec):
|
123
|
+
"""Membrane roofing performance specification."""
|
124
|
+
|
125
|
+
_EXT_VERSION = "1.0"
|
126
|
+
|
127
|
+
# Own fields:
|
128
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
129
|
+
sri: float | None = pyd.Field(default=None, description="", example=2.3)
|
130
|
+
total_recycled_content: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
|
131
|
+
post_consumer_recycled_content: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
|
132
|
+
reinforcement: MembraneRoofingReinforcement | None = pyd.Field(default=None, description="", example="Polyester")
|
133
|
+
felt_backing: bool | None = pyd.Field(default=None, description="", example=True)
|
134
|
+
nsf347: bool | None = pyd.Field(default=None, description="", example=True)
|
135
|
+
vantage_vinyl: bool | None = pyd.Field(default=None, description="", example=True)
|
136
|
+
|
137
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
138
|
+
|
139
|
+
# Nested specs:
|
140
|
+
BituminousRoofing: BituminousRoofingV1 | None = None
|
141
|
+
SinglePlyEPDM: SinglePlyEPDMV1 | None = None
|
142
|
+
SinglePlyKEE: SinglePlyKEEV1 | None = None
|
143
|
+
SinglePlyOther: SinglePlyOtherV1 | None = None
|
144
|
+
SinglePlyPolyurethane: SinglePlyPolyurethaneV1 | None = None
|
145
|
+
SinglePlyPVC: SinglePlyPVCV1 | None = None
|
146
|
+
SinglePlyTPO: SinglePlyTPOV1 | None = None
|
147
|
+
|
148
|
+
|
149
|
+
class InsulationV1(BaseOpenEpdHierarchicalSpec):
|
150
|
+
"""Insulation performance specification."""
|
151
|
+
|
152
|
+
_EXT_VERSION = "1.0"
|
153
|
+
|
154
|
+
# Own fields:
|
155
|
+
r_value: float | None = pyd.Field(default=None, description="", example=2.3)
|
156
|
+
material: InsulatingMaterial | None = pyd.Field(default=None, description="", example="Mineral Wool")
|
157
|
+
intended_application: list[InsulationIntendedApplication] | None = pyd.Field(
|
158
|
+
default=None, description="", example=["Wall & General"]
|
159
|
+
)
|
160
|
+
thickness_per_declared_unit: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
161
|
+
|
162
|
+
_thickness_per_declared_unit_is_quantity_validator = pyd.validator("thickness_per_declared_unit", allow_reuse=True)(
|
163
|
+
validate_unit_factory("m")
|
164
|
+
)
|
165
|
+
|
166
|
+
# Nested specs:
|
167
|
+
BlanketInsulation: BlanketInsulationV1 | None = None
|
168
|
+
BlownInsulation: BlownInsulationV1 | None = None
|
169
|
+
BoardInsulation: BoardInsulationV1 | None = None
|
170
|
+
FoamedInPlace: FoamedInPlaceV1 | None = None
|
171
|
+
SprayedInsulation: SprayedInsulationV1 | None = None
|
172
|
+
|
173
|
+
|
174
|
+
class DampproofingAndWaterproofingV1(BaseOpenEpdHierarchicalSpec):
|
175
|
+
"""Dampproofing and waterproofing performance specification."""
|
176
|
+
|
177
|
+
_EXT_VERSION = "1.0"
|
178
|
+
|
179
|
+
|
180
|
+
class FlashingAndSheetMetalV1(BaseOpenEpdHierarchicalSpec):
|
181
|
+
"""Flashing and sheet metal performance specification."""
|
182
|
+
|
183
|
+
_EXT_VERSION = "1.0"
|
184
|
+
|
185
|
+
|
186
|
+
class JointProtectionV1(BaseOpenEpdHierarchicalSpec):
|
187
|
+
"""Joint protection performance specification."""
|
188
|
+
|
189
|
+
_EXT_VERSION = "1.0"
|
190
|
+
|
191
|
+
|
192
|
+
class RoofCoverBoardsV1(BaseOpenEpdHierarchicalSpec):
|
193
|
+
"""Roof cover boards performance specification."""
|
194
|
+
|
195
|
+
_EXT_VERSION = "1.0"
|
196
|
+
|
197
|
+
# Own fields:
|
198
|
+
material: RoofCoverBoardsMaterial | None = pyd.Field(default=None, description="", example="Gypsum Fiber")
|
199
|
+
facing: list[RoofCoverBoardsFacing] | None = pyd.Field(default=None, description="", example=["Paper"])
|
200
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
|
201
|
+
|
202
|
+
_roof_cover_boards_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(
|
203
|
+
validate_unit_factory("m")
|
204
|
+
)
|
205
|
+
|
206
|
+
|
207
|
+
class SteepSlopeRoofingV1(BaseOpenEpdHierarchicalSpec):
|
208
|
+
"""Steep slope roofing performance specification."""
|
209
|
+
|
210
|
+
_EXT_VERSION = "1.0"
|
211
|
+
|
212
|
+
|
213
|
+
class WeatherBarriersV1(BaseOpenEpdHierarchicalSpec):
|
214
|
+
"""Weather barriers performance specification."""
|
215
|
+
|
216
|
+
_EXT_VERSION = "1.0"
|
217
|
+
|
218
|
+
|
219
|
+
class ThermalMoistureProtectionV1(BaseOpenEpdHierarchicalSpec):
|
220
|
+
"""Thermal moisture protection performance specification."""
|
221
|
+
|
222
|
+
_EXT_VERSION = "1.0"
|
223
|
+
|
224
|
+
# Nested specs:
|
225
|
+
AirBarriers: AirBarriersV1 | None = None
|
226
|
+
MembraneRoofing: MembraneRoofingV1 | None = None
|
227
|
+
Insulation: InsulationV1 | None = None
|
228
|
+
DampproofingAndWaterproofing: DampproofingAndWaterproofingV1 | None = None
|
229
|
+
FlashingAndSheetMetal: FlashingAndSheetMetalV1 | None = None
|
230
|
+
JointProtection: JointProtectionV1 | None = None
|
231
|
+
RoofCoverBoards: RoofCoverBoardsV1 | None = None
|
232
|
+
SteepSlopeRoofing: SteepSlopeRoofingV1 | None = None
|
233
|
+
WeatherBarriers: WeatherBarriersV1 | None = None
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.compat.pydantic import pyd
|
21
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
|
+
from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
|
23
|
+
from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
|
24
|
+
|
25
|
+
|
26
|
+
class BuildingHeatingPipingV1(BaseOpenEpdHierarchicalSpec):
|
27
|
+
"""Building heating piping performance specification."""
|
28
|
+
|
29
|
+
_EXT_VERSION = "1.0"
|
30
|
+
|
31
|
+
|
32
|
+
class BuriedPipingV1(BaseOpenEpdHierarchicalSpec):
|
33
|
+
"""Buried piping performance specification."""
|
34
|
+
|
35
|
+
_EXT_VERSION = "1.0"
|
36
|
+
|
37
|
+
# Own fields:
|
38
|
+
buried_piping_type: list[BuriedPipingType] | None = pyd.Field(
|
39
|
+
default=None, description="", example=["Water Utilities"]
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
class UtilityPipingV1(BaseOpenEpdHierarchicalSpec):
|
44
|
+
"""Utility piping performance specification."""
|
45
|
+
|
46
|
+
_EXT_VERSION = "1.0"
|
47
|
+
|
48
|
+
# Own fields:
|
49
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="6 m")
|
50
|
+
piping_diameter: LengthMmStr | None = pyd.Field(default=None, description="", example="200 mm")
|
51
|
+
mass_per_unit_length: str | None = pyd.Field(default=None, description="", example="1 kg / m")
|
52
|
+
piping_ansi_schedule: PipingAnsiSchedule | None = pyd.Field(default=None, description="", example="5")
|
53
|
+
utility_piping_material: UtilityPipingMaterial | None = pyd.Field(default=None, description="", example="PVC")
|
54
|
+
|
55
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
56
|
+
_piping_diameter_is_quantity_validator = pyd.validator("piping_diameter", allow_reuse=True)(
|
57
|
+
validate_unit_factory("m")
|
58
|
+
)
|
59
|
+
_mass_per_unit_length_is_quantity_validator = pyd.validator("mass_per_unit_length", allow_reuse=True)(
|
60
|
+
validate_unit_factory("kg / m")
|
61
|
+
)
|
62
|
+
|
63
|
+
# Nested specs:
|
64
|
+
BuildingHeatingPiping: BuildingHeatingPipingV1 | None = None
|
65
|
+
BuriedPiping: BuriedPipingV1 | None = None
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.compat.pydantic import pyd
|
21
|
+
from openepd.model.org import OrgRef
|
22
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
23
|
+
from openepd.model.specs.generated.common import HasForestPracticesCertifiers
|
24
|
+
from openepd.model.specs.generated.enums import (
|
25
|
+
AllFabrication,
|
26
|
+
AllTimberSpecies,
|
27
|
+
CompositeLumberFabrication,
|
28
|
+
EngineeredTimberSpecies,
|
29
|
+
MassTimberFabrication,
|
30
|
+
SawnTimberSpecies,
|
31
|
+
SheathingPanelsFabrication,
|
32
|
+
)
|
33
|
+
from openepd.model.validation.numbers import RatioFloat
|
34
|
+
from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
|
35
|
+
|
36
|
+
|
37
|
+
class WoodDeckingV1(BaseOpenEpdHierarchicalSpec):
|
38
|
+
"""Wood used for decking."""
|
39
|
+
|
40
|
+
_EXT_VERSION = "1.0"
|
41
|
+
|
42
|
+
|
43
|
+
class WoodFramingV1(BaseOpenEpdHierarchicalSpec):
|
44
|
+
"""Lumber for framing, typically softwood."""
|
45
|
+
|
46
|
+
_EXT_VERSION = "1.0"
|
47
|
+
|
48
|
+
|
49
|
+
class PrefabricatedWoodInsulatedPanelsV1(BaseOpenEpdHierarchicalSpec):
|
50
|
+
"""Prefabricated wood insulated panels performance specification."""
|
51
|
+
|
52
|
+
_EXT_VERSION = "1.0"
|
53
|
+
|
54
|
+
|
55
|
+
class PrefabricatedWoodTrussV1(BaseOpenEpdHierarchicalSpec):
|
56
|
+
"""Prefabricated wood truss performance specification."""
|
57
|
+
|
58
|
+
_EXT_VERSION = "1.0"
|
59
|
+
|
60
|
+
|
61
|
+
class CompositeLumberV1(BaseOpenEpdHierarchicalSpec):
|
62
|
+
"""Composite lumber performance specification."""
|
63
|
+
|
64
|
+
_EXT_VERSION = "1.0"
|
65
|
+
|
66
|
+
fabrication: CompositeLumberFabrication | None = pyd.Field(default=None, description="", example="LVL")
|
67
|
+
timber_species: EngineeredTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
68
|
+
|
69
|
+
|
70
|
+
class DimensionLumberV1(BaseOpenEpdHierarchicalSpec):
|
71
|
+
"""Dimension lumber performance specification."""
|
72
|
+
|
73
|
+
_EXT_VERSION = "1.0"
|
74
|
+
|
75
|
+
# Nested specs:
|
76
|
+
timber_species: SawnTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
77
|
+
WoodDecking: WoodDeckingV1 | None = None
|
78
|
+
WoodFraming: WoodFramingV1 | None = None
|
79
|
+
|
80
|
+
|
81
|
+
class HeavyTimberV1(BaseOpenEpdHierarchicalSpec):
|
82
|
+
"""Large format natural timber."""
|
83
|
+
|
84
|
+
_EXT_VERSION = "1.0"
|
85
|
+
|
86
|
+
|
87
|
+
class MassTimberV1(BaseOpenEpdHierarchicalSpec):
|
88
|
+
"""Manufactured structural wood elements, such a CLT and LVL."""
|
89
|
+
|
90
|
+
_EXT_VERSION = "1.0"
|
91
|
+
|
92
|
+
fabrication: MassTimberFabrication | None = pyd.Field(default=None, description="", example="CLT")
|
93
|
+
timber_species: EngineeredTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
94
|
+
|
95
|
+
|
96
|
+
class NonStructuralWoodV1(BaseOpenEpdHierarchicalSpec):
|
97
|
+
"""Wood products that are not meant for structural use."""
|
98
|
+
|
99
|
+
_EXT_VERSION = "1.0"
|
100
|
+
|
101
|
+
|
102
|
+
class PrefabricatedWoodV1(BaseOpenEpdHierarchicalSpec):
|
103
|
+
"""Prefabricated wood performance specification."""
|
104
|
+
|
105
|
+
_EXT_VERSION = "1.0"
|
106
|
+
|
107
|
+
# Nested specs:
|
108
|
+
PrefabricatedWoodInsulatedPanels: PrefabricatedWoodInsulatedPanelsV1 | None = None
|
109
|
+
PrefabricatedWoodTruss: PrefabricatedWoodTrussV1 | None = None
|
110
|
+
|
111
|
+
|
112
|
+
class SheathingPanelsV1(BaseOpenEpdHierarchicalSpec):
|
113
|
+
"""Structural Wood Panels."""
|
114
|
+
|
115
|
+
_EXT_VERSION = "1.0"
|
116
|
+
|
117
|
+
# Own fields:
|
118
|
+
fabrication: SheathingPanelsFabrication | None = pyd.Field(default=None, description="", example="Plywood")
|
119
|
+
wood_board_thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
120
|
+
timber_species: EngineeredTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
121
|
+
|
122
|
+
_wood_board_thickness_is_quantity_validator = pyd.validator("wood_board_thickness", allow_reuse=True)(
|
123
|
+
validate_unit_factory("m")
|
124
|
+
)
|
125
|
+
|
126
|
+
|
127
|
+
class UnfinishedWoodV1(BaseOpenEpdHierarchicalSpec):
|
128
|
+
"""Unfinished or 'green' timber."""
|
129
|
+
|
130
|
+
_EXT_VERSION = "1.0"
|
131
|
+
|
132
|
+
|
133
|
+
class WoodV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
|
134
|
+
"""Wood performance specification."""
|
135
|
+
|
136
|
+
_EXT_VERSION = "1.0"
|
137
|
+
|
138
|
+
# Own fields:
|
139
|
+
timber_species: AllTimberSpecies | None = pyd.Field(
|
140
|
+
default=None, description="Timber species", example="Alaska Cedar"
|
141
|
+
)
|
142
|
+
fabrication: AllFabrication | None = pyd.Field(default=None, description="Timber fabrication", example="LVL")
|
143
|
+
forest_practices_certifiers: list[OrgRef] | None = pyd.Field(
|
144
|
+
default=None, description="List of organizations that certify forest practices."
|
145
|
+
)
|
146
|
+
weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed", example=True)
|
147
|
+
fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant", example=True)
|
148
|
+
decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant", example=True)
|
149
|
+
fsc_certified: RatioFloat | None = pyd.Field(
|
150
|
+
default=None, description="Forest Stewardship Council certified proportion", example=0.3, ge=0, le=1
|
151
|
+
)
|
152
|
+
fsc_certified_z: float | None = pyd.Field(default=None, description="", example=0.7)
|
153
|
+
|
154
|
+
recycled_content: RatioFloat | None = pyd.Field(
|
155
|
+
default=None, description="Recycled content", example=0.3, ge=0, le=1
|
156
|
+
)
|
157
|
+
recycled_content_z: float | None = pyd.Field(default=None, description="", example=0.7)
|
158
|
+
|
159
|
+
# Nested specs:
|
160
|
+
CompositeLumber: CompositeLumberV1 | None = None
|
161
|
+
DimensionLumber: DimensionLumberV1 | None = None
|
162
|
+
HeavyTimber: HeavyTimberV1 | None = None
|
163
|
+
MassTimber: MassTimberV1 | None = None
|
164
|
+
NonStructuralWood: NonStructuralWoodV1 | None = None
|
165
|
+
PrefabricatedWood: PrefabricatedWoodV1 | None = None
|
166
|
+
SheathingPanels: SheathingPanelsV1 | None = None
|
167
|
+
UnfinishedWood: UnfinishedWoodV1 | None = None
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.compat.pydantic import pyd
|
21
|
+
from openepd.model.org import OrgRef
|
22
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
23
|
+
from openepd.model.specs.generated.common import HasForestPracticesCertifiers
|
24
|
+
from openepd.model.specs.generated.enums import AllFabrication, AllTimberSpecies
|
25
|
+
|
26
|
+
|
27
|
+
class WoodJoistsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
|
28
|
+
"""Wood joists performance specification."""
|
29
|
+
|
30
|
+
_EXT_VERSION = "1.0"
|
31
|
+
|
32
|
+
# Own fields:
|
33
|
+
timber_species: AllTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
34
|
+
fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
|
35
|
+
forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
|
36
|
+
weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
|
37
|
+
fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
|
38
|
+
decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
openepd/model/specs/glass.py
CHANGED
@@ -22,6 +22,7 @@ from enum import StrEnum
|
|
22
22
|
from openepd.compat.pydantic import pyd
|
23
23
|
from openepd.model.base import BaseOpenEpdSchema
|
24
24
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
25
|
+
from openepd.model.specs.generated.enums import NAFSPerformanceGrade
|
25
26
|
from openepd.model.validation.numbers import PositiveInt, RatioFloat
|
26
27
|
from openepd.model.validation.quantity import HeatConductanceUCIStr, LengthMmStr, PressureMPaStr, QuantityStr
|
27
28
|
|
@@ -179,51 +180,6 @@ class HurricaneResistantMixin(BaseOpenEpdSchema):
|
|
179
180
|
)
|
180
181
|
|
181
182
|
|
182
|
-
class NAFSPerformanceGrade(StrEnum):
|
183
|
-
"""NAFS Performance Grade enum."""
|
184
|
-
|
185
|
-
GRADE_15_PSF = "15 psf"
|
186
|
-
GRADE_20_PSF = "20 psf"
|
187
|
-
GRADE_25_PSF = "25 psf"
|
188
|
-
GRADE_30_PSF = "30 psf"
|
189
|
-
GRADE_35_PSF = "35 psf"
|
190
|
-
GRADE_40_PSF = "40 psf"
|
191
|
-
GRADE_45_PSF = "45 psf"
|
192
|
-
GRADE_50_PSF = "50 psf"
|
193
|
-
GRADE_55_PSF = "55 psf"
|
194
|
-
GRADE_60_PSF = "60 psf"
|
195
|
-
GRADE_65_PSF = "65 psf"
|
196
|
-
GRADE_70_PSF = "70 psf"
|
197
|
-
GRADE_75_PSF = "75 psf"
|
198
|
-
GRADE_80_PSF = "80 psf"
|
199
|
-
GRADE_85_PSF = "85 psf"
|
200
|
-
GRADE_90_PSF = "90 psf"
|
201
|
-
GRADE_95_PSF = "95 psf"
|
202
|
-
GRADE_100_PSF = "100 psf"
|
203
|
-
GRADE_105_PSF = "105 psf"
|
204
|
-
GRADE_110_PSF = "110 psf"
|
205
|
-
GRADE_115_PSF = "115 psf"
|
206
|
-
GRADE_120_PSF = "120 psf"
|
207
|
-
GRADE_125_PSF = "125 psf"
|
208
|
-
GRADE_130_PSF = "130 psf"
|
209
|
-
GRADE_135_PSF = "135 psf"
|
210
|
-
GRADE_140_PSF = "140 psf"
|
211
|
-
GRADE_145_PSF = "145 psf"
|
212
|
-
GRADE_150_PSF = "150 psf"
|
213
|
-
GRADE_155_PSF = "155 psf"
|
214
|
-
GRADE_160_PSF = "160 psf"
|
215
|
-
GRADE_165_PSF = "165 psf"
|
216
|
-
GRADE_170_PSF = "170 psf"
|
217
|
-
GRADE_175_PSF = "175 psf"
|
218
|
-
GRADE_180_PSF = "180 psf"
|
219
|
-
GRADE_185_PSF = "185 psf"
|
220
|
-
GRADE_190_PSF = "190 psf"
|
221
|
-
GRADE_195_PSF = "195 psf"
|
222
|
-
GRADE_200_PSF = "200 psf"
|
223
|
-
GRADE_205_PSF = "205 psf"
|
224
|
-
GRADE_210_PSF = "210 psf"
|
225
|
-
|
226
|
-
|
227
183
|
class SpacerEnum(StrEnum):
|
228
184
|
"""Spacer enum."""
|
229
185
|
|
openepd/model/specs/steel.py
CHANGED
@@ -23,6 +23,7 @@ from openepd.compat.pydantic import pyd
|
|
23
23
|
from openepd.model.base import BaseOpenEpdSchema
|
24
24
|
from openepd.model.common import OpenEPDUnit
|
25
25
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
26
|
+
from openepd.model.specs.generated.enums import SteelComposition
|
26
27
|
from openepd.model.standard import Standard
|
27
28
|
from openepd.model.validation.numbers import RatioFloat
|
28
29
|
from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
|
@@ -36,16 +37,6 @@ class SteelMakingRoute(BaseOpenEpdSchema):
|
|
36
37
|
ohf: bool | None = pyd.Field(default=None, description="Open hearth furnace")
|
37
38
|
|
38
39
|
|
39
|
-
class SteelComposition(StrEnum):
|
40
|
-
"""Steel composition enum."""
|
41
|
-
|
42
|
-
CARBON = "Carbon"
|
43
|
-
ALLOY = "Alloy"
|
44
|
-
STAINLESS = "Stainless"
|
45
|
-
TOOL = "Tool"
|
46
|
-
OTHER = "Other"
|
47
|
-
|
48
|
-
|
49
40
|
class FabricatedOptionsMixin(pyd.BaseModel):
|
50
41
|
"""Fabricated options mixin."""
|
51
42
|
|
@@ -123,9 +123,10 @@ def validate_quantity_le_factory(max_value: str) -> "QuantityValidatorType":
|
|
123
123
|
QuantityStr: TypeAlias = Annotated[str, pyd.Field()]
|
124
124
|
PressureMPaStr: TypeAlias = Annotated[str, pyd.Field(example="30 MPa")]
|
125
125
|
MassKgStr: TypeAlias = Annotated[str, pyd.Field(example="30 kg")]
|
126
|
-
|
127
|
-
|
128
|
-
|
126
|
+
AreaM2Str: TypeAlias = Annotated[str, pyd.Field(example="12 m2", gt=0)]
|
127
|
+
LengthMStr: TypeAlias = Annotated[str, pyd.Field(example="30 m", gt=0)]
|
128
|
+
LengthMmStr: TypeAlias = Annotated[str, pyd.Field(example="30 mm", gt=0)]
|
129
|
+
LengthInchStr: TypeAlias = Annotated[str, pyd.Field(example="30 m", gt=0)]
|
129
130
|
TemperatureCStr: TypeAlias = Annotated[str, pyd.Field(example="45 C")]
|
130
131
|
HeatConductanceUCIStr: TypeAlias = Annotated[str, pyd.Field(example="0.3 U")]
|
131
132
|
GwpKgCo2eStr: TypeAlias = Annotated[str, pyd.Field(example="300 kgCO2e")]
|