Skip to content

Commit

Permalink
UPDATE carbon_footprint.py - implement product_or_sector_specific_rul…
Browse files Browse the repository at this point in the history
…es attribute
  • Loading branch information
JohnVonNeumann committed Jul 15, 2024
1 parent 7b11c39 commit dbcc369
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
12 changes: 11 additions & 1 deletion pathfinder_framework/carbon_footprint/carbon_footprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
DataQualityIndicators,
)
from pathfinder_framework.carbon_footprint.biogenic_accounting_methodology import BiogenicAccountingMethodology
from pathfinder_framework.carbon_footprint.product_or_sector_specific_rule import ProductOrSectorSpecificRule


class CarbonFootprint:
Expand Down Expand Up @@ -49,6 +50,7 @@ class CarbonFootprint:
uncertainty_assessment_description (str | None): If present, the results, key drivers, and a short qualitative description of the uncertainty assessment.
assurance (Assurance | None): If present, the Assurance information in accordance with the Pathfinder Framework.
biogenic_accounting_methodology (BiogenicAccountingMethodology | None): The methodology used for biogenic carbon accounting.
product_or_sector_specific_rules (list[ProductOrSectorSpecificRule] | None): If present, refers to a set of product or sector specific rules published by a specific operator and applied during product carbon footprint calculation.
"""

def __init__(
Expand Down Expand Up @@ -81,6 +83,7 @@ def __init__(
uncertainty_assessment_description=None,
assurance=None,
biogenic_accounting_methodology=None,
product_or_sector_specific_rules=None
):
if not isinstance(declared_unit, DeclaredUnit):
raise ValueError(
Expand Down Expand Up @@ -191,7 +194,13 @@ def __init__(
biogenic_accounting_methodology, BiogenicAccountingMethodology
):
raise ValueError("biogenic_accounting_methodology must be an instance of BiogenicAccountingMethodology")

if product_or_sector_specific_rules is not None and not all(
isinstance(rule, ProductOrSectorSpecificRule)
for rule in product_or_sector_specific_rules
):
raise ValueError(
"product_or_sector_specific_rules must be a list of ProductOrSectorSpecificRule"
)
self.declared_unit = declared_unit
self.unitary_product_amount = unitary_product_amount
self.p_cf_excluding_biogenic = p_cf_excluding_biogenic
Expand Down Expand Up @@ -222,6 +231,7 @@ def __init__(
self.uncertainty_assessment_description = uncertainty_assessment_description
self.assurance = assurance
self.biogenic_accounting_methodology = biogenic_accounting_methodology
self.product_or_sector_specific_rules = product_or_sector_specific_rules

required_attributes_before_2025 = ["primary_data_share", "dqi"]
required_attributes_after_2025 = [
Expand Down
45 changes: 44 additions & 1 deletion tests/carbon_footprint/test_carbon_footprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
DataQualityIndicators,
)
from pathfinder_framework.carbon_footprint.biogenic_accounting_methodology import BiogenicAccountingMethodology
from pathfinder_framework.carbon_footprint.product_or_sector_specific_rule import ProductOrSectorSpecificRule
from pathfinder_framework.carbon_footprint.product_or_sector_specific_rule_operator import ProductOrSectorSpecificRuleOperator


@pytest.fixture
Expand Down Expand Up @@ -73,6 +75,11 @@ def valid_carbon_footprint_data():
comments="Example comments",
),
"biogenic_accounting_methodology": BiogenicAccountingMethodology.GHGP,
"product_or_sector_specific_rules": [ProductOrSectorSpecificRule(
operator=ProductOrSectorSpecificRuleOperator.OTHER,
rule_names=["Rule1"],
other_operator_name="Custom Operator",
)]
}


Expand Down Expand Up @@ -184,7 +191,10 @@ def test_carbon_footprint_attributes(valid_carbon_footprint_data):
carbon_footprint.biogenic_accounting_methodology
== valid_carbon_footprint_data["biogenic_accounting_methodology"]
)

assert (
carbon_footprint.product_or_sector_specific_rules
== valid_carbon_footprint_data["product_or_sector_specific_rules"]
)

def test_carbon_footprint_invalid_declared_unit(valid_carbon_footprint_data):
invalid_data = {**valid_carbon_footprint_data, "declared_unit": "invalid unit"}
Expand Down Expand Up @@ -742,3 +752,36 @@ def test_carbon_footprint_invalid_assurance(
with pytest.raises(ValueError) as excinfo:
CarbonFootprint(**invalid_data)
assert str(excinfo.value) == expected_error


@pytest.mark.parametrize(
"product_or_sector_specific_rules",
[
None,
[ProductOrSectorSpecificRule(
operator=ProductOrSectorSpecificRuleOperator.OTHER,
rule_names=["Rule1"],
other_operator_name="Custom Operator",
)],
],
)
def test_carbon_footprint_valid_product_or_sector_specific_rules(valid_carbon_footprint_data, product_or_sector_specific_rules):
valid_data = valid_carbon_footprint_data.copy()
valid_data["product_or_sector_specific_rules"] = product_or_sector_specific_rules
CarbonFootprint(**valid_data)


@pytest.mark.parametrize(
"product_or_sector_specific_rules, expected_error",
[
([1], "product_or_sector_specific_rules must be a list of ProductOrSectorSpecificRule"),
],
)
def test_carbon_footprint_invalid_product_or_sector_specific_rules(
valid_carbon_footprint_data, product_or_sector_specific_rules, expected_error
):
invalid_data = valid_carbon_footprint_data.copy()
invalid_data["product_or_sector_specific_rules"] = product_or_sector_specific_rules
with pytest.raises(ValueError) as excinfo:
CarbonFootprint(**invalid_data)
assert str(excinfo.value) == expected_error

0 comments on commit dbcc369

Please sign in to comment.