openepd 6.4.0__tar.gz → 6.4.2__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-6.4.0 → openepd-6.4.2}/PKG-INFO +1 -1
- {openepd-6.4.0 → openepd-6.4.2}/pyproject.toml +1 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/__version__.py +1 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/common.py +13 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/epd.py +2 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/lcia.py +63 -31
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/org.py +2 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/enums.py +1 -1
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/validation/quantity.py +1 -1
- {openepd-6.4.0 → openepd-6.4.2}/LICENSE +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/README.md +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/average_dataset/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/average_dataset/generic_estimate_sync_api.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/average_dataset/industry_epd_sync_api.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/base_sync_client.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/category/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/category/dto.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/category/sync_api.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/common.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/base.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/common.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/meta.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/mf.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/dto/params.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/epd/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/epd/dto.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/epd/sync_api.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/errors.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/pcr/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/pcr/sync_api.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/sync_client.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/test/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/utils.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/bundle/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/bundle/base.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/bundle/model.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/bundle/reader.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/bundle/writer.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/compat/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/compat/compat_functional_validators.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/compat/pydantic.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/base.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/category.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/declaration.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/factory.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/generic_estimate.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/geography.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/industry_epd.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/pcr.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/README.md +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/asphalt.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/base.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/concrete.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/accessories.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/aggregates.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/aluminium.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/asphalt.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/bulk_materials.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/cast_decks_and_underlayment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/cladding.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/cmu.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/concrete.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/conveying_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/electrical.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/electricity.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/finishes.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/fire_and_smoke_protection.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/furnishings.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/grouting.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/manufacturing_inputs.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/masonry.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/material_handling.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/mechanical.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/mechanical_insulation.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/network_infrastructure.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/openings.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/other_electrical_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/other_materials.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/plumbing.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/precast_concrete.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/sheathing.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/steel.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/thermal_moisture_protection.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/utility_piping.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/wood.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/wood_joists.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/accessories.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/aggregates.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/aluminium.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/asphalt.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/bulk_materials.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/cast_decks_and_underlayment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/cladding.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/cmu.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/common.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/concrete.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/conveying_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/electrical.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/electricity.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/finishes.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/fire_and_smoke_protection.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/furnishings.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/grouting.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/manufacturing_inputs.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/masonry.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/material_handling.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/mechanical.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/mechanical_insulation.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/mixins/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/mixins/conduit_mixin.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/network_infrastructure.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/openings.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/other_electrical_equipment.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/other_materials.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/plumbing.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/precast_concrete.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/sheathing.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/steel.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/thermal_moisture_protection.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/utility_piping.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/wood.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/wood_joists.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/standard.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/validation/__init__.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/validation/common.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/validation/enum.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/validation/numbers.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/versioning.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/patch_pydantic.py +0 -0
- {openepd-6.4.0 → openepd-6.4.2}/src/openepd/py.typed +0 -0
@@ -24,7 +24,7 @@ from openepd.model.validation.numbers import RatioFloat
|
|
24
24
|
class Amount(BaseOpenEpdSchema):
|
25
25
|
"""A value-and-unit pairing for amounts that do not have an uncertainty."""
|
26
26
|
|
27
|
-
qty: float | None = pyd.Field(description="How much of this in the amount.", default=None)
|
27
|
+
qty: float | None = pyd.Field(description="How much of this in the amount.", ge=0, default=None)
|
28
28
|
unit: str | None = pyd.Field(description="Which unit. SI units are preferred.", example="kg", default=None)
|
29
29
|
|
30
30
|
@pyd.root_validator
|
@@ -117,6 +117,18 @@ class Ingredient(BaseOpenEpdSchema):
|
|
117
117
|
)
|
118
118
|
citation: str | None = pyd.Field(default=None, description="Text citation describing the data source ")
|
119
119
|
|
120
|
+
@pyd.root_validator(skip_on_failure=True)
|
121
|
+
def _validate_evidence(cls, values: dict[str, Any]) -> dict[str, Any]:
|
122
|
+
# gwp_fraction should be backed by some type of evidence (fraction coming from product EPD etc) to be accounted
|
123
|
+
# for in the calculation of uncertainty
|
124
|
+
if values.get("gwp_fraction"):
|
125
|
+
if not values.get("evidence_type"):
|
126
|
+
raise ValueError("evidence_type is required if gwp_fraction is provided")
|
127
|
+
if not (values.get("citation") or values.get("link")):
|
128
|
+
raise ValueError("link or citation is required if gwp_fraction is provided")
|
129
|
+
|
130
|
+
return values
|
131
|
+
|
120
132
|
|
121
133
|
class LatLng(BaseOpenEpdSchema):
|
122
134
|
"""A latitude and longitude."""
|
@@ -38,6 +38,7 @@ MANUFACTURER_DESCRIPTION = (
|
|
38
38
|
'JSON object for declaring Org. Sometimes called the "Declaration Holder" or "Declaration Owner".'
|
39
39
|
)
|
40
40
|
|
41
|
+
PLANT_DESCRIPTION = "List of object(s) for one or more plant(s) that this declaration applies to."
|
41
42
|
|
42
43
|
#
|
43
44
|
# Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
|
@@ -161,7 +162,7 @@ class EpdPreviewV0(
|
|
161
162
|
manufacturer: Org | None = pyd.Field(description=MANUFACTURER_DESCRIPTION)
|
162
163
|
plants: list[Plant] = pyd.Field(
|
163
164
|
max_items=32,
|
164
|
-
description=
|
165
|
+
description=PLANT_DESCRIPTION,
|
165
166
|
default_factory=list,
|
166
167
|
)
|
167
168
|
|
@@ -206,9 +206,17 @@ class ScopeSet(BaseOpenEpdSchema):
|
|
206
206
|
if isinstance(v, Measurement):
|
207
207
|
all_units.add(v.unit)
|
208
208
|
|
209
|
-
|
210
|
-
|
211
|
-
|
209
|
+
if not cls.allowed_units:
|
210
|
+
# For unknown units - only units should be the same across all measurements (textually)
|
211
|
+
if len(all_units) > 1:
|
212
|
+
raise ValueError("All scopes and measurements should be expressed in the same unit.")
|
213
|
+
else:
|
214
|
+
# might be multiple variations of the same unit (kgCFC-11e, kgCFC11e)
|
215
|
+
if len(all_units) > 1 and ExternalValidationConfig.QUANTITY_VALIDATOR:
|
216
|
+
all_units_list = list(all_units)
|
217
|
+
first = all_units_list[0]
|
218
|
+
for unit in all_units_list[1:]:
|
219
|
+
ExternalValidationConfig.QUANTITY_VALIDATOR.validate_same_dimensionality(first, unit)
|
212
220
|
|
213
221
|
# can correctly validate unit
|
214
222
|
if cls.allowed_units is not None and len(all_units) == 1 and ExternalValidationConfig.QUANTITY_VALIDATOR:
|
@@ -357,6 +365,30 @@ class ScopeSetDiseaseIncidence(ScopeSet):
|
|
357
365
|
allowed_units = "AnnualPerCapita"
|
358
366
|
|
359
367
|
|
368
|
+
class ScopeSetMass(ScopeSet):
|
369
|
+
"""ScopeSet measuring mass in kg."""
|
370
|
+
|
371
|
+
allowed_units = "kg"
|
372
|
+
|
373
|
+
|
374
|
+
class ScopeSetVolume(ScopeSet):
|
375
|
+
"""ScopeSet measuring mass in kg."""
|
376
|
+
|
377
|
+
allowed_units = "m3"
|
378
|
+
|
379
|
+
|
380
|
+
class ScopeSetMassOrVolume(ScopeSet):
|
381
|
+
"""ScopeSet measuring mass in kg OR volume in m3, example: radioactive waste."""
|
382
|
+
|
383
|
+
allowed_units = ("kg", "m3")
|
384
|
+
|
385
|
+
|
386
|
+
class ScopeSetEnergy(ScopeSet):
|
387
|
+
"""ScopeSet measuring mass in kg."""
|
388
|
+
|
389
|
+
allowed_units = "MJ"
|
390
|
+
|
391
|
+
|
360
392
|
class ImpactSet(ScopesetByNameBase):
|
361
393
|
"""A set of impacts, such as GWP, ODP, AP, EP, POCP, EP-marine, EP-terrestrial, EP-freshwater, etc."""
|
362
394
|
|
@@ -554,71 +586,71 @@ class Impacts(pyd.BaseModel):
|
|
554
586
|
class ResourceUseSet(ScopesetByNameBase):
|
555
587
|
"""A set of resource use indicators, such as RPRec, RPRm, etc."""
|
556
588
|
|
557
|
-
RPRec:
|
589
|
+
RPRec: ScopeSetEnergy | None = pyd.Field(
|
558
590
|
description="Renewable primary resources used as energy carrier (fuel). "
|
559
591
|
"First use bio-based materials used as an energy source. Hydropower, solar and wind power used "
|
560
592
|
"in the technosphere are also included in this indicator",
|
561
593
|
default=None,
|
562
594
|
)
|
563
|
-
RPRm:
|
595
|
+
RPRm: ScopeSetEnergy | None = pyd.Field(
|
564
596
|
description="Renewable primary resources with energy content used as material. "
|
565
597
|
"First use biobased materials used as materials (e.g. wood, hemp, etc.).",
|
566
598
|
default=None,
|
567
599
|
)
|
568
|
-
rpre:
|
600
|
+
rpre: ScopeSetEnergy | None = pyd.Field(
|
569
601
|
description="Renewable primary energy resources as energy",
|
570
602
|
default=None,
|
571
603
|
)
|
572
|
-
nrpre:
|
604
|
+
nrpre: ScopeSetEnergy | None = pyd.Field(
|
573
605
|
description="Non-renewable primary resources as energy (fuel)",
|
574
606
|
default=None,
|
575
607
|
)
|
576
|
-
nrprm:
|
608
|
+
nrprm: ScopeSetEnergy | None = pyd.Field(
|
577
609
|
description="Non-renewable primary resources as material",
|
578
610
|
default=None,
|
579
611
|
)
|
580
|
-
fw:
|
612
|
+
fw: ScopeSetVolume | None = pyd.Field(
|
581
613
|
description="Use of net fresh water",
|
582
614
|
default=None,
|
583
615
|
)
|
584
|
-
sm:
|
616
|
+
sm: ScopeSetMass | None = pyd.Field(
|
585
617
|
description="Use of secondary materials",
|
586
618
|
default=None,
|
587
619
|
)
|
588
|
-
rsf:
|
620
|
+
rsf: ScopeSetEnergy | None = pyd.Field(
|
589
621
|
description="Use of renewable secondary materials",
|
590
622
|
default=None,
|
591
623
|
)
|
592
|
-
nrsf:
|
624
|
+
nrsf: ScopeSetEnergy | None = pyd.Field(
|
593
625
|
description="Use of non-renewable secondary fuels",
|
594
626
|
default=None,
|
595
627
|
)
|
596
|
-
re:
|
628
|
+
re: ScopeSetEnergy | None = pyd.Field(
|
597
629
|
description="Renewable energy resources",
|
598
630
|
default=None,
|
599
631
|
)
|
600
|
-
pere:
|
632
|
+
pere: ScopeSetEnergy | None = pyd.Field(
|
601
633
|
description="Use of renewable primary energy excluding renewable primary energy resources used as raw materials",
|
602
634
|
default=None,
|
603
635
|
)
|
604
|
-
perm:
|
636
|
+
perm: ScopeSetEnergy | None = pyd.Field(
|
605
637
|
description="Use of renewable primary energy resources used as raw materials",
|
606
638
|
default=None,
|
607
639
|
)
|
608
|
-
pert:
|
640
|
+
pert: ScopeSetEnergy | None = pyd.Field(
|
609
641
|
description="Total use of renewable primary energy resources",
|
610
642
|
default=None,
|
611
643
|
)
|
612
|
-
penre:
|
644
|
+
penre: ScopeSetEnergy | None = pyd.Field(
|
613
645
|
description="Use of non-renewable primary energy excluding "
|
614
646
|
"non-renewable primary energy resources used as raw materials",
|
615
647
|
default=None,
|
616
648
|
)
|
617
|
-
penrm:
|
649
|
+
penrm: ScopeSetEnergy | None = pyd.Field(
|
618
650
|
description="Use of non-renewable primary energy resources used as raw materials",
|
619
651
|
default=None,
|
620
652
|
)
|
621
|
-
penrt:
|
653
|
+
penrt: ScopeSetEnergy | None = pyd.Field(
|
622
654
|
description="Total use of non-renewable primary energy resources",
|
623
655
|
default=None,
|
624
656
|
)
|
@@ -627,51 +659,51 @@ class ResourceUseSet(ScopesetByNameBase):
|
|
627
659
|
class OutputFlowSet(ScopesetByNameBase):
|
628
660
|
"""A set of output flows, such as waste, emissions, etc."""
|
629
661
|
|
630
|
-
twd:
|
662
|
+
twd: ScopeSetMass | None = pyd.Field(
|
631
663
|
description="Total waste disposed",
|
632
664
|
default=None,
|
633
665
|
)
|
634
|
-
hwd:
|
666
|
+
hwd: ScopeSetMass | None = pyd.Field(
|
635
667
|
description="Hazardous waste disposed",
|
636
668
|
default=None,
|
637
669
|
)
|
638
|
-
nhwd:
|
670
|
+
nhwd: ScopeSetMass | None = pyd.Field(
|
639
671
|
description="Non-hazardous waste disposed",
|
640
672
|
default=None,
|
641
673
|
)
|
642
|
-
rwd:
|
674
|
+
rwd: ScopeSetMass | None = pyd.Field(
|
643
675
|
description="Radioactive waste disposed",
|
644
676
|
default=None,
|
645
677
|
)
|
646
|
-
hlrw:
|
678
|
+
hlrw: ScopeSetMassOrVolume | None = pyd.Field(
|
647
679
|
description="High level radioactive waste disposed",
|
648
680
|
default=None,
|
649
681
|
)
|
650
|
-
illrw:
|
682
|
+
illrw: ScopeSetMassOrVolume | None = pyd.Field(
|
651
683
|
description="Intermediate level radioactive waste disposed",
|
652
684
|
default=None,
|
653
685
|
)
|
654
|
-
cru:
|
686
|
+
cru: ScopeSetMass | None = pyd.Field(
|
655
687
|
description="Components for re-use",
|
656
688
|
default=None,
|
657
689
|
)
|
658
|
-
mr:
|
690
|
+
mr: ScopeSetMass | None = pyd.Field(
|
659
691
|
description="Recycled materials",
|
660
692
|
default=None,
|
661
693
|
)
|
662
|
-
mfr:
|
694
|
+
mfr: ScopeSetMass | None = pyd.Field(
|
663
695
|
description="Materials for recycling",
|
664
696
|
default=None,
|
665
697
|
)
|
666
|
-
mer:
|
698
|
+
mer: ScopeSetMass | None = pyd.Field(
|
667
699
|
description="Materials for energy recovery",
|
668
700
|
default=None,
|
669
701
|
)
|
670
|
-
ee:
|
702
|
+
ee: ScopeSetEnergy | None = pyd.Field(
|
671
703
|
description="Exported energy",
|
672
704
|
default=None,
|
673
705
|
)
|
674
|
-
eh:
|
706
|
+
eh: ScopeSetEnergy | None = pyd.Field(
|
675
707
|
description="Exported heat",
|
676
708
|
default=None,
|
677
709
|
)
|
@@ -66,7 +66,6 @@ class Org(WithAttachmentsMixin, WithAltIdsMixin, OrgRef):
|
|
66
66
|
class Plant(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
|
67
67
|
"""Represent a manufacturing plant."""
|
68
68
|
|
69
|
-
# TODO: Add proper validator
|
70
69
|
id: str | None = pyd.Field(
|
71
70
|
description="Plus code (aka Open Location Code) of plant's location and "
|
72
71
|
"owner's web domain joined with `.`(dot).",
|
@@ -110,6 +109,8 @@ class Plant(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
|
|
110
109
|
|
111
110
|
@pyd.validator("id")
|
112
111
|
def _validate_id(cls, v: str) -> str:
|
112
|
+
if not v:
|
113
|
+
return v
|
113
114
|
try:
|
114
115
|
pluscode, web_domain = v.split(".", maxsplit=1)
|
115
116
|
except ValueError as e:
|
@@ -33,7 +33,7 @@ class QuantityValidator(ABC):
|
|
33
33
|
"""
|
34
34
|
|
35
35
|
@abstractmethod
|
36
|
-
def validate_same_dimensionality(self, unit: str | None, dimensionality_unit: str) -> None:
|
36
|
+
def validate_same_dimensionality(self, unit: str | None, dimensionality_unit: str | None) -> None:
|
37
37
|
"""
|
38
38
|
Validate that a given unit ('kg') has the same dimesnionality as provided dimensionality_unit ('g').
|
39
39
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/api/average_dataset/generic_estimate_sync_api.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/cast_decks_and_underlayment.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/range/thermal_moisture_protection.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/cast_decks_and_underlayment.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/fire_and_smoke_protection.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/other_electrical_equipment.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{openepd-6.4.0 → openepd-6.4.2}/src/openepd/model/specs/singular/thermal_moisture_protection.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|