openepd 1.7.2__py3-none-any.whl → 1.9.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openepd/__version__.py +1 -1
- openepd/api/dto/common.py +4 -1
- openepd/api/epd/dto.py +21 -7
- openepd/api/pcr/dto.py +2 -3
- openepd/model/epd.py +1 -1
- openepd/model/org.py +2 -2
- openepd/model/specs/concrete.py +113 -26
- openepd/model/specs/glass.py +10 -9
- openepd/model/specs/steel.py +10 -0
- openepd/model/validation/quantity.py +2 -0
- openepd/model/versioning.py +2 -1
- {openepd-1.7.2.dist-info → openepd-1.9.0.dist-info}/METADATA +1 -1
- {openepd-1.7.2.dist-info → openepd-1.9.0.dist-info}/RECORD +15 -15
- {openepd-1.7.2.dist-info → openepd-1.9.0.dist-info}/LICENSE +0 -0
- {openepd-1.7.2.dist-info → openepd-1.9.0.dist-info}/WHEEL +0 -0
openepd/__version__.py
CHANGED
openepd/api/dto/common.py
CHANGED
@@ -111,4 +111,7 @@ class OpenEpdApiResponse(GenericModel, BaseOpenEpdApiModel, Generic[TPayload, TM
|
|
111
111
|
"""Standard DTO representing response from OpenEPD API server."""
|
112
112
|
|
113
113
|
payload: TPayload
|
114
|
-
|
114
|
+
# there is an issue with using covariant type variables as parameters when used for container mutable types,
|
115
|
+
# as described in https://github.com/python/mypy/issues/7049
|
116
|
+
# However, in our workflow TMeta is not a container type which is further returned back to caller.
|
117
|
+
meta: TMeta # type: ignore[misc]
|
openepd/api/epd/dto.py
CHANGED
@@ -37,20 +37,34 @@ class StatisticsDto(BaseOpenEpdApiModel):
|
|
37
37
|
"""
|
38
38
|
|
39
39
|
# percentiles
|
40
|
-
pct10_gwp: float = pyd.Field(
|
40
|
+
pct10_gwp: float = pyd.Field(
|
41
|
+
description="10th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
42
|
+
)
|
41
43
|
achievable_target: float = pyd.Field(
|
42
44
|
description="Achievable target. 20th percentile of GWP measured in kgCO2e per declared unit", example=445.65
|
43
45
|
)
|
44
|
-
pct30_gwp: float = pyd.Field(
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
pct30_gwp: float = pyd.Field(
|
47
|
+
description="30th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
48
|
+
)
|
49
|
+
pct40_gwp: float = pyd.Field(
|
50
|
+
description="40th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
51
|
+
)
|
52
|
+
pct50_gwp: float = pyd.Field(
|
53
|
+
description="50th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
54
|
+
)
|
55
|
+
pct60_gwp: float = pyd.Field(
|
56
|
+
description="60th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
57
|
+
)
|
58
|
+
pct70_gwp: float = pyd.Field(
|
59
|
+
description="70th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
60
|
+
)
|
49
61
|
conservative_estimate: float = pyd.Field(
|
50
62
|
description="Conservative estimate. 80th percentile of GWP per declared unit measured in kgCO2e",
|
51
63
|
example=640.778,
|
52
64
|
)
|
53
|
-
pct90_gwp: float = pyd.Field(
|
65
|
+
pct90_gwp: float = pyd.Field(
|
66
|
+
description="70th percentile GWP for this statistics measured in kgCO2e per declared unit"
|
67
|
+
)
|
54
68
|
|
55
69
|
# stats
|
56
70
|
average: float = pyd.Field(description="Average GWP in kgCO2e per declared unit", example=554.2)
|
openepd/api/pcr/dto.py
CHANGED
@@ -25,15 +25,14 @@ from openepd.api.dto.base import BaseOpenEpdApiModel
|
|
25
25
|
class PcrRef(BaseOpenEpdApiModel):
|
26
26
|
"""Reference to a PCR."""
|
27
27
|
|
28
|
-
id: str = pyd.Field(
|
28
|
+
id: str | None = pyd.Field(
|
29
29
|
description="The unique ID for this PCR. To ensure global uniqueness, should be registered "
|
30
30
|
"at open-xpd-uuid.cqd.io/register or a coordinating registry.",
|
31
31
|
example="ec3xpgq2",
|
32
32
|
default=None,
|
33
33
|
)
|
34
|
-
name: str = pyd.Field(
|
34
|
+
name: str | None = pyd.Field(
|
35
35
|
max_length=200,
|
36
|
-
default=None,
|
37
36
|
description="Full document name as listed in source document",
|
38
37
|
example="c-PCR-003 Concrete and concrete elements (EN 16757)",
|
39
38
|
)
|
openepd/model/epd.py
CHANGED
@@ -55,7 +55,7 @@ class EpdV0(WithAttachmentsMixin, WithAltIdsMixin, BaseEpd):
|
|
55
55
|
default=None,
|
56
56
|
)
|
57
57
|
product_name: str | None = pyd.Field(
|
58
|
-
max_length=200, description="The name of the product described by this EPD", example="Mix 12345AC"
|
58
|
+
max_length=200, description="The name of the product described by this EPD", example="Mix 12345AC", default=None
|
59
59
|
)
|
60
60
|
product_sku: str | None = pyd.Field(
|
61
61
|
max_length=200, description="Unique stock keeping identifier assigned by manufacturer"
|
openepd/model/org.py
CHANGED
@@ -29,8 +29,8 @@ from openepd.model.validation.common import ReferenceStr
|
|
29
29
|
class OrgRef(BaseOpenEpdSchema):
|
30
30
|
"""Represents Organisation with minimal data."""
|
31
31
|
|
32
|
-
web_domain: str = pyd.Field(
|
33
|
-
description="A web domain owned by organization. Typically is the org's home website address"
|
32
|
+
web_domain: str | None = pyd.Field(
|
33
|
+
description="A web domain owned by organization. Typically is the org's home website address", default=None
|
34
34
|
)
|
35
35
|
name: str | None = pyd.Field(
|
36
36
|
max_length=200,
|
openepd/model/specs/concrete.py
CHANGED
@@ -43,6 +43,13 @@ class AciExposureClass(StrEnum):
|
|
43
43
|
* `aci.S1` - Exposed to <1500 ppm of SO4 in water and <0.2% SO4 in soil
|
44
44
|
* `aci.S2` - Exposed to <10000 ppm of SO4 in water and <2% SO4 in soil
|
45
45
|
* `aci.S3` - Exposed to >10000 ppm of SO4 in water or >2% SO4 in soil
|
46
|
+
|
47
|
+
* `aci.C1` - Concrete in contact with moisture, but the external source of chloride does not reach it.
|
48
|
+
* `aci.C2` - Concrete subjected to moisture and an external source of chlorides such as deicing chemicals,
|
49
|
+
salt, brackish water, seawater, or spray from these sources.
|
50
|
+
* `aci.W0` - Concrete dry in service
|
51
|
+
* `aci.W1` - Concrete in contact with water, no requirement for low permeability
|
52
|
+
* `aci.W2` - Concrete in contact with water where low permeability is required
|
46
53
|
"""
|
47
54
|
|
48
55
|
F0 = "aci.F0"
|
@@ -53,6 +60,11 @@ class AciExposureClass(StrEnum):
|
|
53
60
|
S1 = "aci.S1"
|
54
61
|
S2 = "aci.S2"
|
55
62
|
S3 = "aci.S3"
|
63
|
+
C1 = "aci.C1"
|
64
|
+
C2 = "aci.C2"
|
65
|
+
W0 = "aci.W0"
|
66
|
+
W1 = "aci.W1"
|
67
|
+
W2 = "aci.W2"
|
56
68
|
|
57
69
|
|
58
70
|
class CsaExposureClass(StrEnum):
|
@@ -357,39 +369,71 @@ class ConcreteV1Options(BaseOpenEpdSchema):
|
|
357
369
|
fiber_reinforced: bool | None = pyd.Field(description="Fiber reinforced", default=None)
|
358
370
|
|
359
371
|
|
360
|
-
class
|
361
|
-
"""
|
372
|
+
class ReadyMixV1(BaseOpenEpdHierarchicalSpec):
|
373
|
+
"""Concretes to be mixed and then poured on-site."""
|
362
374
|
|
363
|
-
|
364
|
-
default=None, example="30 MPa", description="Concrete strength after 28 days"
|
365
|
-
)
|
366
|
-
w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
|
367
|
-
aci_exposure_classes: list[AciExposureClass] = pyd.Field(
|
368
|
-
description=(AciExposureClass.__doc__ or "").lstrip(), default=None
|
369
|
-
)
|
370
|
-
csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
|
371
|
-
description=(CsaExposureClass.__doc__ or "").lstrip(), default=None
|
372
|
-
)
|
373
|
-
en_exposure_classes: list[EnExposureClass] = pyd.Field(
|
374
|
-
description=(EnExposureClass.__doc__ or "").lstrip(), default=None
|
375
|
-
)
|
376
|
-
cementitious: Cementitious | None = pyd.Field(
|
377
|
-
default=None,
|
378
|
-
description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
|
379
|
-
)
|
380
|
-
application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
|
381
|
-
options: ConcreteV1Options = pyd.Field(description="Concrete options", default=None)
|
375
|
+
_EXT_VERSION = "1.0"
|
382
376
|
|
383
|
-
_compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
|
384
|
-
validate_unit_factory(OpenEPDUnit.MPa)
|
385
|
-
)
|
386
377
|
|
378
|
+
class FlowableFillV1(BaseOpenEpdHierarchicalSpec):
|
379
|
+
"""
|
380
|
+
Flowable fill is a slurry that is placed as a flowable liquid (high slump) and sets with no compaction.
|
381
|
+
|
382
|
+
It is often used in tight or restricted access areas where placing and compacting
|
383
|
+
fill is difficult. Applications include filling large voids such as abandoned underground storage
|
384
|
+
tanks, basements, tunnels, mines, and sewers. It can also be used as paving sub-base, bridge
|
385
|
+
abutment, and retaining wall backfill. Also called Controlled Density Fill (CDF) or Controlled
|
386
|
+
Low Strength Materials (CLSMs). These materials typically have compressive strengths
|
387
|
+
under 1200 psi.
|
388
|
+
"""
|
389
|
+
|
390
|
+
_EXT_VERSION = "1.0"
|
391
|
+
|
392
|
+
|
393
|
+
class OilPatchV1(BaseOpenEpdHierarchicalSpec):
|
394
|
+
"""
|
395
|
+
Concretes for use in petroleum extraction wells and similar applications.
|
396
|
+
|
397
|
+
Includes foamed cement; often called cement in the drilling industry. Differs from
|
398
|
+
flowable fill and grout in that it contains no sand or other aggregates.
|
399
|
+
"""
|
400
|
+
|
401
|
+
_EXT_VERSION = "1.0"
|
402
|
+
|
403
|
+
|
404
|
+
class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
|
405
|
+
"""Concrete paving."""
|
406
|
+
|
407
|
+
_EXT_VERSION = "1.0"
|
408
|
+
|
409
|
+
|
410
|
+
class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
|
411
|
+
"""Concretes sprayed on a target."""
|
412
|
+
|
413
|
+
_EXT_VERSION = "1.0"
|
414
|
+
|
415
|
+
|
416
|
+
class CementGroutV1(BaseOpenEpdHierarchicalSpec):
|
417
|
+
"""
|
418
|
+
Cement grouting is a slurry that is placed as a flowable liquid.
|
419
|
+
|
420
|
+
It is an effective material for filling and
|
421
|
+
strengthening granular soils, voids in rocks, foundation underpinnings, and other underground voids. Also called
|
422
|
+
structural grout, these materials typically impart significant compressive strength to the system.
|
423
|
+
|
424
|
+
"""
|
425
|
+
|
426
|
+
_EXT_VERSION = "1.0"
|
387
427
|
|
388
|
-
|
428
|
+
|
429
|
+
class ConcreteV1(BaseOpenEpdHierarchicalSpec):
|
389
430
|
"""Concrete spec."""
|
390
431
|
|
391
432
|
_EXT_VERSION = "1.0"
|
392
433
|
|
434
|
+
strength_28d: PressureMPaStr | None = pyd.Field(
|
435
|
+
default=None, example="30 MPa", description="Concrete strength after 28 days"
|
436
|
+
)
|
393
437
|
strength_early: PressureMPaStr | None = pyd.Field(
|
394
438
|
default=None,
|
395
439
|
example="30 MPa",
|
@@ -405,7 +449,34 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
|
|
405
449
|
default=None, description="Test Day for the Late Strength"
|
406
450
|
)
|
407
451
|
slump: LengthMmStr | None = pyd.Field(description="Minimum test slump", example="40 mm", default=None)
|
452
|
+
w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
|
453
|
+
aci_exposure_classes: list[AciExposureClass] = pyd.Field(
|
454
|
+
description=(AciExposureClass.__doc__ or "").lstrip(), default_factory=list
|
455
|
+
)
|
456
|
+
csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
|
457
|
+
description=(CsaExposureClass.__doc__ or "").lstrip(), default_factory=list
|
458
|
+
)
|
459
|
+
en_exposure_classes: list[EnExposureClass] = pyd.Field(
|
460
|
+
description=(EnExposureClass.__doc__ or "").lstrip(), default_factory=list
|
461
|
+
)
|
462
|
+
cementitious: Cementitious | None = pyd.Field(
|
463
|
+
default=None,
|
464
|
+
description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
|
465
|
+
)
|
466
|
+
application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
|
467
|
+
options: ConcreteV1Options | None = pyd.Field(description="Concrete options", default=None)
|
468
|
+
|
469
|
+
# Nested specs
|
470
|
+
ReadyMix: ReadyMixV1 | None = None
|
471
|
+
FlowableFill: FlowableFillV1 | None = None
|
472
|
+
OilPatch: OilPatchV1 | None = None
|
473
|
+
ConcretePaving: ConcretePavingV1 | None = None
|
474
|
+
Shotcrete: ShotcreteV1 | None = None
|
475
|
+
CementGrout: CementGroutV1 | None = None
|
408
476
|
|
477
|
+
_compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
|
478
|
+
validate_unit_factory(OpenEPDUnit.MPa)
|
479
|
+
)
|
409
480
|
_strength_early_unit_validator = pyd.validator("strength_early", allow_reuse=True)(
|
410
481
|
validate_unit_factory(OpenEPDUnit.MPa)
|
411
482
|
)
|
@@ -424,10 +495,26 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
|
|
424
495
|
return values
|
425
496
|
|
426
497
|
|
427
|
-
class PrecastConcreteV1(
|
498
|
+
class PrecastConcreteV1(BaseOpenEpdHierarchicalSpec):
|
428
499
|
"""Precast Concrete spec."""
|
429
500
|
|
430
501
|
_EXT_VERSION = "1.0"
|
431
502
|
|
503
|
+
strength_28d: PressureMPaStr | None = pyd.Field(
|
504
|
+
default=None, example="30 MPa", description="Concrete strength after 28 days"
|
505
|
+
)
|
506
|
+
|
507
|
+
lightweight: bool | None = pyd.Field(description="Lightweight", default=None)
|
508
|
+
steel_mass_percentage: RatioFloat | None = pyd.Field(
|
509
|
+
default=None,
|
510
|
+
description="Percent of total mass that is steel reinforcement. Steel reinforcement "
|
511
|
+
"substantially changes functional performance and usually adds substantial GWP "
|
512
|
+
"per declared unit.",
|
513
|
+
)
|
514
|
+
|
432
515
|
insulated: bool | None = pyd.Field(description="Insulated", default=None)
|
433
516
|
gfrc: bool | None = pyd.Field(description="Glass Fiber Reinforced Concrete", default=None)
|
517
|
+
|
518
|
+
_compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True)(
|
519
|
+
validate_unit_factory(OpenEPDUnit.MPa)
|
520
|
+
)
|
openepd/model/specs/glass.py
CHANGED
@@ -21,12 +21,13 @@ from enum import StrEnum
|
|
21
21
|
|
22
22
|
import pydantic as pyd
|
23
23
|
|
24
|
+
from openepd.model.base import BaseOpenEpdSchema
|
24
25
|
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
25
26
|
from openepd.model.validation.numbers import PositiveInt, RatioFloat
|
26
27
|
from openepd.model.validation.quantity import HeatConductanceUCIStr, LengthMmStr, PressureMPaStr, QuantityStr
|
27
28
|
|
28
29
|
|
29
|
-
class SolarHeatGainMixin(
|
30
|
+
class SolarHeatGainMixin(BaseOpenEpdSchema):
|
30
31
|
"""Solar heat gain mixin."""
|
31
32
|
|
32
33
|
solar_heat_gain: RatioFloat | None = pyd.Field(
|
@@ -38,7 +39,7 @@ class SolarHeatGainMixin(BaseOpenEpdHierarchicalSpec):
|
|
38
39
|
)
|
39
40
|
|
40
41
|
|
41
|
-
class GlazingOptionsMixin(
|
42
|
+
class GlazingOptionsMixin(BaseOpenEpdSchema):
|
42
43
|
"""Glazing options mixin."""
|
43
44
|
|
44
45
|
low_emissivity: bool | None = pyd.Field(default=None, description="Low Emissivity coatings")
|
@@ -80,7 +81,7 @@ class GlazingOptionsMixin(BaseOpenEpdHierarchicalSpec):
|
|
80
81
|
)
|
81
82
|
|
82
83
|
|
83
|
-
class GlassPanesMixin(
|
84
|
+
class GlassPanesMixin(BaseOpenEpdSchema):
|
84
85
|
"""Glass panes mixin."""
|
85
86
|
|
86
87
|
glass_panes: PositiveInt | None = pyd.Field(
|
@@ -90,7 +91,7 @@ class GlassPanesMixin(BaseOpenEpdHierarchicalSpec):
|
|
90
91
|
)
|
91
92
|
|
92
93
|
|
93
|
-
class DPRatingMixin(
|
94
|
+
class DPRatingMixin(BaseOpenEpdSchema):
|
94
95
|
"""Differential pressure rating mixin."""
|
95
96
|
|
96
97
|
dp_rating: PressureMPaStr | None = pyd.Field(
|
@@ -98,7 +99,7 @@ class DPRatingMixin(BaseOpenEpdHierarchicalSpec):
|
|
98
99
|
)
|
99
100
|
|
100
101
|
|
101
|
-
class AirInfiltrationMixin(
|
102
|
+
class AirInfiltrationMixin(BaseOpenEpdSchema):
|
102
103
|
"""Air infiltration mixin."""
|
103
104
|
|
104
105
|
air_infiltration: QuantityStr | None = pyd.Field(
|
@@ -108,7 +109,7 @@ class AirInfiltrationMixin(BaseOpenEpdHierarchicalSpec):
|
|
108
109
|
)
|
109
110
|
|
110
111
|
|
111
|
-
class AssemblyUFactorMixin(
|
112
|
+
class AssemblyUFactorMixin(BaseOpenEpdSchema):
|
112
113
|
"""Assembly U factor mixin."""
|
113
114
|
|
114
115
|
assembly_u_factor: HeatConductanceUCIStr | None = pyd.Field(
|
@@ -118,7 +119,7 @@ class AssemblyUFactorMixin(BaseOpenEpdHierarchicalSpec):
|
|
118
119
|
)
|
119
120
|
|
120
121
|
|
121
|
-
class GlassIntendedApplicationMixin(
|
122
|
+
class GlassIntendedApplicationMixin(BaseOpenEpdSchema):
|
122
123
|
"""Glass intended application mixin."""
|
123
124
|
|
124
125
|
glazing_intended_application_curtain_wall: bool | None = pyd.Field(
|
@@ -165,13 +166,13 @@ class ThermalSeparationEnum(StrEnum):
|
|
165
166
|
NON_METAL = "Nonmetal"
|
166
167
|
|
167
168
|
|
168
|
-
class ThermalSeparationMixin(
|
169
|
+
class ThermalSeparationMixin(BaseOpenEpdSchema):
|
169
170
|
"""Thermal separation mixin."""
|
170
171
|
|
171
172
|
thermal_separation: ThermalSeparationEnum | None = pyd.Field(default=None, description="Thermal separation.")
|
172
173
|
|
173
174
|
|
174
|
-
class HurricaneResistantMixin(
|
175
|
+
class HurricaneResistantMixin(BaseOpenEpdSchema):
|
175
176
|
"""Hurricane resistant mixin."""
|
176
177
|
|
177
178
|
hurricane_resistant: bool | None = pyd.Field(
|
openepd/model/specs/steel.py
CHANGED
@@ -50,12 +50,16 @@ class SteelComposition(StrEnum):
|
|
50
50
|
class FabricatedOptionsMixin(pyd.BaseModel):
|
51
51
|
"""Fabricated options mixin."""
|
52
52
|
|
53
|
+
_EXT_VERSION = "1.0"
|
54
|
+
|
53
55
|
fabricated: bool | None = pyd.Field(default=None, description="Fabricated")
|
54
56
|
|
55
57
|
|
56
58
|
class WireMeshSteelV1(BaseOpenEpdHierarchicalSpec):
|
57
59
|
"""Spec for wire mesh steel."""
|
58
60
|
|
61
|
+
_EXT_VERSION = "1.0"
|
62
|
+
|
59
63
|
class Options(BaseOpenEpdSchema, FabricatedOptionsMixin):
|
60
64
|
"""Wire Mesh Options."""
|
61
65
|
|
@@ -115,6 +119,8 @@ class RebarSteelV1(BaseOpenEpdHierarchicalSpec):
|
|
115
119
|
class PlateSteelV1(BaseOpenEpdHierarchicalSpec):
|
116
120
|
"""Plate Steel Spec."""
|
117
121
|
|
122
|
+
_EXT_VERSION = "1.0"
|
123
|
+
|
118
124
|
class Options(BaseOpenEpdSchema, FabricatedOptionsMixin):
|
119
125
|
"""Plate Steel Options."""
|
120
126
|
|
@@ -126,6 +132,8 @@ class PlateSteelV1(BaseOpenEpdHierarchicalSpec):
|
|
126
132
|
class HollowV1(BaseOpenEpdHierarchicalSpec):
|
127
133
|
"""Hollow Sections Spec."""
|
128
134
|
|
135
|
+
_EXT_VERSION = "1.0"
|
136
|
+
|
129
137
|
class Options(FabricatedOptionsMixin, BaseOpenEpdSchema):
|
130
138
|
"""Hollow Sections Options."""
|
131
139
|
|
@@ -137,6 +145,8 @@ class HollowV1(BaseOpenEpdHierarchicalSpec):
|
|
137
145
|
class HotRolledV1(BaseOpenEpdHierarchicalSpec):
|
138
146
|
"""Hot Rolled spec."""
|
139
147
|
|
148
|
+
_EXT_VERSION = "1.0"
|
149
|
+
|
140
150
|
class Options(FabricatedOptionsMixin, BaseOpenEpdSchema):
|
141
151
|
"""Hot Rolled options."""
|
142
152
|
|
@@ -69,7 +69,9 @@ def validate_unit_factory(dimensionality: OpenEPDUnit | str):
|
|
69
69
|
# for abitrary non-standard quantity
|
70
70
|
QuantityStr: TypeAlias = Annotated[str, pyd.Field()]
|
71
71
|
PressureMPaStr: TypeAlias = Annotated[str, pyd.Field(example="30 MPa")]
|
72
|
+
MassKgStr: TypeAlias = Annotated[str, pyd.Field(example="30 kg")]
|
72
73
|
LengthMmStr: TypeAlias = Annotated[str, pyd.Field(example="30 mm")]
|
74
|
+
AreaM2Str: TypeAlias = Annotated[str, pyd.Field(example="12 m2")]
|
73
75
|
LengthMStr: TypeAlias = Annotated[str, pyd.Field(example="30 m")]
|
74
76
|
TemperatureCStr: TypeAlias = Annotated[str, pyd.Field(example="45 C")]
|
75
77
|
HeatConductanceUCIStr: TypeAlias = Annotated[str, pyd.Field(example="0.3 U")]
|
openepd/model/versioning.py
CHANGED
@@ -37,7 +37,8 @@ class WithExtVersionMixin(ABC, BaseModel):
|
|
37
37
|
if hasattr(cls, "_EXT_VERSION"):
|
38
38
|
cls.__fields__["ext_version"].default = cls._EXT_VERSION
|
39
39
|
|
40
|
-
|
40
|
+
# Note: default is set programmatically in __init_subclass__
|
41
|
+
ext_version: str | None = pyd.Field(description="Extension version", example="3.22", default=None)
|
41
42
|
|
42
43
|
|
43
44
|
class Version(NamedTuple):
|
@@ -1,5 +1,5 @@
|
|
1
1
|
openepd/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
2
|
-
openepd/__version__.py,sha256=
|
2
|
+
openepd/__version__.py,sha256=jnF1KQQH-oe7r7Nthg1ws4gaTnagjiXOX84RVcGM0XA,855
|
3
3
|
openepd/api/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
4
4
|
openepd/api/base_sync_client.py,sha256=JcNpWsGoIK_1Eg27CAQd7nIjbcfD56jQ1nS6B48Q0cI,21142
|
5
5
|
openepd/api/category/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
@@ -8,16 +8,16 @@ openepd/api/category/sync_api.py,sha256=QLEyga590UON9zv7864NjdSPkxSoeWObIOCUOLhD
|
|
8
8
|
openepd/api/common.py,sha256=rfxjaDd7gGoen85wSooHt0W9xHdUlSlkTlkr2CO1ccg,8681
|
9
9
|
openepd/api/dto/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
10
10
|
openepd/api/dto/base.py,sha256=r3vxG3CpSS2M_L6k5mHVA4_Khunxkmh4QxEPjLOwft8,1233
|
11
|
-
openepd/api/dto/common.py,sha256=
|
11
|
+
openepd/api/dto/common.py,sha256=u6N-MmKoS1SZ7-IdVLHU8PQYGxPKKV8-NcZassIaKzo,4692
|
12
12
|
openepd/api/dto/meta.py,sha256=_jrQuzmWhhitdB0_tREGLdzU2iGOZqYy84zsC3Hexhw,2361
|
13
13
|
openepd/api/dto/mf.py,sha256=4jqhXqSGtA_MRXvJJFXtj4xMhsT9rucveyVAxt8V-oc,2195
|
14
14
|
openepd/api/dto/params.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
15
15
|
openepd/api/epd/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
16
|
-
openepd/api/epd/dto.py,sha256
|
16
|
+
openepd/api/epd/dto.py,sha256=-uEQRi2DBUIrtulgZ8D_qNbptBNrA-vJA09JeeY114Q,5075
|
17
17
|
openepd/api/epd/sync_api.py,sha256=JEZR3WBZHqP4yOk1qkWsz0oKHMgegoZ7Pvoh6YTVefg,4391
|
18
18
|
openepd/api/errors.py,sha256=K6L_T91iJLFSl_7hVS6poV_BUjZJe3qJBUzp8mItm7g,2376
|
19
19
|
openepd/api/pcr/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
20
|
-
openepd/api/pcr/dto.py,sha256=
|
20
|
+
openepd/api/pcr/dto.py,sha256=CljjYK50Xz7wlIc0TfpTyyQLwdMao3SJW3hSHJpd8i4,1633
|
21
21
|
openepd/api/pcr/sync_api.py,sha256=j8g23-FuaN2JkROVRo32v77JWpTWDIOWnIyomBbqNd4,1805
|
22
22
|
openepd/api/sync_client.py,sha256=DBkoB8rH8OG1d1sJ77h2YvIP8aFQX5eCfaX4sTN0vEs,2504
|
23
23
|
openepd/api/test/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
@@ -30,28 +30,28 @@ openepd/model/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
|
30
30
|
openepd/model/base.py,sha256=R81hZd8EZBM2E9EhQbzNa9JLRzAjeNPPkZYEmoUM4v0,9132
|
31
31
|
openepd/model/category.py,sha256=_6yFyldaDrkZk2_9ZAO2oRTz7ocvkg4T-D_aw5ncgvo,1840
|
32
32
|
openepd/model/common.py,sha256=j-M_2T_Kl_Ea8l50pJT7LNatBW1fKrRcw4XNpeNvLU0,5635
|
33
|
-
openepd/model/epd.py,sha256=
|
33
|
+
openepd/model/epd.py,sha256=T935Aaz6jULmFQHasqfwzgfvHKJ6tSSkbWKWUQ_XPk0,14283
|
34
34
|
openepd/model/factory.py,sha256=qQZNb4yFN1EQWHHVS-fHnJ2gB-vsKz9hVmXXJE7YaRU,1918
|
35
35
|
openepd/model/lcia.py,sha256=4AffuUYDZISwhJFcUC_r3JJYq4zL_q0RwS6KatYotU0,17149
|
36
|
-
openepd/model/org.py,sha256=
|
36
|
+
openepd/model/org.py,sha256=xV3MQE6iMaXtQWHHwGnjlE5LAd0Joyt-JuvOIvOLQ_4,3997
|
37
37
|
openepd/model/pcr.py,sha256=t861yFntmy3ewrnGLP47cv3afV-aCCVRlrbpGeRh-7I,4604
|
38
38
|
openepd/model/specs/README.md,sha256=W5LSMpZuW5x36cKS4HRfeFsClsRf8J9yHMMICghdc0s,862
|
39
39
|
openepd/model/specs/__init__.py,sha256=nNs2nu1DIKyFC2A-Wc6Zk2VguSti3bC0gMpjop692z0,2299
|
40
40
|
openepd/model/specs/aluminium.py,sha256=UqTX1gigGNgR9jWi4TEM-bKVGlZ_MBkdsLx4H1-H7KA,2246
|
41
41
|
openepd/model/specs/asphalt.py,sha256=lBHTultMZqWXe9u-inGzcZRBkvW6axFZ10REZv-OBys,3533
|
42
42
|
openepd/model/specs/base.py,sha256=S2KmHpBjjZnJ67FS3VJBA3aQ0a440OmhFFTqM8ZEOMM,2681
|
43
|
-
openepd/model/specs/concrete.py,sha256=
|
44
|
-
openepd/model/specs/glass.py,sha256=
|
45
|
-
openepd/model/specs/steel.py,sha256=
|
43
|
+
openepd/model/specs/concrete.py,sha256=I5_KVLkHeMvOrdJRY3TOeSVQ9lQZXcaLu0zHP1RJO1M,23203
|
44
|
+
openepd/model/specs/glass.py,sha256=gsqTTylaDZTi1U1GQDvmIV08m3h-1uq3iQIm1rvWpJI,14824
|
45
|
+
openepd/model/specs/steel.py,sha256=u2Lyu69y0bewghfz3JcrKVjKc5bZJKAljA356_EKgWc,6464
|
46
46
|
openepd/model/specs/wood.py,sha256=ehKJqqW9VfNKgM1S3gazfNNL4Af4SKZBm7HttAjokZQ,5128
|
47
47
|
openepd/model/standard.py,sha256=YjxpC9nyz6LM8m3z1s5S0exJ1qvA3n59-FBoScg-FL0,1519
|
48
48
|
openepd/model/validation/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
|
49
49
|
openepd/model/validation/common.py,sha256=afJrWSvxMf8s9Y80-bG67Fp6W5siqtciMJ3Z6nUOPAI,2636
|
50
50
|
openepd/model/validation/numbers.py,sha256=60Z9hT8nQwJHvUL7k5nBZsHxxWhaIxNKVbW3BnHS8zM,1088
|
51
|
-
openepd/model/validation/quantity.py,sha256
|
52
|
-
openepd/model/versioning.py,sha256=
|
51
|
+
openepd/model/validation/quantity.py,sha256=yYI-vJzhZTTMlHfZqZzxTgEziXp_WeIouIo7etntFfI,3005
|
52
|
+
openepd/model/versioning.py,sha256=fpj45RmphEI5u9fKZLI8FWa83cjH-wkeIU1RLLLwmX8,4700
|
53
53
|
openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
54
|
-
openepd-1.
|
55
|
-
openepd-1.
|
56
|
-
openepd-1.
|
57
|
-
openepd-1.
|
54
|
+
openepd-1.9.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
55
|
+
openepd-1.9.0.dist-info/METADATA,sha256=RnFS7P2ijW63ly6LP2-dvJeYC07V1fh8dQwBoJVmf-k,7762
|
56
|
+
openepd-1.9.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
57
|
+
openepd-1.9.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|