openepd 3.1.1__tar.gz → 3.1.3__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.
- {openepd-3.1.1 → openepd-3.1.3}/PKG-INFO +2 -1
- {openepd-3.1.1 → openepd-3.1.3}/pyproject.toml +3 -2
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/__version__.py +1 -1
- openepd-3.1.3/src/openepd/compat/compat_functional_validators.py +29 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/compat/pydantic.py +6 -1
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/concrete.py +1 -157
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/asphalt.py +1 -11
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/cladding.py +4 -16
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/cmu.py +1 -8
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/concrete.py +59 -33
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/conveying_equipment.py +2 -12
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/electrical.py +9 -12
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/enums.py +26 -20
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/finishes.py +2 -36
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/fire_and_smoke_protection.py +1 -3
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/furnishings.py +1 -3
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/masonry.py +5 -4
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/mechanical.py +25 -93
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/mechanical_insulation.py +1 -5
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/network_infrastructure.py +2 -12
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/openings.py +209 -91
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/plumbing.py +3 -19
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/precast_concrete.py +1 -5
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/steel.py +117 -53
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/thermal_moisture_protection.py +1 -15
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/utility_piping.py +2 -10
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/wood.py +1 -5
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/validation/quantity.py +158 -16
- openepd-3.1.1/src/openepd/model/specs/aluminium.py +0 -67
- openepd-3.1.1/src/openepd/model/specs/glass.py +0 -360
- openepd-3.1.1/src/openepd/model/specs/steel.py +0 -184
- openepd-3.1.1/src/openepd/model/specs/wood.py +0 -130
- {openepd-3.1.1 → openepd-3.1.3}/LICENSE +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/README.md +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/base_sync_client.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/category/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/category/dto.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/category/sync_api.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/common.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/base.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/common.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/meta.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/mf.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/dto/params.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/epd/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/epd/dto.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/epd/sync_api.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/errors.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/pcr/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/pcr/dto.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/pcr/sync_api.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/sync_client.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/api/test/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/bundle/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/bundle/base.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/bundle/model.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/bundle/reader.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/bundle/writer.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/compat/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/base.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/category.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/common.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/epd.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/factory.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/lcia.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/org.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/pcr.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/README.md +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/asphalt.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/base.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/accessories.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/aggregates.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/aluminium.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/bulk_materials.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/cast_decks_and_underlayment.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/common.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/electricity.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/grouting.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/manufacturing_inputs.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/material_handling.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/other_electrical_equipment.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/other_materials.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/sheathing.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/specs/generated/wood_joists.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/standard.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/validation/__init__.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/validation/common.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/validation/numbers.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/model/versioning.py +0 -0
- {openepd-3.1.1 → openepd-3.1.3}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: openepd
|
3
|
-
Version: 3.1.
|
3
|
+
Version: 3.1.3
|
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
|
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
19
19
|
Provides-Extra: api-client
|
20
20
|
Requires-Dist: email-validator (>=1.3.1)
|
21
|
+
Requires-Dist: idna (>=3.7)
|
21
22
|
Requires-Dist: pydantic (>=1.10,<3.0)
|
22
23
|
Requires-Dist: requests (>=2.0) ; extra == "api-client"
|
23
24
|
Project-URL: Repository, https://github.com/cchangelabs/openepd
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "openepd"
|
3
|
-
version = "3.1.
|
3
|
+
version = "3.1.3"
|
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>"]
|
@@ -24,6 +24,7 @@ python = "^3.11"
|
|
24
24
|
pydantic = ">=1.10,<3.0"
|
25
25
|
email-validator = ">=1.3.1"
|
26
26
|
requests = { version = ">=2.0", optional = true }
|
27
|
+
idna = ">=3.7"
|
27
28
|
|
28
29
|
# Optional dependencies
|
29
30
|
# lxml = { version = "~=4.9.2", optional = true }
|
@@ -38,7 +39,7 @@ teamcity-messages = ">=1.31"
|
|
38
39
|
wheel = "~=0.40.0"
|
39
40
|
|
40
41
|
# Dev tools
|
41
|
-
black = "~=
|
42
|
+
black = "~=24.3"
|
42
43
|
licenseheaders = "~=0.8"
|
43
44
|
flake8 = "~=4.0"
|
44
45
|
flake8-import-graph = "~=0.1.3"
|
@@ -0,0 +1,29 @@
|
|
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 typing import Any
|
21
|
+
|
22
|
+
__all__ = ["AfterValidator"]
|
23
|
+
|
24
|
+
|
25
|
+
class AfterValidator:
|
26
|
+
"""Placeholder stub for validator, unused in pydantic 1."""
|
27
|
+
|
28
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
29
|
+
pass
|
@@ -18,12 +18,17 @@
|
|
18
18
|
# Find out more at www.BuildingTransparency.org
|
19
19
|
#
|
20
20
|
try:
|
21
|
+
from pydantic import functional_validators # type: ignore
|
21
22
|
from pydantic import v1 as pyd # type: ignore
|
22
23
|
from pydantic.v1 import generics as pyd_generics # type: ignore
|
24
|
+
|
23
25
|
except ImportError:
|
24
26
|
import pydantic as pyd # type: ignore[no-redef]
|
25
27
|
from pydantic import generics as pyd_generics # type: ignore[no-redef]
|
26
28
|
|
29
|
+
from . import compat_functional_validators as functional_validators # type: ignore[no-redef]
|
30
|
+
|
31
|
+
|
27
32
|
pydantic = pyd
|
28
33
|
|
29
|
-
__all__ = ["pyd", "pydantic", "pyd_generics"]
|
34
|
+
__all__ = ["pyd", "pydantic", "pyd_generics", "functional_validators"]
|
@@ -18,16 +18,11 @@
|
|
18
18
|
# Find out more at www.BuildingTransparency.org
|
19
19
|
#
|
20
20
|
from enum import StrEnum
|
21
|
-
from typing import Literal
|
22
21
|
|
23
22
|
from openepd.compat.pydantic import pyd
|
24
23
|
from openepd.model.base import BaseOpenEpdSchema
|
25
|
-
from openepd.model.
|
26
|
-
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec, BaseOpenEpdSpec
|
27
|
-
from openepd.model.specs.generated.enums import AciExposureClass, CsaExposureClass, EnExposureClass
|
28
|
-
from openepd.model.validation.common import together_validator
|
24
|
+
from openepd.model.specs.base import BaseOpenEpdSpec
|
29
25
|
from openepd.model.validation.numbers import RatioFloat
|
30
|
-
from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
|
31
26
|
|
32
27
|
|
33
28
|
class CmuWeightClassification(StrEnum):
|
@@ -208,154 +203,3 @@ class ConcreteV1Options(BaseOpenEpdSchema):
|
|
208
203
|
co2: bool | None = pyd.Field(description="CO2 Curing", default=None)
|
209
204
|
white: bool | None = pyd.Field(description="White Cement", default=None)
|
210
205
|
fiber_reinforced: bool | None = pyd.Field(description="Fiber reinforced", default=None)
|
211
|
-
|
212
|
-
|
213
|
-
class ReadyMixV1(BaseOpenEpdHierarchicalSpec):
|
214
|
-
"""Concretes to be mixed and then poured on-site."""
|
215
|
-
|
216
|
-
_EXT_VERSION = "1.0"
|
217
|
-
|
218
|
-
|
219
|
-
class FlowableFillV1(BaseOpenEpdHierarchicalSpec):
|
220
|
-
"""
|
221
|
-
Flowable fill is a slurry that is placed as a flowable liquid (high slump) and sets with no compaction.
|
222
|
-
|
223
|
-
It is often used in tight or restricted access areas where placing and compacting
|
224
|
-
fill is difficult. Applications include filling large voids such as abandoned underground storage
|
225
|
-
tanks, basements, tunnels, mines, and sewers. It can also be used as paving sub-base, bridge
|
226
|
-
abutment, and retaining wall backfill. Also called Controlled Density Fill (CDF) or Controlled
|
227
|
-
Low Strength Materials (CLSMs). These materials typically have compressive strengths
|
228
|
-
under 1200 psi.
|
229
|
-
"""
|
230
|
-
|
231
|
-
_EXT_VERSION = "1.0"
|
232
|
-
|
233
|
-
|
234
|
-
class OilPatchV1(BaseOpenEpdHierarchicalSpec):
|
235
|
-
"""
|
236
|
-
Concretes for use in petroleum extraction wells and similar applications.
|
237
|
-
|
238
|
-
Includes foamed cement; often called cement in the drilling industry. Differs from
|
239
|
-
flowable fill and grout in that it contains no sand or other aggregates.
|
240
|
-
"""
|
241
|
-
|
242
|
-
_EXT_VERSION = "1.0"
|
243
|
-
|
244
|
-
|
245
|
-
class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
|
246
|
-
"""Concrete paving."""
|
247
|
-
|
248
|
-
_EXT_VERSION = "1.0"
|
249
|
-
|
250
|
-
|
251
|
-
class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
|
252
|
-
"""Concretes sprayed on a target."""
|
253
|
-
|
254
|
-
_EXT_VERSION = "1.0"
|
255
|
-
|
256
|
-
|
257
|
-
class CementGroutV1(BaseOpenEpdHierarchicalSpec):
|
258
|
-
"""
|
259
|
-
Cement grouting is a slurry that is placed as a flowable liquid.
|
260
|
-
|
261
|
-
It is an effective material for filling and
|
262
|
-
strengthening granular soils, voids in rocks, foundation underpinnings, and other underground voids. Also called
|
263
|
-
structural grout, these materials typically impart significant compressive strength to the system.
|
264
|
-
|
265
|
-
"""
|
266
|
-
|
267
|
-
_EXT_VERSION = "1.0"
|
268
|
-
|
269
|
-
|
270
|
-
class ConcreteV1(BaseOpenEpdHierarchicalSpec):
|
271
|
-
"""Concrete spec."""
|
272
|
-
|
273
|
-
_EXT_VERSION = "1.0"
|
274
|
-
|
275
|
-
strength_28d: PressureMPaStr | None = pyd.Field(
|
276
|
-
default=None, example="30 MPa", description="Concrete strength after 28 days"
|
277
|
-
)
|
278
|
-
strength_early: PressureMPaStr | None = pyd.Field(
|
279
|
-
default=None,
|
280
|
-
example="30 MPa",
|
281
|
-
description="A strength spec which is to be reached earlier than 28 days (e.g. 3d)",
|
282
|
-
)
|
283
|
-
strength_early_d: Literal[3, 7, 14] | None = pyd.Field(default=None, description="Test Day for the Early Strength")
|
284
|
-
strength_late: PressureMPaStr | None = pyd.Field(
|
285
|
-
default=None,
|
286
|
-
example="30 MPa",
|
287
|
-
description="A strength spec which is to be reached later than 28 days (e.g. 42d)",
|
288
|
-
)
|
289
|
-
strength_late_d: Literal[42, 56, 72, 96, 120] | None = pyd.Field(
|
290
|
-
default=None, description="Test Day for the Late Strength"
|
291
|
-
)
|
292
|
-
slump: LengthMmStr | None = pyd.Field(description="Minimum test slump", example="40 mm", default=None)
|
293
|
-
w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
|
294
|
-
aci_exposure_classes: list[AciExposureClass] = pyd.Field(
|
295
|
-
description=(AciExposureClass.__doc__ or "").lstrip(), default_factory=list
|
296
|
-
)
|
297
|
-
csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
|
298
|
-
description=(CsaExposureClass.__doc__ or "").lstrip(), default_factory=list
|
299
|
-
)
|
300
|
-
en_exposure_classes: list[EnExposureClass] = pyd.Field(
|
301
|
-
description=(EnExposureClass.__doc__ or "").lstrip(), default_factory=list
|
302
|
-
)
|
303
|
-
cementitious: Cementitious | None = pyd.Field(
|
304
|
-
default=None,
|
305
|
-
description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
|
306
|
-
)
|
307
|
-
application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
|
308
|
-
options: ConcreteV1Options | None = pyd.Field(description="Concrete options", default=None)
|
309
|
-
|
310
|
-
# Nested specs
|
311
|
-
ReadyMix: ReadyMixV1 | None = None
|
312
|
-
FlowableFill: FlowableFillV1 | None = None
|
313
|
-
OilPatch: OilPatchV1 | None = None
|
314
|
-
ConcretePaving: ConcretePavingV1 | None = None
|
315
|
-
Shotcrete: ShotcreteV1 | None = None
|
316
|
-
CementGrout: CementGroutV1 | None = None
|
317
|
-
|
318
|
-
_compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
|
319
|
-
validate_unit_factory(OpenEPDUnit.MPa)
|
320
|
-
)
|
321
|
-
_strength_early_unit_validator = pyd.validator("strength_early", allow_reuse=True)(
|
322
|
-
validate_unit_factory(OpenEPDUnit.MPa)
|
323
|
-
)
|
324
|
-
_strength_late_unit_validator = pyd.validator("strength_late", allow_reuse=True)(
|
325
|
-
validate_unit_factory(OpenEPDUnit.MPa)
|
326
|
-
)
|
327
|
-
|
328
|
-
@pyd.root_validator
|
329
|
-
def _late_validator(cls, values):
|
330
|
-
together_validator("strength_late", "strength_late_d", values)
|
331
|
-
return values
|
332
|
-
|
333
|
-
@pyd.root_validator
|
334
|
-
def _early_validator(cls, values):
|
335
|
-
together_validator("strength_early", "strength_early_d", values)
|
336
|
-
return values
|
337
|
-
|
338
|
-
|
339
|
-
class PrecastConcreteV1(BaseOpenEpdHierarchicalSpec):
|
340
|
-
"""Precast Concrete spec."""
|
341
|
-
|
342
|
-
_EXT_VERSION = "1.0"
|
343
|
-
|
344
|
-
strength_28d: PressureMPaStr | None = pyd.Field(
|
345
|
-
default=None, example="30 MPa", description="Concrete strength after 28 days"
|
346
|
-
)
|
347
|
-
|
348
|
-
lightweight: bool | None = pyd.Field(description="Lightweight", default=None)
|
349
|
-
steel_mass_percentage: RatioFloat | None = pyd.Field(
|
350
|
-
default=None,
|
351
|
-
description="Percent of total mass that is steel reinforcement. Steel reinforcement "
|
352
|
-
"substantially changes functional performance and usually adds substantial GWP "
|
353
|
-
"per declared unit.",
|
354
|
-
)
|
355
|
-
|
356
|
-
insulated: bool | None = pyd.Field(description="Insulated", default=None)
|
357
|
-
gfrc: bool | None = pyd.Field(description="Glass Fiber Reinforced Concrete", default=None)
|
358
|
-
|
359
|
-
_compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True)(
|
360
|
-
validate_unit_factory(OpenEPDUnit.MPa)
|
361
|
-
)
|
@@ -21,7 +21,7 @@ from openepd.compat.pydantic import pyd
|
|
21
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
22
|
from openepd.model.specs.generated.enums import AsphaltGradation, AsphaltMixType
|
23
23
|
from openepd.model.validation.numbers import RatioFloat
|
24
|
-
from openepd.model.validation.quantity import LengthMmStr, TemperatureCStr
|
24
|
+
from openepd.model.validation.quantity import LengthMmStr, TemperatureCStr
|
25
25
|
|
26
26
|
|
27
27
|
class AsphaltV1(BaseOpenEpdHierarchicalSpec):
|
@@ -74,13 +74,3 @@ class AsphaltV1(BaseOpenEpdHierarchicalSpec):
|
|
74
74
|
ppa: bool | None = pyd.Field(default=None, description="Polyphosphoric acid (PPA)", example=True)
|
75
75
|
gtr: bool | None = pyd.Field(default=None, description="Ground tire rubber (GTR)", example=True)
|
76
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
|
-
)
|
@@ -20,7 +20,7 @@
|
|
20
20
|
from openepd.compat.pydantic import pyd
|
21
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
22
|
from openepd.model.specs.generated.enums import CladdingFacingMaterial, CladdingInsulatingMaterial, SidingFormFactor
|
23
|
-
from openepd.model.validation.quantity import LengthMmStr, LengthMStr, validate_unit_factory
|
23
|
+
from openepd.model.validation.quantity import LengthMmStr, LengthMStr, RValueStr, validate_unit_factory
|
24
24
|
|
25
25
|
|
26
26
|
class AluminiumSidingV1(BaseOpenEpdHierarchicalSpec):
|
@@ -126,13 +126,9 @@ class SidingV1(BaseOpenEpdHierarchicalSpec):
|
|
126
126
|
insulated: bool | None = pyd.Field(default=None, description="", example=True)
|
127
127
|
ventilated: bool | None = pyd.Field(default=None, description="", example=True)
|
128
128
|
paint_or_stain_required: bool | None = pyd.Field(default=None, description="", example=True)
|
129
|
-
r_value:
|
129
|
+
r_value: RValueStr | None = pyd.Field(default=None, description="")
|
130
130
|
form_factor: SidingFormFactor | None = pyd.Field(default=None, description="", example="Lap")
|
131
131
|
|
132
|
-
_siding_r_value_is_quantity_validator = pyd.validator("r_value", allow_reuse=True)(
|
133
|
-
validate_unit_factory("K * m2 / W")
|
134
|
-
)
|
135
|
-
|
136
132
|
# Nested specs:
|
137
133
|
MetalSiding: MetalSidingV1 | None = None
|
138
134
|
CompositionSiding: CompositionSidingV1 | None = None
|
@@ -150,15 +146,11 @@ class InsulatedRoofPanelsV1(BaseOpenEpdHierarchicalSpec):
|
|
150
146
|
_EXT_VERSION = "1.0"
|
151
147
|
|
152
148
|
# Own fields:
|
153
|
-
r_value:
|
149
|
+
r_value: RValueStr | None = pyd.Field(default=None, description="")
|
154
150
|
insulating_material: CladdingInsulatingMaterial | None = pyd.Field(
|
155
151
|
default=None, description="", example="No Insulation"
|
156
152
|
)
|
157
153
|
|
158
|
-
_cladding_r_value_is_quantity_validator = pyd.validator("r_value", allow_reuse=True)(
|
159
|
-
validate_unit_factory("K * m2 / W")
|
160
|
-
)
|
161
|
-
|
162
154
|
|
163
155
|
class InsulatedWallPanelsV1(BaseOpenEpdHierarchicalSpec):
|
164
156
|
"""Insulated wall panels performance specification."""
|
@@ -166,15 +158,11 @@ class InsulatedWallPanelsV1(BaseOpenEpdHierarchicalSpec):
|
|
166
158
|
_EXT_VERSION = "1.0"
|
167
159
|
|
168
160
|
# Own fields:
|
169
|
-
r_value:
|
161
|
+
r_value: RValueStr | None = pyd.Field(default=None, description="")
|
170
162
|
insulating_material: CladdingInsulatingMaterial | None = pyd.Field(
|
171
163
|
default=None, description="", example="No Insulation"
|
172
164
|
)
|
173
165
|
|
174
|
-
_cladding_r_value_is_quantity_validator = pyd.validator("r_value", allow_reuse=True)(
|
175
|
-
validate_unit_factory("K * m2 / W")
|
176
|
-
)
|
177
|
-
|
178
166
|
|
179
167
|
class RoofPanelsV1(BaseOpenEpdHierarchicalSpec):
|
180
168
|
"""Roof panels performance specification."""
|
@@ -20,7 +20,7 @@
|
|
20
20
|
from openepd.compat.pydantic import pyd
|
21
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
22
|
from openepd.model.specs.generated.enums import CmuBlockType, CmuWeightClassification
|
23
|
-
from openepd.model.validation.quantity import GwpKgCo2eStr, PressureMPaStr
|
23
|
+
from openepd.model.validation.quantity import GwpKgCo2eStr, PressureMPaStr
|
24
24
|
|
25
25
|
|
26
26
|
class CMUV1(BaseOpenEpdHierarchicalSpec):
|
@@ -37,10 +37,3 @@ class CMUV1(BaseOpenEpdHierarchicalSpec):
|
|
37
37
|
sound_performance: bool | None = pyd.Field(default=None, description="", example=True)
|
38
38
|
b1_recarbonation: GwpKgCo2eStr | None = pyd.Field(default=None, description="", example="1 kgCO2e")
|
39
39
|
b1_recarbonation_z: float | None = pyd.Field(default=None, description="", example=2.3)
|
40
|
-
|
41
|
-
_concrete_compressive_strength_28d_is_quantity_validator = pyd.validator("strength_28d", allow_reuse=True)(
|
42
|
-
validate_unit_factory("MPa")
|
43
|
-
)
|
44
|
-
_b1_recarbonation_is_quantity_validator = pyd.validator("b1_recarbonation", allow_reuse=True)(
|
45
|
-
validate_unit_factory("kgCO2e")
|
46
|
-
)
|
@@ -34,19 +34,26 @@ from openepd.model.validation.quantity import (
|
|
34
34
|
|
35
35
|
|
36
36
|
class CementGroutV1(BaseOpenEpdHierarchicalSpec):
|
37
|
-
"""
|
37
|
+
"""
|
38
|
+
Cement grout performance specification.
|
39
|
+
|
40
|
+
Cement grouting is a slurry that is placed as a flowable liquid. It is an effective material
|
41
|
+
for filling and strengthening granular soils, voids in rocks, foundation underpinnings, and
|
42
|
+
other underground voids. Also called structural grout, these materials typically impart
|
43
|
+
significant compressive strength to the system.
|
44
|
+
"""
|
38
45
|
|
39
46
|
_EXT_VERSION = "1.0"
|
40
47
|
|
41
48
|
|
42
49
|
class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
|
43
|
-
"""Concrete paving
|
50
|
+
"""Concrete paving."""
|
44
51
|
|
45
52
|
_EXT_VERSION = "1.0"
|
46
53
|
|
47
54
|
# Own fields:
|
48
55
|
flexion_strength: PressureMPaStr | None = pyd.Field(
|
49
|
-
default=None, description="
|
56
|
+
default=None, description="Concrete flexural strength.", example="30 MPa"
|
50
57
|
)
|
51
58
|
|
52
59
|
_concrete_flexion_strength_is_quantity_validator = pyd.validator("flexion_strength", allow_reuse=True)(
|
@@ -55,36 +62,58 @@ class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
|
|
55
62
|
|
56
63
|
|
57
64
|
class FlowableFillV1(BaseOpenEpdHierarchicalSpec):
|
58
|
-
"""
|
65
|
+
"""
|
66
|
+
Flowable fill performance specification.
|
67
|
+
|
68
|
+
Flowable fill is a slurry that is placed as a flowable liquid (high slump) and sets with no
|
69
|
+
compaction. It is often used in tight or restricted access areas where placing and compacting
|
70
|
+
fill is difficult. Applications include filling large voids such as abandoned underground storage
|
71
|
+
tanks, basements, tunnels, mines, and sewers. It can also be used as paving sub-base, bridge
|
72
|
+
abutment, and retaining wall backfill.
|
73
|
+
|
74
|
+
Also called Controlled Density Fill (CDF) or Controlled Low Strength Materials (CLSMs). These materials typically
|
75
|
+
have compressive strengths under 1200 psi.
|
76
|
+
"""
|
59
77
|
|
60
78
|
_EXT_VERSION = "1.0"
|
61
79
|
|
62
80
|
|
63
81
|
class OilPatchV1(BaseOpenEpdHierarchicalSpec):
|
64
|
-
"""
|
82
|
+
"""
|
83
|
+
Petroleum Industry Cement Slurry.
|
84
|
+
|
85
|
+
Concretes for use in creation, maintenance, and decommissioning of petroleum extraction wells and similar
|
86
|
+
applications. Includes foamed cement; often called cement in the drilling industry. Differs from
|
87
|
+
flowable fill and grout in that it contains no sand or other aggregates.
|
88
|
+
"""
|
65
89
|
|
66
90
|
_EXT_VERSION = "1.0"
|
67
91
|
|
68
92
|
|
69
93
|
class ReadyMixV1(BaseOpenEpdHierarchicalSpec):
|
70
|
-
"""Concretes
|
94
|
+
"""Concretes to be mixed and then poured on-site."""
|
71
95
|
|
72
96
|
_EXT_VERSION = "1.0"
|
73
97
|
|
74
98
|
|
75
99
|
class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
|
76
|
-
"""
|
100
|
+
"""Concretes sprayed on a target."""
|
77
101
|
|
78
102
|
_EXT_VERSION = "1.0"
|
79
103
|
|
80
104
|
|
81
105
|
class ConcreteV1(BaseOpenEpdHierarchicalSpec):
|
82
|
-
"""
|
106
|
+
"""
|
107
|
+
Concrete.
|
108
|
+
|
109
|
+
A composite material composed of fine and coarse aggregate bonded together with a fluid cement (cement paste) that
|
110
|
+
hardens over time.
|
111
|
+
"""
|
83
112
|
|
84
113
|
_EXT_VERSION = "1.0"
|
85
114
|
|
86
115
|
# Own fields:
|
87
|
-
lightweight: bool | None = pyd.Field(default=None, description="
|
116
|
+
lightweight: bool | None = pyd.Field(default=None, description="Product is lightweight", example=True)
|
88
117
|
|
89
118
|
strength_28d: PressureMPaStr | None = pyd.Field(
|
90
119
|
default=None, description="Concrete strength after 28 days", example="1 MPa"
|
@@ -95,14 +124,16 @@ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
|
|
95
124
|
example="30 MPa",
|
96
125
|
)
|
97
126
|
strength_other_d: Literal[3, 7, 14, 42, 56, 72, 96, 120] | None = pyd.Field(
|
98
|
-
default=None, description="Test Day for
|
127
|
+
default=None, description="Test Day for strength_other", example=42
|
99
128
|
)
|
100
129
|
|
101
130
|
slump: LengthInchStr | None = pyd.Field(default=None, description="", example="2 in")
|
102
131
|
min_slump: LengthInchStr | None = pyd.Field(default=None, description="Minimum test slump", example="2 in")
|
103
132
|
max_slump: LengthInchStr | None = pyd.Field(default=None, description="", example="2 in")
|
104
133
|
|
105
|
-
min_pipeline_size: LengthMmStr | None = pyd.Field(
|
134
|
+
min_pipeline_size: LengthMmStr | None = pyd.Field(
|
135
|
+
default=None, description="Minimum pipeline size", example="200 mm"
|
136
|
+
)
|
106
137
|
w_c_ratio: RatioFloat | None = pyd.Field(
|
107
138
|
default=None, description="Ratio of water to cement", example=0.5, ge=0, le=1
|
108
139
|
)
|
@@ -114,33 +145,28 @@ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
|
|
114
145
|
finishable: bool | None = pyd.Field(default=None, description="Finishable", example=True)
|
115
146
|
fiber_reinforced: bool | None = pyd.Field(default=None, description="fiber_reinforced", example=True)
|
116
147
|
|
117
|
-
cementitious: Cementitious | None = pyd.Field(
|
118
|
-
|
119
|
-
aggregate_size_max: LengthMmStr | None = pyd.Field(default=None, description="", example="0.0254 m")
|
120
|
-
cement_content: MassKgStr | None = pyd.Field(default=None, description="", example="1 kg")
|
121
|
-
aci_exposure_classes: list[AciExposureClass] | None = pyd.Field(default=None, description="", example=["aci.F0"])
|
122
|
-
csa_exposure_classes: list[CsaExposureClass] | None = pyd.Field(default=None, description="", example=["csa.C-2"])
|
123
|
-
en_exposure_classes: list[EnExposureClass] | None = pyd.Field(default=None, description="", example=["en206.X0"])
|
124
|
-
typical_application: ConcreteTypicalApplication | None = pyd.Field(default=None, description="Typical Application")
|
125
|
-
|
126
|
-
_concrete_compressive_strength_28d_is_quantity_validator = pyd.validator("strength_28d", allow_reuse=True)(
|
127
|
-
validate_unit_factory("MPa")
|
148
|
+
cementitious: Cementitious | None = pyd.Field(
|
149
|
+
default=None, description="List of cementitious materials, and proportion by mass"
|
128
150
|
)
|
129
|
-
|
130
|
-
|
151
|
+
|
152
|
+
aggregate_size_max: LengthMmStr | None = pyd.Field(
|
153
|
+
default=None,
|
154
|
+
description="The smallest sieve size for which the entire amount of aggregate is able to pass. "
|
155
|
+
"Parameter describes diameter of aggregate",
|
156
|
+
example="8 mm",
|
131
157
|
)
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
validate_unit_factory("m")
|
158
|
+
cement_content: MassKgStr | None = pyd.Field(default=None, example="1 kg")
|
159
|
+
|
160
|
+
aci_exposure_classes: list[AciExposureClass] | None = pyd.Field(
|
161
|
+
default=None, description="List of ACI exposure classes", example=["aci.F0"]
|
137
162
|
)
|
138
|
-
|
139
|
-
|
163
|
+
csa_exposure_classes: list[CsaExposureClass] | None = pyd.Field(
|
164
|
+
default=None, description="List of CSA exposure classes", example=["csa.C-2"]
|
140
165
|
)
|
141
|
-
|
142
|
-
|
166
|
+
en_exposure_classes: list[EnExposureClass] | None = pyd.Field(
|
167
|
+
default=None, description="List of EN exposure classes", example=["en206.X0"]
|
143
168
|
)
|
169
|
+
typical_application: ConcreteTypicalApplication | None = pyd.Field(default=None, description="Typical Application")
|
144
170
|
|
145
171
|
# Nested specs:
|
146
172
|
CementGrout: CementGroutV1 | None = None
|
@@ -20,7 +20,7 @@
|
|
20
20
|
from openepd.compat.pydantic import pyd
|
21
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
22
|
from openepd.model.specs.generated.enums import ElevatorsBuildingRise, ElevatorsUsageIntensity
|
23
|
-
from openepd.model.validation.quantity import LengthMStr, MassKgStr,
|
23
|
+
from openepd.model.validation.quantity import LengthMStr, MassKgStr, SpeedStr
|
24
24
|
|
25
25
|
|
26
26
|
class ElevatorsV1(BaseOpenEpdHierarchicalSpec):
|
@@ -34,19 +34,9 @@ class ElevatorsV1(BaseOpenEpdHierarchicalSpec):
|
|
34
34
|
)
|
35
35
|
travel_length: LengthMStr | None = pyd.Field(default=None, description="", example="1 m")
|
36
36
|
rated_load: MassKgStr | None = pyd.Field(default=None, description="", example="1 kg")
|
37
|
-
rated_speed:
|
37
|
+
rated_speed: SpeedStr | None = pyd.Field(default=None, description="", example="1 m / s")
|
38
38
|
building_rise: ElevatorsBuildingRise | None = pyd.Field(default=None, description="", example="Low-rise")
|
39
39
|
|
40
|
-
_elevators_travel_length_is_quantity_validator = pyd.validator("travel_length", allow_reuse=True)(
|
41
|
-
validate_unit_factory("m")
|
42
|
-
)
|
43
|
-
_elevators_rated_load_is_quantity_validator = pyd.validator("rated_load", allow_reuse=True)(
|
44
|
-
validate_unit_factory("kg")
|
45
|
-
)
|
46
|
-
_elevators_rated_speed_is_quantity_validator = pyd.validator("rated_speed", allow_reuse=True)(
|
47
|
-
validate_unit_factory("m / s")
|
48
|
-
)
|
49
|
-
|
50
40
|
|
51
41
|
class ConveyingEquipmentV1(BaseOpenEpdHierarchicalSpec):
|
52
42
|
"""Conveying equipment performance specification."""
|
@@ -21,10 +21,12 @@ from openepd.compat.pydantic import pyd
|
|
21
21
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
22
|
from openepd.model.specs.generated.enums import CableTraysMaterial, EnergySource, RacewaysMaterial
|
23
23
|
from openepd.model.validation.quantity import (
|
24
|
+
ColorTemperatureStr,
|
24
25
|
LengthMmStr,
|
25
26
|
LengthMStr,
|
27
|
+
LuminosityStr,
|
26
28
|
MassKgStr,
|
27
|
-
|
29
|
+
PowerStr,
|
28
30
|
validate_quantity_ge_factory,
|
29
31
|
validate_quantity_le_factory,
|
30
32
|
validate_unit_factory,
|
@@ -70,11 +72,6 @@ class CableTraysV1(BaseOpenEpdHierarchicalSpec):
|
|
70
72
|
)
|
71
73
|
cable_trays_material: CableTraysMaterial | None = pyd.Field(default=None, description="", example="Stainless Steel")
|
72
74
|
|
73
|
-
_height_is_quantity_validator = pyd.validator("height", allow_reuse=True)(validate_unit_factory("m"))
|
74
|
-
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
75
|
-
_depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
|
76
|
-
_static_load_is_quantity_validator = pyd.validator("static_load", allow_reuse=True)(validate_unit_factory("kg"))
|
77
|
-
|
78
75
|
|
79
76
|
class ElectricalBusesV1(BaseOpenEpdHierarchicalSpec):
|
80
77
|
"""Electrical buses performance specification."""
|
@@ -110,9 +107,6 @@ class RacewaysV1(BaseOpenEpdHierarchicalSpec):
|
|
110
107
|
divided: bool | None = pyd.Field(default=None, description="", example=True)
|
111
108
|
raceways_material: RacewaysMaterial | None = pyd.Field(default=None, description="", example="Aluminum")
|
112
109
|
|
113
|
-
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
114
|
-
_depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
|
115
|
-
|
116
110
|
|
117
111
|
class FueledElectricalGeneratorsV1(BaseOpenEpdHierarchicalSpec):
|
118
112
|
"""Fueled electrical generators performance specification."""
|
@@ -250,10 +244,10 @@ class LightingV1(BaseOpenEpdHierarchicalSpec):
|
|
250
244
|
_EXT_VERSION = "1.0"
|
251
245
|
|
252
246
|
# Own fields:
|
253
|
-
color_temperature:
|
247
|
+
color_temperature: ColorTemperatureStr | None = pyd.Field(default=None, description="", example="1 K")
|
254
248
|
typical_utilization: str | None = pyd.Field(default=None, description="", example="1 h / yr")
|
255
|
-
luminosity:
|
256
|
-
wattage:
|
249
|
+
luminosity: LuminosityStr | None = pyd.Field(default=None, description="", example="1 lumen")
|
250
|
+
wattage: PowerStr | None = pyd.Field(default=None, description="")
|
257
251
|
color_rendering_index: float | None = pyd.Field(default=None, description="", example=2.3)
|
258
252
|
dimmable: bool | None = pyd.Field(default=None, description="", example=True)
|
259
253
|
|
@@ -263,6 +257,9 @@ class LightingV1(BaseOpenEpdHierarchicalSpec):
|
|
263
257
|
_color_temperature_quantity_le_validator = pyd.validator("color_temperature", allow_reuse=True)(
|
264
258
|
validate_quantity_le_factory("1E+04 K")
|
265
259
|
)
|
260
|
+
_typical_utilization_unit_validator = pyd.validator("typical_utilization", allow_reuse=True)(
|
261
|
+
validate_unit_factory("h / yr")
|
262
|
+
)
|
266
263
|
_typical_utilization_quantity_ge_validator = pyd.validator("typical_utilization", allow_reuse=True)(
|
267
264
|
validate_quantity_ge_factory("25 h / yr")
|
268
265
|
)
|