From a34151767f454daa6c8a67f7f199b30c1220a7c9 Mon Sep 17 00:00:00 2001 From: nawaaaaaAaar <198336470+nawaaaaaAaar@users.noreply.github.com> Date: Mon, 5 Oct 2026 16:13:35 +0000 Subject: [PATCH] Preserve explicitly provided zero carbon intensity factors --- codecarbon/core/emissions.py | 4 ++-- tests/test_zero_carbon_intensity.py | 34 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 tests/test_zero_carbon_intensity.py diff --git a/codecarbon/core/emissions.py b/codecarbon/core/emissions.py index 3b2f10fad..12fe42a62 100644 --- a/codecarbon/core/emissions.py +++ b/codecarbon/core/emissions.py @@ -335,7 +335,7 @@ def _global_energy_mix_to_emissions_rate(energy_mix: Dict) -> EmissionsPerKWh: in Kgs.CO2 / kWh """ # If we have the chance to have the carbon intensity for this country - if energy_mix.get("carbon_intensity"): + if energy_mix.get("carbon_intensity") is not None: return EmissionsPerKWh.from_g_per_kWh(energy_mix.get("carbon_intensity")) # Else we compute it from the energy mix. @@ -353,7 +353,7 @@ def _global_energy_mix_to_emissions_rate(energy_mix: Dict) -> EmissionsPerKWh: carbon_intensity_for_type = carbon_intensity_per_source.get( energy_type[: -len("_TWh")] ) - if carbon_intensity_for_type: # to ignore "total_TWh" + if carbon_intensity_for_type is not None: # to ignore "total_TWh" carbon_intensity += ( energy_per_year / energy_sum ) * carbon_intensity_for_type diff --git a/tests/test_zero_carbon_intensity.py b/tests/test_zero_carbon_intensity.py new file mode 100644 index 000000000..be8e95f15 --- /dev/null +++ b/tests/test_zero_carbon_intensity.py @@ -0,0 +1,34 @@ +from unittest.mock import patch + +import pytest + +from codecarbon.core.emissions import Emissions + + +@pytest.mark.parametrize("intensity", [0, 0.0, 42.0]) +def test_explicit_carbon_intensity_is_used(intensity): + with patch( + "codecarbon.input.DataSource.get_carbon_intensity_per_source_data", + side_effect=AssertionError("Source factors should not be needed"), + ): + rate = Emissions._global_energy_mix_to_emissions_rate( + {"carbon_intensity": intensity} + ) + assert rate.kgs_per_kWh == intensity / 1000 + + +@pytest.mark.parametrize( + "mix,expected", + [ + ({"total_TWh": 1, "wind_TWh": 1}, 0.0), + ({"total_TWh": 2, "wind_TWh": 1, "coal_TWh": 1}, 0.4), + ({"total_TWh": 1, "coal_TWh": 1}, 0.8), + ], +) +def test_zero_source_factor_counts_toward_energy_coverage(mix, expected): + with patch( + "codecarbon.input.DataSource.get_carbon_intensity_per_source_data", + return_value={"wind": 0, "coal": 800, "world_average": 475}, + ): + rate = Emissions._global_energy_mix_to_emissions_rate(mix) + assert rate.kgs_per_kWh == expected