openepd 5.3.0__tar.gz → 6.0.1__tar.gz

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 (140) hide show
  1. {openepd-5.3.0 → openepd-6.0.1}/PKG-INFO +1 -1
  2. {openepd-5.3.0 → openepd-6.0.1}/pyproject.toml +1 -1
  3. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/__version__.py +1 -1
  4. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/average_dataset/generic_estimate_sync_api.py +8 -7
  5. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/epd/sync_api.py +6 -11
  6. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/common.py +22 -0
  7. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/epd.py +1 -1
  8. openepd-6.0.1/src/openepd/model/specs/__init__.py +52 -0
  9. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/base.py +2 -1
  10. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/aggregates.py +2 -2
  11. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/aluminium.py +1 -1
  12. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/asphalt.py +4 -4
  13. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/cladding.py +1 -1
  14. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/cmu.py +6 -5
  15. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/concrete.py +1 -1
  16. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/conveying_equipment.py +1 -1
  17. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/electrical.py +3 -2
  18. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/finishes.py +13 -6
  19. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/fire_and_smoke_protection.py +1 -1
  20. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/furnishings.py +1 -1
  21. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/manufacturing_inputs.py +1 -1
  22. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/masonry.py +2 -2
  23. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/mechanical.py +1 -1
  24. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/mechanical_insulation.py +1 -1
  25. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/network_infrastructure.py +1 -1
  26. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/openings.py +12 -5
  27. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/plumbing.py +1 -1
  28. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/precast_concrete.py +1 -1
  29. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/sheathing.py +3 -3
  30. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/steel.py +10 -5
  31. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/thermal_moisture_protection.py +1 -1
  32. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/utility_piping.py +1 -1
  33. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/wood.py +8 -6
  34. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/wood_joists.py +1 -1
  35. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/__init__.py +37 -35
  36. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/aggregates.py +1 -1
  37. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/aluminium.py +1 -1
  38. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/asphalt.py +6 -4
  39. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/cladding.py +1 -1
  40. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/cmu.py +10 -4
  41. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/concrete.py +1 -1
  42. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/conveying_equipment.py +1 -1
  43. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/electrical.py +4 -3
  44. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/finishes.py +9 -6
  45. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/fire_and_smoke_protection.py +1 -1
  46. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/furnishings.py +1 -1
  47. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/manufacturing_inputs.py +1 -1
  48. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/masonry.py +4 -1
  49. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/mechanical.py +1 -1
  50. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/mechanical_insulation.py +1 -1
  51. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/mixins/conduit_mixin.py +1 -1
  52. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/network_infrastructure.py +2 -2
  53. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/openings.py +10 -4
  54. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/plumbing.py +1 -1
  55. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/sheathing.py +3 -3
  56. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/steel.py +11 -5
  57. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/thermal_moisture_protection.py +1 -1
  58. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/utility_piping.py +1 -1
  59. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/wood.py +13 -7
  60. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/wood_joists.py +2 -2
  61. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/validation/quantity.py +179 -0
  62. openepd-5.3.0/src/openepd/model/specs/__init__.py +0 -93
  63. {openepd-5.3.0 → openepd-6.0.1}/LICENSE +0 -0
  64. {openepd-5.3.0 → openepd-6.0.1}/README.md +0 -0
  65. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/__init__.py +0 -0
  66. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/__init__.py +0 -0
  67. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/average_dataset/__init__.py +0 -0
  68. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/average_dataset/industry_epd_sync_api.py +0 -0
  69. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/base_sync_client.py +0 -0
  70. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/category/__init__.py +0 -0
  71. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/category/dto.py +0 -0
  72. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/category/sync_api.py +0 -0
  73. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/common.py +0 -0
  74. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/__init__.py +0 -0
  75. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/base.py +0 -0
  76. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/common.py +0 -0
  77. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/meta.py +0 -0
  78. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/mf.py +0 -0
  79. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/dto/params.py +0 -0
  80. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/epd/__init__.py +0 -0
  81. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/epd/dto.py +0 -0
  82. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/errors.py +0 -0
  83. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/pcr/__init__.py +0 -0
  84. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/pcr/sync_api.py +0 -0
  85. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/sync_client.py +0 -0
  86. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/test/__init__.py +0 -0
  87. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/api/utils.py +0 -0
  88. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/bundle/__init__.py +0 -0
  89. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/bundle/base.py +0 -0
  90. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/bundle/model.py +0 -0
  91. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/bundle/reader.py +0 -0
  92. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/bundle/writer.py +0 -0
  93. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/compat/__init__.py +0 -0
  94. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/compat/compat_functional_validators.py +0 -0
  95. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/compat/pydantic.py +0 -0
  96. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/__init__.py +0 -0
  97. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/base.py +0 -0
  98. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/category.py +0 -0
  99. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/declaration.py +0 -0
  100. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/factory.py +0 -0
  101. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/generic_estimate.py +0 -0
  102. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/geography.py +0 -0
  103. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/industry_epd.py +0 -0
  104. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/lcia.py +0 -0
  105. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/org.py +0 -0
  106. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/pcr.py +0 -0
  107. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/README.md +0 -0
  108. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/asphalt.py +0 -0
  109. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/concrete.py +0 -0
  110. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs}/enums.py +0 -0
  111. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/__init__.py +0 -0
  112. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/accessories.py +0 -0
  113. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/bulk_materials.py +0 -0
  114. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/cast_decks_and_underlayment.py +0 -0
  115. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +0 -0
  116. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/electricity.py +0 -0
  117. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/grouting.py +0 -0
  118. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/material_handling.py +0 -0
  119. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/other_electrical_equipment.py +0 -0
  120. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/specs/range/other_materials.py +0 -0
  121. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/accessories.py +0 -0
  122. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/bulk_materials.py +0 -0
  123. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/cast_decks_and_underlayment.py +0 -0
  124. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/common.py +0 -0
  125. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/electrical_transmission_and_distribution_equipment.py +0 -0
  126. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/electricity.py +0 -0
  127. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/grouting.py +0 -0
  128. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/material_handling.py +0 -0
  129. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/mixins/__init__.py +0 -0
  130. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/other_electrical_equipment.py +0 -0
  131. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/other_materials.py +0 -0
  132. {openepd-5.3.0/src/openepd/model/specs/generated → openepd-6.0.1/src/openepd/model/specs/singular}/precast_concrete.py +0 -0
  133. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/standard.py +0 -0
  134. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/validation/__init__.py +0 -0
  135. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/validation/common.py +0 -0
  136. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/validation/enum.py +0 -0
  137. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/validation/numbers.py +0 -0
  138. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/model/versioning.py +0 -0
  139. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/patch_pydantic.py +0 -0
  140. {openepd-5.3.0 → openepd-6.0.1}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 5.3.0
3
+ Version: 6.0.1
4
4
  Summary: Python library to work with OpenEPD format
5
5
  Home-page: https://github.com/cchangelabs/openepd
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "5.3.0"
3
+ version = "6.0.1"
4
4
  license = "Apache-2.0"
5
5
  description = "Python library to work with OpenEPD format"
6
6
  authors = ["C-Change Labs <support@c-change-labs.com>"]
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- VERSION = "5.3.0"
16
+ VERSION = "6.0.1"
@@ -57,16 +57,18 @@ class GenericEstimateApi(BaseApiMethodGroup):
57
57
 
58
58
  @overload
59
59
  def post_with_refs(
60
- self, ge: GenericEstimateWithDeps, with_response: Literal[True], exclude_defaults: bool = True
60
+ self, ge: GenericEstimateWithDeps, with_response: Literal[True]
61
61
  ) -> tuple[GenericEstimate, Response]: ...
62
62
 
63
63
  @overload
64
64
  def post_with_refs(
65
- self, ge: GenericEstimateWithDeps, with_response: Literal[False] = False, exclude_defaults: bool = True
65
+ self,
66
+ ge: GenericEstimateWithDeps,
67
+ with_response: Literal[False] = False,
66
68
  ) -> GenericEstimate: ...
67
69
 
68
70
  def post_with_refs(
69
- self, ge: GenericEstimateWithDeps, with_response: bool = False, exclude_defaults: bool = True
71
+ self, ge: GenericEstimateWithDeps, with_response: bool = False
70
72
  ) -> GenericEstimate | tuple[GenericEstimate, Response]:
71
73
  """
72
74
  Post an GenericEstimate with references.
@@ -76,10 +78,9 @@ class GenericEstimateApi(BaseApiMethodGroup):
76
78
  :param exclude_defaults: If True, fields with default values are excluded from the payload
77
79
  :return: GenericEstimate alone, or GenericEstimate with HTTP Response object depending on parameter
78
80
  """
79
- data = ge.to_serializable(exclude_unset=True, exclude_defaults=exclude_defaults, by_alias=True)
80
- if exclude_defaults is False:
81
- # Remove 'id' fields with None values, as 'id' cannot be None
82
- data = remove_none_id_fields(data)
81
+ data = ge.to_serializable(exclude_unset=True, by_alias=True)
82
+ # Remove 'id' fields with None values, as 'id' cannot be None
83
+ data = remove_none_id_fields(data)
83
84
  response = self._client.do_request(
84
85
  "patch",
85
86
  "/generic_estimates/post_with_refs",
@@ -106,16 +106,12 @@ class EpdApi(BaseApiMethodGroup):
106
106
  return self.get_statistics_raw(omf).payload
107
107
 
108
108
  @overload
109
- def post_with_refs(
110
- self, epd: Epd, with_response: Literal[True], exclude_defaults: bool = True
111
- ) -> tuple[Epd, Response]: ...
109
+ def post_with_refs(self, epd: Epd, with_response: Literal[True]) -> tuple[Epd, Response]: ...
112
110
 
113
111
  @overload
114
- def post_with_refs(self, epd: Epd, with_response: Literal[False] = False, exclude_defaults: bool = True) -> Epd: ...
112
+ def post_with_refs(self, epd: Epd, with_response: Literal[False] = False) -> Epd: ...
115
113
 
116
- def post_with_refs(
117
- self, epd: Epd, with_response: bool = False, exclude_defaults: bool = True
118
- ) -> Epd | tuple[Epd, Response]:
114
+ def post_with_refs(self, epd: Epd, with_response: bool = False) -> Epd | tuple[Epd, Response]:
119
115
  """
120
116
  Post an EPD with references.
121
117
 
@@ -124,10 +120,9 @@ class EpdApi(BaseApiMethodGroup):
124
120
  :param exclude_defaults: If True, fields with default values are excluded from the payload
125
121
  :return: EPD or EPD with HTTP Response object depending on parameter
126
122
  """
127
- epd_data = epd.to_serializable(exclude_unset=True, exclude_defaults=exclude_defaults, by_alias=True)
128
- if exclude_defaults is False:
129
- # Remove 'id' fields with None values, as 'id' cannot be None
130
- epd_data = remove_none_id_fields(epd_data)
123
+ epd_data = epd.to_serializable(exclude_unset=True, by_alias=True)
124
+ # Remove 'id' fields with None values, as 'id' cannot be None
125
+ epd_data = remove_none_id_fields(epd_data)
131
126
  response = self._client.do_request(
132
127
  "patch",
133
128
  "/epds/post-with-refs",
@@ -18,6 +18,7 @@ from typing import Annotated, Any
18
18
 
19
19
  from openepd.compat.pydantic import pyd
20
20
  from openepd.model.base import BaseOpenEpdSchema
21
+ from openepd.model.validation.numbers import RatioFloat
21
22
 
22
23
 
23
24
  class Amount(BaseOpenEpdSchema):
@@ -77,6 +78,12 @@ class Measurement(BaseOpenEpdSchema):
77
78
  )
78
79
 
79
80
 
81
+ class IngredientEvidenceTypeEnum(StrEnum):
82
+ """Supported types of evidence for indirect ingredient."""
83
+
84
+ PRODUCT_EPD = "Product EPD"
85
+
86
+
80
87
  class Ingredient(BaseOpenEpdSchema):
81
88
  """
82
89
  An ingredient of a product.
@@ -84,6 +91,11 @@ class Ingredient(BaseOpenEpdSchema):
84
91
  The Ingredients list gives the core data references and quantities. This list is used to document supply-chain
85
92
  transparency, such as the EPDs of major components (e.g. cement in concrete, or recycled steel
86
93
  in hot-rolled sections).
94
+
95
+ Since the exact ingredients may be viewed as a proprietary information by Manufacturers, this schema also allows
96
+ to pass some data about ingredient about explicitly saying what it is. Further, this data can be used to
97
+ calculate the supply chain specificity of the product and uncertainty adjusted factor. For this option, use
98
+ gwp_fraction, citation and evidence_type.
87
99
  """
88
100
 
89
101
  qty: float | None = pyd.Field(
@@ -95,6 +107,16 @@ class Ingredient(BaseOpenEpdSchema):
95
107
  default=None,
96
108
  )
97
109
 
110
+ gwp_fraction: RatioFloat | None = pyd.Field(
111
+ default=None,
112
+ description="Fraction of product's A1-A3 GWP this flow represents. This value, along with the specificity of "
113
+ "the reference, are used to caclulate supply chain specificity.",
114
+ )
115
+ evidence_type: IngredientEvidenceTypeEnum | None = pyd.Field(
116
+ default=None, description="Type of evidence used, which can be used to calculate degree of specificity"
117
+ )
118
+ citation: str | None = pyd.Field(default=None, description="Text citation describing the data source ")
119
+
98
120
 
99
121
  class LatLng(BaseOpenEpdSchema):
100
122
  """A latitude and longitude."""
@@ -29,7 +29,7 @@ from openepd.model.declaration import (
29
29
  )
30
30
  from openepd.model.lcia import WithLciaMixin
31
31
  from openepd.model.org import Org, Plant
32
- from openepd.model.specs import Specs
32
+ from openepd.model.specs.singular import Specs
33
33
  from openepd.model.versioning import OpenEpdVersions, Version
34
34
 
35
35
  MANUFACTURER_DESCRIPTION = (
@@ -0,0 +1,52 @@
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
+
17
+ from openepd.model.specs.singular.accessories import AccessoriesV1
18
+ from openepd.model.specs.singular.aggregates import AggregatesV1
19
+ from openepd.model.specs.singular.aluminium import AluminiumV1
20
+ from openepd.model.specs.singular.asphalt import AsphaltV1
21
+ from openepd.model.specs.singular.bulk_materials import BulkMaterialsV1
22
+ from openepd.model.specs.singular.cast_decks_and_underlayment import CastDecksAndUnderlaymentV1
23
+ from openepd.model.specs.singular.cladding import CladdingV1
24
+ from openepd.model.specs.singular.cmu import CMUV1
25
+ from openepd.model.specs.singular.concrete import ConcreteV1
26
+ from openepd.model.specs.singular.conveying_equipment import ConveyingEquipmentV1
27
+ from openepd.model.specs.singular.electrical import ElectricalV1
28
+ from openepd.model.specs.singular.electrical_transmission_and_distribution_equipment import (
29
+ ElectricalTransmissionAndDistributionEquipmentV1,
30
+ )
31
+ from openepd.model.specs.singular.electricity import ElectricityV1
32
+ from openepd.model.specs.singular.finishes import FinishesV1
33
+ from openepd.model.specs.singular.fire_and_smoke_protection import FireAndSmokeProtectionV1
34
+ from openepd.model.specs.singular.furnishings import FurnishingsV1
35
+ from openepd.model.specs.singular.grouting import GroutingV1
36
+ from openepd.model.specs.singular.manufacturing_inputs import ManufacturingInputsV1
37
+ from openepd.model.specs.singular.masonry import MasonryV1
38
+ from openepd.model.specs.singular.material_handling import MaterialHandlingV1
39
+ from openepd.model.specs.singular.mechanical import MechanicalV1
40
+ from openepd.model.specs.singular.mechanical_insulation import MechanicalInsulationV1
41
+ from openepd.model.specs.singular.network_infrastructure import NetworkInfrastructureV1
42
+ from openepd.model.specs.singular.openings import OpeningsV1
43
+ from openepd.model.specs.singular.other_electrical_equipment import OtherElectricalEquipmentV1
44
+ from openepd.model.specs.singular.other_materials import OtherMaterialsV1
45
+ from openepd.model.specs.singular.plumbing import PlumbingV1
46
+ from openepd.model.specs.singular.precast_concrete import PrecastConcreteV1
47
+ from openepd.model.specs.singular.sheathing import SheathingV1
48
+ from openepd.model.specs.singular.steel import SteelV1
49
+ from openepd.model.specs.singular.thermal_moisture_protection import ThermalMoistureProtectionV1
50
+ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
51
+ from openepd.model.specs.singular.wood import WoodV1
52
+ from openepd.model.specs.singular.wood_joists import WoodJoistsV1
@@ -14,6 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  import dataclasses
17
+ from types import UnionType
17
18
  from typing import Any
18
19
 
19
20
  from openepd.compat.pydantic import pyd
@@ -63,4 +64,4 @@ class CodegenSpec:
63
64
  """
64
65
 
65
66
  exclude_from_codegen: bool = False
66
- override_type: type
67
+ override_type: type | UnionType
@@ -21,8 +21,8 @@ __all__ = ("AggregatesRangeV1",)
21
21
  from openepd.compat.pydantic import pyd
22
22
  from openepd.model.common import RangeRatioFloat
23
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.specs.generated.aggregates import AggregateApplication
25
- from openepd.model.specs.generated.enums import AggregateGradation, AggregateWeightClassification
24
+ from openepd.model.specs.enums import AggregateGradation, AggregateWeightClassification
25
+ from openepd.model.specs.singular.aggregates import AggregateApplication
26
26
  from openepd.model.validation.quantity import AmountRangeLengthMm
27
27
 
28
28
 
@@ -26,7 +26,7 @@ __all__ = (
26
26
 
27
27
  from openepd.compat.pydantic import pyd
28
28
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
29
- from openepd.model.specs.generated.enums import AluminiumAlloy
29
+ from openepd.model.specs.enums import AluminiumAlloy
30
30
 
31
31
 
32
32
  class AluminiumBilletsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -21,8 +21,8 @@ __all__ = ("AsphaltRangeV1",)
21
21
  from openepd.compat.pydantic import pyd
22
22
  from openepd.model.common import RangeRatioFloat
23
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.specs.generated.enums import AsphaltGradation, AsphaltMixType
25
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeTemperatureC
24
+ from openepd.model.specs.enums import AsphaltGradation, AsphaltMixType
25
+ from openepd.model.validation.quantity import AmountRangeLengthMm, TemperatureCStr
26
26
 
27
27
 
28
28
  class AsphaltRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -44,11 +44,11 @@ class AsphaltRangeV1(BaseOpenEpdHierarchicalSpec):
44
44
  ground_tire_rubber: RangeRatioFloat | None = pyd.Field(
45
45
  default=None, description="Percent of mixture that has been replaced by ground tire rubber (GTR)."
46
46
  )
47
- max_temperature: AmountRangeTemperatureC | None = pyd.Field(
47
+ max_temperature: TemperatureCStr | None = pyd.Field(
48
48
  default=None,
49
49
  description="The upper threshold temperature to which an asphalt binder can be heated preventing the asphalt mixture from rutting",
50
50
  )
51
- min_temperature: AmountRangeTemperatureC | None = pyd.Field(
51
+ min_temperature: TemperatureCStr | None = pyd.Field(
52
52
  default=None,
53
53
  description="The lower threshold temperature for an asphalt binder to prevent thermal cracking of the asphalt mixture.",
54
54
  )
@@ -40,7 +40,7 @@ __all__ = (
40
40
 
41
41
  from openepd.compat.pydantic import pyd
42
42
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
43
- from openepd.model.specs.generated.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
43
+ from openepd.model.specs.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
44
44
  from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeRValue
45
45
 
46
46
 
@@ -18,11 +18,12 @@ __all__ = ("CMURangeV1",)
18
18
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
19
19
 
20
20
 
21
+ from builtins import float
22
+
21
23
  from openepd.compat.pydantic import pyd
22
- from openepd.model.common import RangeFloat
23
24
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.specs.generated.enums import CmuBlockType, CmuWeightClassification
25
- from openepd.model.validation.quantity import AmountRangeGWP, AmountRangePressureMpa
25
+ from openepd.model.specs.enums import CmuBlockType, CmuWeightClassification
26
+ from openepd.model.validation.quantity import AmountRangePressureMpa, GwpKgCo2eStr
26
27
 
27
28
 
28
29
  class CMURangeV1(BaseOpenEpdHierarchicalSpec):
@@ -40,5 +41,5 @@ class CMURangeV1(BaseOpenEpdHierarchicalSpec):
40
41
  block_type: list[CmuBlockType] | None = pyd.Field(default=None, description="")
41
42
  insulated: bool | None = pyd.Field(default=None, description="")
42
43
  sound_performance: bool | None = pyd.Field(default=None, description="")
43
- b1_recarbonation: AmountRangeGWP | None = pyd.Field(default=None, description="")
44
- b1_recarbonation_z: RangeFloat | None = pyd.Field(default=None, description="")
44
+ b1_recarbonation: GwpKgCo2eStr | None = pyd.Field(default=None, description="")
45
+ b1_recarbonation_z: float | None = pyd.Field(default=None, description="")
@@ -32,7 +32,7 @@ from openepd.compat.pydantic import pyd
32
32
  from openepd.model.common import RangeRatioFloat
33
33
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
34
34
  from openepd.model.specs.concrete import Cementitious, ConcreteTypicalApplication
35
- from openepd.model.specs.generated.enums import AciExposureClass, CsaExposureClass, EnExposureClass
35
+ from openepd.model.specs.enums import AciExposureClass, CsaExposureClass, EnExposureClass
36
36
  from openepd.model.validation.quantity import (
37
37
  AmountRangeLengthInch,
38
38
  AmountRangeLengthMm,
@@ -24,7 +24,7 @@ __all__ = (
24
24
 
25
25
  from openepd.compat.pydantic import pyd
26
26
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
27
- from openepd.model.specs.generated.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
27
+ from openepd.model.specs.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
28
28
  from openepd.model.validation.quantity import (
29
29
  AmountRangeCapacityPerHour,
30
30
  AmountRangeLengthMm,
@@ -51,13 +51,14 @@ __all__ = (
51
51
  from openepd.compat.pydantic import pyd
52
52
  from openepd.model.common import RangeFloat
53
53
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
54
- from openepd.model.specs.generated.enums import CableTraysMaterial, ConduitMaterial, EnergySource, RacewaysMaterial
54
+ from openepd.model.specs.enums import CableTraysMaterial, ConduitMaterial, EnergySource, RacewaysMaterial
55
55
  from openepd.model.validation.quantity import (
56
56
  AmountRangeColorTemperature,
57
57
  AmountRangeLengthMm,
58
58
  AmountRangeLuminosity,
59
59
  AmountRangeMass,
60
60
  AmountRangePower,
61
+ AmountRangeUtilization,
61
62
  )
62
63
 
63
64
 
@@ -376,7 +377,7 @@ class LightingRangeV1(BaseOpenEpdHierarchicalSpec):
376
377
  _EXT_VERSION = "1.0"
377
378
 
378
379
  color_temperature: AmountRangeColorTemperature | None = pyd.Field(default=None, description="")
379
- typical_utilization: str | None = pyd.Field(default=None, description="")
380
+ typical_utilization: AmountRangeUtilization | None = pyd.Field(default=None, description="")
380
381
  luminosity: AmountRangeLuminosity | None = pyd.Field(default=None, description="")
381
382
  wattage: AmountRangePower | None = pyd.Field(default=None, description="")
382
383
  color_rendering_index: RangeFloat | None = pyd.Field(default=None, description="")
@@ -51,7 +51,7 @@ from openepd.compat.pydantic import pyd
51
51
  from openepd.model.common import RangeAmount, RangeFloat, RangeInt, RangeRatioFloat
52
52
  from openepd.model.org import OrgRef
53
53
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
54
- from openepd.model.specs.generated.enums import (
54
+ from openepd.model.specs.enums import (
55
55
  AccessFlooringCoreMaterial,
56
56
  AccessFlooringFinishMaterial,
57
57
  AccessFlooringSeismicRating,
@@ -78,7 +78,14 @@ from openepd.model.specs.generated.enums import (
78
78
  WoodFlooringFabrication,
79
79
  WoodFlooringTimberSpecies,
80
80
  )
81
- from openepd.model.validation.quantity import AmountRangeGWP, AmountRangeLengthMm, AmountRangePressureMpa
81
+ from openepd.model.validation.quantity import (
82
+ AmountRangeForce,
83
+ AmountRangeGWP,
84
+ AmountRangeLengthMm,
85
+ AmountRangePressureMpa,
86
+ AmountRangeRFactor,
87
+ AmountRangeYarnWeight,
88
+ )
82
89
 
83
90
 
84
91
  class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -106,8 +113,8 @@ class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
106
113
  panel_thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
107
114
  concentrated_load: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
108
115
  uniform_load: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
109
- rolling_load_10_pass: str | None = pyd.Field(default=None, description="")
110
- rolling_load_10000_pass: str | 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="")
111
118
 
112
119
 
113
120
  class CarpetRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -124,7 +131,7 @@ class CarpetRangeV1(BaseOpenEpdHierarchicalSpec):
124
131
  intended_application: list[CarpetIntendedApplication] | None = pyd.Field(default=None, description="")
125
132
  manufacture_type: list[CarpetManufactureType] | None = pyd.Field(default=None, description="")
126
133
  form_factor: list[CarpetFormFactor] | None = pyd.Field(default=None, description="")
127
- yarn_weight: str | None = pyd.Field(default=None, description="")
134
+ yarn_weight: AmountRangeYarnWeight | None = pyd.Field(default=None, description="")
128
135
  yarn_type: list[CarpetYarnType] | None = pyd.Field(default=None, description="")
129
136
  fire_radiant_panel_rating_astme648: str | None = pyd.Field(default=None, description="")
130
137
  fire_smoke_density_rating_astme648: str | None = pyd.Field(default=None, description="")
@@ -457,7 +464,7 @@ class GypsumRangeV1(BaseOpenEpdHierarchicalSpec):
457
464
  fire_rating: list[GypsumFireRating] | None = pyd.Field(default=None, description="")
458
465
  thickness: list[GypsumThickness] | None = pyd.Field(default=None, description="")
459
466
  facing: list[GypsumFacing] | None = pyd.Field(default=None, description="")
460
- r_factor: str | None = pyd.Field(default=None, description="")
467
+ r_factor: AmountRangeRFactor | None = pyd.Field(default=None, description="")
461
468
  flame_spread_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
462
469
  smoke_production_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
463
470
  surface_abrasion_d4977: RangeInt | None = pyd.Field(default=None, description="")
@@ -26,7 +26,7 @@ __all__ = (
26
26
 
27
27
  from openepd.compat.pydantic import pyd
28
28
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
29
- from openepd.model.specs.generated.enums import (
29
+ from openepd.model.specs.enums import (
30
30
  IntumescentFireproofingMaterialType,
31
31
  SprayFireproofingDensity,
32
32
  SprayFireproofingMaterialType,
@@ -30,7 +30,7 @@ __all__ = (
30
30
 
31
31
  from openepd.compat.pydantic import pyd
32
32
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
33
- from openepd.model.specs.generated.enums import CountertopMaterial
33
+ from openepd.model.specs.enums import CountertopMaterial
34
34
  from openepd.model.validation.quantity import AmountRangeLengthMm
35
35
 
36
36
 
@@ -33,7 +33,7 @@ from openepd.compat.pydantic import pyd
33
33
  from openepd.model.common import RangeFloat
34
34
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
35
35
  from openepd.model.specs.concrete import Cementitious
36
- from openepd.model.specs.generated.enums import (
36
+ from openepd.model.specs.enums import (
37
37
  AdmixtureEffects,
38
38
  CarpetYarnType,
39
39
  CementAstmType,
@@ -25,7 +25,7 @@ __all__ = (
25
25
 
26
26
  from openepd.compat.pydantic import pyd
27
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
- from openepd.model.validation.quantity import AmountRangePressureMpa
28
+ from openepd.model.validation.quantity import AmountRangePressureMpa, AmountRangeThermalConductivity
29
29
 
30
30
 
31
31
  class GMURangeV1(BaseOpenEpdHierarchicalSpec):
@@ -48,7 +48,7 @@ class AutoclavedAeratedConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
48
48
  _EXT_VERSION = "1.0"
49
49
 
50
50
  strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
51
- thermal_conductivity: str | None = pyd.Field(default=None, description="")
51
+ thermal_conductivity: AmountRangeThermalConductivity | None = pyd.Field(default=None, description="")
52
52
  white: bool | None = pyd.Field(default=None, description="")
53
53
 
54
54
 
@@ -37,7 +37,7 @@ __all__ = (
37
37
 
38
38
  from openepd.compat.pydantic import pyd
39
39
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
40
- from openepd.model.specs.generated.enums import (
40
+ from openepd.model.specs.enums import (
41
41
  AhuAirflowControl,
42
42
  AhuZoneControl,
43
43
  AirFiltersMediaType,
@@ -21,7 +21,7 @@ __all__ = ("MechanicalInsulationRangeV1",)
21
21
  from openepd.compat.pydantic import pyd
22
22
  from openepd.model.common import RangeFloat
23
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.specs.generated.enums import InsulatingMaterial, InsulationIntendedApplication
24
+ from openepd.model.specs.enums import InsulatingMaterial, InsulationIntendedApplication
25
25
  from openepd.model.validation.quantity import AmountRangeLengthMm
26
26
 
27
27
 
@@ -30,7 +30,7 @@ __all__ = (
30
30
  from openepd.compat.pydantic import pyd
31
31
  from openepd.model.common import RangeInt
32
32
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
33
- from openepd.model.specs.generated.enums import (
33
+ from openepd.model.specs.enums import (
34
34
  CableTraysMaterial,
35
35
  CablingCategory,
36
36
  CablingFireRating,
@@ -50,7 +50,7 @@ __all__ = (
50
50
  from openepd.compat.pydantic import pyd
51
51
  from openepd.model.common import RangeInt, RangeRatioFloat
52
52
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
53
- from openepd.model.specs.generated.enums import (
53
+ from openepd.model.specs.enums import (
54
54
  FlatGlassPanesThickness,
55
55
  FrameMaterial,
56
56
  HardwareFunction,
@@ -58,8 +58,13 @@ from openepd.model.specs.generated.enums import (
58
58
  Spacer,
59
59
  ThermalSeparation,
60
60
  )
61
- from openepd.model.specs.generated.openings import GlazingIntendedApplication, NAFSPerformanceClass
62
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa, AmountRangeSpeed
61
+ from openepd.model.specs.singular.openings import GlazingIntendedApplication, NAFSPerformanceClass
62
+ from openepd.model.validation.quantity import (
63
+ AmountRangeLengthMm,
64
+ AmountRangePressureMpa,
65
+ AmountRangeSpeed,
66
+ AmountRangeUFactor,
67
+ )
63
68
 
64
69
 
65
70
  class PanelDoorsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -328,7 +333,7 @@ class NAFSFenestrationRangeV1(BaseOpenEpdHierarchicalSpec):
328
333
  hurricane_resistant: bool | None = pyd.Field(
329
334
  default=None, description="The product has been designed to resist windborne debris."
330
335
  )
331
- assembly_u_factor: str | None = pyd.Field(
336
+ assembly_u_factor: AmountRangeUFactor | None = pyd.Field(
332
337
  default=None, description="Weighted average conductance of heat across assembly (including frame)."
333
338
  )
334
339
  air_infiltration: AmountRangeSpeed | None = pyd.Field(
@@ -386,7 +391,9 @@ class InsulatingGlazingUnitsRangeV1(BaseOpenEpdHierarchicalSpec):
386
391
  default=None,
387
392
  description="Number of panes, each separated by a cavity. A 3 pane unit has 2 cavities. example: 3",
388
393
  )
389
- cog_u_factor: str | None = pyd.Field(default=None, description="Conductance of heat at center of glass.")
394
+ cog_u_factor: AmountRangeUFactor | None = pyd.Field(
395
+ default=None, description="Conductance of heat at center of glass."
396
+ )
390
397
  spacer: list[Spacer] | None = pyd.Field(default=None, description="Spacer material for Integrated Glass Unit.")
391
398
 
392
399
 
@@ -35,7 +35,7 @@ __all__ = (
35
35
  from openepd.compat.pydantic import pyd
36
36
  from openepd.model.common import RangeAmount
37
37
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
38
- from openepd.model.specs.generated.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
38
+ from openepd.model.specs.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
39
39
  from openepd.model.validation.quantity import AmountRangeLengthMm
40
40
 
41
41
 
@@ -27,7 +27,7 @@ __all__ = (
27
27
  from openepd.compat.pydantic import pyd
28
28
  from openepd.model.common import RangeRatioFloat
29
29
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
30
- from openepd.model.specs.generated.precast_concrete import (
30
+ from openepd.model.specs.singular.precast_concrete import (
31
31
  ArchitecturalPrecastElementType,
32
32
  CivilPrecastElementType,
33
33
  StructuralPrecastElementType,
@@ -25,8 +25,8 @@ __all__ = (
25
25
  from openepd.compat.pydantic import pyd
26
26
  from openepd.model.common import RangeInt
27
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
- from openepd.model.specs.generated.enums import GypsumFacing, GypsumFireRating, GypsumThickness
29
- from openepd.model.validation.quantity import AmountRangeLengthMm
28
+ from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
29
+ from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeRFactor
30
30
 
31
31
 
32
32
  class CementitiousSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -58,7 +58,7 @@ class GypsumSheathingBoardRangeV1(BaseOpenEpdHierarchicalSpec):
58
58
  fire_rating: list[GypsumFireRating] | None = pyd.Field(default=None, description="")
59
59
  thickness: list[GypsumThickness] | None = pyd.Field(default=None, description="")
60
60
  facing: list[GypsumFacing] | None = pyd.Field(default=None, description="")
61
- r_factor: str | None = pyd.Field(default=None, description="")
61
+ r_factor: AmountRangeRFactor | None = pyd.Field(default=None, description="")
62
62
  flame_spread_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
63
63
  smoke_production_astm_e84: RangeInt | None = pyd.Field(default=None, description="")
64
64
  surface_abrasion_d4977: RangeInt | None = pyd.Field(default=None, description="")
@@ -41,10 +41,15 @@ __all__ = (
41
41
  from openepd.compat.pydantic import pyd
42
42
  from openepd.model.common import RangeFloat, RangeRatioFloat
43
43
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
44
- from openepd.model.specs.generated.enums import SteelComposition, SteelRebarGrade
45
- from openepd.model.specs.generated.steel import SteelMakingRoute
44
+ from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
45
+ from openepd.model.specs.singular.steel import SteelMakingRoute
46
46
  from openepd.model.standard import Standard
47
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa
47
+ from openepd.model.validation.quantity import (
48
+ AmountRangeLengthMm,
49
+ AmountRangePressureMpa,
50
+ AmountRangeThermalConductivity,
51
+ AmountRangeThermalExpansion,
52
+ )
48
53
 
49
54
 
50
55
  class ColdFormedFramingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -224,10 +229,10 @@ class StructuralSteelRangeV1(BaseOpenEpdHierarchicalSpec):
224
229
  modulus_of_elasticity: AmountRangePressureMpa | None = pyd.Field(
225
230
  default=None, description="Modulus of Elasticity, https://en.wikipedia.org/wiki/Elastic_modulus "
226
231
  )
227
- thermal_expansion: str | None = pyd.Field(
232
+ thermal_expansion: AmountRangeThermalExpansion | None = pyd.Field(
228
233
  default=None, description="Thermal Expansion, https://en.wikipedia.org/wiki/Thermal_expansion"
229
234
  )
230
- thermal_conductivity: str | None = pyd.Field(
235
+ thermal_conductivity: AmountRangeThermalConductivity | None = pyd.Field(
231
236
  default=None,
232
237
  description="Thermal Conductivity, https://en.wikipedia.org/wiki/Thermal_conductivity_and_resistivity",
233
238
  )
@@ -44,7 +44,7 @@ __all__ = (
44
44
  from openepd.compat.pydantic import pyd
45
45
  from openepd.model.common import RangeFloat, RangeRatioFloat
46
46
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
47
- from openepd.model.specs.generated.enums import (
47
+ from openepd.model.specs.enums import (
48
48
  FoamType,
49
49
  InsulatingMaterial,
50
50
  InsulationIntendedApplication,
@@ -25,7 +25,7 @@ __all__ = (
25
25
  from openepd.compat.pydantic import pyd
26
26
  from openepd.model.common import RangeAmount
27
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
- from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
28
+ from openepd.model.specs.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
29
29
  from openepd.model.validation.quantity import AmountRangeLengthMm
30
30
 
31
31