openepd 7.1.0__py3-none-any.whl → 7.3.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 (78) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/api/average_dataset/generic_estimate_sync_api.py +2 -1
  3. openepd/api/average_dataset/industry_epd_sync_api.py +2 -1
  4. openepd/api/base_sync_client.py +10 -8
  5. openepd/api/common.py +17 -11
  6. openepd/api/dto/common.py +1 -1
  7. openepd/api/epd/sync_api.py +2 -1
  8. openepd/api/org/__init__.py +15 -0
  9. openepd/api/org/sync_api.py +79 -0
  10. openepd/api/pcr/sync_api.py +35 -0
  11. openepd/api/plant/__init__.py +15 -0
  12. openepd/api/plant/sync_api.py +79 -0
  13. openepd/api/standard/__init__.py +15 -0
  14. openepd/api/standard/sync_api.py +79 -0
  15. openepd/api/sync_client.py +27 -0
  16. openepd/bundle/base.py +47 -6
  17. openepd/bundle/model.py +1 -0
  18. openepd/bundle/reader.py +35 -10
  19. openepd/bundle/writer.py +21 -12
  20. openepd/m49/__init__.py +2 -0
  21. openepd/m49/const.py +1 -1
  22. openepd/m49/utils.py +16 -10
  23. openepd/model/base.py +20 -15
  24. openepd/model/common.py +10 -5
  25. openepd/model/declaration.py +2 -2
  26. openepd/model/epd.py +2 -1
  27. openepd/model/factory.py +5 -3
  28. openepd/model/generic_estimate.py +4 -0
  29. openepd/model/lcia.py +10 -10
  30. openepd/model/org.py +14 -7
  31. openepd/model/pcr.py +2 -2
  32. openepd/model/specs/__init__.py +37 -0
  33. openepd/model/specs/asphalt.py +3 -3
  34. openepd/model/specs/base.py +2 -1
  35. openepd/model/specs/enums.py +9 -1
  36. openepd/model/specs/range/__init__.py +5 -3
  37. openepd/model/specs/range/accessories.py +1 -1
  38. openepd/model/specs/range/aluminium.py +1 -1
  39. openepd/model/specs/range/cladding.py +10 -10
  40. openepd/model/specs/range/cmu.py +0 -2
  41. openepd/model/specs/range/concrete.py +25 -2
  42. openepd/model/specs/range/conveying_equipment.py +2 -2
  43. openepd/model/specs/range/electrical.py +18 -18
  44. openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +1 -1
  45. openepd/model/specs/range/exterior_improvements.py +47 -0
  46. openepd/model/specs/range/finishes.py +19 -40
  47. openepd/model/specs/range/fire_and_smoke_protection.py +3 -3
  48. openepd/model/specs/range/furnishings.py +7 -7
  49. openepd/model/specs/range/manufacturing_inputs.py +17 -5
  50. openepd/model/specs/range/masonry.py +1 -1
  51. openepd/model/specs/range/mechanical.py +6 -6
  52. openepd/model/specs/range/mixins/__init__.py +15 -0
  53. openepd/model/specs/range/mixins/access_flooring_mixin.py +43 -0
  54. openepd/model/specs/range/network_infrastructure.py +3 -3
  55. openepd/model/specs/range/openings.py +17 -17
  56. openepd/model/specs/range/other_materials.py +4 -4
  57. openepd/model/specs/range/plumbing.py +5 -5
  58. openepd/model/specs/range/precast_concrete.py +2 -2
  59. openepd/model/specs/range/steel.py +18 -9
  60. openepd/model/specs/range/thermal_moisture_protection.py +12 -12
  61. openepd/model/specs/range/wood.py +4 -6
  62. openepd/model/specs/singular/__init__.py +119 -2
  63. openepd/model/specs/singular/aluminium.py +2 -1
  64. openepd/model/specs/singular/concrete.py +25 -1
  65. openepd/model/specs/singular/deprecated/__init__.py +1 -1
  66. openepd/model/specs/singular/exterior_improvements.py +47 -0
  67. openepd/model/specs/singular/finishes.py +3 -59
  68. openepd/model/specs/singular/manufacturing_inputs.py +13 -1
  69. openepd/model/specs/singular/mixins/access_flooring_mixin.py +55 -0
  70. openepd/model/specs/singular/steel.py +10 -2
  71. openepd/model/validation/common.py +10 -6
  72. openepd/model/validation/enum.py +4 -2
  73. openepd/model/validation/quantity.py +13 -6
  74. openepd/model/versioning.py +8 -6
  75. {openepd-7.1.0.dist-info → openepd-7.3.0.dist-info}/METADATA +23 -13
  76. {openepd-7.1.0.dist-info → openepd-7.3.0.dist-info}/RECORD +78 -67
  77. {openepd-7.1.0.dist-info → openepd-7.3.0.dist-info}/WHEEL +1 -1
  78. {openepd-7.1.0.dist-info → openepd-7.3.0.dist-info}/LICENSE +0 -0
@@ -14,6 +14,43 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
+ __all__ = [
18
+ "CMUV1",
19
+ "AccessoriesV1",
20
+ "AggregatesV1",
21
+ "AluminiumV1",
22
+ "AsphaltV1",
23
+ "BulkMaterialsV1",
24
+ "CastDecksAndUnderlaymentV1",
25
+ "CladdingV1",
26
+ "ConcreteV1",
27
+ "ConveyingEquipmentV1",
28
+ "ElectricalTransmissionAndDistributionEquipmentV1",
29
+ "ElectricalV1",
30
+ "ElectricityV1",
31
+ "FinishesV1",
32
+ "FireAndSmokeProtectionV1",
33
+ "FurnishingsV1",
34
+ "GroutingV1",
35
+ "ManufacturingInputsV1",
36
+ "MasonryV1",
37
+ "MaterialHandlingV1",
38
+ "MechanicalInsulationV1",
39
+ "MechanicalV1",
40
+ "NetworkInfrastructureV1",
41
+ "OpeningsV1",
42
+ "OtherElectricalEquipmentV1",
43
+ "OtherMaterialsV1",
44
+ "PlumbingV1",
45
+ "PrecastConcreteV1",
46
+ "SheathingV1",
47
+ "SteelV1",
48
+ "ThermalMoistureProtectionV1",
49
+ "UtilityPipingV1",
50
+ "WoodJoistsV1",
51
+ "WoodV1",
52
+ ]
53
+
17
54
  from openepd.model.specs.singular.accessories import AccessoriesV1
18
55
  from openepd.model.specs.singular.aggregates import AggregatesV1
19
56
  from openepd.model.specs.singular.aluminium import AluminiumV1
@@ -51,19 +51,19 @@ class AsphaltV1(BaseOpenEpdHierarchicalSpec):
51
51
 
52
52
  asphalt_rap: float | None = pydantic.Field(
53
53
  default=None,
54
- description="Percent of mixture that has been replaced by recycled " "asphalt pavement (RAP).",
54
+ description="Percent of mixture that has been replaced by recycled asphalt pavement (RAP).",
55
55
  ge=0,
56
56
  le=1,
57
57
  )
58
58
  asphalt_ras: float | None = pydantic.Field(
59
59
  default=None,
60
- description="Percent of mixture that has been replaced by recycled " "asphalt shingles (RAS).",
60
+ description="Percent of mixture that has been replaced by recycled asphalt shingles (RAS).",
61
61
  ge=0,
62
62
  le=1,
63
63
  )
64
64
  asphalt_ground_tire_rubber: float | None = pydantic.Field(
65
65
  default=None,
66
- description="Percent of mixture that has been replaced " "by ground tire rubber (GTR).",
66
+ description="Percent of mixture that has been replaced by ground tire rubber (GTR).",
67
67
  ge=0,
68
68
  le=1,
69
69
  )
@@ -40,7 +40,8 @@ class BaseOpenEpdHierarchicalSpec(BaseOpenEpdSpec, WithExtVersionMixin):
40
40
  # ensure that all the concrete spec objects fail on creations if they dont have _EXT_VERSION declared to
41
41
  # something meaningful
42
42
  if not hasattr(self, "_EXT_VERSION") or self._EXT_VERSION is None:
43
- raise ValueError(f"Class {self.__class__} must declare an extension version")
43
+ msg = f"Class {self.__class__} must declare an extension version"
44
+ raise ValueError(msg)
44
45
  Version.parse_version(self._EXT_VERSION) # validate format correctness
45
46
  super().__init__(**{"ext_version": self._EXT_VERSION, **data})
46
47
 
@@ -2017,7 +2017,8 @@ class InsulatingMaterial(StrEnum):
2017
2017
  - Polyisocyanurate: Polyisocyanurate
2018
2018
  - Expanded Polyethylene: Expanded Polyethylene
2019
2019
  - EPS: EPS
2020
- - Other: Other
2020
+ - Wood Fiber = Wood Fiber
2021
+ - Other: Other
2021
2022
 
2022
2023
  """
2023
2024
 
@@ -2029,6 +2030,8 @@ class InsulatingMaterial(StrEnum):
2029
2030
  POLYISOCYANURATE = "Polyisocyanurate"
2030
2031
  EXPANDED_POLYETHYLENE = "Expanded Polyethylene"
2031
2032
  EPS = "EPS"
2033
+ WOOD_FIBER = "Wood Fiber"
2034
+ POLYURETHANE = "Polyurethane"
2032
2035
  OTHER = "Other"
2033
2036
 
2034
2037
 
@@ -2439,13 +2442,18 @@ class CementBoardThickness(StrEnum):
2439
2442
  INCH_3_8 = '3/8"'
2440
2443
  INCH_1_2 = '1/2"'
2441
2444
  INCH_5_8 = '5/8"'
2445
+ MM_4 = "4 mm"
2446
+ MM_6 = "6 mm"
2442
2447
  MM_6_5 = "6.5 mm"
2443
2448
  MM_8_0 = "8.0 mm"
2444
2449
  MM_9_0 = "9.0 mm"
2445
2450
  MM_9_5 = "9.5 mm"
2451
+ MM_10 = "10 mm"
2452
+ MM_12 = "12 mm"
2446
2453
  MM_12_5 = "12.5 mm"
2447
2454
  MM_13 = "13 mm"
2448
2455
  MM_15 = "15 mm"
2456
+ MM_16 = "16 mm"
2449
2457
  MM_18 = "18 mm"
2450
2458
 
2451
2459
 
@@ -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 ExteriorImprovementsRangeV1
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: ExteriorImprovementsRangeV1 | None = None
@@ -14,12 +14,12 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
+ "AccessoriesRangeV1",
17
18
  "BlanketFacingRangeV1",
18
19
  "DoorsHardwareRangeV1",
19
20
  "FlooringAccessoriesRangeV1",
20
21
  "MortarRangeV1",
21
22
  "TileGroutRangeV1",
22
- "AccessoriesRangeV1",
23
23
  )
24
24
 
25
25
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
@@ -16,9 +16,9 @@
16
16
  __all__ = (
17
17
  "AluminiumBilletsRangeV1",
18
18
  "AluminiumExtrusionsRangeV1",
19
+ "AluminiumRangeV1",
19
20
  "AluminiumSheetGoodsRangeV1",
20
21
  "AluminiumSuspensionAssemblyRangeV1",
21
- "AluminiumRangeV1",
22
22
  )
23
23
 
24
24
  import pydantic
@@ -15,24 +15,24 @@
15
15
  #
16
16
  __all__ = (
17
17
  "AluminiumSidingRangeV1",
18
- "SteelSidingRangeV1",
19
- "ZincSidingRangeV1",
20
- "ShingleAndShakeSidingRangeV1",
21
- "MetalSidingRangeV1",
18
+ "CladdingRangeV1",
22
19
  "CompositionSidingRangeV1",
23
20
  "FiberCementSidingRangeV1",
21
+ "InsulatedRoofPanelsRangeV1",
24
22
  "InsulatedVinylSidingRangeV1",
23
+ "InsulatedWallPanelsRangeV1",
24
+ "MetalSidingRangeV1",
25
25
  "PlywoodSidingRangeV1",
26
26
  "PolypropyleneSidingRangeV1",
27
- "SolidWoodSidingRangeV1",
28
- "VinylSidingRangeV1",
29
- "SidingRangeV1",
30
- "InsulatedRoofPanelsRangeV1",
31
- "InsulatedWallPanelsRangeV1",
32
27
  "RoofPanelsRangeV1",
28
+ "ShingleAndShakeSidingRangeV1",
29
+ "SidingRangeV1",
30
+ "SolidWoodSidingRangeV1",
31
+ "SteelSidingRangeV1",
33
32
  "StoneCladdingRangeV1",
33
+ "VinylSidingRangeV1",
34
34
  "WallPanelsRangeV1",
35
- "CladdingRangeV1",
35
+ "ZincSidingRangeV1",
36
36
  )
37
37
 
38
38
  import pydantic
@@ -18,8 +18,6 @@ __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
-
23
21
  import pydantic
24
22
 
25
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
@@ -16,11 +16,11 @@
16
16
  __all__ = (
17
17
  "CementGroutRangeV1",
18
18
  "ConcretePavingRangeV1",
19
+ "ConcreteRangeV1",
19
20
  "FlowableFillRangeV1",
20
21
  "OilPatchRangeV1",
21
22
  "ReadyMixRangeV1",
22
23
  "ShotcreteRangeV1",
23
- "ConcreteRangeV1",
24
24
  )
25
25
 
26
26
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
@@ -124,6 +124,27 @@ class ShotcreteRangeV1(BaseOpenEpdHierarchicalSpec):
124
124
  _EXT_VERSION = "1.0"
125
125
 
126
126
 
127
+ class OtherConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
128
+ """
129
+ Other Concrete.
130
+
131
+ Range version.
132
+ """
133
+
134
+ _EXT_VERSION = "1.0"
135
+
136
+
137
+ class CellularConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
138
+ """
139
+ Cellular concrete is typically composed of cementitious material, water, and pre-formed foam with air entrainment.
140
+
141
+ Such a product is a homogeneous void or cell structure.
142
+ It is self-compacting and can be pumped over extensive heights and distances.
143
+ """
144
+
145
+ _EXT_VERSION = "1.0"
146
+
147
+
127
148
  class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
128
149
  """
129
150
  Concrete.
@@ -134,7 +155,7 @@ class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
134
155
  Range version.
135
156
  """
136
157
 
137
- _EXT_VERSION = "1.0"
158
+ _EXT_VERSION = "1.1"
138
159
 
139
160
  lightweight: bool | None = pydantic.Field(default=None, description="Product is lightweight")
140
161
  strength_28d: AmountRangePressureMpa | None = pydantic.Field(
@@ -186,3 +207,5 @@ class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
186
207
  OilPatch: OilPatchRangeV1 | None = None
187
208
  ReadyMix: ReadyMixRangeV1 | None = None
188
209
  Shotcrete: ShotcreteRangeV1 | None = None
210
+ OtherConcrete: OtherConcreteRangeV1 | None = None
211
+ CellularConcrete: CellularConcreteRangeV1 | None = None
@@ -14,9 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "EscalatorsRangeV1",
18
- "ElevatorsRangeV1",
19
17
  "ConveyingEquipmentRangeV1",
18
+ "ElevatorsRangeV1",
19
+ "EscalatorsRangeV1",
20
20
  )
21
21
 
22
22
  import pydantic
@@ -14,35 +14,35 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "LowVoltBusesRangeV1",
18
- "MedVoltBusesRangeV1",
19
17
  "BatteriesRangeV1",
20
- "OtherElectricalPowerStorageRangeV1",
21
18
  "CableTraysRangeV1",
19
+ "ElectricPowerRangeV1",
22
20
  "ElectricalBusesRangeV1",
23
- "FloorEquipmentBoxesRangeV1",
24
- "PowerDistributionUnitsRangeV1",
25
- "RacewaysRangeV1",
26
- "FueledElectricalGeneratorsRangeV1",
27
- "OtherGenerationRangeV1",
28
- "PhotovoltaicsRangeV1",
29
- "WindTurbinesRangeV1",
21
+ "ElectricalConduitRangeV1",
22
+ "ElectricalGenerationEquipmentRangeV1",
23
+ "ElectricalPowerStorageRangeV1",
24
+ "ElectricalRangeV1",
30
25
  "ElectricityFromPowerGridRangeV1",
31
26
  "ElectricityFromSpecificGeneratorRangeV1",
32
- "PowerPurchaseAgreementsRangeV1",
27
+ "FloorEquipmentBoxesRangeV1",
28
+ "FueledElectricalGeneratorsRangeV1",
33
29
  "LightbulbsRangeV1",
34
30
  "LightingControlsRangeV1",
35
31
  "LightingFixturesRangeV1",
32
+ "LightingRangeV1",
33
+ "LowVoltBusesRangeV1",
34
+ "LowVoltageElectricalDistributionRangeV1",
35
+ "MedVoltBusesRangeV1",
36
+ "OtherElectricalPowerStorageRangeV1",
37
+ "OtherGenerationRangeV1",
36
38
  "OutdoorLightingRangeV1",
39
+ "PhotovoltaicsRangeV1",
40
+ "PowerDistributionUnitsRangeV1",
41
+ "PowerPurchaseAgreementsRangeV1",
42
+ "RacewaysRangeV1",
37
43
  "SpecialtyLightingRangeV1",
38
44
  "TaskLightingRangeV1",
39
- "ElectricalPowerStorageRangeV1",
40
- "LowVoltageElectricalDistributionRangeV1",
41
- "ElectricalGenerationEquipmentRangeV1",
42
- "ElectricPowerRangeV1",
43
- "LightingRangeV1",
44
- "ElectricalConduitRangeV1",
45
- "ElectricalRangeV1",
45
+ "WindTurbinesRangeV1",
46
46
  )
47
47
 
48
48
  import pydantic
@@ -18,8 +18,8 @@ __all__ = (
18
18
  "ElectricalInsulatorsRangeV1",
19
19
  "ElectricalSubstationsRangeV1",
20
20
  "ElectricalSwitchgearRangeV1",
21
- "PowerCablingRangeV1",
22
21
  "ElectricalTransmissionAndDistributionEquipmentRangeV1",
22
+ "PowerCablingRangeV1",
23
23
  )
24
24
 
25
25
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
@@ -0,0 +1,47 @@
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
+ import pydantic as pyd
17
+
18
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
+ from openepd.model.validation.quantity import AmountRangePressureMpa
20
+
21
+
22
+ class ConcretePaversRangeV1(BaseOpenEpdHierarchicalSpec):
23
+ """
24
+ Segmental units of concrete of standardized sizes and shapes for use in paving applications.
25
+
26
+ Includes pavers and paving slabs.
27
+ """
28
+
29
+ _EXT_VERSION = "1.0"
30
+
31
+ compressive_strength: AmountRangePressureMpa | None = pyd.Field(
32
+ default=None,
33
+ description=(
34
+ "Unit strength in MPa, ksi, or psi. "
35
+ "This is the net compressive strength, also known as unit strength, as opposed to f′ₘ (f prime m) which is "
36
+ "the strength of the completed wall module."
37
+ ),
38
+ )
39
+ white_cement: bool | None = pyd.Field(default=None, description="CMU using some portion of white cement")
40
+
41
+
42
+ class ExteriorImprovementsRangeV1(BaseOpenEpdHierarchicalSpec):
43
+ """Products that alter the exterior appearance of a lot or its structures."""
44
+
45
+ _EXT_VERSION = "1.0"
46
+
47
+ ConcretePavers: ConcretePaversRangeV1 | None = None
@@ -15,33 +15,33 @@
15
15
  #
16
16
  __all__ = (
17
17
  "AccessFlooringRangeV1",
18
- "CarpetRangeV1",
19
- "LaminateRangeV1",
20
- "OtherFlooringRangeV1",
21
- "ResilientFlooringRangeV1",
22
- "WallBaseRangeV1",
23
- "WoodFlooringRangeV1",
24
18
  "AcousticalCeilingsRangeV1",
25
- "CeramicTileRangeV1",
26
- "GaugedTileRangeV1",
27
- "GlassTileRangeV1",
28
- "GypsumSupportsRangeV1",
29
- "FlooringRangeV1",
30
- "CeilingPanelRangeV1",
31
19
  "BackingAndUnderlayRangeV1",
20
+ "CarpetRangeV1",
21
+ "CeilingPanelRangeV1",
32
22
  "CementBoardRangeV1",
33
- "TilingRangeV1",
23
+ "CeramicTileRangeV1",
34
24
  "DeckingBoardsRangeV1",
25
+ "FinishesRangeV1",
26
+ "FlooringRangeV1",
27
+ "GaugedTileRangeV1",
35
28
  "GlassFiberReinforcedGypsumFabricationsRangeV1",
29
+ "GlassTileRangeV1",
36
30
  "GypsumRangeV1",
31
+ "GypsumSupportsRangeV1",
32
+ "LaminateRangeV1",
37
33
  "MirrorsRangeV1",
34
+ "OtherFlooringRangeV1",
35
+ "PaintByAreaRangeV1",
38
36
  "PaintByMassRangeV1",
39
37
  "PaintByVolumeRangeV1",
40
- "PaintByAreaRangeV1",
41
38
  "PaintingAndCoatingRangeV1",
42
- "WallFinishesRangeV1",
43
39
  "PlasterRangeV1",
44
- "FinishesRangeV1",
40
+ "ResilientFlooringRangeV1",
41
+ "TilingRangeV1",
42
+ "WallBaseRangeV1",
43
+ "WallFinishesRangeV1",
44
+ "WoodFlooringRangeV1",
45
45
  )
46
46
 
47
47
  import pydantic
@@ -50,10 +50,6 @@ from openepd.model.common import RangeAmount, RangeFloat, RangeInt, RangeRatioFl
50
50
  from openepd.model.org import OrgRef
51
51
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
52
52
  from openepd.model.specs.enums import (
53
- AccessFlooringCoreMaterial,
54
- AccessFlooringFinishMaterial,
55
- AccessFlooringSeismicRating,
56
- AccessFlooringStringers,
57
53
  AllFabrication,
58
54
  CarpetFormFactor,
59
55
  CarpetIntendedApplication,
@@ -76,11 +72,10 @@ from openepd.model.specs.enums import (
76
72
  WoodFlooringFabrication,
77
73
  WoodFlooringTimberSpecies,
78
74
  )
75
+ from openepd.model.specs.range.mixins.access_flooring_mixin import AccessFlooringRangeMixin
79
76
  from openepd.model.validation.quantity import (
80
- AmountRangeForce,
81
77
  AmountRangeGWP,
82
78
  AmountRangeLengthMm,
83
- AmountRangePressureMpa,
84
79
  AmountRangeRFactor,
85
80
  AmountRangeYarnWeight,
86
81
  )
@@ -88,7 +83,7 @@ from openepd.model.validation.quantity import (
88
83
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
89
84
 
90
85
 
91
- class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
86
+ class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec, AccessFlooringRangeMixin):
92
87
  """
93
88
  Elevated floor system built on top of concrete slab surface.
94
89
 
@@ -100,22 +95,6 @@ class AccessFlooringRangeV1(BaseOpenEpdHierarchicalSpec):
100
95
 
101
96
  _EXT_VERSION = "1.0"
102
97
 
103
- core_material: list[AccessFlooringCoreMaterial] | None = pydantic.Field(default=None, description="")
104
- finish_material: list[AccessFlooringFinishMaterial] | None = pydantic.Field(default=None, description="")
105
- stringers: list[AccessFlooringStringers] | None = pydantic.Field(default=None, description="")
106
- seismic_rating: list[AccessFlooringSeismicRating] | None = pydantic.Field(default=None, description="")
107
- magnetically_attached_finish: bool | None = pydantic.Field(default=None, description="")
108
- permanent_finish: bool | None = pydantic.Field(default=None, description="")
109
- drylay: bool | None = pydantic.Field(default=None, description="")
110
- adjustable_height: bool | None = pydantic.Field(default=None, description="")
111
- fixed_height: bool | None = pydantic.Field(default=None, description="")
112
- finished_floor_height: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
113
- panel_thickness: AmountRangeLengthMm | None = pydantic.Field(default=None, description="")
114
- concentrated_load: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
115
- uniform_load: AmountRangePressureMpa | None = pydantic.Field(default=None, description="")
116
- rolling_load_10_pass: AmountRangeForce | None = pydantic.Field(default=None, description="")
117
- rolling_load_10000_pass: AmountRangeForce | None = pydantic.Field(default=None, description="")
118
-
119
98
 
120
99
  class CarpetRangeV1(BaseOpenEpdHierarchicalSpec):
121
100
  """
@@ -377,7 +356,7 @@ class CementBoardRangeV1(BaseOpenEpdHierarchicalSpec):
377
356
  Range version.
378
357
  """
379
358
 
380
- _EXT_VERSION = "1.0"
359
+ _EXT_VERSION = "1.1"
381
360
 
382
361
  thickness: list[CementBoardThickness] | None = pydantic.Field(default=None, description="")
383
362
 
@@ -14,11 +14,11 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "IntumescentFireproofingRangeV1",
18
- "SprayFireproofingRangeV1",
19
17
  "AppliedFireproofingRangeV1",
20
- "FirestoppingRangeV1",
21
18
  "FireAndSmokeProtectionRangeV1",
19
+ "FirestoppingRangeV1",
20
+ "IntumescentFireproofingRangeV1",
21
+ "SprayFireproofingRangeV1",
22
22
  )
23
23
 
24
24
  import pydantic
@@ -14,22 +14,22 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "DemountablePartitionTrackRangeV1",
18
17
  "ChairsRangeV1",
18
+ "ClosedStorageFurnitureRangeV1",
19
19
  "CountertopsRangeV1",
20
+ "DemountablePartitionTrackRangeV1",
20
21
  "DemountablePartitionsRangeV1",
21
- "OtherFurnishingsRangeV1",
22
- "OpenStorageFurnitureRangeV1",
23
- "ClosedStorageFurnitureRangeV1",
24
- "RetractableStorageFurnitureRangeV1",
22
+ "FurnishingsRangeV1",
25
23
  "MobileStorageFurnitureRangeV1",
26
- "WallMountedStorageShelvingRangeV1",
24
+ "OpenStorageFurnitureRangeV1",
25
+ "OtherFurnishingsRangeV1",
27
26
  "OtherStorageFurnitureRangeV1",
27
+ "RetractableStorageFurnitureRangeV1",
28
28
  "StorageFurnitureRangeV1",
29
29
  "TablesRangeV1",
30
+ "WallMountedStorageShelvingRangeV1",
30
31
  "WorkSurfacesRangeV1",
31
32
  "WorkspacesRangeV1",
32
- "FurnishingsRangeV1",
33
33
  )
34
34
 
35
35
  import pydantic
@@ -14,16 +14,16 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "CementRangeV1",
18
- "MasonryCementRangeV1",
19
- "SupplementaryCementitiousMaterialsRangeV1",
20
17
  "AccessFlooringPedestalsRangeV1",
21
18
  "CarpetBackingRangeV1",
22
19
  "CarpetFiberRangeV1",
20
+ "CementRangeV1",
23
21
  "CementitiousMaterialsRangeV1",
24
22
  "ConcreteAdmixturesRangeV1",
25
- "TextilesRangeV1",
26
23
  "ManufacturingInputsRangeV1",
24
+ "MasonryCementRangeV1",
25
+ "SupplementaryCementitiousMaterialsRangeV1",
26
+ "TextilesRangeV1",
27
27
  )
28
28
 
29
29
  import pydantic
@@ -42,6 +42,7 @@ from openepd.model.specs.enums import (
42
42
  MasonryCementAstmC91Type,
43
43
  TextilesFabricType,
44
44
  )
45
+ from openepd.model.specs.range.mixins.access_flooring_mixin import AccessFlooringRangeMixin
45
46
 
46
47
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
47
48
 
@@ -170,6 +171,16 @@ class TextilesRangeV1(BaseOpenEpdHierarchicalSpec):
170
171
  fabric_type: list[TextilesFabricType] | None = pydantic.Field(default=None, description="")
171
172
 
172
173
 
174
+ class AccessFlooringPanelsRangeV1(BaseOpenEpdHierarchicalSpec, AccessFlooringRangeMixin):
175
+ """
176
+ Part of an access floor system.
177
+
178
+ Panels are laid on top of an access floor pedestal, creating a finish floor.
179
+ """
180
+
181
+ _EXT_VERSION = "1.0"
182
+
183
+
173
184
  class ManufacturingInputsRangeV1(BaseOpenEpdHierarchicalSpec):
174
185
  """
175
186
  Manufacturing inputs.
@@ -180,7 +191,7 @@ class ManufacturingInputsRangeV1(BaseOpenEpdHierarchicalSpec):
180
191
  Range version.
181
192
  """
182
193
 
183
- _EXT_VERSION = "1.0"
194
+ _EXT_VERSION = "1.1"
184
195
 
185
196
  AccessFlooringPedestals: AccessFlooringPedestalsRangeV1 | None = None
186
197
  CarpetBacking: CarpetBackingRangeV1 | None = None
@@ -188,3 +199,4 @@ class ManufacturingInputsRangeV1(BaseOpenEpdHierarchicalSpec):
188
199
  CementitiousMaterials: CementitiousMaterialsRangeV1 | None = None
189
200
  ConcreteAdmixtures: ConcreteAdmixturesRangeV1 | None = None
190
201
  Textiles: TextilesRangeV1 | None = None
202
+ AccessFlooringPanels: AccessFlooringPanelsRangeV1 | None = None
@@ -14,9 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "GMURangeV1",
18
17
  "AutoclavedAeratedConcreteRangeV1",
19
18
  "BrickRangeV1",
19
+ "GMURangeV1",
20
20
  "MasonryRangeV1",
21
21
  )
22
22
 
@@ -14,21 +14,21 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __all__ = (
17
- "HvacVrfControlRangeV1",
18
- "HvacVrfIndoorRangeV1",
19
- "HvacVrfOutdoorRangeV1",
17
+ "HvacAHUsRangeV1",
20
18
  "HvacAirDiffusersRangeV1",
21
19
  "HvacAirFiltersRangeV1",
22
- "HvacAHUsRangeV1",
23
20
  "HvacBoilersRangeV1",
24
21
  "HvacChillersRangeV1",
22
+ "HvacDuctsRangeV1",
25
23
  "HvacFansRangeV1",
26
- "HvacHeatPumpsRangeV1",
27
24
  "HvacHeatExRangeV1",
25
+ "HvacHeatPumpsRangeV1",
28
26
  "HvacPumpsRangeV1",
29
27
  "HvacRTUsRangeV1",
28
+ "HvacVrfControlRangeV1",
29
+ "HvacVrfIndoorRangeV1",
30
+ "HvacVrfOutdoorRangeV1",
30
31
  "HvacVrfSystemsRangeV1",
31
- "HvacDuctsRangeV1",
32
32
  "MechanicalRangeV1",
33
33
  )
34
34
 
@@ -0,0 +1,15 @@
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
+ #