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.
Files changed (48) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/model/specs/__init__.py +71 -19
  3. openepd/model/specs/aluminium.py +1 -1
  4. openepd/model/specs/concrete.py +19 -177
  5. openepd/model/specs/generated/accessories.py +63 -0
  6. openepd/model/specs/generated/aggregates.py +71 -0
  7. openepd/model/specs/generated/aluminium.py +66 -0
  8. openepd/model/specs/generated/asphalt.py +86 -0
  9. openepd/model/specs/generated/bulk_materials.py +26 -0
  10. openepd/model/specs/generated/cast_decks_and_underlayment.py +26 -0
  11. openepd/model/specs/generated/cladding.py +214 -0
  12. openepd/model/specs/generated/cmu.py +46 -0
  13. openepd/model/specs/generated/common.py +27 -0
  14. openepd/model/specs/generated/concrete.py +151 -0
  15. openepd/model/specs/generated/conveying_equipment.py +57 -0
  16. openepd/model/specs/generated/electrical.py +297 -0
  17. openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +63 -0
  18. openepd/model/specs/generated/electricity.py +26 -0
  19. openepd/model/specs/generated/enums.py +2420 -0
  20. openepd/model/specs/generated/finishes.py +519 -0
  21. openepd/model/specs/generated/fire_and_smoke_protection.py +79 -0
  22. openepd/model/specs/generated/furnishings.py +95 -0
  23. openepd/model/specs/generated/grouting.py +26 -0
  24. openepd/model/specs/generated/manufacturing_inputs.py +131 -0
  25. openepd/model/specs/generated/masonry.py +77 -0
  26. openepd/model/specs/generated/material_handling.py +35 -0
  27. openepd/model/specs/generated/mechanical.py +271 -0
  28. openepd/model/specs/generated/mechanical_insulation.py +41 -0
  29. openepd/model/specs/generated/network_infrastructure.py +181 -0
  30. openepd/model/specs/generated/openings.py +423 -0
  31. openepd/model/specs/generated/other_electrical_equipment.py +26 -0
  32. openepd/model/specs/generated/other_materials.py +123 -0
  33. openepd/model/specs/generated/plumbing.py +153 -0
  34. openepd/model/specs/generated/precast_concrete.py +68 -0
  35. openepd/model/specs/generated/sheathing.py +74 -0
  36. openepd/model/specs/generated/steel.py +224 -0
  37. openepd/model/specs/generated/thermal_moisture_protection.py +233 -0
  38. openepd/model/specs/generated/utility_piping.py +65 -0
  39. openepd/model/specs/generated/wood.py +167 -0
  40. openepd/model/specs/generated/wood_joists.py +38 -0
  41. openepd/model/specs/glass.py +1 -45
  42. openepd/model/specs/steel.py +1 -10
  43. openepd/model/validation/quantity.py +4 -3
  44. {openepd-3.0.0.dist-info → openepd-3.1.1.dist-info}/METADATA +1 -1
  45. openepd-3.1.1.dist-info/RECORD +95 -0
  46. openepd-3.0.0.dist-info/RECORD +0 -59
  47. {openepd-3.0.0.dist-info → openepd-3.1.1.dist-info}/LICENSE +0 -0
  48. {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)
@@ -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
 
@@ -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
- LengthMmStr: TypeAlias = Annotated[str, pyd.Field(example="30 mm")]
127
- AreaM2Str: TypeAlias = Annotated[str, pyd.Field(example="12 m2")]
128
- LengthMStr: TypeAlias = Annotated[str, pyd.Field(example="30 m")]
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")]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 3.0.0
3
+ Version: 3.1.1
4
4
  Summary: Python library to work with OpenEPD format
5
5
  Home-page: https://github.com/cchangelabs/openepd
6
6
  License: Apache-2.0