openepd 5.3.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.
Files changed (77) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/api/average_dataset/generic_estimate_sync_api.py +8 -7
  3. openepd/api/epd/sync_api.py +6 -11
  4. openepd/model/common.py +22 -0
  5. openepd/model/epd.py +1 -1
  6. openepd/model/specs/__init__.py +34 -75
  7. openepd/model/specs/base.py +2 -1
  8. openepd/model/specs/range/aggregates.py +2 -2
  9. openepd/model/specs/range/aluminium.py +1 -1
  10. openepd/model/specs/range/asphalt.py +4 -4
  11. openepd/model/specs/range/cladding.py +1 -1
  12. openepd/model/specs/range/cmu.py +6 -5
  13. openepd/model/specs/range/concrete.py +1 -1
  14. openepd/model/specs/range/conveying_equipment.py +1 -1
  15. openepd/model/specs/range/electrical.py +3 -2
  16. openepd/model/specs/range/finishes.py +13 -6
  17. openepd/model/specs/range/fire_and_smoke_protection.py +1 -1
  18. openepd/model/specs/range/furnishings.py +1 -1
  19. openepd/model/specs/range/manufacturing_inputs.py +1 -1
  20. openepd/model/specs/range/masonry.py +2 -2
  21. openepd/model/specs/range/mechanical.py +1 -1
  22. openepd/model/specs/range/mechanical_insulation.py +1 -1
  23. openepd/model/specs/range/network_infrastructure.py +1 -1
  24. openepd/model/specs/range/openings.py +12 -5
  25. openepd/model/specs/range/plumbing.py +1 -1
  26. openepd/model/specs/range/precast_concrete.py +1 -1
  27. openepd/model/specs/range/sheathing.py +3 -3
  28. openepd/model/specs/range/steel.py +10 -5
  29. openepd/model/specs/range/thermal_moisture_protection.py +1 -1
  30. openepd/model/specs/range/utility_piping.py +1 -1
  31. openepd/model/specs/range/wood.py +8 -6
  32. openepd/model/specs/range/wood_joists.py +1 -1
  33. openepd/model/specs/{generated → singular}/__init__.py +37 -35
  34. openepd/model/specs/{generated → singular}/aggregates.py +1 -1
  35. openepd/model/specs/{generated → singular}/aluminium.py +1 -1
  36. openepd/model/specs/{generated → singular}/asphalt.py +6 -4
  37. openepd/model/specs/{generated → singular}/cladding.py +1 -1
  38. openepd/model/specs/{generated → singular}/cmu.py +10 -4
  39. openepd/model/specs/{generated → singular}/concrete.py +1 -1
  40. openepd/model/specs/{generated → singular}/conveying_equipment.py +1 -1
  41. openepd/model/specs/{generated → singular}/electrical.py +4 -3
  42. openepd/model/specs/{generated → singular}/finishes.py +9 -6
  43. openepd/model/specs/{generated → singular}/fire_and_smoke_protection.py +1 -1
  44. openepd/model/specs/{generated → singular}/furnishings.py +1 -1
  45. openepd/model/specs/{generated → singular}/manufacturing_inputs.py +1 -1
  46. openepd/model/specs/{generated → singular}/masonry.py +4 -1
  47. openepd/model/specs/{generated → singular}/mechanical.py +1 -1
  48. openepd/model/specs/{generated → singular}/mechanical_insulation.py +1 -1
  49. openepd/model/specs/{generated → singular}/mixins/conduit_mixin.py +1 -1
  50. openepd/model/specs/{generated → singular}/network_infrastructure.py +2 -2
  51. openepd/model/specs/{generated → singular}/openings.py +10 -4
  52. openepd/model/specs/{generated → singular}/plumbing.py +1 -1
  53. openepd/model/specs/{generated → singular}/sheathing.py +3 -3
  54. openepd/model/specs/{generated → singular}/steel.py +11 -5
  55. openepd/model/specs/{generated → singular}/thermal_moisture_protection.py +1 -1
  56. openepd/model/specs/{generated → singular}/utility_piping.py +1 -1
  57. openepd/model/specs/{generated → singular}/wood.py +13 -7
  58. openepd/model/specs/{generated → singular}/wood_joists.py +2 -2
  59. openepd/model/validation/quantity.py +179 -0
  60. {openepd-5.3.0.dist-info → openepd-6.0.1.dist-info}/METADATA +1 -1
  61. openepd-6.0.1.dist-info/RECORD +139 -0
  62. openepd-5.3.0.dist-info/RECORD +0 -139
  63. /openepd/model/specs/{generated/enums.py → enums.py} +0 -0
  64. /openepd/model/specs/{generated → singular}/accessories.py +0 -0
  65. /openepd/model/specs/{generated → singular}/bulk_materials.py +0 -0
  66. /openepd/model/specs/{generated → singular}/cast_decks_and_underlayment.py +0 -0
  67. /openepd/model/specs/{generated → singular}/common.py +0 -0
  68. /openepd/model/specs/{generated → singular}/electrical_transmission_and_distribution_equipment.py +0 -0
  69. /openepd/model/specs/{generated → singular}/electricity.py +0 -0
  70. /openepd/model/specs/{generated → singular}/grouting.py +0 -0
  71. /openepd/model/specs/{generated → singular}/material_handling.py +0 -0
  72. /openepd/model/specs/{generated → singular}/mixins/__init__.py +0 -0
  73. /openepd/model/specs/{generated → singular}/other_electrical_equipment.py +0 -0
  74. /openepd/model/specs/{generated → singular}/other_materials.py +0 -0
  75. /openepd/model/specs/{generated → singular}/precast_concrete.py +0 -0
  76. {openepd-5.3.0.dist-info → openepd-6.0.1.dist-info}/LICENSE +0 -0
  77. {openepd-5.3.0.dist-info → openepd-6.0.1.dist-info}/WHEEL +0 -0
@@ -41,10 +41,15 @@ __all__ = (
41
41
  from openepd.compat.pydantic import pyd
42
42
  from openepd.model.common import RangeFloat, RangeRatioFloat
43
43
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
44
- from openepd.model.specs.generated.enums import SteelComposition, SteelRebarGrade
45
- from openepd.model.specs.generated.steel import SteelMakingRoute
44
+ from openepd.model.specs.enums import SteelComposition, SteelRebarGrade
45
+ from openepd.model.specs.singular.steel import SteelMakingRoute
46
46
  from openepd.model.standard import Standard
47
- from openepd.model.validation.quantity import AmountRangeLengthMm, AmountRangePressureMpa
47
+ from openepd.model.validation.quantity import (
48
+ AmountRangeLengthMm,
49
+ AmountRangePressureMpa,
50
+ AmountRangeThermalConductivity,
51
+ AmountRangeThermalExpansion,
52
+ )
48
53
 
49
54
 
50
55
  class ColdFormedFramingRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -224,10 +229,10 @@ class StructuralSteelRangeV1(BaseOpenEpdHierarchicalSpec):
224
229
  modulus_of_elasticity: AmountRangePressureMpa | None = pyd.Field(
225
230
  default=None, description="Modulus of Elasticity, https://en.wikipedia.org/wiki/Elastic_modulus "
226
231
  )
227
- thermal_expansion: str | None = pyd.Field(
232
+ thermal_expansion: AmountRangeThermalExpansion | None = pyd.Field(
228
233
  default=None, description="Thermal Expansion, https://en.wikipedia.org/wiki/Thermal_expansion"
229
234
  )
230
- thermal_conductivity: str | None = pyd.Field(
235
+ thermal_conductivity: AmountRangeThermalConductivity | None = pyd.Field(
231
236
  default=None,
232
237
  description="Thermal Conductivity, https://en.wikipedia.org/wiki/Thermal_conductivity_and_resistivity",
233
238
  )
@@ -44,7 +44,7 @@ __all__ = (
44
44
  from openepd.compat.pydantic import pyd
45
45
  from openepd.model.common import RangeFloat, RangeRatioFloat
46
46
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
47
- from openepd.model.specs.generated.enums import (
47
+ from openepd.model.specs.enums import (
48
48
  FoamType,
49
49
  InsulatingMaterial,
50
50
  InsulationIntendedApplication,
@@ -25,7 +25,7 @@ __all__ = (
25
25
  from openepd.compat.pydantic import pyd
26
26
  from openepd.model.common import RangeAmount
27
27
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
28
- from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
28
+ from openepd.model.specs.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
29
29
  from openepd.model.validation.quantity import AmountRangeLengthMm
30
30
 
31
31
 
@@ -32,11 +32,12 @@ __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
- from openepd.model.specs.generated.enums import (
40
+ from openepd.model.specs.enums import (
40
41
  AllFabrication,
41
42
  AllTimberSpecies,
42
43
  CompositeLumberFabrication,
@@ -45,6 +46,7 @@ from openepd.model.specs.generated.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
@@ -21,7 +21,7 @@ __all__ = ("WoodJoistsRangeV1",)
21
21
  from openepd.compat.pydantic import pyd
22
22
  from openepd.model.org import OrgRef
23
23
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.specs.generated.enums import AllFabrication, AllTimberSpecies
24
+ from openepd.model.specs.enums import AllFabrication, AllTimberSpecies
25
25
 
26
26
 
27
27
  class WoodJoistsRangeV1(BaseOpenEpdHierarchicalSpec):
@@ -13,44 +13,46 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
-
16
+ from openepd.model.base import BaseOpenEpdSchema
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.accessories import AccessoriesV1
19
- from openepd.model.specs.generated.aggregates import AggregatesV1
20
- from openepd.model.specs.generated.aluminium import AluminiumV1
21
- from openepd.model.specs.generated.asphalt import AsphaltV1
22
- from openepd.model.specs.generated.bulk_materials import BulkMaterialsV1
23
- from openepd.model.specs.generated.cast_decks_and_underlayment import CastDecksAndUnderlaymentV1
24
- from openepd.model.specs.generated.cladding import CladdingV1
25
- from openepd.model.specs.generated.cmu import CMUV1
26
- from openepd.model.specs.generated.concrete import ConcreteV1
27
- from openepd.model.specs.generated.conveying_equipment import ConveyingEquipmentV1
28
- from openepd.model.specs.generated.electrical import ElectricalV1
29
- from openepd.model.specs.generated.electrical_transmission_and_distribution_equipment import (
18
+ from openepd.model.specs.singular.accessories import AccessoriesV1
19
+ from openepd.model.specs.singular.aggregates import AggregatesV1
20
+ from openepd.model.specs.singular.aluminium import AluminiumV1
21
+ from openepd.model.specs.singular.asphalt import AsphaltV1
22
+ from openepd.model.specs.singular.bulk_materials import BulkMaterialsV1
23
+ from openepd.model.specs.singular.cast_decks_and_underlayment import CastDecksAndUnderlaymentV1
24
+ from openepd.model.specs.singular.cladding import CladdingV1
25
+ from openepd.model.specs.singular.cmu import CMUV1
26
+ from openepd.model.specs.singular.concrete import ConcreteV1
27
+ from openepd.model.specs.singular.conveying_equipment import ConveyingEquipmentV1
28
+ from openepd.model.specs.singular.electrical import ElectricalV1
29
+ from openepd.model.specs.singular.electrical_transmission_and_distribution_equipment import (
30
30
  ElectricalTransmissionAndDistributionEquipmentV1,
31
31
  )
32
- from openepd.model.specs.generated.electricity import ElectricityV1
33
- from openepd.model.specs.generated.finishes import FinishesV1
34
- from openepd.model.specs.generated.fire_and_smoke_protection import FireAndSmokeProtectionV1
35
- from openepd.model.specs.generated.furnishings import FurnishingsV1
36
- from openepd.model.specs.generated.grouting import GroutingV1
37
- from openepd.model.specs.generated.manufacturing_inputs import ManufacturingInputsV1
38
- from openepd.model.specs.generated.masonry import MasonryV1
39
- from openepd.model.specs.generated.material_handling import MaterialHandlingV1
40
- from openepd.model.specs.generated.mechanical import MechanicalV1
41
- from openepd.model.specs.generated.mechanical_insulation import MechanicalInsulationV1
42
- from openepd.model.specs.generated.network_infrastructure import NetworkInfrastructureV1
43
- from openepd.model.specs.generated.openings import OpeningsV1
44
- from openepd.model.specs.generated.other_electrical_equipment import OtherElectricalEquipmentV1
45
- from openepd.model.specs.generated.other_materials import OtherMaterialsV1
46
- from openepd.model.specs.generated.plumbing import PlumbingV1
47
- from openepd.model.specs.generated.precast_concrete import PrecastConcreteV1
48
- from openepd.model.specs.generated.sheathing import SheathingV1
49
- from openepd.model.specs.generated.steel import SteelV1
50
- from openepd.model.specs.generated.thermal_moisture_protection import ThermalMoistureProtectionV1
51
- from openepd.model.specs.generated.utility_piping import UtilityPipingV1
52
- from openepd.model.specs.generated.wood import WoodV1
53
- from openepd.model.specs.generated.wood_joists import WoodJoistsV1
32
+ from openepd.model.specs.singular.electricity import ElectricityV1
33
+ from openepd.model.specs.singular.finishes import FinishesV1
34
+ from openepd.model.specs.singular.fire_and_smoke_protection import FireAndSmokeProtectionV1
35
+ from openepd.model.specs.singular.furnishings import FurnishingsV1
36
+ from openepd.model.specs.singular.grouting import GroutingV1
37
+ from openepd.model.specs.singular.manufacturing_inputs import ManufacturingInputsV1
38
+ from openepd.model.specs.singular.masonry import MasonryV1
39
+ from openepd.model.specs.singular.material_handling import MaterialHandlingV1
40
+ from openepd.model.specs.singular.mechanical import MechanicalV1
41
+ from openepd.model.specs.singular.mechanical_insulation import MechanicalInsulationV1
42
+ from openepd.model.specs.singular.network_infrastructure import NetworkInfrastructureV1
43
+ from openepd.model.specs.singular.openings import OpeningsV1
44
+ from openepd.model.specs.singular.other_electrical_equipment import OtherElectricalEquipmentV1
45
+ from openepd.model.specs.singular.other_materials import OtherMaterialsV1
46
+ from openepd.model.specs.singular.plumbing import PlumbingV1
47
+ from openepd.model.specs.singular.precast_concrete import PrecastConcreteV1
48
+ from openepd.model.specs.singular.sheathing import SheathingV1
49
+ from openepd.model.specs.singular.steel import SteelV1
50
+ from openepd.model.specs.singular.thermal_moisture_protection import ThermalMoistureProtectionV1
51
+ from openepd.model.specs.singular.utility_piping import UtilityPipingV1
52
+ from openepd.model.specs.singular.wood import WoodV1
53
+ from openepd.model.specs.singular.wood_joists import WoodJoistsV1
54
+
55
+ __all__ = ("Specs",)
54
56
 
55
57
 
56
58
  class Specs(BaseOpenEpdHierarchicalSpec):
@@ -16,7 +16,7 @@
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.base import BaseOpenEpdSchema
18
18
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
- from openepd.model.specs.generated.enums import AggregateGradation, AggregateWeightClassification
19
+ from openepd.model.specs.enums import AggregateGradation, AggregateWeightClassification
20
20
  from openepd.model.validation.numbers import RatioFloat
21
21
  from openepd.model.validation.quantity import LengthMmStr
22
22
 
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import AluminiumAlloy
18
+ from openepd.model.specs.enums import AluminiumAlloy
19
19
 
20
20
 
21
21
  class AluminiumBilletsV1(BaseOpenEpdHierarchicalSpec):
@@ -13,9 +13,11 @@
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
18
- from openepd.model.specs.generated.enums import AsphaltGradation, AsphaltMixType
19
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
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
21
23
 
@@ -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"
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
18
+ from openepd.model.specs.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
19
19
  from openepd.model.validation.quantity import LengthMmStr, LengthMStr, RValueStr, validate_quantity_unit_factory
20
20
 
21
21
 
@@ -13,9 +13,11 @@
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
18
- from openepd.model.specs.generated.enums import CmuBlockType, CmuWeightClassification
19
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
20
+ from openepd.model.specs.enums import CmuBlockType, CmuWeightClassification
19
21
  from openepd.model.validation.quantity import GwpKgCo2eStr, PressureMPaStr
20
22
 
21
23
 
@@ -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
+ )
@@ -18,7 +18,7 @@ from typing import Annotated, Literal
18
18
  from openepd.compat.pydantic import pyd
19
19
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, CodegenSpec
20
20
  from openepd.model.specs.concrete import Cementitious, ConcreteTypicalApplication
21
- from openepd.model.specs.generated.enums import AciExposureClass, CsaExposureClass, EnExposureClass
21
+ from openepd.model.specs.enums import AciExposureClass, CsaExposureClass, EnExposureClass
22
22
  from openepd.model.validation.enum import exclusive_groups_validator_factory
23
23
  from openepd.model.validation.numbers import RatioFloat
24
24
  from openepd.model.validation.quantity import (
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
18
+ from openepd.model.specs.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
19
19
  from openepd.model.validation.quantity import CapacityPerHourStr, LengthMStr, MassKgStr, SpeedStr
20
20
 
21
21
 
@@ -15,8 +15,8 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import CableTraysMaterial, EnergySource, RacewaysMaterial
19
- from openepd.model.specs.generated.mixins.conduit_mixin import ConduitMixin
18
+ from openepd.model.specs.enums import CableTraysMaterial, EnergySource, RacewaysMaterial
19
+ from openepd.model.specs.singular.mixins.conduit_mixin import ConduitMixin
20
20
  from openepd.model.validation.quantity import (
21
21
  ColorTemperatureStr,
22
22
  LengthMmStr,
@@ -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)
@@ -15,8 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.common import HasForestPracticesCertifiers
19
- from openepd.model.specs.generated.enums import (
18
+ from openepd.model.specs.enums import (
20
19
  AccessFlooringCoreMaterial,
21
20
  AccessFlooringFinishMaterial,
22
21
  AccessFlooringSeismicRating,
@@ -43,13 +42,17 @@ from openepd.model.specs.generated.enums import (
43
42
  WoodFlooringFabrication,
44
43
  WoodFlooringTimberSpecies,
45
44
  )
45
+ 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)
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import (
18
+ from openepd.model.specs.enums import (
19
19
  IntumescentFireproofingMaterialType,
20
20
  SprayFireproofingDensity,
21
21
  SprayFireproofingMaterialType,
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import CountertopMaterial
18
+ from openepd.model.specs.enums import CountertopMaterial
19
19
  from openepd.model.validation.quantity import LengthMmStr
20
20
 
21
21
 
@@ -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.concrete import Cementitious
19
- from openepd.model.specs.generated.enums import (
19
+ from openepd.model.specs.enums import (
20
20
  AdmixtureEffects,
21
21
  CarpetYarnType,
22
22
  CementAstmType,
@@ -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)(
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import (
18
+ from openepd.model.specs.enums import (
19
19
  AhuAirflowControl,
20
20
  AhuZoneControl,
21
21
  AirFiltersMediaType,
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import InsulatingMaterial, InsulationIntendedApplication
18
+ from openepd.model.specs.enums import InsulatingMaterial, InsulationIntendedApplication
19
19
  from openepd.model.validation.quantity import LengthMmStr
20
20
 
21
21
 
@@ -17,7 +17,7 @@ __all__ = ["ConduitMixin"]
17
17
 
18
18
  from openepd.compat.pydantic import pyd
19
19
  from openepd.model.specs.base import BaseOpenEpdSpec
20
- from openepd.model.specs.generated.enums import ConduitMaterial
20
+ from openepd.model.specs.enums import ConduitMaterial
21
21
  from openepd.model.validation.quantity import LengthMmStr
22
22
 
23
23
 
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import (
18
+ from openepd.model.specs.enums import (
19
19
  CableTraysMaterial,
20
20
  CablingCategory,
21
21
  CablingFireRating,
@@ -27,7 +27,7 @@ from openepd.model.specs.generated.enums import (
27
27
  RacewaysMaterial,
28
28
  RackType,
29
29
  )
30
- from openepd.model.specs.generated.mixins.conduit_mixin import ConduitMixin
30
+ from openepd.model.specs.singular.mixins.conduit_mixin import ConduitMixin
31
31
  from openepd.model.validation.quantity import (
32
32
  ElectricalCurrentStr,
33
33
  LengthMmStr,
@@ -17,7 +17,7 @@
17
17
  from openepd.compat.pydantic import pyd
18
18
  from openepd.model.base import BaseOpenEpdSchema
19
19
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
20
- from openepd.model.specs.generated.enums import (
20
+ from openepd.model.specs.enums import (
21
21
  FlatGlassPanesThickness,
22
22
  FrameMaterial,
23
23
  HardwareFunction,
@@ -26,7 +26,13 @@ from openepd.model.specs.generated.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(
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
18
+ from openepd.model.specs.enums import FireProtectionPipingMaterial, PipingAnsiSchedule, PlumbingPipingMaterial
19
19
  from openepd.model.validation.quantity import LengthMmStr, MassPerLengthStr
20
20
 
21
21
 
@@ -15,8 +15,8 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import GypsumFacing, GypsumFireRating, GypsumThickness
19
- from openepd.model.validation.quantity import LengthMmStr, validate_quantity_unit_factory
18
+ from openepd.model.specs.enums import GypsumFacing, GypsumFireRating, GypsumThickness
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)
@@ -18,10 +18,16 @@ from typing import Annotated
18
18
  from openepd.compat.pydantic import pyd
19
19
  from openepd.model.base import BaseOpenEpdSchema
20
20
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, BaseOpenEpdSpec, CodegenSpec
21
- from openepd.model.specs.generated.enums import SteelComposition, SteelRebarGrade
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)(
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import (
18
+ from openepd.model.specs.enums import (
19
19
  FoamType,
20
20
  InsulatingMaterial,
21
21
  InsulationIntendedApplication,
@@ -15,7 +15,7 @@
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
18
- from openepd.model.specs.generated.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
18
+ from openepd.model.specs.enums import BuriedPipingType, PipingAnsiSchedule, UtilityPipingMaterial
19
19
  from openepd.model.validation.quantity import LengthMmStr, MassPerLengthStr
20
20
 
21
21