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,519 @@
|
|
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
|
+
AccessFlooringCoreMaterial,
|
26
|
+
AccessFlooringFinishMaterial,
|
27
|
+
AccessFlooringSeismicRating,
|
28
|
+
AccessFlooringStringers,
|
29
|
+
AllFabrication,
|
30
|
+
CarpetFormFactor,
|
31
|
+
CarpetIntendedApplication,
|
32
|
+
CarpetManufactureType,
|
33
|
+
CarpetYarnType,
|
34
|
+
CeilingPanelCoreMaterial,
|
35
|
+
CeilingPanelFireRating,
|
36
|
+
CementBoardThickness,
|
37
|
+
DeckingBoardMaterial,
|
38
|
+
GypsumFacing,
|
39
|
+
GypsumFireRating,
|
40
|
+
GypsumThickness,
|
41
|
+
ResilientFlooringFormFactor,
|
42
|
+
ResilientFlooringMaterial,
|
43
|
+
ResilientFlooringThickness,
|
44
|
+
SawnTimberSpecies,
|
45
|
+
VinylSheetConstruction,
|
46
|
+
WallBaseMaterial,
|
47
|
+
WoodFlooringFabrication,
|
48
|
+
WoodFlooringTimberSpecies,
|
49
|
+
)
|
50
|
+
from openepd.model.validation.numbers import RatioFloat
|
51
|
+
from openepd.model.validation.quantity import (
|
52
|
+
GwpKgCo2eStr,
|
53
|
+
LengthMmStr,
|
54
|
+
LengthMStr,
|
55
|
+
PressureMPaStr,
|
56
|
+
validate_quantity_ge_factory,
|
57
|
+
validate_quantity_le_factory,
|
58
|
+
validate_unit_factory,
|
59
|
+
)
|
60
|
+
|
61
|
+
|
62
|
+
class AccessFlooringV1(BaseOpenEpdHierarchicalSpec):
|
63
|
+
"""Access flooring performance specification."""
|
64
|
+
|
65
|
+
_EXT_VERSION = "1.0"
|
66
|
+
|
67
|
+
# Own fields:
|
68
|
+
core_material: AccessFlooringCoreMaterial | None = pyd.Field(default=None, description="", example="Cementitious")
|
69
|
+
finish_material: AccessFlooringFinishMaterial | None = pyd.Field(default=None, description="", example="Linoleum")
|
70
|
+
stringers: AccessFlooringStringers | None = pyd.Field(default=None, description="", example="Standard")
|
71
|
+
seismic_rating: AccessFlooringSeismicRating | None = pyd.Field(default=None, description="", example="Type 0")
|
72
|
+
magnetically_attached_finish: bool | None = pyd.Field(default=None, description="", example=True)
|
73
|
+
permanent_finish: bool | None = pyd.Field(default=None, description="", example=True)
|
74
|
+
drylay: bool | None = pyd.Field(default=None, description="", example=True)
|
75
|
+
adjustable_height: bool | None = pyd.Field(default=None, description="", example=True)
|
76
|
+
fixed_height: bool | None = pyd.Field(default=None, description="", example=True)
|
77
|
+
finished_floor_height: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
|
78
|
+
panel_thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
|
79
|
+
concentrated_load: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
|
80
|
+
uniform_load: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
|
81
|
+
rolling_load_10_pass: str | None = pyd.Field(default=None, description="", example="1 N")
|
82
|
+
rolling_load_10000_pass: str | None = pyd.Field(default=None, description="", example="1 N")
|
83
|
+
|
84
|
+
_access_flooring_finished_floor_height_is_quantity_validator = pyd.validator(
|
85
|
+
"finished_floor_height", allow_reuse=True
|
86
|
+
)(validate_unit_factory("m"))
|
87
|
+
_access_flooring_panel_thickness_is_quantity_validator = pyd.validator("panel_thickness", allow_reuse=True)(
|
88
|
+
validate_unit_factory("m")
|
89
|
+
)
|
90
|
+
_access_flooring_concentrated_load_is_quantity_validator = pyd.validator("concentrated_load", allow_reuse=True)(
|
91
|
+
validate_unit_factory("MPa")
|
92
|
+
)
|
93
|
+
_access_flooring_uniform_load_is_quantity_validator = pyd.validator("uniform_load", allow_reuse=True)(
|
94
|
+
validate_unit_factory("MPa")
|
95
|
+
)
|
96
|
+
_access_flooring_rolling_load_10_pass_is_quantity_validator = pyd.validator(
|
97
|
+
"rolling_load_10_pass", allow_reuse=True
|
98
|
+
)(validate_unit_factory("N"))
|
99
|
+
_access_flooring_rolling_load_10000_pass_is_quantity_validator = pyd.validator(
|
100
|
+
"rolling_load_10000_pass", allow_reuse=True
|
101
|
+
)(validate_unit_factory("N"))
|
102
|
+
|
103
|
+
|
104
|
+
class CarpetV1(BaseOpenEpdHierarchicalSpec):
|
105
|
+
"""Carpet performance specification."""
|
106
|
+
|
107
|
+
_EXT_VERSION = "1.0"
|
108
|
+
|
109
|
+
# Own fields:
|
110
|
+
length: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
111
|
+
width: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
112
|
+
intended_application: list[CarpetIntendedApplication] | None = pyd.Field(
|
113
|
+
default=None, description="", example=["Res"]
|
114
|
+
)
|
115
|
+
manufacture_type: CarpetManufactureType | None = pyd.Field(default=None, description="", example="Tufted")
|
116
|
+
form_factor: CarpetFormFactor | None = pyd.Field(default=None, description="", example="Tiles")
|
117
|
+
yarn_weight: str | None = pyd.Field(default=None, description="", example="1 g / m2")
|
118
|
+
yarn_type: CarpetYarnType | None = pyd.Field(default=None, description="", example="Nylon 6,6")
|
119
|
+
fire_radiant_panel_rating_astme648: str | None = pyd.Field(default=None, description="")
|
120
|
+
fire_smoke_density_rating_astme648: str | None = pyd.Field(default=None, description="")
|
121
|
+
voc_emissions: str | None = pyd.Field(default=None, description="", example="test_valueValidatedStringProperty")
|
122
|
+
cushioned: bool | None = pyd.Field(default=None, description="", example=True)
|
123
|
+
bleachable: bool | None = pyd.Field(default=None, description="", example=True)
|
124
|
+
gwp_factor_base: GwpKgCo2eStr | None = pyd.Field(default=None, description="", example="1 kgCO2e")
|
125
|
+
gwp_factor_yarn: GwpKgCo2eStr | None = pyd.Field(default=None, description="", example="1 kgCO2e")
|
126
|
+
|
127
|
+
_length_is_quantity_validator = pyd.validator("length", allow_reuse=True)(validate_unit_factory("m"))
|
128
|
+
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
129
|
+
_yarn_weight_is_quantity_validator = pyd.validator("yarn_weight", allow_reuse=True)(validate_unit_factory("g / m2"))
|
130
|
+
_gwp_factor_base_is_quantity_validator = pyd.validator("gwp_factor_base", allow_reuse=True)(
|
131
|
+
validate_unit_factory("kgCO2e")
|
132
|
+
)
|
133
|
+
_gwp_factor_yarn_is_quantity_validator = pyd.validator("gwp_factor_yarn", allow_reuse=True)(
|
134
|
+
validate_unit_factory("kgCO2e")
|
135
|
+
)
|
136
|
+
|
137
|
+
|
138
|
+
class LaminateV1(BaseOpenEpdHierarchicalSpec):
|
139
|
+
"""Laminate performance specification."""
|
140
|
+
|
141
|
+
_EXT_VERSION = "1.0"
|
142
|
+
|
143
|
+
|
144
|
+
class OtherFlooringV1(BaseOpenEpdHierarchicalSpec):
|
145
|
+
"""Other flooring performance specification."""
|
146
|
+
|
147
|
+
_EXT_VERSION = "1.0"
|
148
|
+
|
149
|
+
|
150
|
+
class ResilientFlooringV1(BaseOpenEpdHierarchicalSpec):
|
151
|
+
"""Resilient flooring performance specification."""
|
152
|
+
|
153
|
+
_EXT_VERSION = "1.0"
|
154
|
+
|
155
|
+
# Own fields:
|
156
|
+
length: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
157
|
+
width: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
158
|
+
form_factor: ResilientFlooringFormFactor | None = pyd.Field(default=None, description="", example="Loose Lay")
|
159
|
+
material: ResilientFlooringMaterial | None = pyd.Field(default=None, description="", example="VCT")
|
160
|
+
sheet_construction: VinylSheetConstruction | None = pyd.Field(default=None, description="", example="Homogeneous")
|
161
|
+
wear_layer: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
|
162
|
+
delta_iic: float | None = pyd.Field(default=None, description="", example=2.3)
|
163
|
+
thickness: ResilientFlooringThickness | None = pyd.Field(default=None, description="", example="≤ 2mm")
|
164
|
+
sport_flooring: bool | None = pyd.Field(default=None, description="", example=True)
|
165
|
+
conductive_flooring: bool | None = pyd.Field(default=None, description="", example=True)
|
166
|
+
zwtl: bool | None = pyd.Field(default=None, description="", example=True)
|
167
|
+
floor_score: bool | None = pyd.Field(default=None, description="", example=True)
|
168
|
+
nsf332: bool | None = pyd.Field(default=None, description="", example=True)
|
169
|
+
|
170
|
+
_length_is_quantity_validator = pyd.validator("length", allow_reuse=True)(validate_unit_factory("m"))
|
171
|
+
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
172
|
+
_resilient_flooring_wear_layer_is_quantity_validator = pyd.validator("wear_layer", allow_reuse=True)(
|
173
|
+
validate_unit_factory("m")
|
174
|
+
)
|
175
|
+
|
176
|
+
|
177
|
+
class WallBaseV1(BaseOpenEpdHierarchicalSpec):
|
178
|
+
"""Wall base performance specification."""
|
179
|
+
|
180
|
+
_EXT_VERSION = "1.0"
|
181
|
+
|
182
|
+
# Own fields:
|
183
|
+
wall_base_material: WallBaseMaterial | None = pyd.Field(default=None, description="", example="Rubber")
|
184
|
+
|
185
|
+
|
186
|
+
class WoodFlooringV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
|
187
|
+
"""Wood flooring performance specification."""
|
188
|
+
|
189
|
+
_EXT_VERSION = "1.0"
|
190
|
+
|
191
|
+
# Own fields:
|
192
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
193
|
+
timber_species: WoodFlooringTimberSpecies | None = pyd.Field(default=None, description="", example="Oak")
|
194
|
+
fabrication: WoodFlooringFabrication | None = pyd.Field(default=None, description="", example="Solid hardwood")
|
195
|
+
forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
|
196
|
+
|
197
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
198
|
+
|
199
|
+
|
200
|
+
class AcousticalCeilingsV1(BaseOpenEpdHierarchicalSpec):
|
201
|
+
"""Acoustical ceilings performance specification."""
|
202
|
+
|
203
|
+
_EXT_VERSION = "1.0"
|
204
|
+
|
205
|
+
# Own fields:
|
206
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
207
|
+
|
208
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
209
|
+
|
210
|
+
|
211
|
+
class CeramicTileV1(BaseOpenEpdHierarchicalSpec):
|
212
|
+
"""Ceramic tile performance specification."""
|
213
|
+
|
214
|
+
_EXT_VERSION = "1.0"
|
215
|
+
|
216
|
+
# Own fields:
|
217
|
+
porcelain: bool | None = pyd.Field(
|
218
|
+
default=None, description="A dense and durable ceramic tile made from fine porcelain clay.", example=True
|
219
|
+
)
|
220
|
+
quarry: bool | None = pyd.Field(
|
221
|
+
default=None,
|
222
|
+
description="A type of unglazed ceramic tile made from natural clay with a slightly rough texture.",
|
223
|
+
example=True,
|
224
|
+
)
|
225
|
+
pressed_floor_tile: bool | None = pyd.Field(
|
226
|
+
default=None,
|
227
|
+
description="A durable and low-maintenance type of tile made by compressing clay or "
|
228
|
+
"other materials at high pressure.",
|
229
|
+
example=True,
|
230
|
+
)
|
231
|
+
wall_tile: bool | None = pyd.Field(
|
232
|
+
default=None,
|
233
|
+
description="A decorative tile designed for use on vertical surfaces such as walls or backsplashes.",
|
234
|
+
example=True,
|
235
|
+
)
|
236
|
+
mosaic_tile: bool | None = pyd.Field(
|
237
|
+
default=None,
|
238
|
+
description="A small decorative tile made of glass, stone, or ceramic, arranged in a pattern "
|
239
|
+
"to create a design.",
|
240
|
+
example=True,
|
241
|
+
)
|
242
|
+
specialty: bool | None = pyd.Field(
|
243
|
+
default=None,
|
244
|
+
description="A unique and customized type of tile, often made from unconventional materials or with "
|
245
|
+
"specialized designs or finishes.",
|
246
|
+
example=True,
|
247
|
+
)
|
248
|
+
|
249
|
+
|
250
|
+
class GaugedTileV1(BaseOpenEpdHierarchicalSpec):
|
251
|
+
"""Gauged tile performance specification."""
|
252
|
+
|
253
|
+
_EXT_VERSION = "1.0"
|
254
|
+
|
255
|
+
# Own fields:
|
256
|
+
tile_panels: bool | None = pyd.Field(
|
257
|
+
default=None,
|
258
|
+
description="Large-format porcelain or natural stone tiles that are typically over 3 feet in length and width, "
|
259
|
+
"designed for use in floor and wall installations to create a seamless and uninterrupted "
|
260
|
+
"appearance.",
|
261
|
+
example=True,
|
262
|
+
)
|
263
|
+
tile_pavers: bool | None = pyd.Field(
|
264
|
+
default=None,
|
265
|
+
description="Thick and durable porcelain or natural stone tiles that are commonly used in outdoor "
|
266
|
+
"applications, such as patios, walkways, and driveways, due to their high resistance to weather "
|
267
|
+
"and wear.",
|
268
|
+
example=True,
|
269
|
+
)
|
270
|
+
|
271
|
+
|
272
|
+
class GlassTileV1(BaseOpenEpdHierarchicalSpec):
|
273
|
+
"""Glass tile performance specification."""
|
274
|
+
|
275
|
+
_EXT_VERSION = "1.0"
|
276
|
+
|
277
|
+
# Own fields:
|
278
|
+
regular: bool | None = pyd.Field(
|
279
|
+
default=None,
|
280
|
+
description="Glass tile that is typically square or rectangular in shape, and used for a variety of "
|
281
|
+
"decorative applications, such as kitchen backsplashes, shower walls, and accent borders.",
|
282
|
+
example=True,
|
283
|
+
)
|
284
|
+
glass_mosaic: bool | None = pyd.Field(
|
285
|
+
default=None,
|
286
|
+
description="A small, decorative glass tile made in a variety of shapes and colors, used for intricate "
|
287
|
+
"designs and patterns on walls, floors, and other surfaces.",
|
288
|
+
example=True,
|
289
|
+
)
|
290
|
+
miniature_mosaic: bool | None = pyd.Field(
|
291
|
+
default=None,
|
292
|
+
description="Glass mosaic tile that is smaller in size than regular glass mosaic tile, often used for "
|
293
|
+
"intricate details and designs in backsplashes, shower walls, and decorative accents.",
|
294
|
+
example=True,
|
295
|
+
)
|
296
|
+
large_format: bool | None = pyd.Field(
|
297
|
+
default=None,
|
298
|
+
description="Glass tile that is larger in size than regular glass tile, often used to create a dramatic and "
|
299
|
+
"modern effect in commercial and residential spaces.",
|
300
|
+
example=True,
|
301
|
+
)
|
302
|
+
|
303
|
+
|
304
|
+
class GypsumSupportsV1(BaseOpenEpdHierarchicalSpec):
|
305
|
+
"""Gypsum supports performance specification."""
|
306
|
+
|
307
|
+
_EXT_VERSION = "1.0"
|
308
|
+
|
309
|
+
|
310
|
+
class FlooringV1(BaseOpenEpdHierarchicalSpec):
|
311
|
+
"""Flooring performance specification."""
|
312
|
+
|
313
|
+
_EXT_VERSION = "1.0"
|
314
|
+
|
315
|
+
# Nested specs:
|
316
|
+
AccessFlooring: AccessFlooringV1 | None = None
|
317
|
+
Carpet: CarpetV1 | None = None
|
318
|
+
Laminate: LaminateV1 | None = None
|
319
|
+
OtherFlooring: OtherFlooringV1 | None = None
|
320
|
+
ResilientFlooring: ResilientFlooringV1 | None = None
|
321
|
+
WallBase: WallBaseV1 | None = None
|
322
|
+
WoodFlooring: WoodFlooringV1 | None = None
|
323
|
+
|
324
|
+
|
325
|
+
class CeilingPanelV1(BaseOpenEpdHierarchicalSpec):
|
326
|
+
"""Ceiling panel performance specification."""
|
327
|
+
|
328
|
+
_EXT_VERSION = "1.0"
|
329
|
+
"""Modular Ceiling Panels"""
|
330
|
+
|
331
|
+
# Own fields:
|
332
|
+
fire_rating: CeilingPanelFireRating | None = pyd.Field(default=None, description="", example="Class A")
|
333
|
+
core_material: CeilingPanelCoreMaterial | None = pyd.Field(default=None, description="", example="Fiberglass")
|
334
|
+
nrc: RatioFloat | None = pyd.Field(
|
335
|
+
default=None,
|
336
|
+
description="Noise Reduction Coefficient (NRC) or Sound Absorbtion Average (SAA) per ASTM C423",
|
337
|
+
example=0.5,
|
338
|
+
ge=0,
|
339
|
+
le=1,
|
340
|
+
)
|
341
|
+
cac: int | None = pyd.Field(
|
342
|
+
default=None, description="Ceiling Attenuation Class (CAC) per ASTM E1414", example=13, ge=10, le=50
|
343
|
+
)
|
344
|
+
|
345
|
+
# Nested specs:
|
346
|
+
AcousticalCeilings: AcousticalCeilingsV1 | None = None
|
347
|
+
|
348
|
+
|
349
|
+
class BackingAndUnderlayV1(BaseOpenEpdHierarchicalSpec):
|
350
|
+
"""Backing and underlay performance specification."""
|
351
|
+
|
352
|
+
_EXT_VERSION = "1.0"
|
353
|
+
|
354
|
+
|
355
|
+
class CementBoardV1(BaseOpenEpdHierarchicalSpec):
|
356
|
+
"""Cement board performance specification."""
|
357
|
+
|
358
|
+
_EXT_VERSION = "1.0"
|
359
|
+
|
360
|
+
# Own fields:
|
361
|
+
thickness: CementBoardThickness | None = pyd.Field(
|
362
|
+
default=None, description="", example=str(CementBoardThickness.INCH_1_2)
|
363
|
+
)
|
364
|
+
|
365
|
+
_cement_board_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(
|
366
|
+
validate_unit_factory("m")
|
367
|
+
)
|
368
|
+
|
369
|
+
|
370
|
+
class TilingV1(BaseOpenEpdHierarchicalSpec):
|
371
|
+
"""Tiling performance specification."""
|
372
|
+
|
373
|
+
_EXT_VERSION = "1.0"
|
374
|
+
|
375
|
+
# Own fields:
|
376
|
+
thickness: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
377
|
+
flooring: bool | None = pyd.Field(default=None, description="Tiling intended for walking.", example=True)
|
378
|
+
wall_finish: bool | None = pyd.Field(
|
379
|
+
default=None,
|
380
|
+
description="A decorative tile designed for use on vertical surfaces such as walls or backsplashes.",
|
381
|
+
example=True,
|
382
|
+
)
|
383
|
+
cladding: bool | None = pyd.Field(
|
384
|
+
default=None,
|
385
|
+
description="Tiling for exterior use, primarily used for the walls of buildings and structures, providing a "
|
386
|
+
"protective and decorative layer that enhances the aesthetic appearance and weather resistance "
|
387
|
+
"of the underlying structure.",
|
388
|
+
example=True,
|
389
|
+
)
|
390
|
+
other: bool | None = pyd.Field(
|
391
|
+
default=None, description="Tiling used as countertops, ceilings, furnishings, hardscapes etc.", example=True
|
392
|
+
)
|
393
|
+
residential_only: bool | None = pyd.Field(
|
394
|
+
default=None,
|
395
|
+
description="All commercial tile can also be used in residential applications, but the opposite may not be "
|
396
|
+
"true. This selection allows to filter out tiling that is not intended for commercial "
|
397
|
+
"applications.",
|
398
|
+
example=True,
|
399
|
+
)
|
400
|
+
reinforced: bool | None = pyd.Field(
|
401
|
+
default=None,
|
402
|
+
description="Steel-reinforced ceramic tiles or tiles with other special reinforcing technology.",
|
403
|
+
example=True,
|
404
|
+
)
|
405
|
+
total_recycled_content: RatioFloat | None = pyd.Field(
|
406
|
+
default=None,
|
407
|
+
description="Proportion of this product that is sourced from recycled content. Pre-consumer recycling is "
|
408
|
+
"given a 50% weighting, 100% for post-consumer, by mass.",
|
409
|
+
example=0.5,
|
410
|
+
ge=0,
|
411
|
+
le=1,
|
412
|
+
)
|
413
|
+
post_consumer_recycled_content: RatioFloat | None = pyd.Field(
|
414
|
+
default=None,
|
415
|
+
description="Proportion of this product that is sourced from post-consumer recycled content, by mass.",
|
416
|
+
example=0.5,
|
417
|
+
ge=0,
|
418
|
+
le=1,
|
419
|
+
)
|
420
|
+
|
421
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
422
|
+
_thickness_min_validator = pyd.validator("thickness", allow_reuse=True)(validate_quantity_ge_factory("0 mm"))
|
423
|
+
_thickness_max_validator = pyd.validator("thickness", allow_reuse=True)(validate_quantity_le_factory("50 mm"))
|
424
|
+
|
425
|
+
# Nested specs:
|
426
|
+
CeramicTile: CeramicTileV1 | None = None
|
427
|
+
GaugedTile: GaugedTileV1 | None = None
|
428
|
+
GlassTile: GlassTileV1 | None = None
|
429
|
+
|
430
|
+
|
431
|
+
class DeckingBoardsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
|
432
|
+
"""Decking boards performance specification."""
|
433
|
+
|
434
|
+
_EXT_VERSION = "1.0"
|
435
|
+
|
436
|
+
# Own fields:
|
437
|
+
timber_species: SawnTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
|
438
|
+
fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
|
439
|
+
forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
|
440
|
+
weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
|
441
|
+
fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
|
442
|
+
decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
443
|
+
material: DeckingBoardMaterial | None = pyd.Field(default=None, description="", example="Wood")
|
444
|
+
|
445
|
+
|
446
|
+
class GlassFiberReinforcedGypsumFabricationsV1(BaseOpenEpdHierarchicalSpec):
|
447
|
+
"""Glass fiber reinforced gypsum fabrications performance specification."""
|
448
|
+
|
449
|
+
_EXT_VERSION = "1.0"
|
450
|
+
|
451
|
+
|
452
|
+
class GypsumV1(BaseOpenEpdHierarchicalSpec):
|
453
|
+
"""Gypsum Sheet and Board."""
|
454
|
+
|
455
|
+
_EXT_VERSION = "1.0"
|
456
|
+
|
457
|
+
# Own fields:
|
458
|
+
fire_rating: GypsumFireRating | None = pyd.Field(default=None, description="", example="-")
|
459
|
+
thickness: GypsumThickness | None = pyd.Field(default=None, description="", example="1 m")
|
460
|
+
facing: GypsumFacing | None = pyd.Field(default=None, description="", example="Paper")
|
461
|
+
r_factor: str | None = pyd.Field(default=None, description="", example="1 RSI")
|
462
|
+
flame_spread_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
|
463
|
+
smoke_production_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
|
464
|
+
surface_abrasion_d4977: int | None = pyd.Field(default=None, description="", example=3)
|
465
|
+
indentation_d5420: int | None = pyd.Field(default=None, description="", example=3)
|
466
|
+
soft_body_impact_e695: int | None = pyd.Field(default=None, description="", example=3)
|
467
|
+
hard_body_impact_c1929: int | None = pyd.Field(default=None, description="", example=3)
|
468
|
+
mold_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
469
|
+
foil_backing: bool | None = pyd.Field(default=None, description="", example=True)
|
470
|
+
moisture_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
471
|
+
abuse_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
472
|
+
|
473
|
+
_gypsum_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
474
|
+
_gypsum_r_factor_is_quantity_validator = pyd.validator("r_factor", allow_reuse=True)(validate_unit_factory("RSI"))
|
475
|
+
|
476
|
+
# Nested specs:
|
477
|
+
GypsumSupports: GypsumSupportsV1 | None = None
|
478
|
+
|
479
|
+
|
480
|
+
class MirrorsV1(BaseOpenEpdHierarchicalSpec):
|
481
|
+
"""Mirrors performance specification."""
|
482
|
+
|
483
|
+
_EXT_VERSION = "1.0"
|
484
|
+
|
485
|
+
|
486
|
+
class PaintingAndCoatingV1(BaseOpenEpdHierarchicalSpec):
|
487
|
+
"""Painting and coating performance specification."""
|
488
|
+
|
489
|
+
_EXT_VERSION = "1.0"
|
490
|
+
|
491
|
+
|
492
|
+
class WallFinishesV1(BaseOpenEpdHierarchicalSpec):
|
493
|
+
"""Wall finishes performance specification."""
|
494
|
+
|
495
|
+
_EXT_VERSION = "1.0"
|
496
|
+
|
497
|
+
# Own fields:
|
498
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
499
|
+
|
500
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
501
|
+
|
502
|
+
|
503
|
+
class FinishesV1(BaseOpenEpdHierarchicalSpec):
|
504
|
+
"""Finishes performance specification."""
|
505
|
+
|
506
|
+
_EXT_VERSION = "1.0"
|
507
|
+
|
508
|
+
# Nested specs:
|
509
|
+
Flooring: FlooringV1 | None = None
|
510
|
+
CeilingPanel: CeilingPanelV1 | None = None
|
511
|
+
BackingAndUnderlay: BackingAndUnderlayV1 | None = None
|
512
|
+
CementBoard: CementBoardV1 | None = None
|
513
|
+
Tiling: TilingV1 | None = None
|
514
|
+
DeckingBoards: DeckingBoardsV1 | None = None
|
515
|
+
GlassFiberReinforcedGypsumFabrications: GlassFiberReinforcedGypsumFabricationsV1 | None = None
|
516
|
+
Gypsum: GypsumV1 | None = None
|
517
|
+
Mirrors: MirrorsV1 | None = None
|
518
|
+
PaintingAndCoating: PaintingAndCoatingV1 | None = None
|
519
|
+
WallFinishes: WallFinishesV1 | None = None
|
@@ -0,0 +1,79 @@
|
|
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
|
+
IntumescentFireproofingMaterialType,
|
24
|
+
SprayFireproofingDensity,
|
25
|
+
SprayFireproofingMaterialType,
|
26
|
+
)
|
27
|
+
from openepd.model.validation.quantity import LengthMmStr, validate_unit_factory
|
28
|
+
|
29
|
+
|
30
|
+
class IntumescentFireproofingV1(BaseOpenEpdHierarchicalSpec):
|
31
|
+
"""Intumescent fireproofing performance specification."""
|
32
|
+
|
33
|
+
_EXT_VERSION = "1.0"
|
34
|
+
|
35
|
+
# Own fields:
|
36
|
+
material_type: IntumescentFireproofingMaterialType | None = pyd.Field(default=None, description="", example="Epoxy")
|
37
|
+
|
38
|
+
|
39
|
+
class SprayFireproofingV1(BaseOpenEpdHierarchicalSpec):
|
40
|
+
"""Spray fireproofing performance specification."""
|
41
|
+
|
42
|
+
_EXT_VERSION = "1.0"
|
43
|
+
|
44
|
+
# Own fields:
|
45
|
+
material_type: SprayFireproofingMaterialType | None = pyd.Field(
|
46
|
+
default=None, description="", example="Gypsum-based"
|
47
|
+
)
|
48
|
+
density: SprayFireproofingDensity | None = pyd.Field(default=None, description="", example="Standard")
|
49
|
+
|
50
|
+
|
51
|
+
class AppliedFireproofingV1(BaseOpenEpdHierarchicalSpec):
|
52
|
+
"""Applied fireproofing performance specification."""
|
53
|
+
|
54
|
+
_EXT_VERSION = "1.0"
|
55
|
+
|
56
|
+
# Own fields:
|
57
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
|
58
|
+
|
59
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
60
|
+
|
61
|
+
# Nested specs:
|
62
|
+
IntumescentFireproofing: IntumescentFireproofingV1 | None = None
|
63
|
+
SprayFireproofing: SprayFireproofingV1 | None = None
|
64
|
+
|
65
|
+
|
66
|
+
class FirestoppingV1(BaseOpenEpdHierarchicalSpec):
|
67
|
+
"""Firestopping performance specification."""
|
68
|
+
|
69
|
+
_EXT_VERSION = "1.0"
|
70
|
+
|
71
|
+
|
72
|
+
class FireAndSmokeProtectionV1(BaseOpenEpdHierarchicalSpec):
|
73
|
+
"""Fire and smoke protection performance specification."""
|
74
|
+
|
75
|
+
_EXT_VERSION = "1.0"
|
76
|
+
|
77
|
+
# Nested specs:
|
78
|
+
AppliedFireproofing: AppliedFireproofingV1 | None = None
|
79
|
+
Firestopping: FirestoppingV1 | None = None
|