openepd 6.0.0__py3-none-any.whl → 6.0.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.
openepd/__version__.py CHANGED
@@ -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.0.0"
16
+ VERSION = "6.0.1"
@@ -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
@@ -22,7 +22,7 @@ from openepd.compat.pydantic import pyd
22
22
  from openepd.model.common import RangeRatioFloat
23
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
24
  from openepd.model.specs.enums import AsphaltGradation, AsphaltMixType
25
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangeTemperatureC
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
  )
@@ -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
25
  from openepd.model.specs.enums import CmuBlockType, CmuWeightClassification
25
- from openepd.model.validation.quantity import AmountRangeGWP, AmountRangePressureMpa
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="")
@@ -58,6 +58,7 @@ from openepd.model.validation.quantity import (
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="")
@@ -78,7 +78,14 @@ from openepd.model.specs.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="")
@@ -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
 
@@ -59,7 +59,12 @@ from openepd.model.specs.enums import (
59
59
  ThermalSeparation,
60
60
  )
61
61
  from openepd.model.specs.singular.openings import GlazingIntendedApplication, NAFSPerformanceClass
62
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa, AmountRangeSpeed
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
 
@@ -26,7 +26,7 @@ from openepd.compat.pydantic import pyd
26
26
  from openepd.model.common import RangeInt
27
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
28
  from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
29
- from openepd.model.validation.quantity import AmountRangeLengthMm
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="")
@@ -44,7 +44,12 @@ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
44
44
  from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
45
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
  )
@@ -32,8 +32,9 @@ __all__ = (
32
32
  # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
33
33
 
34
34
 
35
+ from builtins import float
36
+
35
37
  from openepd.compat.pydantic import pyd
36
- from openepd.model.common import RangeFloat, RangeRatioFloat
37
38
  from openepd.model.org import OrgRef
38
39
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
39
40
  from openepd.model.specs.enums import (
@@ -45,6 +46,7 @@ from openepd.model.specs.enums import (
45
46
  SawnTimberSpecies,
46
47
  SheathingPanelsFabrication,
47
48
  )
49
+ from openepd.model.validation.numbers import RatioFloat
48
50
  from openepd.model.validation.quantity import AmountRangeLengthMm
49
51
 
50
52
 
@@ -212,12 +214,12 @@ class WoodRangeV1(BaseOpenEpdHierarchicalSpec):
212
214
  weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed")
213
215
  fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant")
214
216
  decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant")
215
- fsc_certified: RangeRatioFloat | None = pyd.Field(
217
+ fsc_certified: RatioFloat | None = pyd.Field(
216
218
  default=None, description="Forest Stewardship Council certified proportion"
217
219
  )
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="")
220
+ fsc_certified_z: float | None = pyd.Field(default=None, description="")
221
+ recycled_content: RatioFloat | None = pyd.Field(default=None, description="Recycled content")
222
+ recycled_content_z: float | None = pyd.Field(default=None, description="")
221
223
  CompositeLumber: CompositeLumberRangeV1 | None = None
222
224
  DimensionLumber: DimensionLumberRangeV1 | None = None
223
225
  HeavyTimber: HeavyTimberRangeV1 | None = None
@@ -14,6 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.model.base import BaseOpenEpdSchema
17
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
17
18
  from openepd.model.specs.singular.accessories import AccessoriesV1
18
19
  from openepd.model.specs.singular.aggregates import AggregatesV1
19
20
  from openepd.model.specs.singular.aluminium import AluminiumV1
@@ -51,10 +52,14 @@ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
51
52
  from openepd.model.specs.singular.wood import WoodV1
52
53
  from openepd.model.specs.singular.wood_joists import WoodJoistsV1
53
54
 
55
+ __all__ = ("Specs",)
54
56
 
55
- class Specs(BaseOpenEpdSchema):
57
+
58
+ class Specs(BaseOpenEpdHierarchicalSpec):
56
59
  """Material specific specs."""
57
60
 
61
+ _EXT_VERSION = "1.0"
62
+
58
63
  # Nested specs:
59
64
  CMU: CMUV1 | None = None
60
65
  Masonry: MasonryV1 | None = None
@@ -13,8 +13,10 @@
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
17
- from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
18
20
  from openepd.model.specs.enums import AsphaltGradation, AsphaltMixType
19
21
  from openepd.model.validation.numbers import RatioFloat
20
22
  from openepd.model.validation.quantity import LengthMmStr, TemperatureCStr
@@ -48,14 +50,14 @@ class AsphaltV1(BaseOpenEpdHierarchicalSpec):
48
50
  ge=0,
49
51
  le=1,
50
52
  )
51
- max_temperature: TemperatureCStr | None = pyd.Field(
53
+ max_temperature: Annotated[TemperatureCStr | None, CodegenSpec(override_type=TemperatureCStr)] = pyd.Field(
52
54
  default=None,
53
55
  description="The upper threshold temperature to which an asphalt "
54
56
  "binder can be heated preventing the asphalt mixture "
55
57
  "from rutting",
56
58
  example="90 °C",
57
59
  )
58
- min_temperature: TemperatureCStr | None = pyd.Field(
60
+ min_temperature: Annotated[TemperatureCStr | None, CodegenSpec(override_type=TemperatureCStr)] = pyd.Field(
59
61
  default=None,
60
62
  description="The lower threshold temperature for an asphalt "
61
63
  "binder to prevent thermal cracking of the asphalt"
@@ -13,8 +13,10 @@
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
17
- from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
18
20
  from openepd.model.specs.enums import CmuBlockType, CmuWeightClassification
19
21
  from openepd.model.validation.quantity import GwpKgCo2eStr, PressureMPaStr
20
22
 
@@ -31,5 +33,9 @@ class CMUV1(BaseOpenEpdHierarchicalSpec):
31
33
  block_type: CmuBlockType | None = pyd.Field(default=None, description="", example="Gray")
32
34
  insulated: bool | None = pyd.Field(default=None, description="", example=True)
33
35
  sound_performance: bool | None = pyd.Field(default=None, description="", example=True)
34
- b1_recarbonation: GwpKgCo2eStr | None = pyd.Field(default=None, description="", example="1 kgCO2e")
35
- b1_recarbonation_z: float | None = pyd.Field(default=None, description="", example=2.3)
36
+ b1_recarbonation: Annotated[GwpKgCo2eStr | None, CodegenSpec(override_type=GwpKgCo2eStr)] = pyd.Field(
37
+ default=None, description="", example="1 kgCO2e"
38
+ )
39
+ b1_recarbonation_z: Annotated[float | None, CodegenSpec(override_type=float)] = pyd.Field(
40
+ default=None, description="", example=2.3
41
+ )
@@ -24,6 +24,7 @@ from openepd.model.validation.quantity import (
24
24
  LuminosityStr,
25
25
  MassKgStr,
26
26
  PowerStr,
27
+ UtilizationStr,
27
28
  validate_quantity_ge_factory,
28
29
  validate_quantity_le_factory,
29
30
  validate_quantity_unit_factory,
@@ -255,7 +256,7 @@ class LightingV1(BaseOpenEpdHierarchicalSpec):
255
256
 
256
257
  # Own fields:
257
258
  color_temperature: ColorTemperatureStr | None = pyd.Field(default=None, description="", example="1 K")
258
- typical_utilization: str | None = pyd.Field(default=None, description="", example="1 h / yr")
259
+ typical_utilization: UtilizationStr | None = pyd.Field(default=None, description="", example="1 h / yr")
259
260
  luminosity: LuminosityStr | None = pyd.Field(default=None, description="", example="1 lumen")
260
261
  wattage: PowerStr | None = pyd.Field(default=None, description="")
261
262
  color_rendering_index: float | None = pyd.Field(default=None, description="", example=2.3)
@@ -46,10 +46,13 @@ from openepd.model.specs.singular.common import HasForestPracticesCertifiers
46
46
  from openepd.model.validation.numbers import RatioFloat
47
47
  from openepd.model.validation.quantity import (
48
48
  AreaPerVolumeStr,
49
+ ForceNStr,
49
50
  GwpKgCo2eStr,
50
51
  LengthMmStr,
51
52
  LengthMStr,
52
53
  PressureMPaStr,
54
+ RFactorStr,
55
+ YarnWeightStr,
53
56
  validate_quantity_ge_factory,
54
57
  validate_quantity_le_factory,
55
58
  validate_quantity_unit_factory,
@@ -80,8 +83,8 @@ class AccessFlooringV1(BaseOpenEpdHierarchicalSpec):
80
83
  panel_thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="1 m")
81
84
  concentrated_load: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
82
85
  uniform_load: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
83
- rolling_load_10_pass: str | None = pyd.Field(default=None, description="", example="1 N")
84
- rolling_load_10000_pass: str | None = pyd.Field(default=None, description="", example="1 N")
86
+ rolling_load_10_pass: ForceNStr | None = pyd.Field(default=None, description="", example="1 N")
87
+ rolling_load_10000_pass: ForceNStr | None = pyd.Field(default=None, description="", example="1 N")
85
88
 
86
89
  _access_flooring_rolling_load_10_pass_is_quantity_validator = pyd.validator(
87
90
  "rolling_load_10_pass", allow_reuse=True
@@ -104,7 +107,7 @@ class CarpetV1(BaseOpenEpdHierarchicalSpec):
104
107
  )
105
108
  manufacture_type: CarpetManufactureType | None = pyd.Field(default=None, description="", example="Tufted")
106
109
  form_factor: CarpetFormFactor | None = pyd.Field(default=None, description="", example="Tiles")
107
- yarn_weight: str | None = pyd.Field(default=None, description="", example="1 g / m2")
110
+ yarn_weight: YarnWeightStr | None = pyd.Field(default=None, description="", example="1 g / m2")
108
111
  yarn_type: CarpetYarnType | None = pyd.Field(default=None, description="", example="Nylon 6,6")
109
112
  fire_radiant_panel_rating_astme648: str | None = pyd.Field(default=None, description="")
110
113
  fire_smoke_density_rating_astme648: str | None = pyd.Field(default=None, description="")
@@ -446,7 +449,7 @@ class GypsumV1(BaseOpenEpdHierarchicalSpec):
446
449
  fire_rating: GypsumFireRating | None = pyd.Field(default=None, description="", example="-")
447
450
  thickness: GypsumThickness | None = pyd.Field(default=None, description="", example="1 m")
448
451
  facing: GypsumFacing | None = pyd.Field(default=None, description="", example="Paper")
449
- r_factor: str | None = pyd.Field(default=None, description="", example="1 RSI")
452
+ r_factor: RFactorStr | None = pyd.Field(default=None, description="", example="1 RSI")
450
453
  flame_spread_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
451
454
  smoke_production_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
452
455
  surface_abrasion_d4977: int | None = pyd.Field(default=None, description="", example=3)
@@ -17,6 +17,7 @@ from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
18
  from openepd.model.validation.quantity import (
19
19
  PressureMPaStr,
20
+ ThermalConductivityStr,
20
21
  validate_quantity_ge_factory,
21
22
  validate_quantity_unit_factory,
22
23
  )
@@ -35,7 +36,9 @@ class AutoclavedAeratedConcreteV1(BaseOpenEpdHierarchicalSpec):
35
36
 
36
37
  # Own fields:
37
38
  strength_28d: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
38
- thermal_conductivity: str | None = pyd.Field(default=None, description="", example="1 W / (m * K)")
39
+ thermal_conductivity: ThermalConductivityStr | None = pyd.Field(
40
+ default=None, description="", example="1 W / (m * K)"
41
+ )
39
42
  white: bool | None = pyd.Field(default=None, description="", example=True)
40
43
 
41
44
  _aac_thermal_conductivity_is_quantity_validator = pyd.validator("thermal_conductivity", allow_reuse=True)(
@@ -26,7 +26,13 @@ from openepd.model.specs.enums import (
26
26
  ThermalSeparation,
27
27
  )
28
28
  from openepd.model.validation.numbers import RatioFloat
29
- from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, SpeedStr, validate_quantity_unit_factory
29
+ from openepd.model.validation.quantity import (
30
+ LengthMmStr,
31
+ PressureMPaStr,
32
+ SpeedStr,
33
+ UFactorStr,
34
+ validate_quantity_unit_factory,
35
+ )
30
36
 
31
37
 
32
38
  class GlazingIntendedApplication(BaseOpenEpdSchema):
@@ -346,7 +352,7 @@ class NAFSFenestrationV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin):
346
352
  default=None, description="The product has been designed to resist windborne debris.", example=True
347
353
  )
348
354
 
349
- assembly_u_factor: str | None = pyd.Field(
355
+ assembly_u_factor: UFactorStr | None = pyd.Field(
350
356
  default=None,
351
357
  description="Weighted average conductance of heat across assembly (including frame).",
352
358
  example="1 USI",
@@ -417,7 +423,7 @@ class InsulatingGlazingUnitsV1(BaseOpenEpdHierarchicalSpec, GlazingOptionsMixin)
417
423
  description="Number of panes, each separated by a cavity. A 3 pane unit has 2 cavities. example: 3",
418
424
  example=3,
419
425
  )
420
- cog_u_factor: str | None = pyd.Field(
426
+ cog_u_factor: UFactorStr | None = pyd.Field(
421
427
  default=None, description="Conductance of heat at center of glass.", example="1 USI"
422
428
  )
423
429
  spacer: Spacer | None = pyd.Field(
@@ -16,7 +16,7 @@
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
18
  from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
19
- from openepd.model.validation.quantity import LengthMmStr, validate_quantity_unit_factory
19
+ from openepd.model.validation.quantity import LengthMmStr, RFactorStr, validate_quantity_unit_factory
20
20
 
21
21
 
22
22
  class CementitiousSheathingBoardV1(BaseOpenEpdHierarchicalSpec):
@@ -51,7 +51,7 @@ class GypsumSheathingBoardV1(BaseOpenEpdHierarchicalSpec):
51
51
  thickness: GypsumThickness | None = pyd.Field(default=None, description="", example="9 mm")
52
52
  facing: GypsumFacing | None = pyd.Field(default=None, description="", example="Paper")
53
53
 
54
- r_factor: str | None = pyd.Field(default=None, description="", example="1 RSI")
54
+ r_factor: RFactorStr | None = pyd.Field(default=None, description="", example="1 RSI")
55
55
 
56
56
  flame_spread_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
57
57
  smoke_production_astm_e84: int | None = pyd.Field(default=None, description="", example=3)
@@ -21,7 +21,13 @@ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, BaseOpenEpdSpe
21
21
  from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
22
22
  from openepd.model.standard import Standard
23
23
  from openepd.model.validation.numbers import RatioFloat
24
- from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_quantity_unit_factory
24
+ from openepd.model.validation.quantity import (
25
+ LengthMmStr,
26
+ PressureMPaStr,
27
+ ThermalConductivityStr,
28
+ ThermalExpansionStr,
29
+ validate_quantity_unit_factory,
30
+ )
25
31
 
26
32
 
27
33
  class SteelMakingRoute(BaseOpenEpdSchema):
@@ -175,15 +181,15 @@ class StructuralSteelV1(BaseOpenEpdHierarchicalSpec):
175
181
  description="Modulus of Elasticity, https://en.wikipedia.org/wiki/Elastic_modulus ",
176
182
  example="193 GPa",
177
183
  )
178
- thermal_expansion: str | None = pyd.Field(
184
+ thermal_expansion: ThermalExpansionStr | None = pyd.Field(
179
185
  default=None,
180
186
  description="Thermal Expansion, https://en.wikipedia.org/wiki/Thermal_expansion",
181
187
  example="1.11E-5 / K",
182
188
  )
183
- thermal_conductivity: str | None = pyd.Field(
189
+ thermal_conductivity: ThermalConductivityStr | None = pyd.Field(
184
190
  default=None,
185
191
  description="Thermal Conductivity, https://en.wikipedia.org/wiki/Thermal_conductivity_and_resistivity",
186
- example="1.45E-5 W / (m * K)",
192
+ example="1.45E-5 W / m / K)",
187
193
  )
188
194
 
189
195
  _steel_thermal_expansion_is_quantity_validator = pyd.validator("thermal_expansion", allow_reuse=True)(
@@ -13,8 +13,10 @@
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
17
- from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
18
20
  from openepd.model.specs.enums import (
19
21
  AllFabrication,
20
22
  AllTimberSpecies,
@@ -156,15 +158,19 @@ class WoodV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
156
158
  weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed", example=True)
157
159
  fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant", example=True)
158
160
  decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant", example=True)
159
- fsc_certified: RatioFloat | None = pyd.Field(
161
+ fsc_certified: Annotated[RatioFloat | None, CodegenSpec(override_type=RatioFloat)] = pyd.Field(
160
162
  default=None, description="Forest Stewardship Council certified proportion", example=0.3, ge=0, le=1
161
163
  )
162
- fsc_certified_z: float | None = pyd.Field(default=None, description="", example=0.7)
164
+ fsc_certified_z: Annotated[float | None, CodegenSpec(override_type=float)] = pyd.Field(
165
+ default=None, description="", example=0.7
166
+ )
163
167
 
164
- recycled_content: RatioFloat | None = pyd.Field(
168
+ recycled_content: Annotated[RatioFloat | None, CodegenSpec(override_type=RatioFloat)] = pyd.Field(
165
169
  default=None, description="Recycled content", example=0.3, ge=0, le=1
166
170
  )
167
- recycled_content_z: float | None = pyd.Field(default=None, description="", example=0.7)
171
+ recycled_content_z: Annotated[float | None, CodegenSpec(override_type=float)] = pyd.Field(
172
+ default=None, description="", example=0.7
173
+ )
168
174
 
169
175
  # Nested specs:
170
176
  CompositeLumber: CompositeLumberV1 | None = None
@@ -307,6 +307,48 @@ class AreaPerVolumeStr(QuantityStr):
307
307
  unit = "m2 / l"
308
308
 
309
309
 
310
+ class ThermalConductivityStr(QuantityStr):
311
+ """Thermal conductivity quantity type."""
312
+
313
+ unit = "1 W / K / m"
314
+
315
+
316
+ class ThermalExpansionStr(QuantityStr):
317
+ """Thermal conductivity quantity type."""
318
+
319
+ unit = "1 / K"
320
+
321
+
322
+ class ForceNStr(QuantityStr):
323
+ """Force (N) type."""
324
+
325
+ unit = "1 N"
326
+
327
+
328
+ class YarnWeightStr(QuantityStr):
329
+ """Yarn weight quantity type."""
330
+
331
+ unit = "1 g / m2"
332
+
333
+
334
+ class UtilizationStr(QuantityStr):
335
+ """Utilization quantity type."""
336
+
337
+ unit = "1 h / yr"
338
+
339
+
340
+ class UFactorStr(QuantityStr):
341
+ """Utilization quantity type."""
342
+
343
+ unit = "1 USI"
344
+
345
+
346
+ class RFactorStr(QuantityStr):
347
+ """R-Factor type."""
348
+
349
+ unit = "1 RSI"
350
+
351
+
310
352
  class WithDimensionalityMixin(BaseOpenEpdSchema):
311
353
  """Class for dimensionality-validated amounts."""
312
354
 
@@ -696,6 +738,136 @@ class AmountRangeAreaPerVolume(AmountRangeWithDimensionality, WithFlowRateMixin)
696
738
  pass
697
739
 
698
740
 
741
+ class WithThermalConductivity(WithDimensionalityMixin):
742
+ """Unit validation mixin."""
743
+
744
+ dimensionality_unit = ThermalConductivityStr.unit
745
+
746
+
747
+ class AmountThermalConductivityMixin(Amount, WithThermalConductivity):
748
+ """Area per volume."""
749
+
750
+ pass
751
+
752
+
753
+ class AmountRangeThermalConductivity(AmountRangeWithDimensionality, WithThermalConductivity):
754
+ """Area per volume range."""
755
+
756
+ pass
757
+
758
+
759
+ class WithForce(WithDimensionalityMixin):
760
+ """
761
+ Unit validation mixin.
762
+
763
+ May the Force be with you.
764
+ """
765
+
766
+ dimensionality_unit = ForceNStr.unit
767
+
768
+
769
+ class AmountForce(Amount, WithForce):
770
+ """Area per volume."""
771
+
772
+ pass
773
+
774
+
775
+ class AmountRangeForce(AmountRangeWithDimensionality, WithForce):
776
+ """Area per volume range."""
777
+
778
+ pass
779
+
780
+
781
+ class WithYarnWeight(WithDimensionalityMixin):
782
+ """Unit validation mixin."""
783
+
784
+ dimensionality_unit = YarnWeightStr.unit
785
+
786
+
787
+ class AmountYarnWeight(Amount, WithYarnWeight):
788
+ """Yarn weight."""
789
+
790
+ pass
791
+
792
+
793
+ class AmountRangeYarnWeight(AmountRangeWithDimensionality, WithYarnWeight):
794
+ """Yarn weight range."""
795
+
796
+ pass
797
+
798
+
799
+ class WithThermalExpansion(WithDimensionalityMixin):
800
+ """Unit validation mixin."""
801
+
802
+ dimensionality_unit = ThermalExpansionStr.unit
803
+
804
+
805
+ class AmountThermalExpansion(Amount, WithThermalExpansion):
806
+ """Yarn weight."""
807
+
808
+ pass
809
+
810
+
811
+ class AmountRangeThermalExpansion(AmountRangeWithDimensionality, WithThermalExpansion):
812
+ """Yarn weight range."""
813
+
814
+ pass
815
+
816
+
817
+ class WithUtilization(WithDimensionalityMixin):
818
+ """Unit validation mixin."""
819
+
820
+ dimensionality_unit = UtilizationStr.unit
821
+
822
+
823
+ class AmountUtilization(Amount, WithUtilization):
824
+ """Utilization."""
825
+
826
+ pass
827
+
828
+
829
+ class AmountRangeUtilization(AmountRangeWithDimensionality, WithUtilization):
830
+ """Utilization range."""
831
+
832
+ pass
833
+
834
+
835
+ class WithUFactor(WithDimensionalityMixin):
836
+ """Unit validation mixin."""
837
+
838
+ dimensionality_unit = UFactorStr.unit
839
+
840
+
841
+ class AmountUFactor(Amount, WithUFactor):
842
+ """U-Factor."""
843
+
844
+ pass
845
+
846
+
847
+ class AmountRangeUFactor(AmountRangeWithDimensionality, WithUFactor):
848
+ """U-Factor range."""
849
+
850
+ pass
851
+
852
+
853
+ class WithRFactor(WithDimensionalityMixin):
854
+ """Unit validation mixin."""
855
+
856
+ dimensionality_unit = RFactorStr.unit
857
+
858
+
859
+ class AmountRFactor(Amount, WithRFactor):
860
+ """R-Factor."""
861
+
862
+ pass
863
+
864
+
865
+ class AmountRangeRFactor(AmountRangeWithDimensionality, WithRFactor):
866
+ """R-Factor range."""
867
+
868
+ pass
869
+
870
+
699
871
  # known range amounts
700
872
  SUPPORTED_RANGE_TYPES: tuple[type[AmountRangeWithDimensionality], ...] = (
701
873
  AmountRangeMass,
@@ -718,6 +890,13 @@ SUPPORTED_RANGE_TYPES: tuple[type[AmountRangeWithDimensionality], ...] = (
718
890
  AmountRangeFlowRate,
719
891
  AmountRangeMassPerLength,
720
892
  AmountRangeAreaPerVolume,
893
+ AmountRangeThermalConductivity,
894
+ AmountRangeForce,
895
+ AmountRangeYarnWeight,
896
+ AmountRangeThermalExpansion,
897
+ AmountRangeUtilization,
898
+ AmountRangeUFactor,
899
+ AmountRangeRFactor,
721
900
  )
722
901
 
723
902
  # known range amount mapping by unit
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 6.0.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,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=Shkfh0Kun0YRhmRDw7LkUj2eQL3X-HnP55u2THOEALw,794
2
- openepd/__version__.py,sha256=7Oh8Rchc2xBDqLEabanDtlyvfKW7gtjKvpBhLaqpDp4,638
2
+ openepd/__version__.py,sha256=Oa5j0gzOB1wIVumdMbOVzGNMS9BPyyfZpuNULXNLrw4,638
3
3
  openepd/api/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
4
4
  openepd/api/average_dataset/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
5
5
  openepd/api/average_dataset/generic_estimate_sync_api.py,sha256=mxWwDokEGMe87Px8C_aHvIdVKZVHrEAuVtaSA1zJchU,7953
@@ -48,92 +48,92 @@ openepd/model/pcr.py,sha256=QknLtTn6Y14JORWKQ1qBqGgKnZpbKgqNiYF3Axl4U4c,5494
48
48
  openepd/model/specs/README.md,sha256=UGhSiFJ9hOxT1mZl-5ZrhkOrPKf1W_gcu5CI9hzV7LU,2430
49
49
  openepd/model/specs/__init__.py,sha256=IAevXqqYrCWlTH4z4Fy9o77vaOLinX56G05iIJJfm0M,3094
50
50
  openepd/model/specs/asphalt.py,sha256=V-N7NbrxyNnjgNXQbJPj17ZFM3Q-qxTxxjqpx61wEfA,3350
51
- openepd/model/specs/base.py,sha256=xYIzCmDDUWEJRVbAFt10HY_c_5d81deFFyraxzpidEg,2612
51
+ openepd/model/specs/base.py,sha256=JgXvfy8K1Jpcai1eCUDZ-ndsLYkL-dcDyH2hQls6Znw,2652
52
52
  openepd/model/specs/concrete.py,sha256=spMvijIv79c87PXT_YV7coG851AkJ1ILl9EHCxN2-6E,9593
53
53
  openepd/model/specs/enums.py,sha256=rh35d0CZUIp1GDYopldu-dUJ3YQtXlKzJuMpyFLKT2w,63602
54
54
  openepd/model/specs/range/__init__.py,sha256=LmBClxzTNpWzGwS1zvFoAxbKILrMRMz22mJXKYu2u8I,4502
55
55
  openepd/model/specs/range/accessories.py,sha256=T3z-5jLoIVIIGeQi2cc5fMP3a7uGgvoW2E_SVmr3c30,2498
56
56
  openepd/model/specs/range/aggregates.py,sha256=nxk6iZHzs0CIoUMWSw4IfB-D4tGd4prh9O2HXnC9u70,2549
57
57
  openepd/model/specs/range/aluminium.py,sha256=FcIfVKwwCH-58K7YQ1lRQx0DNcojcj43oplJGYZfh2s,2745
58
- openepd/model/specs/range/asphalt.py,sha256=0Vj_94E2-s43CMxzFW7-s4LmZW_dRPWVxVKRJfdaz0Y,2958
58
+ openepd/model/specs/range/asphalt.py,sha256=tmUUBlhg-lqqfgEHz_5LvdwurCkkemRFAGm_PIODAwU,2934
59
59
  openepd/model/specs/range/bulk_materials.py,sha256=Vqm6eY6Kfi7vSx4n9JUrGh15JVNZ1YapdBXQR9usICU,1051
60
60
  openepd/model/specs/range/cast_decks_and_underlayment.py,sha256=CzQhqq4hhtLAbm7SbrcOH0CMYFNzxcMYDy-L9jk3txY,1132
61
61
  openepd/model/specs/range/cladding.py,sha256=ITPk6sThzryLt8pVtvqy5QWeuDOg2-LVinkG-p9imTY,7236
62
- openepd/model/specs/range/cmu.py,sha256=uUlkJGfbRo3IM919x0Ha0cNXscsYbSitVsgAEDVIHy8,1887
62
+ openepd/model/specs/range/cmu.py,sha256=d0Kx5AsUazziYDfgEOyp0ddLKDprxw5W2v7xcnKDvGw,1862
63
63
  openepd/model/specs/range/concrete.py,sha256=3nVuWag3QP56YGxcRUAYlVEbagxLaKP0RE0TaBqxums,6907
64
64
  openepd/model/specs/range/conveying_equipment.py,sha256=Ztvd4m3ECPFHtpb_k16nqPZmibH44YXbhafI2kb2CwQ,3176
65
- openepd/model/specs/range/electrical.py,sha256=SIlOoGiH2vUCOlQfKuMzjQsKjocTKYeoZ-rw1g8IY7U,11813
65
+ openepd/model/specs/range/electrical.py,sha256=VDaUrqnGi8b88ChL19FReZCiNXSmd98hqgwmEdE6S4Y,11860
66
66
  openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py,sha256=6xOBAN3rjJ1SeGAiD-bTEWJB2rJ7VmUDPV3JHWHUTp4,2525
67
67
  openepd/model/specs/range/electricity.py,sha256=isRgk35_gYhZWR3d36dpxHKDIrmpuOqpaUCWigNE4Co,997
68
- openepd/model/specs/range/finishes.py,sha256=6yFMYETA8GoaBBB8vPKP_hAO9rc33RuV938wv1igy0Q,21142
68
+ openepd/model/specs/range/finishes.py,sha256=hEGxRje4_yXoDaHIK02jAAkGta4Fyds5JFvlOrzD0_0,21291
69
69
  openepd/model/specs/range/fire_and_smoke_protection.py,sha256=j7E5rqPtNrJCksq8QL-m2gX9sqrOADuTNJkc0rUH7mo,3337
70
70
  openepd/model/specs/range/furnishings.py,sha256=eQ4T91RXNEhTe3hb8VG9NPGWNfjQy1yKSHrGkRGNO5k,3234
71
71
  openepd/model/specs/range/grouting.py,sha256=5w3kU3MnUreVilpri-eFRe9TTZvrJsZ9_MLiK3GTlg0,1095
72
72
  openepd/model/specs/range/manufacturing_inputs.py,sha256=LXpjXSvq9baeVkqOUbU1yFjMP18KJZNa04UxHr27gto,5574
73
- openepd/model/specs/range/masonry.py,sha256=n-zVQ_fyrwQg-xqgKXmt5b5CCMDMBgOi4NKq9Kf4gVs,2808
73
+ openepd/model/specs/range/masonry.py,sha256=6325-KdNFnZTRs9v2D1sq-3isgfiEOuNd-Ou4lSW9hw,2867
74
74
  openepd/model/specs/range/material_handling.py,sha256=Ri7v4WAguusQQZWU_GZo6DZmYkjgFDB44sScj2jiSOo,1483
75
75
  openepd/model/specs/range/mechanical.py,sha256=Btttb_UkWok5lfNOkQTq2doaPJJUAcZr5p4Xz-buXw4,10267
76
76
  openepd/model/specs/range/mechanical_insulation.py,sha256=BUC_BfjRm0GagW5gpKXtOTpCvf_78um9Hry8BvFZ0_Q,1737
77
77
  openepd/model/specs/range/network_infrastructure.py,sha256=_uSvY2ppIZ1u5YS7XhoReep8c0kY67WmylFF439xUUU,8498
78
- openepd/model/specs/range/openings.py,sha256=EtcAChNwIki0QXzDNuquuyqixBe-bETOqJcnGIKQIUs,15366
78
+ openepd/model/specs/range/openings.py,sha256=WbujF3EW3zjcUgaDlHCufvMxR3nbOvTYaazEiNiL1TQ,15451
79
79
  openepd/model/specs/range/other_electrical_equipment.py,sha256=8pHsH9mkwb-eeLPejgsgUOAHmj9vcd_TfqjbjD5-100,1001
80
80
  openepd/model/specs/range/other_materials.py,sha256=Uy29e4PDkzDI_aX6VoJTLnUTM6zy362NiSxKHFhxEeI,4495
81
81
  openepd/model/specs/range/plumbing.py,sha256=bGbd_hRSDCXnZREEUz4U6N3l5GcAh4EmtoF8yp5z5Xc,5342
82
82
  openepd/model/specs/range/precast_concrete.py,sha256=iwz3vmrArJDVxKF77dvlTAC092EHZu4ZBQbyPZeakl0,3763
83
- openepd/model/specs/range/sheathing.py,sha256=I8SmASto7jGukpYOt2pUYRroniP_seAP17I36LCiQaw,3360
84
- openepd/model/specs/range/steel.py,sha256=BKaFzRQnLPH2YL_ZTGSzP7B9rfk53cCJgE2kk0HnUf8,10040
83
+ openepd/model/specs/range/sheathing.py,sha256=F7g1JOrGoVdrtyyh_0IryBTpf7l2hzGKclcanTWk624,3395
84
+ openepd/model/specs/range/steel.py,sha256=Jujwb0ZCCn9LmWx6WmYMu3S1Rx_-gt3KmoA9tddaYfU,10173
85
85
  openepd/model/specs/range/thermal_moisture_protection.py,sha256=tNimOVhUBn3U4821d5oqY3D3E0-6gB4Bp3F4gzoCScY,9409
86
86
  openepd/model/specs/range/utility_piping.py,sha256=qCyJbOMZQP1nvA71qFos5wWx7xGhb8DFpeGaka8OkjQ,2665
87
- openepd/model/specs/range/wood.py,sha256=-MAwCt16clFfzMp-sUh3UWyqijaqH9Vr6hMpjaRmxuA,6943
87
+ openepd/model/specs/range/wood.py,sha256=zRsOsSOkxT84pQVvf9S4m34kFHa7HOppQK1Ggt_toUk,6946
88
88
  openepd/model/specs/range/wood_joists.py,sha256=FevwQ3ebxMStesFehjyBCw4vxTQOYOZnPCdmobo3TGY,1785
89
- openepd/model/specs/singular/__init__.py,sha256=PqfDn8URWef_DPCk27oIMR_KM04LHTwwxHEj-fDSXTw,4924
89
+ openepd/model/specs/singular/__init__.py,sha256=T99PWY-76bYBg-Fi10R0PhjzpiG9BWv62lmjddZI7-Y,5047
90
90
  openepd/model/specs/singular/accessories.py,sha256=hEnrW4Vdr9GopR_A9gF8QyUyKJ9i5sx4khrNYDVLwy8,2013
91
91
  openepd/model/specs/singular/aggregates.py,sha256=EoAdyZc6QPHqGRn8c6VzoXx1wU05FH9UwQ7aOgU_Zkc,2934
92
92
  openepd/model/specs/singular/aluminium.py,sha256=LFkBtSRWajBFRni3V8IPZtRjIo-h8zlvPLaVSVYpzJs,2403
93
- openepd/model/specs/singular/asphalt.py,sha256=vfYz6ekRPDZdQeLo1rgrHdHRhOqaPPK1VxzLjjFs79w,3142
93
+ openepd/model/specs/singular/asphalt.py,sha256=mnScaoGPZ7xCuKAPpJNkOGkuJxqo0iVIREPhXzECaj4,3295
94
94
  openepd/model/specs/singular/bulk_materials.py,sha256=otVwnI8N5zCs-JqklykdQDenaKqlgfBn4bQKp8JKGwU,875
95
95
  openepd/model/specs/singular/cast_decks_and_underlayment.py,sha256=qZjryfTZc1ltPUkut7pkITb-wwZmBZWGIfUl1p8FNXs,955
96
96
  openepd/model/specs/singular/cladding.py,sha256=PtH41V8K23-fIlqxgsAqXH5rLVgR7-IOHwdfJ-KuCW0,6588
97
- openepd/model/specs/singular/cmu.py,sha256=9Bu2JH5qd-WY8M3mIsp_dnTNfPRvQjeE00pDNIPqbTw,1784
97
+ openepd/model/specs/singular/cmu.py,sha256=NaeAcAiN1NkV_kxH1lyexb1Xas2ShSdWWP-7kE227SA,1952
98
98
  openepd/model/specs/singular/common.py,sha256=iNeJmVYZURVQWewx3zskwnwy7DBuaggCHFWQBThtY2A,1048
99
99
  openepd/model/specs/singular/concrete.py,sha256=PexUR9w_NAkZ_VfgevxeaDqtipbaTY2mVRpPzp8uZnI,7718
100
100
  openepd/model/specs/singular/conveying_equipment.py,sha256=4ftx12OG-9mUvOkoFvx9JKrHQERHrZBDqoCnvmFFQLA,3042
101
- openepd/model/specs/singular/electrical.py,sha256=Df4BJ4ToqJ3mhV1Hj4MRJ_Jm_tStHw8OkXHluxiIRFw,11082
101
+ openepd/model/specs/singular/electrical.py,sha256=IJgSbbcOvUIu70EqtG9qZvUKjtRvFda5eX9-VqRhyH8,11113
102
102
  openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py,sha256=h6UQixACOHrquhQ2GFqqYWel_zqOXT-vAkI0o_RLf0A,1978
103
103
  openepd/model/specs/singular/electricity.py,sha256=iGtN21K1MRVwoRfO6friVgiXc2b6cVdITbvnXqLmW3k,823
104
- openepd/model/specs/singular/finishes.py,sha256=CpJfBaDjnJJSnB_R8VK8RuJv1pBB3TG4SdjJMaiVBxU,22492
104
+ openepd/model/specs/singular/finishes.py,sha256=PUzskF15PnxzWJn9RKRdPcmeoefYH81OtzWtzsxUb70,22571
105
105
  openepd/model/specs/singular/fire_and_smoke_protection.py,sha256=ALV3ixBdd8Bi-rr6Cav7pQhT1XKVqC0UI8lYBJKn9q8,3058
106
106
  openepd/model/specs/singular/furnishings.py,sha256=z3SmlY98A9AUiQTPpe16QsSlDK3H0jXTRGx-nii8BqM,2571
107
107
  openepd/model/specs/singular/grouting.py,sha256=mDpfsax6TO72SuBqv8HftJDYoQPP741dD1vi_2cuNCE,934
108
108
  openepd/model/specs/singular/manufacturing_inputs.py,sha256=-y7WDU4hdKc-boGCpYPT2SyGV83cnNHz76imnzIykaQ,5093
109
- openepd/model/specs/singular/masonry.py,sha256=XrmzDqO0ySSkK30IBbIu5BeN6EJ29BxRNLBwAODXBek,3104
109
+ openepd/model/specs/singular/masonry.py,sha256=VC_UspsiNN9qAhW-I3XgRGYkf0UDL7tY23MO6gypKmM,3165
110
110
  openepd/model/specs/singular/material_handling.py,sha256=hx8fisNcFw6GXC7uMfW-4wkGUS8xJA9gTk_WpZGHkqY,1274
111
111
  openepd/model/specs/singular/mechanical.py,sha256=fjvqP_bmyVM0bC71z4lY_SeBJXdiFglQiYOSGZibrdo,9862
112
112
  openepd/model/specs/singular/mechanical_insulation.py,sha256=y39LcYM6nxJtVAv_Uzc4p4HiqfXMGuh1oiLJUJPG7t8,1607
113
113
  openepd/model/specs/singular/mixins/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
114
114
  openepd/model/specs/singular/mixins/conduit_mixin.py,sha256=nC_xRz1aGFP-Pu7lk_ZC-LIe5ZB_VFIw5J7KbKlMlGo,1928
115
115
  openepd/model/specs/singular/network_infrastructure.py,sha256=zFJ1wjhtah-i39TPzmhFZ2IMvX3hiAIpFhmfSVWpk70,8521
116
- openepd/model/specs/singular/openings.py,sha256=KeMrAe1Tyq6WZp-JvRP3zjK6Ki8lOyFIP7HivyDo2lA,18890
116
+ openepd/model/specs/singular/openings.py,sha256=4ROhnnKv3W9LwC21uCZLAgffto3L99A6Bt6n-6nkmPQ,18941
117
117
  openepd/model/specs/singular/other_electrical_equipment.py,sha256=HUOI_NfCXn_pmon0KEy11hBrILA5QYtpnme0YqWoEfk,814
118
118
  openepd/model/specs/singular/other_materials.py,sha256=ztaZHOr2HbiSpKdz4M1b2jsm_11fMDqZduEYWT1Q_rI,3498
119
119
  openepd/model/specs/singular/plumbing.py,sha256=Dr3lt23FkSbhCyeGDcW8FpyOr2MYvV2JwCZAdvLqz9I,4568
120
120
  openepd/model/specs/singular/precast_concrete.py,sha256=Qwnm49sCXXmPoIckIUwldDvUq760FzTVaYnFOV6XOEY,7327
121
- openepd/model/specs/singular/sheathing.py,sha256=ykt8oAs80IiZG5Ty1jKRxPgtz_7YF7eXOa0D_tu-gcs,3690
122
- openepd/model/specs/singular/steel.py,sha256=dMQwKWuDsY2Jr6BKWfsZqQJquwiWV3mGpd4grrBHz0Y,10236
121
+ openepd/model/specs/singular/sheathing.py,sha256=e3y6XlDuSWF5ldN0NqfJCfB8VQMWciv5DnYKsp7cQzw,3709
122
+ openepd/model/specs/singular/steel.py,sha256=IlYlp77hmweDQbLCluy-ltZgMT0-RNXNDnsRXyWE-8Q,10340
123
123
  openepd/model/specs/singular/thermal_moisture_protection.py,sha256=rwwxAj0TFKuI2jBbEPj4qpYVMVD6uqK-IyDPriJ8nAo,8195
124
124
  openepd/model/specs/singular/utility_piping.py,sha256=8Rs-5Xoe8mepH8nY7-a6zvAxPr1TKL2XJHpYDSy3atM,2483
125
- openepd/model/specs/singular/wood.py,sha256=YO-YjuluW49iTRvapjzSb3zpmnGmuwcD1ni97seOOas,6330
125
+ openepd/model/specs/singular/wood.py,sha256=Bxf7LeodG0DQUdXiYgRWDeQtuYQ6Vpck4Uw4wF7tUzY,6591
126
126
  openepd/model/specs/singular/wood_joists.py,sha256=LWkm3s7yW0S-IN5oeoj6g99CdAdQvplvbjVIyezaZx0,1719
127
127
  openepd/model/standard.py,sha256=QhGpWN3U27fDcS0Yy1Dk8ElJfD0etet6i_PzoTD6B48,1318
128
128
  openepd/model/validation/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
129
129
  openepd/model/validation/common.py,sha256=FLYqK8gYFagx08LCkS0jy3qo4-Zq9VAv5i8ZwF2svkc,2435
130
130
  openepd/model/validation/enum.py,sha256=06Fi2_sdjVhOElavtgvNXvkKU0NQ-bcAFx5_5MiDzdU,1793
131
131
  openepd/model/validation/numbers.py,sha256=J2rVMwJTPr8uC1DrU80xpq2SZGMXvVKx7v74SgOVi0U,851
132
- openepd/model/validation/quantity.py,sha256=8LbSn-Gfo6r1j6AKDjzPnt_9dwyXMFmN5Uaoxa6LIEU,16953
132
+ openepd/model/validation/quantity.py,sha256=UP6x2nUj1nP7G8e2rpi-HigHx9rwKeCuIDh_XWFRU6U,20187
133
133
  openepd/model/versioning.py,sha256=R_zm6rCrgF3vlJQYbpyWhirdS_Oek16cv_mvZmpuE8I,4473
134
134
  openepd/patch_pydantic.py,sha256=xrkzblatmU9HBzukWkp1cPq9ZSuohoz1p0pQqVKSlKs,4122
135
135
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
- openepd-6.0.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
137
- openepd-6.0.0.dist-info/METADATA,sha256=nhKtUBMVGzjXg3QsNYrrVbJzM7HCdrHg828rW5IPwls,8996
138
- openepd-6.0.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
139
- openepd-6.0.0.dist-info/RECORD,,
136
+ openepd-6.0.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
137
+ openepd-6.0.1.dist-info/METADATA,sha256=3JfGfzrMlQ1wyxIDYQTZ-l1CDo8nruSGoQQCj7m-shc,8996
138
+ openepd-6.0.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
139
+ openepd-6.0.1.dist-info/RECORD,,