openepd 6.16.0__tar.gz → 6.17.0__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 (147) hide show
  1. {openepd-6.16.0 → openepd-6.17.0}/PKG-INFO +2 -2
  2. {openepd-6.16.0 → openepd-6.17.0}/README.md +1 -1
  3. {openepd-6.16.0 → openepd-6.17.0}/pyproject.toml +1 -1
  4. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/__version__.py +1 -1
  5. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/__init__.py +5 -3
  6. openepd-6.17.0/src/openepd/model/specs/range/exterior_improvements.py +46 -0
  7. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/__init__.py +7 -2
  8. openepd-6.17.0/src/openepd/model/specs/singular/exterior_improvements.py +46 -0
  9. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/validation/quantity.py +1 -1
  10. {openepd-6.16.0 → openepd-6.17.0}/LICENSE +0 -0
  11. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/__init__.py +0 -0
  12. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/__init__.py +0 -0
  13. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/average_dataset/__init__.py +0 -0
  14. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/average_dataset/generic_estimate_sync_api.py +0 -0
  15. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/average_dataset/industry_epd_sync_api.py +0 -0
  16. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/base_sync_client.py +0 -0
  17. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/category/__init__.py +0 -0
  18. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/category/dto.py +0 -0
  19. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/category/sync_api.py +0 -0
  20. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/common.py +0 -0
  21. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/__init__.py +0 -0
  22. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/base.py +0 -0
  23. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/common.py +0 -0
  24. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/meta.py +0 -0
  25. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/mf.py +0 -0
  26. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/dto/params.py +0 -0
  27. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/epd/__init__.py +0 -0
  28. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/epd/dto.py +0 -0
  29. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/epd/sync_api.py +0 -0
  30. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/errors.py +0 -0
  31. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/pcr/__init__.py +0 -0
  32. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/pcr/sync_api.py +0 -0
  33. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/sync_client.py +0 -0
  34. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/test/__init__.py +0 -0
  35. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/api/utils.py +0 -0
  36. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/bundle/__init__.py +0 -0
  37. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/bundle/base.py +0 -0
  38. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/bundle/model.py +0 -0
  39. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/bundle/reader.py +0 -0
  40. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/bundle/writer.py +0 -0
  41. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/compat/__init__.py +0 -0
  42. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/compat/compat_functional_validators.py +0 -0
  43. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/compat/pydantic.py +0 -0
  44. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/m49/__init__.py +0 -0
  45. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/m49/const.py +0 -0
  46. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/m49/utils.py +0 -0
  47. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/__init__.py +0 -0
  48. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/base.py +0 -0
  49. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/category.py +0 -0
  50. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/common.py +0 -0
  51. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/declaration.py +0 -0
  52. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/epd.py +0 -0
  53. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/factory.py +0 -0
  54. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/generic_estimate.py +0 -0
  55. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/geography.py +0 -0
  56. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/industry_epd.py +0 -0
  57. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/lcia.py +0 -0
  58. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/org.py +0 -0
  59. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/pcr.py +0 -0
  60. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/README.md +0 -0
  61. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/__init__.py +0 -0
  62. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/asphalt.py +0 -0
  63. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/base.py +0 -0
  64. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/concrete.py +0 -0
  65. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/enums.py +0 -0
  66. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/accessories.py +0 -0
  67. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/aggregates.py +0 -0
  68. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/aluminium.py +0 -0
  69. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/asphalt.py +0 -0
  70. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/bulk_materials.py +0 -0
  71. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/cast_decks_and_underlayment.py +0 -0
  72. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/cladding.py +0 -0
  73. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/cmu.py +0 -0
  74. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/concrete.py +0 -0
  75. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/conveying_equipment.py +0 -0
  76. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/electrical.py +0 -0
  77. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +0 -0
  78. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/electricity.py +0 -0
  79. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/finishes.py +0 -0
  80. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/fire_and_smoke_protection.py +0 -0
  81. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/furnishings.py +0 -0
  82. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/grouting.py +0 -0
  83. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/manufacturing_inputs.py +0 -0
  84. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/masonry.py +0 -0
  85. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/material_handling.py +0 -0
  86. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/mechanical.py +0 -0
  87. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/mechanical_insulation.py +0 -0
  88. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/network_infrastructure.py +0 -0
  89. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/openings.py +0 -0
  90. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/other_electrical_equipment.py +0 -0
  91. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/other_materials.py +0 -0
  92. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/plumbing.py +0 -0
  93. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/precast_concrete.py +0 -0
  94. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/sheathing.py +0 -0
  95. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/steel.py +0 -0
  96. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/thermal_moisture_protection.py +0 -0
  97. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/utility_piping.py +0 -0
  98. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/wood.py +0 -0
  99. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/range/wood_joists.py +0 -0
  100. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/accessories.py +0 -0
  101. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/aggregates.py +0 -0
  102. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/aluminium.py +0 -0
  103. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/asphalt.py +0 -0
  104. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/bulk_materials.py +0 -0
  105. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/cast_decks_and_underlayment.py +0 -0
  106. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/cladding.py +0 -0
  107. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/cmu.py +0 -0
  108. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/common.py +0 -0
  109. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/concrete.py +0 -0
  110. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/conveying_equipment.py +0 -0
  111. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/deprecated/__init__.py +0 -0
  112. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/deprecated/concrete.py +0 -0
  113. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/deprecated/steel.py +0 -0
  114. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/electrical.py +0 -0
  115. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py +0 -0
  116. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/electricity.py +0 -0
  117. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/finishes.py +0 -0
  118. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/fire_and_smoke_protection.py +0 -0
  119. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/furnishings.py +0 -0
  120. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/grouting.py +0 -0
  121. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/manufacturing_inputs.py +0 -0
  122. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/masonry.py +0 -0
  123. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/material_handling.py +0 -0
  124. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/mechanical.py +0 -0
  125. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/mechanical_insulation.py +0 -0
  126. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/mixins/__init__.py +0 -0
  127. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/mixins/conduit_mixin.py +0 -0
  128. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/network_infrastructure.py +0 -0
  129. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/openings.py +0 -0
  130. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/other_electrical_equipment.py +0 -0
  131. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/other_materials.py +0 -0
  132. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/plumbing.py +0 -0
  133. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/precast_concrete.py +0 -0
  134. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/sheathing.py +0 -0
  135. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/steel.py +0 -0
  136. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/thermal_moisture_protection.py +0 -0
  137. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/utility_piping.py +0 -0
  138. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/wood.py +0 -0
  139. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/specs/singular/wood_joists.py +0 -0
  140. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/standard.py +0 -0
  141. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/validation/__init__.py +0 -0
  142. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/validation/common.py +0 -0
  143. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/validation/enum.py +0 -0
  144. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/validation/numbers.py +0 -0
  145. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/model/versioning.py +0 -0
  146. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/patch_pydantic.py +0 -0
  147. {openepd-6.16.0 → openepd-6.17.0}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openepd
3
- Version: 6.16.0
3
+ Version: 6.17.0
4
4
  Summary: Python library to work with OpenEPD format
5
5
  License: Apache-2.0
6
6
  Author: C-Change Labs
@@ -59,7 +59,7 @@ including uniqueness of organizations/plants, precise PCR references, and dated
59
59
  The openEPD format is **extensible**. Standard extensions exist for concrete products, and for
60
60
  documenting supply-chain specific data.
61
61
 
62
- [Read More about OpenEPD format here](https://www.buildingtransparency.org/programs/openepd/).
62
+ [Read More about OpenEPD format here](https://www.open-epd-forum.org).
63
63
 
64
64
  ## Usage
65
65
 
@@ -30,7 +30,7 @@ including uniqueness of organizations/plants, precise PCR references, and dated
30
30
  The openEPD format is **extensible**. Standard extensions exist for concrete products, and for
31
31
  documenting supply-chain specific data.
32
32
 
33
- [Read More about OpenEPD format here](https://www.buildingtransparency.org/programs/openepd/).
33
+ [Read More about OpenEPD format here](https://www.open-epd-forum.org).
34
34
 
35
35
  ## Usage
36
36
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "6.16.0"
3
+ version = "6.17.0"
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 = "6.16.0"
16
+ VERSION = "6.17.0"
@@ -13,9 +13,9 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- __all__ = ("SpecsRange",)
17
-
18
- # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
16
+ __all__ = [
17
+ "SpecsRange",
18
+ ]
19
19
 
20
20
 
21
21
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
@@ -33,6 +33,7 @@ from .conveying_equipment import ConveyingEquipmentRangeV1
33
33
  from .electrical import ElectricalRangeV1
34
34
  from .electrical_transmission_and_distribution_equipment import ElectricalTransmissionAndDistributionEquipmentRangeV1
35
35
  from .electricity import ElectricityRangeV1
36
+ from .exterior_improvements import ExteriorImprovementsV1
36
37
  from .finishes import FinishesRangeV1
37
38
  from .fire_and_smoke_protection import FireAndSmokeProtectionRangeV1
38
39
  from .furnishings import FurnishingsRangeV1
@@ -99,3 +100,4 @@ class SpecsRange(BaseOpenEpdHierarchicalSpec):
99
100
  MechanicalInsulation: MechanicalInsulationRangeV1 | None = None
100
101
  OtherElectricalEquipment: OtherElectricalEquipmentRangeV1 | None = None
101
102
  WoodJoists: WoodJoistsRangeV1 | None = None
103
+ ExteriorImprovements: ExteriorImprovementsV1 | None = None
@@ -0,0 +1,46 @@
1
+ #
2
+ # Copyright 2025 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
+ from openepd.compat.pydantic import pyd
17
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
+ from openepd.model.validation.quantity import AmountRangePressureMpa
19
+
20
+
21
+ class ConcretePaversV1(BaseOpenEpdHierarchicalSpec):
22
+ """
23
+ Segmental units of concrete of standardized sizes and shapes for use in paving applications.
24
+
25
+ Includes pavers and paving slabs.
26
+ """
27
+
28
+ _EXT_VERSION = "1.0"
29
+
30
+ compressive_strength: AmountRangePressureMpa | None = pyd.Field(
31
+ default=None,
32
+ description=(
33
+ "Unit strength in MPa, ksi, or psi. "
34
+ "This is the net compressive strength, also known as unit strength, as opposed to f′ₘ (f prime m) which is "
35
+ "the strength of the completed wall module."
36
+ ),
37
+ )
38
+ white_cement: bool | None = pyd.Field(default=None, description="CMU using some portion of white cement")
39
+
40
+
41
+ class ExteriorImprovementsV1(BaseOpenEpdHierarchicalSpec):
42
+ """Products that alter the exterior appearance of a lot or its structures."""
43
+
44
+ _EXT_VERSION = "1.0"
45
+
46
+ ConcretePavers: ConcretePaversV1 | None = None
@@ -13,6 +13,11 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
+ __all__ = [
17
+ "Specs",
18
+ ]
19
+
20
+
16
21
  from collections.abc import Sequence
17
22
  import types
18
23
  from typing import Any, ClassVar, TypeVar
@@ -39,6 +44,7 @@ from openepd.model.specs.singular.electrical_transmission_and_distribution_equip
39
44
  ElectricalTransmissionAndDistributionEquipmentV1,
40
45
  )
41
46
  from openepd.model.specs.singular.electricity import ElectricityV1
47
+ from openepd.model.specs.singular.exterior_improvements import ExteriorImprovementsV1
42
48
  from openepd.model.specs.singular.finishes import FinishesV1
43
49
  from openepd.model.specs.singular.fire_and_smoke_protection import FireAndSmokeProtectionV1
44
50
  from openepd.model.specs.singular.furnishings import FurnishingsV1
@@ -61,8 +67,6 @@ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
61
67
  from openepd.model.specs.singular.wood import WoodV1
62
68
  from openepd.model.specs.singular.wood_joists import WoodJoistsV1
63
69
 
64
- __all__ = ("Specs",)
65
-
66
70
  TValue = TypeVar("TValue")
67
71
 
68
72
 
@@ -108,6 +112,7 @@ class Specs(BaseOpenEpdHierarchicalSpec):
108
112
  MechanicalInsulation: MechanicalInsulationV1 | None = None
109
113
  OtherElectricalEquipment: OtherElectricalEquipmentV1 | None = None
110
114
  WoodJoists: WoodJoistsV1 | None = None
115
+ ExteriorImprovements: ExteriorImprovementsV1 | None = None
111
116
 
112
117
  # historical backward-compatible specs
113
118
  concrete: ConcreteOldSpec | None = None
@@ -0,0 +1,46 @@
1
+ #
2
+ # Copyright 2025 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
+ from openepd.compat.pydantic import pyd
17
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
+ from openepd.model.validation.quantity import AmountPressureMpa
19
+
20
+
21
+ class ConcretePaversV1(BaseOpenEpdHierarchicalSpec):
22
+ """
23
+ Segmental units of concrete of standardized sizes and shapes for use in paving applications.
24
+
25
+ Includes pavers and paving slabs.
26
+ """
27
+
28
+ _EXT_VERSION = "1.0"
29
+
30
+ compressive_strength: AmountPressureMpa | None = pyd.Field(
31
+ default=None,
32
+ description=(
33
+ "Unit strength in MPa, ksi, or psi. "
34
+ "This is the net compressive strength, also known as unit strength, as opposed to f′ₘ (f prime m) which is "
35
+ "the strength of the completed wall module."
36
+ ),
37
+ )
38
+ white_cement: bool | None = pyd.Field(default=None, description="CMU using some portion of white cement")
39
+
40
+
41
+ class ExteriorImprovementsV1(BaseOpenEpdHierarchicalSpec):
42
+ """Products that alter the exterior appearance of a lot or its structures."""
43
+
44
+ _EXT_VERSION = "1.0"
45
+
46
+ ConcretePavers: ConcretePaversV1 | None = None
@@ -464,7 +464,7 @@ class WithPressureMpaMixin(WithDimensionalityMixin):
464
464
 
465
465
 
466
466
  class AmountPressureMpa(Amount, WithPressureMpaMixin):
467
- """Length (mm)."""
467
+ """Pressure (MPa)."""
468
468
 
469
469
  pass
470
470
 
File without changes
File without changes