From deba42be2f7ccb2dddae48adcd818f50a940739a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:42:02 +0000 Subject: [PATCH 1/2] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.15.4 → v0.15.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.4...v0.15.9) - [github.com/snakemake/snakefmt: v0.11.4 → v1.0.0](https://github.com/snakemake/snakefmt/compare/v0.11.4...v1.0.0) - [github.com/codespell-project/codespell: v2.4.1 → v2.4.2](https://github.com/codespell-project/codespell/compare/v2.4.1...v2.4.2) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 605d7a8..643201d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: # Python file formatting - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.4 + rev: v0.15.9 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] @@ -32,13 +32,13 @@ repos: # Snakemake file formatting - repo: https://github.com/snakemake/snakefmt - rev: v0.11.4 + rev: v1.0.0 hooks: - id: snakefmt # Spelling - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 + rev: v2.4.2 hooks: - id: codespell files: .*\.(py|smk|md)$|^Snakefile$ From a411b652e9f985a2b8974b63b406b4c054a5fe40 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:47:47 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/integration/Snakefile | 4 +- workflow/Snakefile | 4 +- workflow/rules/aggregate.smk | 12 ++--- workflow/rules/automatic.smk | 32 +++++------ workflow/rules/impute.smk | 42 +++++++-------- workflow/rules/prepare.smk | 102 +++++++++++++++++------------------ workflow/rules/solar.smk | 30 +++++------ 7 files changed, 113 insertions(+), 113 deletions(-) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index 84137b7..27255f3 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -31,11 +31,11 @@ CATEGORIES = [ # Request something from the module rule all: - message: - "A generic test case for your module." default_target: True input: expand( "results/integration_test/results/MNE/aggregated/adjusted/{category}.parquet", category=CATEGORIES, ), + message: + "A generic test case for your module." diff --git a/workflow/Snakefile b/workflow/Snakefile index 2ea73b0..9f734d2 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -37,8 +37,6 @@ workflow.source_path("scripts/_utils.py") rule all: - message: - "ERROR: Invalid `rule all:` call" default_target: True output: "INVALID", @@ -46,5 +44,7 @@ rule all: stderr="logs/all.stderr", conda: "envs/shell.yaml" + message: + "ERROR: Invalid `rule all:` call" shell: 'echo "This workflow must be called as a snakemake module." > {log.stderr}' diff --git a/workflow/rules/aggregate.smk b/workflow/rules/aggregate.smk index 10e8a17..513c529 100644 --- a/workflow/rules/aggregate.smk +++ b/workflow/rules/aggregate.smk @@ -4,10 +4,6 @@ ADJUSTMENTS = ("adjusted", "unadjusted") rule aggregate_capacity: - message: - "Aggregating capacity for {wildcards.shapes}-{wildcards.adjustment}-{wildcards.category}." - params: - year=config["imputation"]["adjustment_year"], input: powerplants="results/{shapes}/disaggregated/{adjustment}/{category}.parquet", shapes="resources/user/{shapes}/shapes.parquet", @@ -19,12 +15,16 @@ rule aggregate_capacity: category="Powerplants module", subcategory="{category}", ), + log: + "logs/aggregate_capacity_{shapes}_{adjustment}_{category}.log", wildcard_constraints: adjustment="|".join(ADJUSTMENTS), category="|".join(IMPUTED_CAT), - log: - "logs/aggregate_capacity_{shapes}_{adjustment}_{category}.log", conda: "../envs/shapes.yaml" + params: + year=config["imputation"]["adjustment_year"], + message: + "Aggregating capacity for {wildcards.shapes}-{wildcards.adjustment}-{wildcards.category}." script: "../scripts/aggregate_capacity.py" diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk index 07f24e4..48bebf2 100644 --- a/workflow/rules/automatic.smk +++ b/workflow/rules/automatic.smk @@ -2,16 +2,16 @@ rule download_eia: - message: - "Download the EIA International energy statistics in bulk." - params: - url=internal["resources"]["automatic"]["EIA"], output: path="resources/automatic/downloads/EIA-INTL.txt", log: "logs/download_eia.log", conda: "../envs/shell.yaml" + params: + url=internal["resources"]["automatic"]["EIA"], + message: + "Download the EIA International energy statistics in bulk." shell: """ curl -sSLo {output.path:q} {params.url:q} @@ -19,16 +19,16 @@ rule download_eia: rule download_tz_sam: - message: - "Download the Transition Zero - Solar Asset Mapper dataset." - params: - url=internal["resources"]["automatic"]["TZ-SAM"], output: path="resources/automatic/downloads/TZ-SAM.gpkg", log: "logs/download_tz_sam.log", conda: "../envs/shell.yaml" + params: + url=internal["resources"]["automatic"]["TZ-SAM"], + message: + "Download the Transition Zero - Solar Asset Mapper dataset." shell: """ curl -sSLo {output.path:q} {params.url:q} @@ -36,16 +36,16 @@ rule download_tz_sam: rule download_glohydrores: - message: - "Download the GloHydroRes dataset." - params: - url=internal["resources"]["automatic"]["GloHydroRes"], output: path="resources/automatic/downloads/GloHydroRes.csv", log: "logs/download_glohydrores.log", conda: "../envs/shell.yaml" + params: + url=internal["resources"]["automatic"]["GloHydroRes"], + message: + "Download the GloHydroRes dataset." shell: """ curl -sSLo {output.path:q} {params.url:q} @@ -53,16 +53,16 @@ rule download_glohydrores: rule download_gem: - message: - "Download the GEM {wildcards.dataset} dataset." - params: - url=lambda wc: internal["resources"]["automatic"]["GEM"][wc.dataset], output: path="resources/automatic/downloads/GEM_{dataset}.xlsx", log: "logs/download_gem_{dataset}.log", conda: "../envs/shell.yaml" + params: + url=lambda wc: internal["resources"]["automatic"]["GEM"][wc.dataset], + message: + "Download the GEM {wildcards.dataset} dataset." shell: """ curl -sSLo {output.path:q} {params.url:q} diff --git a/workflow/rules/impute.smk b/workflow/rules/impute.smk index b74c4a6..6dae563 100644 --- a/workflow/rules/impute.smk +++ b/workflow/rules/impute.smk @@ -14,34 +14,29 @@ IMPUTED_CAT_WITHOUT_ADJUSTMENT = {"large_solar"} rule impute_years: - message: - "National-level imputation of missing years for all powerplants in {wildcards.shapes}-{wildcards.dataset} dataset." - params: - imputation=config["imputation"], - projected_crs=config["projected_crs"], - tech_map=lambda wc: get_technology_mapping(wc.dataset), input: prepared="resources/automatic/prepared/{dataset}.parquet", shapes="resources/user/{shapes}/shapes.parquet", output: imputed="resources/automatic/{shapes}/imputed/{dataset}.parquet", plot="resources/automatic/{shapes}/imputed/{dataset}.pdf", - wildcard_constraints: - dataset="|".join(PREPARED_PLANT_CAT), log: "logs/impute_years_{shapes}_{dataset}.log", + wildcard_constraints: + dataset="|".join(PREPARED_PLANT_CAT), conda: "../envs/shapes.yaml" + params: + imputation=config["imputation"], + projected_crs=config["projected_crs"], + tech_map=lambda wc: get_technology_mapping(wc.dataset), + message: + "National-level imputation of missing years for all powerplants in {wildcards.shapes}-{wildcards.dataset} dataset." script: "../scripts/impute_years.py" rule impute_category_combination: - message: - "National-level imputation of user-configured inclusions and exclusions for {wildcards.shapes}-{wildcards.category}." - params: - tech_map=lambda wc: get_technology_mapping(f"{wc.category}"), - excluded=lambda wc: get_excluded_powerplant_ids(f"{wc.category}"), input: to_combine=lambda wc: get_files_to_combine(wc.shapes, wc.category), output: @@ -58,21 +53,22 @@ rule impute_category_combination: category="Powerplants module", subcategory="{category}", ), - wildcard_constraints: - category="|".join(IMPUTED_CAT), log: "logs/impute_category_combination_{shapes}_{category}.log", + wildcard_constraints: + category="|".join(IMPUTED_CAT), conda: "../envs/shapes.yaml" + params: + tech_map=lambda wc: get_technology_mapping(f"{wc.category}"), + excluded=lambda wc: get_excluded_powerplant_ids(f"{wc.category}"), + message: + "National-level imputation of user-configured inclusions and exclusions for {wildcards.shapes}-{wildcards.category}." script: "../scripts/impute_category_combination.py" rule impute_capacity_adjustment: - message: - "National-level adjustment of powerplant capacity in {wildcards.shapes}-{wildcards.category} to {params.year} statistics." - params: - year=config["imputation"]["adjustment_year"], input: unadjusted="results/{shapes}/disaggregated/unadjusted/{category}.parquet", stats="results/{shapes}/statistics/category_capacity.parquet", @@ -84,11 +80,15 @@ rule impute_capacity_adjustment: category="Powerplants module", subcategory="{category}", ), - wildcard_constraints: - category="|".join(IMPUTED_CAT - IMPUTED_CAT_WITHOUT_ADJUSTMENT), log: "logs/impute_capacity_adjustment_{shapes}_{category}.log", + wildcard_constraints: + category="|".join(IMPUTED_CAT - IMPUTED_CAT_WITHOUT_ADJUSTMENT), conda: "../envs/shapes.yaml" + params: + year=config["imputation"]["adjustment_year"], + message: + "National-level adjustment of powerplant capacity in {wildcards.shapes}-{wildcards.category} to {params.year} statistics." script: "../scripts/impute_capacity_adjustment.py" diff --git a/workflow/rules/prepare.smk b/workflow/rules/prepare.smk index 8a848c3..ac08363 100644 --- a/workflow/rules/prepare.smk +++ b/workflow/rules/prepare.smk @@ -15,10 +15,6 @@ PREPARED_PLANT_CAT = ( rule prepare_hydropower: - message: - "Preparing hydropower powerplants using the GloHydroRes dataset." - params: - technology_mapping=config["category"]["hydropower"]["technology_mapping"], input: glohydrores_path="resources/automatic/downloads/GloHydroRes.csv", output: @@ -27,16 +23,15 @@ rule prepare_hydropower: "logs/prepare_hydropower.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["hydropower"]["technology_mapping"], + message: + "Preparing hydropower powerplants using the GloHydroRes dataset." script: "../scripts/prepare_hydropower.py" rule prepare_solar_utility_pv: - message: - "Preparing utility PV powerplants using the TZ-SAM and GEM-GSPT datasets." - params: - dc_ac_ratio=config["category"]["solar"]["dc_ac_ratio"]["utility_pv"], - tech_name=config["category"]["solar"]["technology_mapping"]["utility_pv"], input: script=workflow.source_path("../scripts/prepare_solar_utility_pv.py"), tz_sam="resources/automatic/downloads/TZ-SAM.gpkg", @@ -47,6 +42,11 @@ rule prepare_solar_utility_pv: "logs/prepare_solar_utility_pv.log", conda: "../envs/shapes.yaml" + params: + dc_ac_ratio=config["category"]["solar"]["dc_ac_ratio"]["utility_pv"], + tech_name=config["category"]["solar"]["technology_mapping"]["utility_pv"], + message: + "Preparing utility PV powerplants using the TZ-SAM and GEM-GSPT datasets." shell: """ python {input.script:q} {input.tz_sam:q} {input.gem_gspt:q} \ @@ -55,11 +55,6 @@ rule prepare_solar_utility_pv: rule prepare_solar_csp: - message: - "Preparing concentrating solar powerplants using the Global Solar Power Tracker (GEM-GSPT) dataset." - params: - dc_ac_ratio=1, # CSP is already an AC technology - tech_name=config["category"]["solar"]["technology_mapping"]["csp"], input: script=workflow.source_path("../scripts/prepare_solar_csp.py"), gem_gspt="resources/automatic/downloads/GEM_GSPT.xlsx", @@ -69,6 +64,11 @@ rule prepare_solar_csp: "logs/prepare_solar_csp.log", conda: "../envs/shapes.yaml" + params: + dc_ac_ratio=1, # CSP is already an AC technology + tech_name=config["category"]["solar"]["technology_mapping"]["csp"], + message: + "Preparing concentrating solar powerplants using the Global Solar Power Tracker (GEM-GSPT) dataset." shell: """ python {input.script:q} {input.gem_gspt:q} -o {output.path:q} \ @@ -79,10 +79,6 @@ rule prepare_solar_csp: if config["category"]["wind"]["source"] == "gem": rule prepare_wind_gem: - message: - "Preparing wind powerplants using the Global Wind Power Tracker (GEM-GWPT) dataset." - params: - tech_map=config["category"]["wind"]["technology_mapping"], input: script=workflow.source_path("../scripts/prepare_wind_gwpt.py"), gem_gwpt="resources/automatic/downloads/GEM_GWPT.xlsx", @@ -92,6 +88,10 @@ if config["category"]["wind"]["source"] == "gem": "logs/prepare_wind_gem.log", conda: "../envs/shapes.yaml" + params: + tech_map=config["category"]["wind"]["technology_mapping"], + message: + "Preparing wind powerplants using the Global Wind Power Tracker (GEM-GWPT) dataset." shell: """ python {input.script:q} {input.gem_gwpt:q} \ @@ -101,10 +101,6 @@ if config["category"]["wind"]["source"] == "gem": elif config["category"]["wind"]["source"] == "wemi": rule prepare_wind_wemi: - message: - "Preparing wind powerplants using the Wind Energy Market Intelligence dataset." - params: - tech_map=config["category"]["wind"]["technology_mapping"], input: script=workflow.source_path("../scripts/prepare_wind_wemi.py"), wemi="resources/user/WEMI.xls", @@ -114,6 +110,10 @@ elif config["category"]["wind"]["source"] == "wemi": "logs/prepare_wind_wemi.log", conda: "../envs/shapes.yaml" + params: + tech_map=config["category"]["wind"]["technology_mapping"], + message: + "Preparing wind powerplants using the Wind Energy Market Intelligence dataset." shell: """ python {input.script:q} {input.wemi:q} \ @@ -127,11 +127,6 @@ else: rule prepare_fossil_coal: - message: - "Preparing coal powerplants using the Global Coal Power Tracker (GCPT) dataset." - params: - technology_mapping=config["category"]["fossil"]["technology_mapping"]["coal"], - fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], input: gem_gcpt="resources/automatic/downloads/GEM_GCPT.xlsx", output: @@ -141,16 +136,16 @@ rule prepare_fossil_coal: "logs/prepare_fossil_coal.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["fossil"]["technology_mapping"]["coal"], + fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], + message: + "Preparing coal powerplants using the Global Coal Power Tracker (GCPT) dataset." script: "../scripts/prepare_fossil_coal.py" rule prepare_bioenergy: - message: - "Preparing bioenergy powerplants using the Global Bioenergy Power Tracker (GBPT) dataset." - params: - technology_mapping=config["category"]["bioenergy"]["technology_mapping"], - fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], input: gem_gbpt="resources/automatic/downloads/GEM_GBPT.xlsx", output: @@ -160,16 +155,16 @@ rule prepare_bioenergy: "logs/prepare_bioenergy.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["bioenergy"]["technology_mapping"], + fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], + message: + "Preparing bioenergy powerplants using the Global Bioenergy Power Tracker (GBPT) dataset." script: "../scripts/prepare_bioenergy.py" rule prepare_fossil_oil_gas: - message: - "Preparing oil and gas powerplants using the Global Oil and Gas Power Tracker (GOGPT) dataset." - params: - technology_mapping=config["category"]["fossil"]["technology_mapping"]["oil_gas"], - fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], input: gem_gogpt="resources/automatic/downloads/GEM_GOGPT.xlsx", output: @@ -179,15 +174,16 @@ rule prepare_fossil_oil_gas: "logs/prepare_fossil_oil_gas.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["fossil"]["technology_mapping"]["oil_gas"], + fuel_mapping=internal["fuel_mapping"] | config["fuel_mapping"], + message: + "Preparing oil and gas powerplants using the Global Oil and Gas Power Tracker (GOGPT) dataset." script: "../scripts/prepare_fossil_oil_gas.py" rule prepare_nuclear: - message: - "Preparing nuclear powerplants using the Global Nuclear Power Tracker (GNPT) dataset." - params: - technology_mapping=config["category"]["nuclear"]["technology_mapping"], input: gem_gnpt="resources/automatic/downloads/GEM_GNPT.xlsx", output: @@ -196,15 +192,15 @@ rule prepare_nuclear: "logs/prepare_nuclear.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["nuclear"]["technology_mapping"], + message: + "Preparing nuclear powerplants using the Global Nuclear Power Tracker (GNPT) dataset." script: "../scripts/prepare_nuclear.py" rule prepare_geothermal: - message: - "Preparing geothermal powerplants using the Global Geothermal Power Tracker (GGPT) dataset." - params: - technology_mapping=config["category"]["geothermal"]["technology_mapping"], input: gem_ggpt="resources/automatic/downloads/GEM_GGPT.xlsx", output: @@ -213,13 +209,15 @@ rule prepare_geothermal: "logs/prepare_geothermal.log", conda: "../envs/shapes.yaml" + params: + technology_mapping=config["category"]["geothermal"]["technology_mapping"], + message: + "Preparing geothermal powerplants using the Global Geothermal Power Tracker (GGPT) dataset." script: "../scripts/prepare_geothermal.py" rule prepare_statistics: - message: - "Get EIA annual country capacity statistics." input: shapes="resources/user/{shapes}/shapes.parquet", eia_bulk="resources/automatic/downloads/EIA-INTL.txt", @@ -231,13 +229,13 @@ rule prepare_statistics: "logs/prepare_statistics_{shapes}.log", conda: "../envs/shapes.yaml" + message: + "Get EIA annual country capacity statistics." script: "../scripts/prepare_statistics.py" rule prepare_fuels: - message: - "Get a harmonised dataset of fuel class combinations." input: script=workflow.source_path("../scripts/prepare_fuels.py"), fuel_classes=expand( @@ -249,6 +247,8 @@ rule prepare_fuels: "logs/prepare_fuels.log", conda: "../envs/shapes.yaml" + message: + "Get a harmonised dataset of fuel class combinations." shell: """ python {input.script:q} prepare {input.fuel_classes:q} -o {output:q} 2> {log:q} @@ -256,8 +256,6 @@ rule prepare_fuels: rule prepare_remapped_fuel_categories: - message: - "Remap fuel classes of combustion plants to harmonised ones." input: script=workflow.source_path("../scripts/prepare_fuels.py"), plants="resources/automatic/temp/plants_{category}.parquet", @@ -271,6 +269,8 @@ rule prepare_remapped_fuel_categories: category="|".join(PREPARED_FUEL_CAT), conda: "../envs/shapes.yaml" + message: + "Remap fuel classes of combustion plants to harmonised ones." shell: """ python {input.script:q} remap {input.plants:q} {input.old:q} {input.new:q} \ diff --git a/workflow/rules/solar.smk b/workflow/rules/solar.smk index c817bdd..ecfc2ff 100644 --- a/workflow/rules/solar.smk +++ b/workflow/rules/solar.smk @@ -14,11 +14,6 @@ To fill solar capacity, we follow these steps: rule proxy_rooftop_pv: - message: - "Generating proxy for rooftop capacity {wildcards.shapes}." - params: - category="solar", - year=config["imputation"]["adjustment_year"], input: shapes="resources/user/{shapes}/shapes.parquet", proxy="resources/user/{shapes}/proxies/rooftop_pv.tif", @@ -36,15 +31,16 @@ rule proxy_rooftop_pv: "logs/proxy_rooftop_pv_{shapes}.log", conda: "../envs/shapes.yaml" + params: + category="solar", + year=config["imputation"]["adjustment_year"], + message: + "Generating proxy for rooftop capacity {wildcards.shapes}." script: "../scripts/proxy.py" rule aggregate_solar_capacity: - message: - "Aggregating capacity for {wildcards.shapes}-unadjusted-{wildcards.category}." - params: - technology=config["category"]["solar"]["technology_mapping"]["rooftop_pv"], input: large_solar="results/{shapes}/aggregated/unadjusted/large_solar.parquet", proxy="results/{shapes}/proxies/rooftop_pv.tif", @@ -57,21 +53,21 @@ rule aggregate_solar_capacity: category="Powerplants module", subcategory="{category}", ), - wildcard_constraints: - category="solar", log: "logs/aggregate_capacity_{shapes}_unadjusted_{category}.log", + wildcard_constraints: + category="solar", conda: "../envs/shapes.yaml" + params: + technology=config["category"]["solar"]["technology_mapping"]["rooftop_pv"], + message: + "Aggregating capacity for {wildcards.shapes}-unadjusted-{wildcards.category}." script: "../scripts/aggregate_capacity.py" rule impute_capacity_adjustment_solar: - message: - "Adjusting aggregated capacity of {wildcards.shapes}-solar to {params.year} statistics." - params: - year=config["imputation"]["adjustment_year"], input: unadjusted="results/{shapes}/aggregated/unadjusted/solar.parquet", shapes="resources/user/{shapes}/shapes.parquet", @@ -94,5 +90,9 @@ rule impute_capacity_adjustment_solar: "logs/impute_capacity_adjusted_solar_{shapes}.log", conda: "../envs/shapes.yaml" + params: + year=config["imputation"]["adjustment_year"], + message: + "Adjusting aggregated capacity of {wildcards.shapes}-solar to {params.year} statistics." script: "../scripts/impute_capacity_adjustment_solar.py"