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
@@ -21,10 +21,8 @@ __all__ = (
21
21
  "PrecastConcreteRangeV1",
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.common import RangeRatioFloat
29
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
30
28
  from openepd.model.specs.singular.precast_concrete import (
@@ -35,6 +33,8 @@ from openepd.model.specs.singular.precast_concrete import (
35
33
  )
36
34
  from openepd.model.validation.quantity import AmountRangePressureMpa
37
35
 
36
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
37
+
38
38
 
39
39
  class ArchitecturalPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
40
40
  """
@@ -45,8 +45,9 @@ class ArchitecturalPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
45
45
 
46
46
  _EXT_VERSION = "1.1"
47
47
 
48
- element_type: ArchitecturalPrecastElementType | None = pyd.Field(
49
- default=None, description="Precast element type used for architectural applications."
48
+ element_type: ArchitecturalPrecastElementType | None = pydantic.Field(
49
+ default=None,
50
+ description="Precast element type used for architectural applications.",
50
51
  )
51
52
 
52
53
 
@@ -59,8 +60,9 @@ class StructuralPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
59
60
 
60
61
  _EXT_VERSION = "1.1"
61
62
 
62
- element_type: StructuralPrecastElementType | None = pyd.Field(
63
- default=None, description="Precast element type used for structural applications."
63
+ element_type: StructuralPrecastElementType | None = pydantic.Field(
64
+ default=None,
65
+ description="Precast element type used for structural applications.",
64
66
  )
65
67
 
66
68
 
@@ -73,8 +75,9 @@ class UtilityUndergroundPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
73
75
 
74
76
  _EXT_VERSION = "1.1"
75
77
 
76
- element_type: UtilityPrecastElementType | None = pyd.Field(
77
- default=None, description="Precast element type used for utility underground applications."
78
+ element_type: UtilityPrecastElementType | None = pydantic.Field(
79
+ default=None,
80
+ description="Precast element type used for utility underground applications.",
78
81
  )
79
82
 
80
83
 
@@ -87,8 +90,9 @@ class CivilPrecastRangeV1(BaseOpenEpdHierarchicalSpec):
87
90
 
88
91
  _EXT_VERSION = "1.0"
89
92
 
90
- element_type: CivilPrecastElementType | None = pyd.Field(
91
- default=None, description="Precast element type used as civil engineering components."
93
+ element_type: CivilPrecastElementType | None = pydantic.Field(
94
+ default=None,
95
+ description="Precast element type used as civil engineering components.",
92
96
  )
93
97
 
94
98
 
@@ -101,14 +105,14 @@ class PrecastConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
101
105
 
102
106
  _EXT_VERSION = "1.1"
103
107
 
104
- lightweight: bool | None = pyd.Field(default=None, description="")
105
- concrete_compressive_strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
106
- insulated: bool | None = pyd.Field(default=None, description="")
107
- gfrc: bool | None = pyd.Field(
108
+ lightweight: bool | None = pydantic.Field(default=None, description="")
109
+ concrete_compressive_strength_28d: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
110
+ insulated: bool | None = pydantic.Field(default=None, description="")
111
+ gfrc: bool | None = pydantic.Field(
108
112
  default=None,
109
113
  description="Glass Fiber Reinforced Concrete is fiber-reinforced concrete sometimes used in architectural panels",
110
114
  )
111
- steel_mass_percentage: RangeRatioFloat | None = pyd.Field(default=None, description="")
115
+ steel_mass_percentage: RangeRatioFloat | None = pydantic.Field(default=None, description="")
112
116
  ArchitecturalPrecast: ArchitecturalPrecastRangeV1 | None = None
113
117
  StructuralPrecast: StructuralPrecastRangeV1 | None = None
114
118
  UtilityUndergroundPrecast: UtilityUndergroundPrecastRangeV1 | None = None
@@ -19,15 +19,15 @@ __all__ = (
19
19
  "SheathingRangeV1",
20
20
  )
21
21
 
22
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
23
-
22
+ import pydantic
24
23
 
25
- from openepd.compat.pydantic import pyd
26
24
  from openepd.model.common import RangeInt
27
25
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
26
  from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
29
27
  from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeRFactor
30
28
 
29
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
30
+
31
31
 
32
32
  class CementitiousSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
33
33
  """
@@ -41,7 +41,7 @@ class CementitiousSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
41
41
 
42
42
  _EXT_VERSION = "1.0"
43
43
 
44
- cement_board_thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
44
+ cement_board_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
45
45
 
46
46
 
47
47
  class GypsumSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -55,20 +55,20 @@ class GypsumSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
55
55
 
56
56
  _EXT_VERSION = "1.1"
57
57
 
58
- fire_rating: list[GypsumFireRating] | None = pyd.Field(default=None, description="")
59
- thickness: list[GypsumThickness] | None = pyd.Field(default=None, description="")
60
- facing: list[GypsumFacing] | None = pyd.Field(default=None, description="")
61
- r_factor: AmountRangeRFactor | None = pyd.Field(default=None, description="")
62
- flame_spread_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
63
- smoke_production_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
64
- surface_abrasion_d4977: RangeInt | None = pyd.Field(default=None, description="")
65
- indentation_d5420: RangeInt | None = pyd.Field(default=None, description="")
66
- soft_body_impact_e695: RangeInt | None = pyd.Field(default=None, description="")
67
- hard_body_impact_c1929: RangeInt | None = pyd.Field(default=None, description="")
68
- mold_resistant: bool | None = pyd.Field(default=None, description="")
69
- foil_backing: bool | None = pyd.Field(default=None, description="")
70
- moisture_resistant: bool | None = pyd.Field(default=None, description="")
71
- abuse_resistant: bool | None = pyd.Field(default=None, description="")
58
+ fire_rating: list[GypsumFireRating] | None = pydantic.Field(default=None, description="")
59
+ thickness: list[GypsumThickness] | None = pydantic.Field(default=None, description="")
60
+ facing: list[GypsumFacing] | None = pydantic.Field(default=None, description="")
61
+ r_factor: AmountRangeRFactor | None = pydantic.Field(default=None, description="")
62
+ flame_spread_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
63
+ smoke_production_astm_e84: RangeInt | None = pydantic.Field(default=None, description="")
64
+ surface_abrasion_d4977: RangeInt | None = pydantic.Field(default=None, description="")
65
+ indentation_d5420: RangeInt | None = pydantic.Field(default=None, description="")
66
+ soft_body_impact_e695: RangeInt | None = pydantic.Field(default=None, description="")
67
+ hard_body_impact_c1929: RangeInt | None = pydantic.Field(default=None, description="")
68
+ mold_resistant: bool | None = pydantic.Field(default=None, description="")
69
+ foil_backing: bool | None = pydantic.Field(default=None, description="")
70
+ moisture_resistant: bool | None = pydantic.Field(default=None, description="")
71
+ abuse_resistant: bool | None = pydantic.Field(default=None, description="")
72
72
 
73
73
 
74
74
  class SheathingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -35,10 +35,8 @@ __all__ = (
35
35
  "SteelRangeV1",
36
36
  )
37
37
 
38
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
39
-
38
+ import pydantic
40
39
 
41
- from openepd.compat.pydantic import pyd
42
40
  from openepd.model.common import RangeFloat, RangeRatioFloat
43
41
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
44
42
  from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
@@ -51,6 +49,8 @@ from openepd.model.validation.quantity import (
51
49
  AmountRangeThermalExpansion,
52
50
  )
53
51
 
52
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
53
+
54
54
 
55
55
  class ColdFormedFramingRangeV1(BaseOpenEpdHierarchicalSpec):
56
56
  """
@@ -226,15 +226,15 @@ class StructuralSteelRangeV1(BaseOpenEpdHierarchicalSpec):
226
226
 
227
227
  _EXT_VERSION = "1.0"
228
228
 
229
- modulus_of_elasticity: AmountRangePressureMpa | None = pyd.Field(
229
+ modulus_of_elasticity: AmountRangePressureMpa | None = pydantic.Field(
230
230
  default=None,
231
231
  description="Modulus of Elasticity, https://en.wikipedia.org/wiki/Elastic_modulus ",
232
232
  )
233
- thermal_expansion: AmountRangeThermalExpansion | None = pyd.Field(
233
+ thermal_expansion: AmountRangeThermalExpansion | None = pydantic.Field(
234
234
  default=None,
235
235
  description="Thermal Expansion, https://en.wikipedia.org/wiki/Thermal_expansion",
236
236
  )
237
- thermal_conductivity: AmountRangeThermalConductivity | None = pyd.Field(
237
+ thermal_conductivity: AmountRangeThermalConductivity | None = pydantic.Field(
238
238
  default=None,
239
239
  description="Thermal Conductivity, https://en.wikipedia.org/wiki/Thermal_conductivity_and_resistivity",
240
240
  )
@@ -278,14 +278,14 @@ class RebarSteelRangeV1(BaseOpenEpdHierarchicalSpec):
278
278
  _EXT_VERSION = "1.0"
279
279
 
280
280
  fabricated: bool | None = None
281
- grade: list[SteelRebarGrade] | None = pyd.Field(default=None)
282
- diameter_min: AmountRangeLengthMm | None = pyd.Field(default=None, description="Minimal diameter")
283
- bending_pin_max: RangeFloat | None = pyd.Field(default=None)
284
- ts_ys_ratio_max: RangeFloat | None = pyd.Field(
281
+ grade: list[SteelRebarGrade] | None = pydantic.Field(default=None)
282
+ diameter_min: AmountRangeLengthMm | None = pydantic.Field(default=None, description="Minimal diameter")
283
+ bending_pin_max: RangeFloat | None = pydantic.Field(default=None)
284
+ ts_ys_ratio_max: RangeFloat | None = pydantic.Field(
285
285
  default=None,
286
286
  description="Max ratio of ultimate tensile to yield tensile strength",
287
287
  )
288
- epoxy_coated: bool | None = pyd.Field(default=None)
288
+ epoxy_coated: bool | None = pydantic.Field(default=None)
289
289
 
290
290
 
291
291
  class WireMeshSteelRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -315,29 +315,29 @@ class SteelRangeV1(BaseOpenEpdHierarchicalSpec):
315
315
 
316
316
  _EXT_VERSION = "1.1"
317
317
 
318
- yield_tensile_str: AmountRangePressureMpa | None = pyd.Field(
318
+ yield_tensile_str: AmountRangePressureMpa | None = pydantic.Field(
319
319
  default=None,
320
320
  description="Yield Tensile strength (Mpa) per unit area. Yield strength is the point at which a material begins to permanently deform or change shape due to applied stress.",
321
321
  )
322
- bar_elongation: RangeFloat | None = pyd.Field(
322
+ bar_elongation: RangeFloat | None = pydantic.Field(
323
323
  default=None,
324
324
  description="Increase in length at break, in percent. Typically 10%-20%",
325
325
  )
326
- recycled_content: RangeRatioFloat | None = pyd.Field(default=None, description="")
327
- post_consumer_recycled_content: RangeRatioFloat | None = pyd.Field(
326
+ recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
327
+ post_consumer_recycled_content: RangeRatioFloat | None = pydantic.Field(
328
328
  default=None,
329
329
  description="Should be a number between zero and the Recycled Content (steel_recycled_content)",
330
330
  )
331
- astm_marking: str | None = pyd.Field(default=None, description="The marking to be expected on the product.")
332
- euro_marking: str | None = pyd.Field(default=None, description="The marking to be expected on the product.")
333
- composition: list[SteelComposition] | None = pyd.Field(default=None, description="Basic chemical composition")
334
- cold_finished: bool | None = pyd.Field(default=None)
335
- galvanized: bool | None = pyd.Field(default=None)
336
- stainless: bool | None = pyd.Field(default=None)
337
- making_route: SteelMakingRoute | None = pyd.Field(default=None)
338
- astm_standards: list[Standard] | None = pyd.Field(default=None, description="List of ASTM standards")
339
- sae_standards: list[Standard] | None = pyd.Field(default=None, description="List of SAE standards")
340
- en_standards: list[Standard] | None = pyd.Field(default=None, description="List of EN standards")
331
+ astm_marking: str | None = pydantic.Field(default=None, description="The marking to be expected on the product.")
332
+ euro_marking: str | None = pydantic.Field(default=None, description="The marking to be expected on the product.")
333
+ composition: list[SteelComposition] | None = pydantic.Field(default=None, description="Basic chemical composition")
334
+ cold_finished: bool | None = pydantic.Field(default=None)
335
+ galvanized: bool | None = pydantic.Field(default=None)
336
+ stainless: bool | None = pydantic.Field(default=None)
337
+ making_route: SteelMakingRoute | None = pydantic.Field(default=None)
338
+ astm_standards: list[Standard] | None = pydantic.Field(default=None, description="List of ASTM standards")
339
+ sae_standards: list[Standard] | None = pydantic.Field(default=None, description="List of SAE standards")
340
+ en_standards: list[Standard] | None = pydantic.Field(default=None, description="List of EN standards")
341
341
  MBQSteel: MBQSteelRangeV1 | None = None
342
342
  CoilSteel: CoilSteelRangeV1 | None = None
343
343
  ColdFormedSteel: ColdFormedSteelRangeV1 | None = None
@@ -38,10 +38,8 @@ __all__ = (
38
38
  "ThermalMoistureProtectionRangeV1",
39
39
  )
40
40
 
41
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
42
-
41
+ import pydantic
43
42
 
44
- from openepd.compat.pydantic import pyd
45
43
  from openepd.model.common import RangeFloat, RangeRatioFloat
46
44
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
47
45
  from openepd.model.specs.enums import (
@@ -54,6 +52,8 @@ from openepd.model.specs.enums import (
54
52
  )
55
53
  from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa
56
54
 
55
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
56
+
57
57
 
58
58
  class BituminousRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
59
59
  """
@@ -158,7 +158,7 @@ class BoardInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
158
158
 
159
159
  _EXT_VERSION = "1.0"
160
160
 
161
- compressive_strength: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
161
+ compressive_strength: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
162
162
 
163
163
 
164
164
  class FoamedInPlaceRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -170,7 +170,7 @@ class FoamedInPlaceRangeV1(BaseOpenEpdHierarchicalSpec):
170
170
 
171
171
  _EXT_VERSION = "1.0"
172
172
 
173
- foam_type: list[FoamType] | None = pyd.Field(default=None, description="")
173
+ foam_type: list[FoamType] | None = pydantic.Field(default=None, description="")
174
174
 
175
175
 
176
176
  class SprayedInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -207,14 +207,14 @@ class MembraneRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
207
207
 
208
208
  _EXT_VERSION = "1.0"
209
209
 
210
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
211
- sri: RangeFloat | None = pyd.Field(default=None, description="")
212
- total_recycled_content: RangeRatioFloat | None = pyd.Field(default=None, description="")
213
- post_consumer_recycled_content: RangeRatioFloat | None = pyd.Field(default=None, description="")
214
- reinforcement: list[MembraneRoofingReinforcement] | None = pyd.Field(default=None, description="")
215
- felt_backing: bool | None = pyd.Field(default=None, description="")
216
- nsf347: bool | None = pyd.Field(default=None, description="")
217
- vantage_vinyl: bool | None = pyd.Field(default=None, description="")
210
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
211
+ sri: RangeFloat | None = pydantic.Field(default=None, description="")
212
+ total_recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
213
+ post_consumer_recycled_content: RangeRatioFloat | None = pydantic.Field(default=None, description="")
214
+ reinforcement: list[MembraneRoofingReinforcement] | None = pydantic.Field(default=None, description="")
215
+ felt_backing: bool | None = pydantic.Field(default=None, description="")
216
+ nsf347: bool | None = pydantic.Field(default=None, description="")
217
+ vantage_vinyl: bool | None = pydantic.Field(default=None, description="")
218
218
  BituminousRoofing: BituminousRoofingRangeV1 | None = None
219
219
  SinglePlyEPDM: SinglePlyEPDMRangeV1 | None = None
220
220
  SinglePlyKEE: SinglePlyKEERangeV1 | None = None
@@ -233,10 +233,10 @@ class InsulationRangeV1(BaseOpenEpdHierarchicalSpec):
233
233
 
234
234
  _EXT_VERSION = "1.0"
235
235
 
236
- r_value: RangeFloat | None = pyd.Field(default=None, description="")
237
- material: list[InsulatingMaterial] | None = pyd.Field(default=None, description="")
238
- intended_application: list[InsulationIntendedApplication] | None = pyd.Field(default=None, description="")
239
- thickness_per_declared_unit: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
236
+ r_value: RangeFloat | None = pydantic.Field(default=None, description="")
237
+ material: list[InsulatingMaterial] | None = pydantic.Field(default=None, description="")
238
+ intended_application: list[InsulationIntendedApplication] | None = pydantic.Field(default=None, description="")
239
+ thickness_per_declared_unit: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
240
240
  BlanketInsulation: BlanketInsulationRangeV1 | None = None
241
241
  BlownInsulation: BlownInsulationRangeV1 | None = None
242
242
  BoardInsulation: BoardInsulationRangeV1 | None = None
@@ -288,9 +288,9 @@ class RoofCoverBoardsRangeV1(BaseOpenEpdHierarchicalSpec):
288
288
 
289
289
  _EXT_VERSION = "1.0"
290
290
 
291
- material: list[RoofCoverBoardsMaterial] | None = pyd.Field(default=None, description="")
292
- facing: list[RoofCoverBoardsFacing] | None = pyd.Field(default=None, description="")
293
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
291
+ material: list[RoofCoverBoardsMaterial] | None = pydantic.Field(default=None, description="")
292
+ facing: list[RoofCoverBoardsFacing] | None = pydantic.Field(default=None, description="")
293
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
294
294
 
295
295
 
296
296
  class SteepSlopeRoofingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -19,15 +19,15 @@ __all__ = (
19
19
  "UtilityPipingRangeV1",
20
20
  )
21
21
 
22
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
23
-
22
+ import pydantic
24
23
 
25
- from openepd.compat.pydantic import pyd
26
24
  from openepd.model.common import RangeAmount
27
25
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
26
  from openepd.model.specs.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
29
27
  from openepd.model.validation.quantity import AmountRangeLengthMm
30
28
 
29
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
30
+
31
31
 
32
32
  class BuildingHeatingPipingRangeV1(BaseOpenEpdHierarchicalSpec):
33
33
  """
@@ -51,7 +51,7 @@ class BuriedPipingRangeV1(BaseOpenEpdHierarchicalSpec):
51
51
 
52
52
  _EXT_VERSION = "1.0"
53
53
 
54
- buried_piping_type: list[BuriedPipingType] | None = pyd.Field(default=None, description="")
54
+ buried_piping_type: list[BuriedPipingType] | None = pydantic.Field(default=None, description="")
55
55
 
56
56
 
57
57
  class UtilityPipingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -66,10 +66,10 @@ class UtilityPipingRangeV1(BaseOpenEpdHierarchicalSpec):
66
66
 
67
67
  _EXT_VERSION = "1.0"
68
68
 
69
- thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
70
- piping_diameter: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
71
- mass_per_unit_length: RangeAmount | None = pyd.Field(default=None, description="")
72
- piping_ansi_schedule: list[PipingAnsiSchedule] | None = pyd.Field(default=None, description="")
73
- utility_piping_material: list[UtilityPipingMaterial] | None = pyd.Field(default=None, description="")
69
+ thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
70
+ piping_diameter: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
71
+ mass_per_unit_length: RangeAmount | None = pydantic.Field(default=None, description="")
72
+ piping_ansi_schedule: list[PipingAnsiSchedule] | None = pydantic.Field(default=None, description="")
73
+ utility_piping_material: list[UtilityPipingMaterial] | None = pydantic.Field(default=None, description="")
74
74
  BuildingHeatingPiping: BuildingHeatingPipingRangeV1 | None = None
75
75
  BuriedPiping: BuriedPipingRangeV1 | None = None
@@ -34,7 +34,8 @@ __all__ = (
34
34
 
35
35
  from builtins import float
36
36
 
37
- from openepd.compat.pydantic import pyd
37
+ import pydantic
38
+
38
39
  from openepd.model.org import OrgRef
39
40
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
40
41
  from openepd.model.specs.enums import (
@@ -46,7 +47,6 @@ from openepd.model.specs.enums import (
46
47
  SawnTimberSpecies,
47
48
  SheathingPanelsFabrication,
48
49
  )
49
- from openepd.model.validation.numbers import RatioFloat
50
50
  from openepd.model.validation.quantity import AmountRangeLengthMm
51
51
 
52
52
 
@@ -105,8 +105,8 @@ class CompositeLumberRangeV1(BaseOpenEpdHierarchicalSpec):
105
105
 
106
106
  _EXT_VERSION = "1.0"
107
107
 
108
- fabrication: list[CompositeLumberFabrication] | None = pyd.Field(default=None, description="")
109
- timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
108
+ fabrication: list[CompositeLumberFabrication] | None = pydantic.Field(default=None, description="")
109
+ timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
110
110
 
111
111
 
112
112
  class DimensionLumberRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -118,7 +118,7 @@ class DimensionLumberRangeV1(BaseOpenEpdHierarchicalSpec):
118
118
 
119
119
  _EXT_VERSION = "1.0"
120
120
 
121
- timber_species: list[SawnTimberSpecies] | None = pyd.Field(default=None, description="")
121
+ timber_species: list[SawnTimberSpecies] | None = pydantic.Field(default=None, description="")
122
122
  WoodDecking: WoodDeckingRangeV1 | None = None
123
123
  WoodFraming: WoodFramingRangeV1 | None = None
124
124
 
@@ -145,8 +145,8 @@ class MassTimberRangeV1(BaseOpenEpdHierarchicalSpec):
145
145
 
146
146
  _EXT_VERSION = "1.0"
147
147
 
148
- fabrication: list[MassTimberFabrication] | None = pyd.Field(default=None, description="")
149
- timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
148
+ fabrication: list[MassTimberFabrication] | None = pydantic.Field(default=None, description="")
149
+ timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
150
150
 
151
151
 
152
152
  class NonStructuralWoodRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -184,9 +184,9 @@ class SheathingPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
184
184
 
185
185
  _EXT_VERSION = "1.0"
186
186
 
187
- fabrication: list[SheathingPanelsFabrication] | None = pyd.Field(default=None, description="")
188
- wood_board_thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
189
- timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
187
+ fabrication: list[SheathingPanelsFabrication] | None = pydantic.Field(default=None, description="")
188
+ wood_board_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
189
+ timber_species: list[EngineeredTimberSpecies] | None = pydantic.Field(default=None, description="")
190
190
 
191
191
 
192
192
  class UnfinishedWoodRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -209,17 +209,17 @@ class WoodRangeV1(BaseOpenEpdHierarchicalSpec):
209
209
  _EXT_VERSION = "1.0"
210
210
 
211
211
  forest_practices_certifiers: list[OrgRef] | None = None
212
- timber_species: list[AllTimberSpecies] | None = pyd.Field(default=None, description="Timber species")
213
- fabrication: list[AllFabrication] | None = pyd.Field(default=None, description="Timber fabrication")
214
- weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed")
215
- fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant")
216
- decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant")
217
- fsc_certified: RatioFloat | None = pyd.Field(
212
+ timber_species: list[AllTimberSpecies] | None = pydantic.Field(default=None, description="Timber species")
213
+ fabrication: list[AllFabrication] | None = pydantic.Field(default=None, description="Timber fabrication")
214
+ weather_exposed: bool | None = pydantic.Field(default=None, description="Weather exposed")
215
+ fire_retardant: bool | None = pydantic.Field(default=None, description="Fire retardant")
216
+ decay_resistant: bool | None = pydantic.Field(default=None, description="Decay resistant")
217
+ fsc_certified: float | None = pydantic.Field(
218
218
  default=None, description="Forest Stewardship Council certified proportion"
219
219
  )
220
- fsc_certified_z: float | None = pyd.Field(default=None, description="")
221
- recycled_content: RatioFloat | None = pyd.Field(default=None, description="Recycled content")
222
- recycled_content_z: float | None = pyd.Field(default=None, description="")
220
+ fsc_certified_z: float | None = pydantic.Field(default=None, description="")
221
+ recycled_content: float | None = pydantic.Field(default=None, description="Recycled content")
222
+ recycled_content_z: float | None = pydantic.Field(default=None, description="")
223
223
  CompositeLumber: CompositeLumberRangeV1 | None = None
224
224
  DimensionLumber: DimensionLumberRangeV1 | None = None
225
225
  HeavyTimber: HeavyTimberRangeV1 | None = None
@@ -15,14 +15,14 @@
15
15
  #
16
16
  __all__ = ("WoodJoistsRangeV1",)
17
17
 
18
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
19
-
18
+ import pydantic
20
19
 
21
- from openepd.compat.pydantic import pyd
22
20
  from openepd.model.org import OrgRef
23
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
22
  from openepd.model.specs.enums import AllFabrication, AllTimberSpecies
25
23
 
24
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
25
+
26
26
 
27
27
  class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
28
28
  """
@@ -37,8 +37,8 @@ class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
37
37
  _EXT_VERSION = "1.0"
38
38
 
39
39
  forest_practices_certifiers: list[OrgRef] | None = None
40
- timber_species: list[AllTimberSpecies] | None = pyd.Field(default=None, description="")
41
- fabrication: list[AllFabrication] | None = pyd.Field(default=None, description="")
42
- weather_exposed: bool | None = pyd.Field(default=None, description="")
43
- fire_retardant: bool | None = pyd.Field(default=None, description="")
44
- decay_resistant: bool | None = pyd.Field(default=None, description="")
40
+ timber_species: list[AllTimberSpecies] | None = pydantic.Field(default=None, description="")
41
+ fabrication: list[AllFabrication] | None = pydantic.Field(default=None, description="")
42
+ weather_exposed: bool | None = pydantic.Field(default=None, description="")
43
+ fire_retardant: bool | None = pydantic.Field(default=None, description="")
44
+ decay_resistant: bool | None = pydantic.Field(default=None, description="")
@@ -15,7 +15,8 @@
15
15
  #
16
16
  from typing import Any, ClassVar
17
17
 
18
- from openepd.compat.pydantic import pyd
18
+ import pydantic
19
+
19
20
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
20
21
  from openepd.model.specs.singular.accessories import AccessoriesV1
21
22
  from openepd.model.specs.singular.aggregates import AggregatesV1
@@ -57,13 +58,16 @@ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
57
58
  from openepd.model.specs.singular.wood import WoodV1
58
59
  from openepd.model.specs.singular.wood_joists import WoodJoistsV1
59
60
 
60
- __all__ = ("Specs",)
61
+ __all__ = ("Specs", "BaseCompatibilitySpec")
61
62
 
62
63
 
63
64
  class Specs(BaseOpenEpdHierarchicalSpec):
64
65
  """Material specific specs."""
65
66
 
66
- COMPATIBILITY_SPECS: ClassVar[list[type[BaseCompatibilitySpec]]] = [ConcreteOldSpec, SteelOldSpec]
67
+ COMPATIBILITY_SPECS: ClassVar[list[type[BaseCompatibilitySpec]]] = [
68
+ ConcreteOldSpec,
69
+ SteelOldSpec,
70
+ ]
67
71
 
68
72
  _EXT_VERSION = "1.0"
69
73
 
@@ -107,8 +111,8 @@ class Specs(BaseOpenEpdHierarchicalSpec):
107
111
  concrete: ConcreteOldSpec | None = None
108
112
  steel: SteelOldSpec | None = None
109
113
 
110
- @pyd.root_validator(pre=True)
111
- def _ensure_backward_compatibiltiy(cls, values: dict[str, Any]) -> dict[str, Any]:
114
+ @pydantic.model_validator(mode="before")
115
+ def _ensure_backward_compatibility(cls, values: dict[str, Any]) -> dict[str, Any]:
112
116
  """
113
117
  Restore the functionality for backward-compatible specs.
114
118
 
@@ -13,22 +13,25 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- from openepd.compat.pydantic import pyd
16
+ import pydantic
17
+
17
18
  from openepd.model.base import BaseOpenEpdSchema
18
19
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
20
  from openepd.model.specs.enums import AggregateGradation, AggregateWeightClassification
20
- from openepd.model.validation.numbers import RatioFloat
21
21
  from openepd.model.validation.quantity import LengthMmStr
22
22
 
23
23
 
24
24
  class AggregateApplication(BaseOpenEpdSchema):
25
25
  """Application for aggregates."""
26
26
 
27
- concrete: bool | None = pyd.Field(default=None, description="Aggregates used in concrete and masonry applications")
28
- asphalt: bool | None = pyd.Field(
29
- default=None, description="Aggregates used in bituminous paving and surface applications"
27
+ concrete: bool | None = pydantic.Field(
28
+ default=None, description="Aggregates used in concrete and masonry applications"
29
+ )
30
+ asphalt: bool | None = pydantic.Field(
31
+ default=None,
32
+ description="Aggregates used in bituminous paving and surface applications",
30
33
  )
31
- unbound: bool | None = pyd.Field(default=None)
34
+ unbound: bool | None = pydantic.Field(default=None)
32
35
 
33
36
 
34
37
  class AggregatesV1(BaseOpenEpdHierarchicalSpec):
@@ -41,26 +44,30 @@ class AggregatesV1(BaseOpenEpdHierarchicalSpec):
41
44
  _EXT_VERSION = "1.0"
42
45
 
43
46
  # Own fields:
44
- recycled_content: RatioFloat | None = pyd.Field(
45
- example=0.3, default=None, description="Percent of total mass that is recycled aggregate"
47
+ recycled_content: float | None = pydantic.Field(
48
+ examples=[0.3],
49
+ default=None,
50
+ description="Percent of total mass that is recycled aggregate",
51
+ ge=0,
52
+ le=1,
46
53
  )
47
- nominal_max_size: LengthMmStr | None = pyd.Field(
54
+ nominal_max_size: LengthMmStr | None = pydantic.Field(
48
55
  default=None,
49
- example="10 mm",
56
+ examples=["10 mm"],
50
57
  description="Nominal maximum aggregate size is defined as one sieve size smaller than the maximum "
51
58
  "aggregate size. "
52
59
  "The maximum aggregate size is defined as the smallest sieve size that requires 100% passing.",
53
60
  )
54
- weight_classification: AggregateWeightClassification | None = pyd.Field(
55
- example=str(AggregateWeightClassification.HEAVY_WEIGHT), default=None
61
+ weight_classification: AggregateWeightClassification | None = pydantic.Field(
62
+ examples=[str(AggregateWeightClassification.HEAVY_WEIGHT)], default=None
56
63
  )
57
- gradation: AggregateGradation | None = pyd.Field(example=str(AggregateGradation.GAP), default=None)
58
- manufactured: bool | None = pyd.Field(
64
+ gradation: AggregateGradation | None = pydantic.Field(examples=[str(AggregateGradation.GAP)], default=None)
65
+ manufactured: bool | None = pydantic.Field(
59
66
  default=None,
60
67
  description="Aggregate produced via expansion or sintering at high temperatures of the following materials: "
61
68
  "clay, shale, slate, perlite, vermiculite, or slag. Typically used to produce lightweight aggregate",
62
69
  )
63
- slag: bool | None = pyd.Field(
70
+ slag: bool | None = pydantic.Field(
64
71
  default=None,
65
72
  description="Pelletized, foamed, and granulated blast furnace slag can be used as construction aggregate.",
66
73
  )