openepd 3.0.0__py3-none-any.whl → 3.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +1 -167
  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.0.dist-info}/METADATA +1 -1
  45. openepd-3.1.0.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.0.dist-info}/LICENSE +0 -0
  48. {openepd-3.0.0.dist-info → openepd-3.1.0.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