openepd 6.13.2__py3-none-any.whl → 7.0.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 (99) hide show
  1. openepd/__init__.py +4 -4
  2. openepd/__version__.py +1 -1
  3. openepd/api/average_dataset/generic_estimate_sync_api.py +11 -10
  4. openepd/api/average_dataset/industry_epd_sync_api.py +9 -8
  5. openepd/api/base_sync_client.py +53 -9
  6. openepd/api/category/sync_api.py +1 -1
  7. openepd/api/dto/base.py +4 -4
  8. openepd/api/dto/common.py +24 -16
  9. openepd/api/dto/meta.py +15 -11
  10. openepd/api/dto/mf.py +9 -8
  11. openepd/api/epd/dto.py +43 -33
  12. openepd/api/epd/sync_api.py +9 -9
  13. openepd/api/pcr/sync_api.py +2 -2
  14. openepd/bundle/model.py +11 -10
  15. openepd/bundle/reader.py +12 -5
  16. openepd/bundle/writer.py +17 -6
  17. openepd/model/base.py +60 -43
  18. openepd/model/category.py +13 -10
  19. openepd/model/common.py +100 -55
  20. openepd/model/declaration.py +93 -64
  21. openepd/model/epd.py +51 -43
  22. openepd/model/generic_estimate.py +28 -13
  23. openepd/model/industry_epd.py +15 -9
  24. openepd/model/lcia.py +132 -113
  25. openepd/model/org.py +54 -33
  26. openepd/model/pcr.py +38 -32
  27. openepd/model/specs/asphalt.py +31 -22
  28. openepd/model/specs/base.py +11 -9
  29. openepd/model/specs/concrete.py +60 -39
  30. openepd/model/specs/range/aggregates.py +9 -9
  31. openepd/model/specs/range/aluminium.py +7 -7
  32. openepd/model/specs/range/asphalt.py +22 -19
  33. openepd/model/specs/range/cladding.py +16 -16
  34. openepd/model/specs/range/cmu.py +10 -9
  35. openepd/model/specs/range/concrete.py +36 -27
  36. openepd/model/specs/range/conveying_equipment.py +16 -15
  37. openepd/model/specs/range/electrical.py +24 -22
  38. openepd/model/specs/range/finishes.py +109 -104
  39. openepd/model/specs/range/fire_and_smoke_protection.py +7 -7
  40. openepd/model/specs/range/furnishings.py +16 -12
  41. openepd/model/specs/range/manufacturing_inputs.py +16 -16
  42. openepd/model/specs/range/masonry.py +16 -16
  43. openepd/model/specs/range/mechanical.py +47 -47
  44. openepd/model/specs/range/mechanical_insulation.py +7 -7
  45. openepd/model/specs/range/network_infrastructure.py +54 -46
  46. openepd/model/specs/range/openings.py +36 -31
  47. openepd/model/specs/range/plumbing.py +15 -13
  48. openepd/model/specs/range/precast_concrete.py +20 -16
  49. openepd/model/specs/range/sheathing.py +18 -18
  50. openepd/model/specs/range/steel.py +25 -25
  51. openepd/model/specs/range/thermal_moisture_protection.py +20 -20
  52. openepd/model/specs/range/utility_piping.py +9 -9
  53. openepd/model/specs/range/wood.py +19 -19
  54. openepd/model/specs/range/wood_joists.py +8 -8
  55. openepd/model/specs/singular/__init__.py +9 -5
  56. openepd/model/specs/singular/aggregates.py +22 -15
  57. openepd/model/specs/singular/aluminium.py +20 -5
  58. openepd/model/specs/singular/asphalt.py +44 -20
  59. openepd/model/specs/singular/cladding.py +38 -23
  60. openepd/model/specs/singular/cmu.py +26 -11
  61. openepd/model/specs/singular/common.py +3 -2
  62. openepd/model/specs/singular/concrete.py +85 -48
  63. openepd/model/specs/singular/conveying_equipment.py +30 -17
  64. openepd/model/specs/singular/deprecated/__init__.py +3 -2
  65. openepd/model/specs/singular/deprecated/concrete.py +68 -33
  66. openepd/model/specs/singular/deprecated/steel.py +28 -15
  67. openepd/model/specs/singular/electrical.py +69 -41
  68. openepd/model/specs/singular/finishes.py +250 -140
  69. openepd/model/specs/singular/fire_and_smoke_protection.py +9 -6
  70. openepd/model/specs/singular/furnishings.py +16 -14
  71. openepd/model/specs/singular/manufacturing_inputs.py +23 -14
  72. openepd/model/specs/singular/masonry.py +66 -21
  73. openepd/model/specs/singular/mechanical.py +48 -47
  74. openepd/model/specs/singular/mechanical_insulation.py +7 -6
  75. openepd/model/specs/singular/mixins/conduit_mixin.py +13 -10
  76. openepd/model/specs/singular/network_infrastructure.py +111 -52
  77. openepd/model/specs/singular/openings.py +127 -95
  78. openepd/model/specs/singular/plumbing.py +15 -12
  79. openepd/model/specs/singular/precast_concrete.py +68 -54
  80. openepd/model/specs/singular/sheathing.py +47 -27
  81. openepd/model/specs/singular/steel.py +69 -45
  82. openepd/model/specs/singular/thermal_moisture_protection.py +36 -20
  83. openepd/model/specs/singular/utility_piping.py +11 -8
  84. openepd/model/specs/singular/wood.py +48 -24
  85. openepd/model/specs/singular/wood_joists.py +19 -6
  86. openepd/model/standard.py +15 -8
  87. openepd/model/validation/common.py +9 -3
  88. openepd/model/validation/numbers.py +0 -13
  89. openepd/model/validation/quantity.py +53 -25
  90. openepd/model/versioning.py +9 -6
  91. openepd/patch_pydantic.py +0 -93
  92. {openepd-6.13.2.dist-info → openepd-7.0.0.dist-info}/METADATA +1 -1
  93. openepd-7.0.0.dist-info/RECORD +142 -0
  94. openepd/compat/__init__.py +0 -15
  95. openepd/compat/compat_functional_validators.py +0 -25
  96. openepd/compat/pydantic.py +0 -30
  97. openepd-6.13.2.dist-info/RECORD +0 -145
  98. {openepd-6.13.2.dist-info → openepd-7.0.0.dist-info}/LICENSE +0 -0
  99. {openepd-6.13.2.dist-info → openepd-7.0.0.dist-info}/WHEEL +0 -0
@@ -44,10 +44,8 @@ __all__ = (
44
44
  "FinishesRangeV1",
45
45
  )
46
46
 
47
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
48
-
47
+ import pydantic
49
48
 
50
- from openepd.compat.pydantic import pyd
51
49
  from openepd.model.common import RangeAmount, RangeFloat, RangeInt, RangeRatioFloat
52
50
  from openepd.model.org import OrgRef
53
51
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
@@ -87,6 +85,8 @@ from openepd.model.validation.quantity import (
87
85
  AmountRangeYarnWeight,
88
86
  )
89
87
 
88
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
89
+
90
90
 
91
91
  class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
92
92
  """
@@ -100,21 +100,21 @@ class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
100
100
 
101
101
  _EXT_VERSION = "1.0"
102
102
 
103
- core_material: list[AccessFlooringCoreMaterial] | None = pyd.Field(default=None, description="")
104
- finish_material: list[AccessFlooringFinishMaterial] | None = pyd.Field(default=None, description="")
105
- stringers: list[AccessFlooringStringers] | None = pyd.Field(default=None, description="")
106
- seismic_rating: list[AccessFlooringSeismicRating] | None = pyd.Field(default=None, description="")
107
- magnetically_attached_finish: bool | None = pyd.Field(default=None, description="")
108
- permanent_finish: bool | None = pyd.Field(default=None, description="")
109
- drylay: bool | None = pyd.Field(default=None, description="")
110
- adjustable_height: bool | None = pyd.Field(default=None, description="")
111
- fixed_height: bool | None = pyd.Field(default=None, description="")
112
- finished_floor_height: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
113
- panel_thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
114
- concentrated_load: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
115
- uniform_load: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
116
- rolling_load_10_pass: AmountRangeForce | None = pyd.Field(default=None, description="")
117
- rolling_load_10000_pass: AmountRangeForce | None = pyd.Field(default=None, description="")
103
+ core_material: list[AccessFlooringCoreMaterial] | None = pydantic.Field(default=None, description="")
104
+ finish_material: list[AccessFlooringFinishMaterial] | None = pydantic.Field(default=None, description="")
105
+ stringers: list[AccessFlooringStringers] | None = pydantic.Field(default=None, description="")
106
+ seismic_rating: list[AccessFlooringSeismicRating] | None = pydantic.Field(default=None, description="")
107
+ magnetically_attached_finish: bool | None = pydantic.Field(default=None, description="")
108
+ permanent_finish: bool | None = pydantic.Field(default=None, description="")
109
+ drylay: bool | None = pydantic.Field(default=None, description="")
110
+ adjustable_height: bool | None = pydantic.Field(default=None, description="")
111
+ fixed_height: bool | None = pydantic.Field(default=None, description="")
112
+ finished_floor_height: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
113
+ panel_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
114
+ concentrated_load: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
115
+ uniform_load: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
116
+ rolling_load_10_pass: AmountRangeForce | None = pydantic.Field(default=None, description="")
117
+ rolling_load_10000_pass: AmountRangeForce | None = pydantic.Field(default=None, description="")
118
118
 
119
119
 
120
120
  class CarpetRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -126,20 +126,20 @@ class CarpetRangeV1(BaseOpenEpdHierarchicalSpec):
126
126
 
127
127
  _EXT_VERSION = "1.0"
128
128
 
129
- length: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
130
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
131
- intended_application: list[CarpetIntendedApplication] | None = pyd.Field(default=None, description="")
132
- manufacture_type: list[CarpetManufactureType] | None = pyd.Field(default=None, description="")
133
- form_factor: list[CarpetFormFactor] | None = pyd.Field(default=None, description="")
134
- yarn_weight: AmountRangeYarnWeight | None = pyd.Field(default=None, description="")
135
- yarn_type: list[CarpetYarnType] | None = pyd.Field(default=None, description="")
136
- fire_radiant_panel_rating_astme648: str | None = pyd.Field(default=None, description="")
137
- fire_smoke_density_rating_astme648: str | None = pyd.Field(default=None, description="")
138
- voc_emissions: str | None = pyd.Field(default=None, description="")
139
- cushioned: bool | None = pyd.Field(default=None, description="")
140
- bleachable: bool | None = pyd.Field(default=None, description="")
141
- gwp_factor_base: AmountRangeGWP | None = pyd.Field(default=None, description="")
142
- gwp_factor_yarn: AmountRangeGWP | None = pyd.Field(default=None, description="")
129
+ length: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
130
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
131
+ intended_application: list[CarpetIntendedApplication] | None = pydantic.Field(default=None, description="")
132
+ manufacture_type: list[CarpetManufactureType] | None = pydantic.Field(default=None, description="")
133
+ form_factor: list[CarpetFormFactor] | None = pydantic.Field(default=None, description="")
134
+ yarn_weight: AmountRangeYarnWeight | None = pydantic.Field(default=None, description="")
135
+ yarn_type: list[CarpetYarnType] | None = pydantic.Field(default=None, description="")
136
+ fire_radiant_panel_rating_astme648: str | None = pydantic.Field(default=None, description="")
137
+ fire_smoke_density_rating_astme648: str | None = pydantic.Field(default=None, description="")
138
+ voc_emissions: str | None = pydantic.Field(default=None, description="")
139
+ cushioned: bool | None = pydantic.Field(default=None, description="")
140
+ bleachable: bool | None = pydantic.Field(default=None, description="")
141
+ gwp_factor_base: AmountRangeGWP | None = pydantic.Field(default=None, description="")
142
+ gwp_factor_yarn: AmountRangeGWP | None = pydantic.Field(default=None, description="")
143
143
 
144
144
 
145
145
  class LaminateRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -173,19 +173,19 @@ class ResilientFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
173
173
 
174
174
  _EXT_VERSION = "1.0"
175
175
 
176
- length: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
177
- width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
178
- form_factor: list[ResilientFlooringFormFactor] | None = pyd.Field(default=None, description="")
179
- material: list[ResilientFlooringMaterial] | None = pyd.Field(default=None, description="")
180
- sheet_construction: list[VinylSheetConstruction] | None = pyd.Field(default=None, description="")
181
- wear_layer: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
182
- delta_iic: RangeFloat | None = pyd.Field(default=None, description="")
183
- thickness: list[ResilientFlooringThickness] | None = pyd.Field(default=None, description="")
184
- sport_flooring: bool | None = pyd.Field(default=None, description="")
185
- conductive_flooring: bool | None = pyd.Field(default=None, description="")
186
- zwtl: bool | None = pyd.Field(default=None, description="")
187
- floor_score: bool | None = pyd.Field(default=None, description="")
188
- nsf332: bool | None = pyd.Field(default=None, description="")
176
+ length: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
177
+ width: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
178
+ form_factor: list[ResilientFlooringFormFactor] | None = pydantic.Field(default=None, description="")
179
+ material: list[ResilientFlooringMaterial] | None = pydantic.Field(default=None, description="")
180
+ sheet_construction: list[VinylSheetConstruction] | None = pydantic.Field(default=None, description="")
181
+ wear_layer: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
182
+ delta_iic: RangeFloat | None = pydantic.Field(default=None, description="")
183
+ thickness: list[ResilientFlooringThickness] | None = pydantic.Field(default=None, description="")
184
+ sport_flooring: bool | None = pydantic.Field(default=None, description="")
185
+ conductive_flooring: bool | None = pydantic.Field(default=None, description="")
186
+ zwtl: bool | None = pydantic.Field(default=None, description="")
187
+ floor_score: bool | None = pydantic.Field(default=None, description="")
188
+ nsf332: bool | None = pydantic.Field(default=None, description="")
189
189
 
190
190
 
191
191
  class WallBaseRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -197,7 +197,7 @@ class WallBaseRangeV1(BaseOpenEpdHierarchicalSpec):
197
197
 
198
198
  _EXT_VERSION = "1.0"
199
199
 
200
- wall_base_material: list[WallBaseMaterial] | None = pyd.Field(default=None, description="")
200
+ wall_base_material: list[WallBaseMaterial] | None = pydantic.Field(default=None, description="")
201
201
 
202
202
 
203
203
  class WoodFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -213,9 +213,9 @@ class WoodFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
213
213
  _EXT_VERSION = "1.0"
214
214
 
215
215
  forest_practices_certifiers: list[OrgRef] | None = None
216
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
217
- timber_species: list[WoodFlooringTimberSpecies] | None = pyd.Field(default=None, description="")
218
- fabrication: list[WoodFlooringFabrication] | None = pyd.Field(default=None, description="")
216
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
217
+ timber_species: list[WoodFlooringTimberSpecies] | None = pydantic.Field(default=None, description="")
218
+ fabrication: list[WoodFlooringFabrication] | None = pydantic.Field(default=None, description="")
219
219
 
220
220
 
221
221
  class AcousticalCeilingsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -227,7 +227,7 @@ class AcousticalCeilingsRangeV1(BaseOpenEpdHierarchicalSpec):
227
227
 
228
228
  _EXT_VERSION = "1.0"
229
229
 
230
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
230
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
231
231
 
232
232
 
233
233
  class CeramicTileRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -239,26 +239,27 @@ class CeramicTileRangeV1(BaseOpenEpdHierarchicalSpec):
239
239
 
240
240
  _EXT_VERSION = "1.0"
241
241
 
242
- porcelain: bool | None = pyd.Field(
243
- default=None, description="A dense and durable ceramic tile made from fine porcelain clay."
242
+ porcelain: bool | None = pydantic.Field(
243
+ default=None,
244
+ description="A dense and durable ceramic tile made from fine porcelain clay.",
244
245
  )
245
- quarry: bool | None = pyd.Field(
246
+ quarry: bool | None = pydantic.Field(
246
247
  default=None,
247
248
  description="A type of unglazed ceramic tile made from natural clay with a slightly rough texture.",
248
249
  )
249
- pressed_floor_tile: bool | None = pyd.Field(
250
+ pressed_floor_tile: bool | None = pydantic.Field(
250
251
  default=None,
251
252
  description="A durable and low-maintenance type of tile made by compressing clay or other materials at high pressure.",
252
253
  )
253
- wall_tile: bool | None = pyd.Field(
254
+ wall_tile: bool | None = pydantic.Field(
254
255
  default=None,
255
256
  description="A decorative tile designed for use on vertical surfaces such as walls or backsplashes.",
256
257
  )
257
- mosaic_tile: bool | None = pyd.Field(
258
+ mosaic_tile: bool | None = pydantic.Field(
258
259
  default=None,
259
260
  description="A small decorative tile made of glass, stone, or ceramic, arranged in a pattern to create a design.",
260
261
  )
261
- specialty: bool | None = pyd.Field(
262
+ specialty: bool | None = pydantic.Field(
262
263
  default=None,
263
264
  description="A unique and customized type of tile, often made from unconventional materials or with specialized designs or finishes.",
264
265
  )
@@ -275,11 +276,11 @@ class GaugedTileRangeV1(BaseOpenEpdHierarchicalSpec):
275
276
 
276
277
  _EXT_VERSION = "1.0"
277
278
 
278
- tile_panels: bool | None = pyd.Field(
279
+ tile_panels: bool | None = pydantic.Field(
279
280
  default=None,
280
281
  description="Large-format porcelain or natural stone tiles that are typically over 3 feet in length and width, designed for use in floor and wall installations to create a seamless and uninterrupted appearance.",
281
282
  )
282
- tile_pavers: bool | None = pyd.Field(
283
+ tile_pavers: bool | None = pydantic.Field(
283
284
  default=None,
284
285
  description="Thick and durable porcelain or natural stone tiles that are commonly used in outdoor applications, such as patios, walkways, and driveways, due to their high resistance to weather and wear.",
285
286
  )
@@ -294,19 +295,19 @@ class GlassTileRangeV1(BaseOpenEpdHierarchicalSpec):
294
295
 
295
296
  _EXT_VERSION = "1.0"
296
297
 
297
- regular: bool | None = pyd.Field(
298
+ regular: bool | None = pydantic.Field(
298
299
  default=None,
299
300
  description="Glass tile that is typically square or rectangular in shape, and used for a variety of decorative applications, such as kitchen backsplashes, shower walls, and accent borders.",
300
301
  )
301
- glass_mosaic: bool | None = pyd.Field(
302
+ glass_mosaic: bool | None = pydantic.Field(
302
303
  default=None,
303
304
  description="A small, decorative glass tile made in a variety of shapes and colors, used for intricate designs and patterns on walls, floors, and other surfaces.",
304
305
  )
305
- miniature_mosaic: bool | None = pyd.Field(
306
+ miniature_mosaic: bool | None = pydantic.Field(
306
307
  default=None,
307
308
  description="Glass mosaic tile that is smaller in size than regular glass mosaic tile, often used for intricate details and designs in backsplashes, shower walls, and decorative accents.",
308
309
  )
309
- large_format: bool | None = pyd.Field(
310
+ large_format: bool | None = pydantic.Field(
310
311
  default=None,
311
312
  description="Glass tile that is larger in size than regular glass tile, often used to create a dramatic and modern effect in commercial and residential spaces.",
312
313
  )
@@ -349,12 +350,13 @@ class CeilingPanelRangeV1(BaseOpenEpdHierarchicalSpec):
349
350
 
350
351
  _EXT_VERSION = "1.0"
351
352
 
352
- fire_rating: list[CeilingPanelFireRating] | None = pyd.Field(default=None, description="")
353
- core_material: list[CeilingPanelCoreMaterial] | None = pyd.Field(default=None, description="")
354
- nrc: RangeRatioFloat | None = pyd.Field(
355
- default=None, description="Noise Reduction Coefficient (NRC) or Sound Absorbtion Average (SAA) per ASTM C423"
353
+ fire_rating: list[CeilingPanelFireRating] | None = pydantic.Field(default=None, description="")
354
+ core_material: list[CeilingPanelCoreMaterial] | None = pydantic.Field(default=None, description="")
355
+ nrc: RangeRatioFloat | None = pydantic.Field(
356
+ default=None,
357
+ description="Noise Reduction Coefficient (NRC) or Sound Absorbtion Average (SAA) per ASTM C423",
356
358
  )
357
- cac: RangeInt | None = pyd.Field(default=None, description="Ceiling Attenuation Class (CAC) per ASTM E1414")
359
+ cac: RangeInt | None = pydantic.Field(default=None, description="Ceiling Attenuation Class (CAC) per ASTM E1414")
358
360
  AcousticalCeilings: AcousticalCeilingsRangeV1 | None = None
359
361
 
360
362
 
@@ -377,7 +379,7 @@ class CementBoardRangeV1(BaseOpenEpdHierarchicalSpec):
377
379
 
378
380
  _EXT_VERSION = "1.0"
379
381
 
380
- thickness: list[CementBoardThickness] | None = pyd.Field(default=None, description="")
382
+ thickness: list[CementBoardThickness] | None = pydantic.Field(default=None, description="")
381
383
 
382
384
 
383
385
  class TilingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -391,31 +393,33 @@ class TilingRangeV1(BaseOpenEpdHierarchicalSpec):
391
393
 
392
394
  _EXT_VERSION = "1.0"
393
395
 
394
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
395
- flooring: bool | None = pyd.Field(default=None, description="Tiling intended for walking.")
396
- wall_finish: bool | None = pyd.Field(
396
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
397
+ flooring: bool | None = pydantic.Field(default=None, description="Tiling intended for walking.")
398
+ wall_finish: bool | None = pydantic.Field(
397
399
  default=None,
398
400
  description="A decorative tile designed for use on vertical surfaces such as walls or backsplashes.",
399
401
  )
400
- cladding: bool | None = pyd.Field(
402
+ cladding: bool | None = pydantic.Field(
401
403
  default=None,
402
404
  description="Tiling for exterior use, primarily used for the walls of buildings and structures, providing a protective and decorative layer that enhances the aesthetic appearance and weather resistance of the underlying structure.",
403
405
  )
404
- other: bool | None = pyd.Field(
405
- default=None, description="Tiling used as countertops, ceilings, furnishings, hardscapes etc."
406
+ other: bool | None = pydantic.Field(
407
+ default=None,
408
+ description="Tiling used as countertops, ceilings, furnishings, hardscapes etc.",
406
409
  )
407
- residential_only: bool | None = pyd.Field(
410
+ residential_only: bool | None = pydantic.Field(
408
411
  default=None,
409
412
  description="All commercial tile can also be used in residential applications, but the opposite may not be true. This selection allows to filter out tiling that is not intended for commercial applications.",
410
413
  )
411
- reinforced: bool | None = pyd.Field(
412
- default=None, description="Steel-reinforced ceramic tiles or tiles with other special reinforcing technology."
414
+ reinforced: bool | None = pydantic.Field(
415
+ default=None,
416
+ description="Steel-reinforced ceramic tiles or tiles with other special reinforcing technology.",
413
417
  )
414
- total_recycled_content: RangeRatioFloat | None = pyd.Field(
418
+ total_recycled_content: RangeRatioFloat | None = pydantic.Field(
415
419
  default=None,
416
420
  description="Proportion of this product that is sourced from recycled content. Pre-consumer recycling is given a 50% weighting, 100% for post-consumer, by mass.",
417
421
  )
418
- post_consumer_recycled_content: RangeRatioFloat | None = pyd.Field(
422
+ post_consumer_recycled_content: RangeRatioFloat | None = pydantic.Field(
419
423
  default=None,
420
424
  description="Proportion of this product that is sourced from post-consumer recycled content, by mass.",
421
425
  )
@@ -434,12 +438,12 @@ class DeckingBoardsRangeV1(BaseOpenEpdHierarchicalSpec):
434
438
  _EXT_VERSION = "1.0"
435
439
 
436
440
  forest_practices_certifiers: list[OrgRef] | None = None
437
- timber_species: list[SawnTimberSpecies] | None = pyd.Field(default=None, description="")
438
- fabrication: list[AllFabrication] | None = pyd.Field(default=None, description="")
439
- weather_exposed: bool | None = pyd.Field(default=None, description="")
440
- fire_retardant: bool | None = pyd.Field(default=None, description="")
441
- decay_resistant: bool | None = pyd.Field(default=None, description="")
442
- material: list[DeckingBoardMaterial] | None = pyd.Field(default=None, description="")
441
+ timber_species: list[SawnTimberSpecies] | None = pydantic.Field(default=None, description="")
442
+ fabrication: list[AllFabrication] | None = pydantic.Field(default=None, description="")
443
+ weather_exposed: bool | None = pydantic.Field(default=None, description="")
444
+ fire_retardant: bool | None = pydantic.Field(default=None, description="")
445
+ decay_resistant: bool | None = pydantic.Field(default=None, description="")
446
+ material: list[DeckingBoardMaterial] | None = pydantic.Field(default=None, description="")
443
447
 
444
448
 
445
449
  class GlassFiberReinforcedGypsumFabricationsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -461,20 +465,20 @@ class GypsumRangeV1(BaseOpenEpdHierarchicalSpec):
461
465
 
462
466
  _EXT_VERSION = "1.1"
463
467
 
464
- fire_rating: list[GypsumFireRating] | None = pyd.Field(default=None, description="")
465
- thickness: list[GypsumThickness] | None = pyd.Field(default=None, description="")
466
- facing: list[GypsumFacing] | None = pyd.Field(default=None, description="")
467
- r_factor: AmountRangeRFactor | None = pyd.Field(default=None, description="")
468
- flame_spread_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
469
- smoke_production_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
470
- surface_abrasion_d4977: RangeInt | None = pyd.Field(default=None, description="")
471
- indentation_d5420: RangeInt | None = pyd.Field(default=None, description="")
472
- soft_body_impact_e695: RangeInt | None = pyd.Field(default=None, description="")
473
- hard_body_impact_c1929: RangeInt | None = pyd.Field(default=None, description="")
474
- mold_resistant: bool | None = pyd.Field(default=None, description="")
475
- foil_backing: bool | None = pyd.Field(default=None, description="")
476
- moisture_resistant: bool | None = pyd.Field(default=None, description="")
477
- abuse_resistant: bool | None = pyd.Field(default=None, description="")
468
+ fire_rating: list[GypsumFireRating] | None = pydantic.Field(default=None, description="")
469
+ thickness: list[GypsumThickness] | None = pydantic.Field(default=None, description="")
470
+ facing: list[GypsumFacing] | None = pydantic.Field(default=None, description="")
471
+ r_factor: AmountRangeRFactor | None = pydantic.Field(default=None, description="")
472
+ flame_spread_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
473
+ smoke_production_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
474
+ surface_abrasion_d4977: RangeInt | None = pydantic.Field(default=None, description="")
475
+ indentation_d5420: RangeInt | None = pydantic.Field(default=None, description="")
476
+ soft_body_impact_e695: RangeInt | None = pydantic.Field(default=None, description="")
477
+ hard_body_impact_c1929: RangeInt | None = pydantic.Field(default=None, description="")
478
+ mold_resistant: bool | None = pydantic.Field(default=None, description="")
479
+ foil_backing: bool | None = pydantic.Field(default=None, description="")
480
+ moisture_resistant: bool | None = pydantic.Field(default=None, description="")
481
+ abuse_resistant: bool | None = pydantic.Field(default=None, description="")
478
482
  GypsumSupports: GypsumSupportsRangeV1 | None = None
479
483
 
480
484
 
@@ -547,7 +551,7 @@ class WallFinishesRangeV1(BaseOpenEpdHierarchicalSpec):
547
551
 
548
552
  _EXT_VERSION = "1.0"
549
553
 
550
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
554
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
551
555
 
552
556
 
553
557
  class PlasterRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -563,9 +567,10 @@ class PlasterRangeV1(BaseOpenEpdHierarchicalSpec):
563
567
 
564
568
  _EXT_VERSION = "1.0"
565
569
 
566
- composition: list[PlasterComposition] | None = pyd.Field(default=None, description="")
567
- application_rate: RangeAmount | None = pyd.Field(
568
- default=None, description="Typical or reference amount of material covering a unit of a host surface."
570
+ composition: list[PlasterComposition] | None = pydantic.Field(default=None, description="")
571
+ application_rate: RangeAmount | None = pydantic.Field(
572
+ default=None,
573
+ description="Typical or reference amount of material covering a unit of a host surface.",
569
574
  )
570
575
 
571
576
 
@@ -21,10 +21,8 @@ __all__ = (
21
21
  "FireAndSmokeProtectionRangeV1",
22
22
  )
23
23
 
24
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
25
-
24
+ import pydantic
26
25
 
27
- from openepd.compat.pydantic import pyd
28
26
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
29
27
  from openepd.model.specs.enums import (
30
28
  IntumescentFireproofingMaterialType,
@@ -33,6 +31,8 @@ from openepd.model.specs.enums import (
33
31
  )
34
32
  from openepd.model.validation.quantity import AmountRangeLengthMm
35
33
 
34
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
35
+
36
36
 
37
37
  class IntumescentFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
38
38
  """
@@ -45,7 +45,7 @@ class IntumescentFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
45
45
 
46
46
  _EXT_VERSION = "1.0"
47
47
 
48
- material_type: list[IntumescentFireproofingMaterialType] | None = pyd.Field(default=None, description="")
48
+ material_type: list[IntumescentFireproofingMaterialType] | None = pydantic.Field(default=None, description="")
49
49
 
50
50
 
51
51
  class SprayFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -59,8 +59,8 @@ class SprayFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
59
59
 
60
60
  _EXT_VERSION = "1.0"
61
61
 
62
- material_type: list[SprayFireproofingMaterialType] | None = pyd.Field(default=None, description="")
63
- density: list[SprayFireproofingDensity] | None = pyd.Field(default=None, description="")
62
+ material_type: list[SprayFireproofingMaterialType] | None = pydantic.Field(default=None, description="")
63
+ density: list[SprayFireproofingDensity] | None = pydantic.Field(default=None, description="")
64
64
 
65
65
 
66
66
  class AppliedFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -75,7 +75,7 @@ class AppliedFireproofingRangeV1(BaseOpenEpdHierarchicalSpec):
75
75
 
76
76
  _EXT_VERSION = "1.0"
77
77
 
78
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
78
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
79
79
  IntumescentFireproofing: IntumescentFireproofingRangeV1 | None = None
80
80
  SprayFireproofing: SprayFireproofingRangeV1 | None = None
81
81
 
@@ -32,15 +32,15 @@ __all__ = (
32
32
  "FurnishingsRangeV1",
33
33
  )
34
34
 
35
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
36
-
35
+ import pydantic
37
36
 
38
- from openepd.compat.pydantic import pyd
39
37
  from openepd.model.common import RangeInt, RangeRatioFloat
40
38
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
41
39
  from openepd.model.specs.enums import CountertopMaterial
42
40
  from openepd.model.validation.quantity import AmountRangeAreaM2, AmountRangeLengthMm, AmountRangeVolume
43
41
 
42
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
43
+
44
44
 
45
45
  class DemountablePartitionTrackRangeV1(BaseOpenEpdHierarchicalSpec):
46
46
  """
@@ -71,8 +71,8 @@ class CountertopsRangeV1(BaseOpenEpdHierarchicalSpec):
71
71
 
72
72
  _EXT_VERSION = "1.0"
73
73
 
74
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
75
- countertop_material: list[CountertopMaterial] | None = pyd.Field(default=None, description="")
74
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
75
+ countertop_material: list[CountertopMaterial] | None = pydantic.Field(default=None, description="")
76
76
 
77
77
 
78
78
  class DemountablePartitionsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -226,21 +226,25 @@ class FurnishingsRangeV1(BaseOpenEpdHierarchicalSpec):
226
226
 
227
227
  _EXT_VERSION = "1.1"
228
228
 
229
- functional_floor_area_m2: AmountRangeAreaM2 | None = pyd.Field(
230
- default=None, title="Functional Floor Area", description="The floor area that the product occupies."
229
+ functional_floor_area_m2: AmountRangeAreaM2 | None = pydantic.Field(
230
+ default=None,
231
+ title="Functional Floor Area",
232
+ description="The floor area that the product occupies.",
231
233
  )
232
- work_surface_area_m2: AmountRangeAreaM2 | None = pyd.Field(
233
- default=None, title="Work Surface Area", description="The usable work surface area that the product provides."
234
+ work_surface_area_m2: AmountRangeAreaM2 | None = pydantic.Field(
235
+ default=None,
236
+ title="Work Surface Area",
237
+ description="The usable work surface area that the product provides.",
234
238
  )
235
- functional_storage_volume_m3: AmountRangeVolume | None = pyd.Field(
239
+ functional_storage_volume_m3: AmountRangeVolume | None = pydantic.Field(
236
240
  default=None, title="Functional Storage Volume", description=""
237
241
  )
238
- functional_seating_capacity: RangeInt | None = pyd.Field(
242
+ functional_seating_capacity: RangeInt | None = pydantic.Field(
239
243
  default=None,
240
244
  title="Functional Seating Capacity",
241
245
  description="Intended number of individuals the product seats. This value is used in calculating impact per functional unit.",
242
246
  )
243
- installation_waste_factor: RangeRatioFloat | None = pyd.Field(
247
+ installation_waste_factor: RangeRatioFloat | None = pydantic.Field(
244
248
  default=None,
245
249
  title="Installation Waste Factor",
246
250
  description="Typical increase in impacts to account for installation waste.",
@@ -26,10 +26,8 @@ __all__ = (
26
26
  "ManufacturingInputsRangeV1",
27
27
  )
28
28
 
29
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
30
-
29
+ import pydantic
31
30
 
32
- from openepd.compat.pydantic import pyd
33
31
  from openepd.model.common import RangeFloat
34
32
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
35
33
  from openepd.model.specs.concrete import Cementitious
@@ -45,6 +43,8 @@ from openepd.model.specs.enums import (
45
43
  TextilesFabricType,
46
44
  )
47
45
 
46
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
47
+
48
48
 
49
49
  class CementRangeV1(BaseOpenEpdHierarchicalSpec):
50
50
  """
@@ -57,13 +57,13 @@ class CementRangeV1(BaseOpenEpdHierarchicalSpec):
57
57
 
58
58
  _EXT_VERSION = "1.0"
59
59
 
60
- cementitious: Cementitious | None = pyd.Field(default=None, description="")
61
- white_cement: bool | None = pyd.Field(default=None, description="")
62
- astm_type: list[CementAstmType] | None = pyd.Field(default=None, description="")
63
- c1157: list[CementC1157] | None = pyd.Field(default=None, description="")
64
- csa_a3001: list[CementCsaA3001] | None = pyd.Field(default=None, description="")
65
- en197_1: list[CementEn197_1] | None = pyd.Field(default=None, description="")
66
- oil_well_cement: bool | None = pyd.Field(default=None, description="")
60
+ cementitious: Cementitious | None = pydantic.Field(default=None, description="")
61
+ white_cement: bool | None = pydantic.Field(default=None, description="")
62
+ astm_type: list[CementAstmType] | None = pydantic.Field(default=None, description="")
63
+ c1157: list[CementC1157] | None = pydantic.Field(default=None, description="")
64
+ csa_a3001: list[CementCsaA3001] | None = pydantic.Field(default=None, description="")
65
+ en197_1: list[CementEn197_1] | None = pydantic.Field(default=None, description="")
66
+ oil_well_cement: bool | None = pydantic.Field(default=None, description="")
67
67
 
68
68
 
69
69
  class MasonryCementRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -77,7 +77,7 @@ class MasonryCementRangeV1(BaseOpenEpdHierarchicalSpec):
77
77
 
78
78
  _EXT_VERSION = "1.0"
79
79
 
80
- astm_c91_type: list[MasonryCementAstmC91Type] | None = pyd.Field(default=None, description="")
80
+ astm_c91_type: list[MasonryCementAstmC91Type] | None = pydantic.Field(default=None, description="")
81
81
 
82
82
 
83
83
  class SupplementaryCementitiousMaterialsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -89,7 +89,7 @@ class SupplementaryCementitiousMaterialsRangeV1(BaseOpenEpdHierarchicalSpec):
89
89
 
90
90
  _EXT_VERSION = "1.0"
91
91
 
92
- cement_scm: list[CementScm] | None = pyd.Field(default=None, description="")
92
+ cement_scm: list[CementScm] | None = pydantic.Field(default=None, description="")
93
93
 
94
94
 
95
95
  class AccessFlooringPedestalsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -124,8 +124,8 @@ class CarpetFiberRangeV1(BaseOpenEpdHierarchicalSpec):
124
124
 
125
125
  _EXT_VERSION = "1.0"
126
126
 
127
- yarn_material: list[CarpetYarnType] | None = pyd.Field(default=None, description="")
128
- yarn_recycled_content: RangeFloat | None = pyd.Field(default=None, description="")
127
+ yarn_material: list[CarpetYarnType] | None = pydantic.Field(default=None, description="")
128
+ yarn_recycled_content: RangeFloat | None = pydantic.Field(default=None, description="")
129
129
 
130
130
 
131
131
  class CementitiousMaterialsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -155,7 +155,7 @@ class ConcreteAdmixturesRangeV1(BaseOpenEpdHierarchicalSpec):
155
155
 
156
156
  _EXT_VERSION = "1.0"
157
157
 
158
- effects: list[AdmixtureEffects] | None = pyd.Field(default=None, description="")
158
+ effects: list[AdmixtureEffects] | None = pydantic.Field(default=None, description="")
159
159
 
160
160
 
161
161
  class TextilesRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -167,7 +167,7 @@ class TextilesRangeV1(BaseOpenEpdHierarchicalSpec):
167
167
 
168
168
  _EXT_VERSION = "1.0"
169
169
 
170
- fabric_type: list[TextilesFabricType] | None = pyd.Field(default=None, description="")
170
+ fabric_type: list[TextilesFabricType] | None = pydantic.Field(default=None, description="")
171
171
 
172
172
 
173
173
  class ManufacturingInputsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -20,13 +20,13 @@ __all__ = (
20
20
  "MasonryRangeV1",
21
21
  )
22
22
 
23
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
24
-
23
+ import pydantic
25
24
 
26
- from openepd.compat.pydantic import pyd
27
25
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
26
  from openepd.model.validation.quantity import AmountRangePressureMpa, AmountRangeThermalConductivity
29
27
 
28
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
29
+
30
30
 
31
31
  class GMURangeV1(BaseOpenEpdHierarchicalSpec):
32
32
  """
@@ -47,9 +47,9 @@ class AutoclavedAeratedConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
47
47
 
48
48
  _EXT_VERSION = "1.0"
49
49
 
50
- strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
51
- thermal_conductivity: AmountRangeThermalConductivity | None = pyd.Field(default=None, description="")
52
- white: bool | None = pyd.Field(default=None, description="")
50
+ strength_28d: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
51
+ thermal_conductivity: AmountRangeThermalConductivity | None = pydantic.Field(default=None, description="")
52
+ white: bool | None = pydantic.Field(default=None, description="")
53
53
 
54
54
 
55
55
  class BrickRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -61,15 +61,15 @@ class BrickRangeV1(BaseOpenEpdHierarchicalSpec):
61
61
 
62
62
  _EXT_VERSION = "1.0"
63
63
 
64
- building: bool | None = pyd.Field(default=None, description="")
65
- facing: bool | None = pyd.Field(default=None, description="")
66
- floor: bool | None = pyd.Field(default=None, description="")
67
- pedestrian: bool | None = pyd.Field(default=None, description="")
68
- paving: bool | None = pyd.Field(default=None, description="")
69
- other: bool | None = pyd.Field(default=None, description="")
70
- chemical_resistant: bool | None = pyd.Field(default=None, description="")
71
- glazed: bool | None = pyd.Field(default=None, description="")
72
- tiles: bool | None = pyd.Field(default=None, description="")
64
+ building: bool | None = pydantic.Field(default=None, description="")
65
+ facing: bool | None = pydantic.Field(default=None, description="")
66
+ floor: bool | None = pydantic.Field(default=None, description="")
67
+ pedestrian: bool | None = pydantic.Field(default=None, description="")
68
+ paving: bool | None = pydantic.Field(default=None, description="")
69
+ other: bool | None = pydantic.Field(default=None, description="")
70
+ chemical_resistant: bool | None = pydantic.Field(default=None, description="")
71
+ glazed: bool | None = pydantic.Field(default=None, description="")
72
+ tiles: bool | None = pydantic.Field(default=None, description="")
73
73
 
74
74
 
75
75
  class MasonryRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -81,7 +81,7 @@ class MasonryRangeV1(BaseOpenEpdHierarchicalSpec):
81
81
 
82
82
  _EXT_VERSION = "1.0"
83
83
 
84
- white_cement: bool | None = pyd.Field(default=None, description="")
84
+ white_cement: bool | None = pydantic.Field(default=None, description="")
85
85
  GMU: GMURangeV1 | None = None
86
86
  AutoclavedAeratedConcrete: AutoclavedAeratedConcreteRangeV1 | None = None
87
87
  Brick: BrickRangeV1 | None = None