openepd 3.0.0__tar.gz → 3.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {openepd-3.0.0 → openepd-3.1.1}/PKG-INFO +1 -1
  2. {openepd-3.0.0 → openepd-3.1.1}/pyproject.toml +1 -1
  3. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/__version__.py +1 -1
  4. openepd-3.1.1/src/openepd/model/specs/__init__.py +97 -0
  5. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/aluminium.py +1 -1
  6. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/concrete.py +19 -177
  7. openepd-3.1.1/src/openepd/model/specs/generated/accessories.py +63 -0
  8. openepd-3.1.1/src/openepd/model/specs/generated/aggregates.py +71 -0
  9. openepd-3.1.1/src/openepd/model/specs/generated/aluminium.py +66 -0
  10. openepd-3.1.1/src/openepd/model/specs/generated/asphalt.py +86 -0
  11. openepd-3.1.1/src/openepd/model/specs/generated/bulk_materials.py +26 -0
  12. openepd-3.1.1/src/openepd/model/specs/generated/cast_decks_and_underlayment.py +26 -0
  13. openepd-3.1.1/src/openepd/model/specs/generated/cladding.py +214 -0
  14. openepd-3.1.1/src/openepd/model/specs/generated/cmu.py +46 -0
  15. openepd-3.1.1/src/openepd/model/specs/generated/common.py +27 -0
  16. openepd-3.1.1/src/openepd/model/specs/generated/concrete.py +151 -0
  17. openepd-3.1.1/src/openepd/model/specs/generated/conveying_equipment.py +57 -0
  18. openepd-3.1.1/src/openepd/model/specs/generated/electrical.py +297 -0
  19. openepd-3.1.1/src/openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +63 -0
  20. openepd-3.1.1/src/openepd/model/specs/generated/electricity.py +26 -0
  21. openepd-3.1.1/src/openepd/model/specs/generated/enums.py +2420 -0
  22. openepd-3.1.1/src/openepd/model/specs/generated/finishes.py +519 -0
  23. openepd-3.1.1/src/openepd/model/specs/generated/fire_and_smoke_protection.py +79 -0
  24. openepd-3.1.1/src/openepd/model/specs/generated/furnishings.py +95 -0
  25. openepd-3.1.1/src/openepd/model/specs/generated/grouting.py +26 -0
  26. openepd-3.1.1/src/openepd/model/specs/generated/manufacturing_inputs.py +131 -0
  27. openepd-3.1.1/src/openepd/model/specs/generated/masonry.py +77 -0
  28. openepd-3.1.1/src/openepd/model/specs/generated/material_handling.py +35 -0
  29. openepd-3.1.1/src/openepd/model/specs/generated/mechanical.py +271 -0
  30. openepd-3.1.1/src/openepd/model/specs/generated/mechanical_insulation.py +41 -0
  31. openepd-3.1.1/src/openepd/model/specs/generated/network_infrastructure.py +181 -0
  32. openepd-3.1.1/src/openepd/model/specs/generated/openings.py +423 -0
  33. openepd-3.1.1/src/openepd/model/specs/generated/other_electrical_equipment.py +26 -0
  34. openepd-3.1.1/src/openepd/model/specs/generated/other_materials.py +123 -0
  35. openepd-3.1.1/src/openepd/model/specs/generated/plumbing.py +153 -0
  36. openepd-3.1.1/src/openepd/model/specs/generated/precast_concrete.py +68 -0
  37. openepd-3.1.1/src/openepd/model/specs/generated/sheathing.py +74 -0
  38. openepd-3.1.1/src/openepd/model/specs/generated/steel.py +224 -0
  39. openepd-3.1.1/src/openepd/model/specs/generated/thermal_moisture_protection.py +233 -0
  40. openepd-3.1.1/src/openepd/model/specs/generated/utility_piping.py +65 -0
  41. openepd-3.1.1/src/openepd/model/specs/generated/wood.py +167 -0
  42. openepd-3.1.1/src/openepd/model/specs/generated/wood_joists.py +38 -0
  43. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/glass.py +1 -45
  44. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/steel.py +1 -10
  45. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/validation/quantity.py +4 -3
  46. openepd-3.0.0/src/openepd/model/specs/__init__.py +0 -45
  47. {openepd-3.0.0 → openepd-3.1.1}/LICENSE +0 -0
  48. {openepd-3.0.0 → openepd-3.1.1}/README.md +0 -0
  49. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/__init__.py +0 -0
  50. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/__init__.py +0 -0
  51. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/base_sync_client.py +0 -0
  52. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/category/__init__.py +0 -0
  53. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/category/dto.py +0 -0
  54. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/category/sync_api.py +0 -0
  55. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/common.py +0 -0
  56. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/__init__.py +0 -0
  57. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/base.py +0 -0
  58. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/common.py +0 -0
  59. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/meta.py +0 -0
  60. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/mf.py +0 -0
  61. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/dto/params.py +0 -0
  62. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/epd/__init__.py +0 -0
  63. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/epd/dto.py +0 -0
  64. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/epd/sync_api.py +0 -0
  65. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/errors.py +0 -0
  66. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/pcr/__init__.py +0 -0
  67. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/pcr/dto.py +0 -0
  68. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/pcr/sync_api.py +0 -0
  69. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/sync_client.py +0 -0
  70. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/api/test/__init__.py +0 -0
  71. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/bundle/__init__.py +0 -0
  72. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/bundle/base.py +0 -0
  73. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/bundle/model.py +0 -0
  74. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/bundle/reader.py +0 -0
  75. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/bundle/writer.py +0 -0
  76. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/compat/__init__.py +0 -0
  77. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/compat/pydantic.py +0 -0
  78. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/__init__.py +0 -0
  79. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/base.py +0 -0
  80. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/category.py +0 -0
  81. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/common.py +0 -0
  82. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/epd.py +0 -0
  83. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/factory.py +0 -0
  84. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/lcia.py +0 -0
  85. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/org.py +0 -0
  86. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/pcr.py +0 -0
  87. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/README.md +0 -0
  88. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/asphalt.py +0 -0
  89. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/base.py +0 -0
  90. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/specs/wood.py +0 -0
  91. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/standard.py +0 -0
  92. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/validation/__init__.py +0 -0
  93. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/validation/common.py +0 -0
  94. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/validation/numbers.py +0 -0
  95. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/model/versioning.py +0 -0
  96. {openepd-3.0.0 → openepd-3.1.1}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 3.0.0
3
+ Version: 3.1.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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "3.0.0"
3
+ version = "3.1.1"
4
4
  license = "Apache-2.0"
5
5
  description = "Python library to work with OpenEPD format"
6
6
  authors = ["C-Change Labs <support@c-change-labs.com>"]
@@ -17,4 +17,4 @@
17
17
  # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
18
  # Find out more at www.BuildingTransparency.org
19
19
  #
20
- VERSION = "3.0.0"
20
+ VERSION = "3.1.1"
@@ -0,0 +1,97 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+
21
+ from openepd.model.base import BaseOpenEpdSchema
22
+ from openepd.model.specs.generated.accessories import AccessoriesV1
23
+ from openepd.model.specs.generated.aggregates import AggregatesV1
24
+ from openepd.model.specs.generated.aluminium import AluminiumV1
25
+ from openepd.model.specs.generated.asphalt import AsphaltV1
26
+ from openepd.model.specs.generated.bulk_materials import BulkMaterialsV1
27
+ from openepd.model.specs.generated.cast_decks_and_underlayment import CastDecksAndUnderlaymentV1
28
+ from openepd.model.specs.generated.cladding import CladdingV1
29
+ from openepd.model.specs.generated.cmu import CMUV1
30
+ from openepd.model.specs.generated.concrete import ConcreteV1
31
+ from openepd.model.specs.generated.conveying_equipment import ConveyingEquipmentV1
32
+ from openepd.model.specs.generated.electrical import ElectricalV1
33
+ from openepd.model.specs.generated.electrical_transmission_and_distribution_equipment import (
34
+ ElectricalTransmissionAndDistributionEquipmentV1,
35
+ )
36
+ from openepd.model.specs.generated.electricity import ElectricityV1
37
+ from openepd.model.specs.generated.finishes import FinishesV1
38
+ from openepd.model.specs.generated.fire_and_smoke_protection import FireAndSmokeProtectionV1
39
+ from openepd.model.specs.generated.furnishings import FurnishingsV1
40
+ from openepd.model.specs.generated.grouting import GroutingV1
41
+ from openepd.model.specs.generated.manufacturing_inputs import ManufacturingInputsV1
42
+ from openepd.model.specs.generated.masonry import MasonryV1
43
+ from openepd.model.specs.generated.material_handling import MaterialHandlingV1
44
+ from openepd.model.specs.generated.mechanical import MechanicalV1
45
+ from openepd.model.specs.generated.mechanical_insulation import MechanicalInsulationV1
46
+ from openepd.model.specs.generated.network_infrastructure import NetworkInfrastructureV1
47
+ from openepd.model.specs.generated.openings import OpeningsV1
48
+ from openepd.model.specs.generated.other_electrical_equipment import OtherElectricalEquipmentV1
49
+ from openepd.model.specs.generated.other_materials import OtherMaterialsV1
50
+ from openepd.model.specs.generated.plumbing import PlumbingV1
51
+ from openepd.model.specs.generated.precast_concrete import PrecastConcreteV1
52
+ from openepd.model.specs.generated.sheathing import SheathingV1
53
+ from openepd.model.specs.generated.steel import SteelV1
54
+ from openepd.model.specs.generated.thermal_moisture_protection import ThermalMoistureProtectionV1
55
+ from openepd.model.specs.generated.utility_piping import UtilityPipingV1
56
+ from openepd.model.specs.generated.wood import WoodV1
57
+ from openepd.model.specs.generated.wood_joists import WoodJoistsV1
58
+
59
+
60
+ class Specs(BaseOpenEpdSchema):
61
+ """Material specific specs."""
62
+
63
+ # Nested specs:
64
+ CMU: CMUV1 | None = None
65
+ Masonry: MasonryV1 | None = None
66
+ Steel: SteelV1 | None = None
67
+ NetworkInfrastructure: NetworkInfrastructureV1 | None = None
68
+ Finishes: FinishesV1 | None = None
69
+ ManufacturingInputs: ManufacturingInputsV1 | None = None
70
+ Accessories: AccessoriesV1 | None = None
71
+ ElectricalTransmissionAndDistributionEquipment: ElectricalTransmissionAndDistributionEquipmentV1 | None = None
72
+ Aggregates: AggregatesV1 | None = None
73
+ ThermalMoistureProtection: ThermalMoistureProtectionV1 | None = None
74
+ Mechanical: MechanicalV1 | None = None
75
+ Aluminium: AluminiumV1 | None = None
76
+ Cladding: CladdingV1 | None = None
77
+ FireAndSmokeProtection: FireAndSmokeProtectionV1 | None = None
78
+ PrecastConcrete: PrecastConcreteV1 | None = None
79
+ Asphalt: AsphaltV1 | None = None
80
+ OtherMaterials: OtherMaterialsV1 | None = None
81
+ Plumbing: PlumbingV1 | None = None
82
+ Electrical: ElectricalV1 | None = None
83
+ UtilityPiping: UtilityPipingV1 | None = None
84
+ BulkMaterials: BulkMaterialsV1 | None = None
85
+ CastDecksAndUnderlayment: CastDecksAndUnderlaymentV1 | None = None
86
+ Concrete: ConcreteV1 | None = None
87
+ Sheathing: SheathingV1 | None = None
88
+ Furnishings: FurnishingsV1 | None = None
89
+ Wood: WoodV1 | None = None
90
+ ConveyingEquipment: ConveyingEquipmentV1 | None = None
91
+ MaterialHandling: MaterialHandlingV1 | None = None
92
+ Openings: OpeningsV1 | None = None
93
+ Electricity: ElectricityV1 | None = None
94
+ Grouting: GroutingV1 | None = None
95
+ MechanicalInsulation: MechanicalInsulationV1 | None = None
96
+ OtherElectricalEquipment: OtherElectricalEquipmentV1 | None = None
97
+ WoodJoists: WoodJoistsV1 | None = None
@@ -60,7 +60,7 @@ class AluminiumV1(BaseOpenEpdHierarchicalSpec):
60
60
  _EXT_VERSION = "1.0"
61
61
  recycled_content: RatioFloat | None = pyd.Field(default=None, description="Recycled content")
62
62
 
63
- alloy: AluminiumAlloy | None = pyd.Field(default=None, description="Alloy")
63
+ alloy: AluminiumAlloy | None = pyd.Field(default=None, description="AluminiumAlloy")
64
64
  anodized: bool | None = None
65
65
  painted: bool | None = None
66
66
 
@@ -24,178 +24,12 @@ from openepd.compat.pydantic import pyd
24
24
  from openepd.model.base import BaseOpenEpdSchema
25
25
  from openepd.model.common import OpenEPDUnit
26
26
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, BaseOpenEpdSpec
27
+ from openepd.model.specs.generated.enums import AciExposureClass, CsaExposureClass, EnExposureClass
27
28
  from openepd.model.validation.common import together_validator
28
29
  from openepd.model.validation.numbers import RatioFloat
29
30
  from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
30
31
 
31
32
 
32
- class AciExposureClass(StrEnum):
33
- """
34
- American Concrete Institute concrete exposure classes.
35
-
36
- * `aci.F0` - Concrete not subjected to freezing-and-thawing cycles
37
- * `aci.F1` - Concrete experiences freezing-and-thawing cycles with limited exposure to water
38
- * `aci.F2` - Concrete exposed to freezing-and-thawing cycles with frequent exposure to water
39
- * `aci.F3` - Concrete exposed to freezing-and-thawing cycles with continual exposure to water
40
- and exposure to deicing chemicals
41
- * `aci.S0` - Exposed to <150 ppm of SO4 in water and <0.1% SO4 in soil
42
- * `aci.S1` - Exposed to <1500 ppm of SO4 in water and <0.2% SO4 in soil
43
- * `aci.S2` - Exposed to <10000 ppm of SO4 in water and <2% SO4 in soil
44
- * `aci.S3` - Exposed to >10000 ppm of SO4 in water or >2% SO4 in soil
45
-
46
- * `aci.C1` - Concrete in contact with moisture, but the external source of chloride does not reach it.
47
- * `aci.C2` - Concrete subjected to moisture and an external source of chlorides such as deicing chemicals,
48
- salt, brackish water, seawater, or spray from these sources.
49
- * `aci.W0` - Concrete dry in service
50
- * `aci.W1` - Concrete in contact with water, no requirement for low permeability
51
- * `aci.W2` - Concrete in contact with water where low permeability is required
52
- """
53
-
54
- F0 = "aci.F0"
55
- F1 = "aci.F1"
56
- F2 = "aci.F2"
57
- F3 = "aci.F3"
58
- S0 = "aci.S0"
59
- S1 = "aci.S1"
60
- S2 = "aci.S2"
61
- S3 = "aci.S3"
62
- C1 = "aci.C1"
63
- C2 = "aci.C2"
64
- W0 = "aci.W0"
65
- W1 = "aci.W1"
66
- W2 = "aci.W2"
67
-
68
-
69
- class CsaExposureClass(StrEnum):
70
- """
71
- Canadian Standard Association concrete exposure classes.
72
-
73
- * `csa.C-XL` - Structurally reinforced concrete exposed to chlorides or other severe environment with or without
74
- freezing and thawing conditions, with higher durability performance expectations than the C-1, A-1
75
- or S-1 classes.
76
-
77
- * `csa.C-1` - Structurally reinforced concrete exposed to chlorides with or without freezing and thawing conditions.
78
- Examples: bridge decks, parking decks and ramps, portions of marine structures located within the tidal
79
- and splash zones, concrete exposed to seawater spray, and salt water pools.
80
- * `csa.C-2` - Non-structurally reinforced (i.e. plain) concrete exposed to chlorides and freezing and thawing.
81
- Examples: garage floors, porches, steps, pavements, sidewalks curbs and gutters.
82
- * `csa.C-3` - Continuously submerged concrete exposed to chlorides but not to freezing and thawing.
83
- Example: underwater portions of marine structures.
84
- * `csa.C-4` - Non-structurally reinforced concrete exposed to chlorides but not to freezing and thawing.
85
- Examples: underground parking slabs on grade.
86
-
87
- * `csa.F-1` - Concrete exposed to freezing and thawing in a saturated condition but not to chlorides.
88
- Examples: pool decks, patios, tennis courts, freshwater pools and fresh water control structures.
89
- * `csa.F-2` - Concrete in an unsaturated condition exposed to freezing and thawing but not to chlorides.
90
- Examples: exterior walls and columns.
91
-
92
- * `csa.N` - Concrete not exposed to chlorides nor to freezing and thawing.
93
- Examples: footings and interior slabs, walls and columns.
94
-
95
- * `csa.A-1` - Structurally reinforced concrete exposed to severe manure and/or silage gases, with or without
96
- freeze-thaw exposure. Concrete exposed to the vapour above municipal sewage or industrial effluent,
97
- where hydrogen sulphide gas may be generated.
98
- Examples: reinforced beams, slabs, and columns over manure pits and silos, canals, and pig slats;
99
- and access holes, enclosed chambers and pipes that are partially filled with effluents.
100
- * `csa.A-2` - Structurally reinforced concrete exposed to moderate to severe manure and/or silage gases and liquids,
101
- with or without freeze-thaw exposure.
102
- Examples: reinforced walls in exterior manure tanks, silos and feed bunkers, and exterior slabs.
103
- * `csa.A-3` - Structurally reinforced concrete exposed to moderate to severe manure and/or silage gases and liquids,
104
- with or without freeze-thaw exposure in a continuously submerged condition. Concrete continuously
105
- submerged in municipal or industrial effluents.
106
- Examples: interior gutter walls, beams, slabs and columns; sewage pipes that are continuously full
107
- (e.g. force mains); and submerged portions of sewage treatment structures.
108
- * `csa.A-4` - Non-structurally reinforced concrete exposed to moderate manure and/or silage gases and liquids, without
109
- freeze-thaw exposure.
110
- Examples: interior slabs on grade.
111
-
112
- * `csa.S-1` - Concrete subjected to very severe sulphate exposures.
113
- Exposed to >10000 ppm of SO4 in water or >2% SO4 in soil
114
- * `csa.S-2` - Concrete subjected to severe sulphate exposure.
115
- Exposed to <10000 ppm of SO4 in water and <2% SO4 in soil
116
- * `csa.S-3` - Concrete subjected to moderate sulphate exposure.
117
- Exposed to <1500 ppm of SO4 in water and <0.2% SO4 in soil
118
- """
119
-
120
- C_XL = "csa.C-XL"
121
- C_1 = "csa.C-1"
122
- C_2 = "csa.C-2"
123
- C_3 = "csa.C-3"
124
- C_4 = "csa.C-4"
125
- F_1 = "csa.F-1"
126
- F2 = "csa.F-2"
127
- N = "csa.N"
128
- S_1 = "csa.S-1"
129
- S_2 = "csa.S-2"
130
- S_3 = "csa.S-3"
131
- A_1 = "csa.A-1"
132
- A_2 = "csa.A-2"
133
- A_3 = "csa.A-3"
134
- A_4 = "csa.A-4"
135
-
136
-
137
- class EnExposureClass(StrEnum):
138
- """
139
- EN 206 Class (Europe).
140
-
141
- European Standard concrete exposure classes.
142
-
143
- * `en206.X0` - No risk of corrosion or attack.
144
-
145
- Corrosion induced by carbonation.
146
-
147
- * `en206.XC1` - Dry or permanently wet.
148
- * `en206.XC2` - Wet, rarely dry.
149
- * `en206.XC3` - Moderate humidity.
150
- * `en206.XC4` - Cyclic wet and dry.
151
-
152
- Corrosion induced by chlorides from sea water.
153
-
154
- * `en206.XS1` - Exposed to airborne salt but not in direct contact with sea water.
155
- * `en206.XS2` - Permanently submerged.
156
- * `en206.XS3` - Tidal, splash and spray zones.
157
-
158
- Corrosion induced by chlorides other than from sea water.
159
-
160
- * `en206.XD1` - Moderate humidity.
161
- * `en206.XD2` - Wet, rarely dry.
162
- * `en206.XD3` - Cyclic wet and dry.
163
-
164
- Freeze/thaw attack with or without de-icing agents.
165
-
166
- * `en206.XF1` - Moderate water saturation, without deicing agent.
167
- * `en206.XF2` - Moderate water saturation, with deicing agent.
168
- * `en206.XF3` - High water saturation, without de-icing agent.
169
- * `en206.XF4` - High water saturation, with de-icing agent or sea water.
170
-
171
- Chemical attack.
172
-
173
- * `en206.XA1` - Slightly aggressive chemical environment.
174
- * `en206.XA2` - Moderately aggressive chemical environment.
175
- * `en206.XA3` - Highly aggressive chemical environment.
176
-
177
- """
178
-
179
- en206_X0 = "en206.X0"
180
- en206_XC1 = "en206.XC1"
181
- en206_XC2 = "en206.XC2"
182
- en206_XC3 = "en206.XC3"
183
- en206_XC4 = "en206.XC4"
184
- en206_XS1 = "en206.XS1"
185
- en206_XS2 = "en206.XS2"
186
- en206_XS3 = "en206.XS3"
187
- en206_XD1 = "en206.XD1"
188
- en206_XD2 = "en206.XD2"
189
- en206_XD3 = "en206.XD3"
190
- en206_XF1 = "en206.XF1"
191
- en206_XF2 = "en206.XF2"
192
- en206_XF3 = "en206.XF3"
193
- en206_XF4 = "en206.XF4"
194
- en206_XA1 = "en206.XA1"
195
- en206_XA2 = "en206.XA2"
196
- en206_XA3 = "en206.XA3"
197
-
198
-
199
33
  class CmuWeightClassification(StrEnum):
200
34
  """Concrete Masonry Unit weight classification."""
201
35
 
@@ -325,16 +159,24 @@ class CmuSpec(BaseOpenEpdSpec):
325
159
  class Cementitious(BaseOpenEpdSchema):
326
160
  """List of cementitious materials, and proportion by mass."""
327
161
 
328
- opc: RatioFloat | None = pyd.Field(default=None, description="Ordinary Gray Portland Cement")
329
- wht: RatioFloat | None = pyd.Field(default=None, description="White Portland Cement")
330
- ggbs: RatioFloat | None = pyd.Field(default=None, description="Ground Granulated Blast Furnace Slag")
331
- flyAsh: RatioFloat | None = pyd.Field(default=None, description="Fly Ash, including types F, CL, and CH")
332
- siFume: RatioFloat | None = pyd.Field(default=None, description="Silica Fume")
333
- gg45: RatioFloat | None = pyd.Field(default=None, description="Ground Glass, 45um or smaller")
334
- natPoz: RatioFloat | None = pyd.Field(default=None, description="Natural pozzolan")
335
- mk: RatioFloat | None = pyd.Field(default=None, description="Metakaolin")
336
- CaCO3: RatioFloat | None = pyd.Field(default=None, description="Limestone")
337
- other: RatioFloat | None = pyd.Field(default=None, description="Other SCMs")
162
+ opc: RatioFloat | None = pyd.Field(
163
+ default=None, description="Ordinary Gray Portland Cement", example=0.5, ge=0, le=1
164
+ )
165
+ wht: RatioFloat | None = pyd.Field(default=None, description="White Portland Cement", example=0.5, ge=0, le=1)
166
+ ggbs: RatioFloat | None = pyd.Field(
167
+ default=None, description="Ground Granulated Blast Furnace Slag", example=0.5, ge=0, le=1
168
+ )
169
+ flyAsh: RatioFloat | None = pyd.Field(
170
+ default=None, description="Fly Ash, including types F, CL, and CH", example=0.5, ge=0, le=1
171
+ )
172
+ siFume: RatioFloat | None = pyd.Field(default=None, description="Silica Fume", example=0.5, ge=0, le=1)
173
+ gg45: RatioFloat | None = pyd.Field(
174
+ default=None, description="Ground Glass, 45um or smaller", example=0.5, ge=0, le=1
175
+ )
176
+ natPoz: RatioFloat | None = pyd.Field(default=None, description="Natural pozzolan", example=0.5, ge=0, le=1)
177
+ mk: RatioFloat | None = pyd.Field(default=None, description="Metakaolin", example=0.5, ge=0, le=1)
178
+ CaCO3: RatioFloat | None = pyd.Field(default=None, description="Limestone", example=0.5, ge=0, le=1)
179
+ other: RatioFloat | None = pyd.Field(default=None, description="Other SCMs", example=0.5, ge=0, le=1)
338
180
 
339
181
 
340
182
  class TypicalApplication(BaseOpenEpdSchema):
@@ -0,0 +1,63 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
21
+
22
+
23
+ class BlanketFacingV1(BaseOpenEpdHierarchicalSpec):
24
+ """Blanket facing performance specification."""
25
+
26
+ _EXT_VERSION = "1.0"
27
+
28
+
29
+ class DoorsHardwareV1(BaseOpenEpdHierarchicalSpec):
30
+ """Doors hardware performance specification."""
31
+
32
+ _EXT_VERSION = "1.0"
33
+
34
+
35
+ class FlooringAccessoriesV1(BaseOpenEpdHierarchicalSpec):
36
+ """Flooring accessories performance specification."""
37
+
38
+ _EXT_VERSION = "1.0"
39
+
40
+
41
+ class MortarV1(BaseOpenEpdHierarchicalSpec):
42
+ """Mortar performance specification."""
43
+
44
+ _EXT_VERSION = "1.0"
45
+
46
+
47
+ class TileGroutV1(BaseOpenEpdHierarchicalSpec):
48
+ """Tile grout performance specification."""
49
+
50
+ _EXT_VERSION = "1.0"
51
+
52
+
53
+ class AccessoriesV1(BaseOpenEpdHierarchicalSpec):
54
+ """Accessories performance specification."""
55
+
56
+ _EXT_VERSION = "1.0"
57
+
58
+ # Nested specs:
59
+ BlanketFacing: BlanketFacingV1 | None = None
60
+ DoorsHardware: DoorsHardwareV1 | None = None
61
+ FlooringAccessories: FlooringAccessoriesV1 | None = None
62
+ Mortar: MortarV1 | None = None
63
+ TileGrout: TileGroutV1 | None = None
@@ -0,0 +1,71 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+ from openepd.compat.pydantic import pyd
21
+ from openepd.model.base import BaseOpenEpdSchema
22
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
23
+ from openepd.model.specs.generated.enums import AggregateGradation, AggregateWeightClassification
24
+ from openepd.model.validation.numbers import RatioFloat
25
+ from openepd.model.validation.quantity import LengthMmStr
26
+
27
+
28
+ class AggregateApplication(BaseOpenEpdSchema):
29
+ """Application for aggregates."""
30
+
31
+ concrete: bool | None = pyd.Field(default=None, description="Aggregates used in concrete and masonry applications")
32
+ asphalt: bool | None = pyd.Field(
33
+ default=None, description="Aggregates used in bituminous paving and surface applications"
34
+ )
35
+ unbound: bool | None = pyd.Field(default=None)
36
+
37
+
38
+ class AggregatesV1(BaseOpenEpdHierarchicalSpec):
39
+ """
40
+ Construction Aggregates.
41
+
42
+ Includes sand, gravel, crushed stone, etc. for use as bases, ballasts, or as a component in concrete or asphalt.
43
+ """
44
+
45
+ _EXT_VERSION = "1.0"
46
+
47
+ # Own fields:
48
+ recycled_content: RatioFloat | None = pyd.Field(
49
+ example=0.3, default=None, description="Percent of total mass that is recycled aggregate"
50
+ )
51
+ nominal_max_size: LengthMmStr | None = pyd.Field(
52
+ default=None,
53
+ example="10 mm",
54
+ description="Nominal maximum aggregate size is defined as one sieve size smaller than the maximum "
55
+ "aggregate size. "
56
+ "The maximum aggregate size is defined as the smallest sieve size that requires 100% passing.",
57
+ )
58
+ weight_classification: AggregateWeightClassification | None = pyd.Field(
59
+ example=str(AggregateWeightClassification.HEAVY_WEIGHT), default=None
60
+ )
61
+ gradation: AggregateGradation | None = pyd.Field(example=str(AggregateGradation.GAP), default=None)
62
+ manufactured: bool | None = pyd.Field(
63
+ default=None,
64
+ description="Aggregate produced via expansion or sintering at high temperatures of the following materials: "
65
+ "clay, shale, slate, perlite, vermiculite, or slag. Typically used to produce lightweight aggregate",
66
+ )
67
+ slag: bool | None = pyd.Field(
68
+ default=None,
69
+ description="Pelletized, foamed, and granulated blast furnace slag can be used as construction aggregate.",
70
+ )
71
+ application: AggregateApplication | None = None
@@ -0,0 +1,66 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+ from openepd.compat.pydantic import pyd
21
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
+ from openepd.model.specs.generated.enums import AluminiumAlloy
23
+
24
+
25
+ class AluminiumBilletsV1(BaseOpenEpdHierarchicalSpec):
26
+ """Aluminium billets performance specification."""
27
+
28
+ _EXT_VERSION = "1.0"
29
+
30
+
31
+ class AluminiumExtrusionsV1(BaseOpenEpdHierarchicalSpec):
32
+ """Aluminium extrusions performance specification."""
33
+
34
+ _EXT_VERSION = "1.0"
35
+
36
+ # Own fields:
37
+ thermally_improved: bool | None = pyd.Field(default=None, description="", example=True)
38
+
39
+
40
+ class AluminiumSheetGoodsV1(BaseOpenEpdHierarchicalSpec):
41
+ """Aluminium sheet goods performance specification."""
42
+
43
+ _EXT_VERSION = "1.0"
44
+
45
+
46
+ class AluminiumSuspensionAssemblyV1(BaseOpenEpdHierarchicalSpec):
47
+ """Aluminium suspension assembly performance specification."""
48
+
49
+ _EXT_VERSION = "1.0"
50
+
51
+
52
+ class AluminiumV1(BaseOpenEpdHierarchicalSpec):
53
+ """Material definition for objects made primarily from Aluminium and its alloys."""
54
+
55
+ _EXT_VERSION = "1.0"
56
+
57
+ # Own fields:
58
+ alloy: AluminiumAlloy | None = pyd.Field(default=None, description="", example=str(AluminiumAlloy.ALLOY_1XXX))
59
+ anodized: bool | None = pyd.Field(default=None, description="", example=True)
60
+ painted: bool | None = pyd.Field(default=None, description="", example=True)
61
+
62
+ # Nested specs:
63
+ AluminiumBillets: AluminiumBilletsV1 | None = None
64
+ AluminiumExtrusions: AluminiumExtrusionsV1 | None = None
65
+ AluminiumSheetGoods: AluminiumSheetGoodsV1 | None = None
66
+ AluminiumSuspensionAssembly: AluminiumSuspensionAssemblyV1 | None = None
@@ -0,0 +1,86 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+ from openepd.compat.pydantic import pyd
21
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
22
+ from openepd.model.specs.generated.enums import AsphaltGradation, AsphaltMixType
23
+ from openepd.model.validation.numbers import RatioFloat
24
+ from openepd.model.validation.quantity import LengthMmStr, TemperatureCStr, validate_unit_factory
25
+
26
+
27
+ class AsphaltV1(BaseOpenEpdHierarchicalSpec):
28
+ """Asphalt performance specification."""
29
+
30
+ _EXT_VERSION = "1.0"
31
+
32
+ # Own fields:
33
+ aggregate_size_max: LengthMmStr | None = pyd.Field(default=None, description="Max aggregate size", example="20 mm")
34
+ rap: RatioFloat | None = pyd.Field(
35
+ default=None,
36
+ description="Percent of mixture that has been replaced by recycled asphalt pavement (RAP).",
37
+ example=0.5,
38
+ ge=0,
39
+ le=1,
40
+ )
41
+ ras: RatioFloat | None = pyd.Field(
42
+ default=None,
43
+ description="Percent of mixture that has been replaced by recycled asphalt shingles (RAS).",
44
+ example=0.5,
45
+ ge=0,
46
+ le=1,
47
+ )
48
+ ground_tire_rubber: RatioFloat | None = pyd.Field(
49
+ default=None,
50
+ description="Percent of mixture that has been replaced by ground tire rubber (GTR).",
51
+ example=0.5,
52
+ ge=0,
53
+ le=1,
54
+ )
55
+ max_temperature: TemperatureCStr | None = pyd.Field(
56
+ default=None,
57
+ description="The upper threshold temperature to which an asphalt "
58
+ "binder can be heated preventing the asphalt mixture "
59
+ "from rutting",
60
+ example="90 °C",
61
+ )
62
+ min_temperature: TemperatureCStr | None = pyd.Field(
63
+ default=None,
64
+ description="The lower threshold temperature for an asphalt "
65
+ "binder to prevent thermal cracking of the asphalt"
66
+ " mixture.",
67
+ example="-20 °C",
68
+ )
69
+ mix_type: AsphaltMixType | None = pyd.Field(default=None, description="Asphalt mix type", example="WMA")
70
+ gradation: AsphaltGradation | None = pyd.Field(default=None, description="Asphalt gradation", example="Gap-graded")
71
+
72
+ sbr: bool | None = pyd.Field(default=None, description="Styrene-butadiene rubber (SBR)", example=True)
73
+ sbs: bool | None = pyd.Field(default=None, description="Styrene-butadiene-styrene (SBS)", example=True)
74
+ ppa: bool | None = pyd.Field(default=None, description="Polyphosphoric acid (PPA)", example=True)
75
+ gtr: bool | None = pyd.Field(default=None, description="Ground tire rubber (GTR)", example=True)
76
+ pmb: bool | None = pyd.Field(default=None, description="Polymer modified bitumen (PMB)", example=True)
77
+
78
+ _asphalt_aggregate_size_max_is_quantity_validator = pyd.validator("aggregate_size_max", allow_reuse=True)(
79
+ validate_unit_factory("m")
80
+ )
81
+ _asphalt_max_temperature_is_quantity_validator = pyd.validator("max_temperature", allow_reuse=True)(
82
+ validate_unit_factory("°C")
83
+ )
84
+ _asphalt_min_temperature_is_quantity_validator = pyd.validator("min_temperature", allow_reuse=True)(
85
+ validate_unit_factory("°C")
86
+ )
@@ -0,0 +1,26 @@
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
+ # This software was developed with support from the Skanska USA,
17
+ # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
+ # Find out more at www.BuildingTransparency.org
19
+ #
20
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
21
+
22
+
23
+ class BulkMaterialsV1(BaseOpenEpdHierarchicalSpec):
24
+ """Bulk materials performance specification."""
25
+
26
+ _EXT_VERSION = "1.0"