openepd 5.0.0__py3-none-any.whl → 5.1.1__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 (61) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/model/common.py +39 -0
  3. openepd/model/declaration.py +7 -2
  4. openepd/model/geography.py +1 -1
  5. openepd/model/lcia.py +6 -3
  6. openepd/model/org.py +0 -1
  7. openepd/model/pcr.py +2 -2
  8. openepd/model/specs/README.md +34 -8
  9. openepd/model/specs/asphalt.py +2 -2
  10. openepd/model/specs/base.py +13 -0
  11. openepd/model/specs/generated/__init__.py +80 -0
  12. openepd/model/specs/generated/cladding.py +4 -4
  13. openepd/model/specs/generated/concrete.py +8 -7
  14. openepd/model/specs/generated/electrical.py +2 -2
  15. openepd/model/specs/generated/finishes.py +10 -6
  16. openepd/model/specs/generated/masonry.py +6 -2
  17. openepd/model/specs/generated/network_infrastructure.py +7 -2
  18. openepd/model/specs/generated/openings.py +10 -6
  19. openepd/model/specs/generated/sheathing.py +8 -4
  20. openepd/model/specs/generated/steel.py +10 -5
  21. openepd/model/specs/range/__init__.py +101 -0
  22. openepd/model/specs/range/accessories.py +97 -0
  23. openepd/model/specs/range/aggregates.py +57 -0
  24. openepd/model/specs/range/aluminium.py +92 -0
  25. openepd/model/specs/range/asphalt.py +61 -0
  26. openepd/model/specs/range/bulk_materials.py +31 -0
  27. openepd/model/specs/range/cast_decks_and_underlayment.py +34 -0
  28. openepd/model/specs/range/cladding.py +275 -0
  29. openepd/model/specs/range/cmu.py +44 -0
  30. openepd/model/specs/range/concrete.py +179 -0
  31. openepd/model/specs/range/conveying_equipment.py +86 -0
  32. openepd/model/specs/range/electrical.py +422 -0
  33. openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +96 -0
  34. openepd/model/specs/range/electricity.py +31 -0
  35. openepd/model/specs/range/finishes.py +585 -0
  36. openepd/model/specs/range/fire_and_smoke_protection.py +108 -0
  37. openepd/model/specs/range/furnishings.py +137 -0
  38. openepd/model/specs/range/grouting.py +34 -0
  39. openepd/model/specs/range/manufacturing_inputs.py +190 -0
  40. openepd/model/specs/range/masonry.py +87 -0
  41. openepd/model/specs/range/material_handling.py +50 -0
  42. openepd/model/specs/range/mechanical.py +307 -0
  43. openepd/model/specs/range/mechanical_insulation.py +42 -0
  44. openepd/model/specs/range/network_infrastructure.py +208 -0
  45. openepd/model/specs/range/openings.py +512 -0
  46. openepd/model/specs/range/other_electrical_equipment.py +31 -0
  47. openepd/model/specs/range/other_materials.py +194 -0
  48. openepd/model/specs/range/plumbing.py +200 -0
  49. openepd/model/specs/range/precast_concrete.py +115 -0
  50. openepd/model/specs/range/sheathing.py +86 -0
  51. openepd/model/specs/range/steel.py +332 -0
  52. openepd/model/specs/range/thermal_moisture_protection.py +336 -0
  53. openepd/model/specs/range/utility_piping.py +75 -0
  54. openepd/model/specs/range/wood.py +228 -0
  55. openepd/model/specs/range/wood_joists.py +44 -0
  56. openepd/model/validation/numbers.py +11 -5
  57. openepd/model/validation/quantity.py +440 -52
  58. {openepd-5.0.0.dist-info → openepd-5.1.1.dist-info}/METADATA +6 -1
  59. {openepd-5.0.0.dist-info → openepd-5.1.1.dist-info}/RECORD +61 -26
  60. {openepd-5.0.0.dist-info → openepd-5.1.1.dist-info}/LICENSE +0 -0
  61. {openepd-5.0.0.dist-info → openepd-5.1.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,75 @@
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
+ __all__ = (
17
+ "BuildingHeatingPipingRangeV1",
18
+ "BuriedPipingRangeV1",
19
+ "UtilityPipingRangeV1",
20
+ )
21
+
22
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
23
+
24
+
25
+ from openepd.compat.pydantic import pyd
26
+ from openepd.model.common import RangeAmount
27
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
+ from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
29
+ from openepd.model.validation.quantity import AmountRangeLengthMm
30
+
31
+
32
+ class BuildingHeatingPipingRangeV1(BaseOpenEpdHierarchicalSpec):
33
+ """
34
+ Heating piping.
35
+
36
+ System of pipes used to supply heated fluids (liquids or steam) for purposes of controlling temperature inside a
37
+ home, business, or other building facility.
38
+
39
+ Range version.
40
+ """
41
+
42
+ _EXT_VERSION = "1.0"
43
+
44
+
45
+ class BuriedPipingRangeV1(BaseOpenEpdHierarchicalSpec):
46
+ """
47
+ System of pipes used to provide or transport fluids (liquids and gases) underground.
48
+
49
+ Range version.
50
+ """
51
+
52
+ _EXT_VERSION = "1.0"
53
+
54
+ buried_piping_type: list[BuriedPipingType] | None = pyd.Field(default=None, description="")
55
+
56
+
57
+ class UtilityPipingRangeV1(BaseOpenEpdHierarchicalSpec):
58
+ """
59
+ Utility piping.
60
+
61
+ System of pipes used to convey fluids (liquids and gases) from one location to another. Piping can be metal,
62
+ plastic, concrete, fiberglass, or other materials.
63
+
64
+ Range version.
65
+ """
66
+
67
+ _EXT_VERSION = "1.0"
68
+
69
+ thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
70
+ piping_diameter: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
71
+ mass_per_unit_length: RangeAmount | None = pyd.Field(default=None, description="")
72
+ piping_ansi_schedule: list[PipingAnsiSchedule] | None = pyd.Field(default=None, description="")
73
+ utility_piping_material: list[UtilityPipingMaterial] | None = pyd.Field(default=None, description="")
74
+ BuildingHeatingPiping: BuildingHeatingPipingRangeV1 | None = None
75
+ BuriedPiping: BuriedPipingRangeV1 | None = None
@@ -0,0 +1,228 @@
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
+ __all__ = (
17
+ "WoodDeckingRangeV1",
18
+ "WoodFramingRangeV1",
19
+ "PrefabricatedWoodInsulatedPanelsRangeV1",
20
+ "PrefabricatedWoodTrussRangeV1",
21
+ "CompositeLumberRangeV1",
22
+ "DimensionLumberRangeV1",
23
+ "HeavyTimberRangeV1",
24
+ "MassTimberRangeV1",
25
+ "NonStructuralWoodRangeV1",
26
+ "PrefabricatedWoodRangeV1",
27
+ "SheathingPanelsRangeV1",
28
+ "UnfinishedWoodRangeV1",
29
+ "WoodRangeV1",
30
+ )
31
+
32
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
33
+
34
+
35
+ from openepd.compat.pydantic import pyd
36
+ from openepd.model.common import RangeFloat, RangeRatioFloat
37
+ from openepd.model.org import OrgRef
38
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
39
+ from openepd.model.specs.generated.enums import (
40
+ AllFabrication,
41
+ AllTimberSpecies,
42
+ CompositeLumberFabrication,
43
+ EngineeredTimberSpecies,
44
+ MassTimberFabrication,
45
+ SawnTimberSpecies,
46
+ SheathingPanelsFabrication,
47
+ )
48
+ from openepd.model.validation.quantity import AmountRangeLengthMm
49
+
50
+
51
+ class WoodDeckingRangeV1(BaseOpenEpdHierarchicalSpec):
52
+ """
53
+ Dimensional boards for exterior decking.
54
+
55
+ Range version.
56
+ """
57
+
58
+ _EXT_VERSION = "1.0"
59
+
60
+
61
+ class WoodFramingRangeV1(BaseOpenEpdHierarchicalSpec):
62
+ """
63
+ Dimension lumber for light framing.
64
+
65
+ Includes solid and finger-jointed lumber. Standard shapes include 2x4, 2x6, and 2x8.
66
+
67
+ Range version.
68
+ """
69
+
70
+ _EXT_VERSION = "1.0"
71
+
72
+
73
+ class PrefabricatedWoodInsulatedPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
74
+ """
75
+ Structural insulated panels (SIPs).
76
+
77
+ Consist of wood sheet layer(s) combined with (typically foam) insulation layer(s).
78
+
79
+ Range version.
80
+ """
81
+
82
+ _EXT_VERSION = "1.0"
83
+
84
+
85
+ class PrefabricatedWoodTrussRangeV1(BaseOpenEpdHierarchicalSpec):
86
+ """
87
+ Shop-fabricated wood truss.
88
+
89
+ Range version.
90
+ """
91
+
92
+ _EXT_VERSION = "1.0"
93
+
94
+
95
+ class CompositeLumberRangeV1(BaseOpenEpdHierarchicalSpec):
96
+ """
97
+ Shop-fabricated structural Lumber.
98
+
99
+ Includes Laminated Strand Lumber (LSL), Parallel Strand Lumber (PSL), and Laminated Veneer Lumber (LVL).
100
+
101
+ Range version.
102
+ """
103
+
104
+ _EXT_VERSION = "1.0"
105
+
106
+ fabrication: list[CompositeLumberFabrication] | None = pyd.Field(default=None, description="")
107
+ timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
108
+
109
+
110
+ class DimensionLumberRangeV1(BaseOpenEpdHierarchicalSpec):
111
+ """
112
+ Dimension lumber for framing, decking, and other purposes.
113
+
114
+ Range version.
115
+ """
116
+
117
+ _EXT_VERSION = "1.0"
118
+
119
+ timber_species: list[SawnTimberSpecies] | None = pyd.Field(default=None, description="")
120
+ WoodDecking: WoodDeckingRangeV1 | None = None
121
+ WoodFraming: WoodFramingRangeV1 | None = None
122
+
123
+
124
+ class HeavyTimberRangeV1(BaseOpenEpdHierarchicalSpec):
125
+ """
126
+ Large format, unfinished natural timber.
127
+
128
+ Range version.
129
+ """
130
+
131
+ _EXT_VERSION = "1.0"
132
+
133
+
134
+ class MassTimberRangeV1(BaseOpenEpdHierarchicalSpec):
135
+ """
136
+ Engineered heavy timber products.
137
+
138
+ Includes glue laminated (glulam), cross-laminated timber (CLT), dowel laminated timber (DLT), and nail laminated
139
+ timber (NLT).
140
+
141
+ Range version.
142
+ """
143
+
144
+ _EXT_VERSION = "1.0"
145
+
146
+ fabrication: list[MassTimberFabrication] | None = pyd.Field(default=None, description="")
147
+ timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
148
+
149
+
150
+ class NonStructuralWoodRangeV1(BaseOpenEpdHierarchicalSpec):
151
+ """
152
+ Non-structural interior and exterior wood products for trim, cabinets, countertops, etc.
153
+
154
+ Range version.
155
+ """
156
+
157
+ _EXT_VERSION = "1.0"
158
+
159
+
160
+ class PrefabricatedWoodRangeV1(BaseOpenEpdHierarchicalSpec):
161
+ """
162
+ Prefabricated wood structural members made primarily from one or more types of wood.
163
+
164
+ Includes products made with metallic connectors, insulation, etc. Excludes products where the wood is merely
165
+ decorative.
166
+
167
+ Range version.
168
+ """
169
+
170
+ _EXT_VERSION = "1.0"
171
+
172
+ PrefabricatedWoodInsulatedPanels: PrefabricatedWoodInsulatedPanelsRangeV1 | None = None
173
+ PrefabricatedWoodTruss: PrefabricatedWoodTrussRangeV1 | None = None
174
+
175
+
176
+ class SheathingPanelsRangeV1(BaseOpenEpdHierarchicalSpec):
177
+ """
178
+ Wood sheets used for structural sheathing, including plywood and Oriented Strand Board.
179
+
180
+ Range version.
181
+ """
182
+
183
+ _EXT_VERSION = "1.0"
184
+
185
+ fabrication: list[SheathingPanelsFabrication] | None = pyd.Field(default=None, description="")
186
+ wood_board_thickness: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
187
+ timber_species: list[EngineeredTimberSpecies] | None = pyd.Field(default=None, description="")
188
+
189
+
190
+ class UnfinishedWoodRangeV1(BaseOpenEpdHierarchicalSpec):
191
+ """
192
+ Raw logs and other unfinished wood products.
193
+
194
+ Range version.
195
+ """
196
+
197
+ _EXT_VERSION = "1.0"
198
+
199
+
200
+ class WoodRangeV1(BaseOpenEpdHierarchicalSpec):
201
+ """
202
+ Structural Wood Products used in construction.
203
+
204
+ Range version.
205
+ """
206
+
207
+ _EXT_VERSION = "1.0"
208
+
209
+ forest_practices_certifiers: list[OrgRef] | None = None
210
+ timber_species: list[AllTimberSpecies] | None = pyd.Field(default=None, description="Timber species")
211
+ fabrication: list[AllFabrication] | None = pyd.Field(default=None, description="Timber fabrication")
212
+ weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed")
213
+ fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant")
214
+ decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant")
215
+ fsc_certified: RangeRatioFloat | None = pyd.Field(
216
+ default=None, description="Forest Stewardship Council certified proportion"
217
+ )
218
+ fsc_certified_z: RangeFloat | None = pyd.Field(default=None, description="")
219
+ recycled_content: RangeRatioFloat | None = pyd.Field(default=None, description="Recycled content")
220
+ recycled_content_z: RangeFloat | None = pyd.Field(default=None, description="")
221
+ CompositeLumber: CompositeLumberRangeV1 | None = None
222
+ DimensionLumber: DimensionLumberRangeV1 | None = None
223
+ HeavyTimber: HeavyTimberRangeV1 | None = None
224
+ MassTimber: MassTimberRangeV1 | None = None
225
+ NonStructuralWood: NonStructuralWoodRangeV1 | None = None
226
+ PrefabricatedWood: PrefabricatedWoodRangeV1 | None = None
227
+ SheathingPanels: SheathingPanelsRangeV1 | None = None
228
+ UnfinishedWood: UnfinishedWoodRangeV1 | None = None
@@ -0,0 +1,44 @@
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
+ __all__ = ("WoodJoistsRangeV1",)
17
+
18
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
19
+
20
+
21
+ from openepd.compat.pydantic import pyd
22
+ from openepd.model.org import OrgRef
23
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
+ from openepd.model.specs.generated.enums import AllFabrication, AllTimberSpecies
25
+
26
+
27
+ class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
28
+ """
29
+ Wood joists.
30
+
31
+ Prefabricated I-shaped engineered wood structural members made primarily from one or more types of wood. Includes
32
+ products made with metallic webbing. Excludes products where the wood is merely decorative.
33
+
34
+ Range version.
35
+ """
36
+
37
+ _EXT_VERSION = "1.0"
38
+
39
+ forest_practices_certifiers: list[OrgRef] | None = None
40
+ timber_species: list[AllTimberSpecies] | None = pyd.Field(default=None, description="")
41
+ fabrication: list[AllFabrication] | None = pyd.Field(default=None, description="")
42
+ weather_exposed: bool | None = pyd.Field(default=None, description="")
43
+ fire_retardant: bool | None = pyd.Field(default=None, description="")
44
+ decay_resistant: bool | None = pyd.Field(default=None, description="")
@@ -13,10 +13,16 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- from typing import Annotated
17
16
 
18
- from openepd.compat.pydantic import pyd
19
17
 
20
- # todo when move to pydantic 2, check that validators are being enforced.
21
- RatioFloat = Annotated[float, pyd.Field(ge=0, le=1, example=0.5)]
22
- PositiveInt = Annotated[int, pyd.Field(ge=0, example=1)]
18
+ # todo when move to pydantic 2, these should change to Annotated[float, ...]
19
+ class RatioFloat(float):
20
+ """Float representing a ratio (0-1)."""
21
+
22
+ pass
23
+
24
+
25
+ class PositiveInt(int):
26
+ """Greater than zero integer."""
27
+
28
+ pass