From 14759b843942292b9775239d513b457a04a5c566 Mon Sep 17 00:00:00 2001 From: Dazhong Xia Date: Mon, 2 Dec 2024 18:55:06 -0500 Subject: [PATCH 1/2] Add FERC1 validation tests (#3860) * Load dagster assets for FERC1 validation tests This lets us test things that aren't in `PudlTabl`. * Improve performance by caching the asset loader. * Add minmax tests for all FERC1 assets. * Update release notes * move release notes docs --------- Co-authored-by: Christina Gosnell --- docs/release_notes.rst | 2 + test/conftest.py | 13 +++++ test/validate/ferc1_test.py | 112 ++++++++++++++++++++++-------------- 3 files changed, 84 insertions(+), 43 deletions(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index f1e6585a65..ea5857714b 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -22,6 +22,8 @@ Bug Fixes :ref:`core_ferc1__yearly_other_regulatory_liabilities_sched278`. See issue :issue:`3952` and PRs :pr:`3969,3979`. Thanks to :user:`yolandazzz13` for making this fix. +* Added preliminary data validation checks for several FERC 1 tables that were + missing it :pr:`3860`. Major Dependency Updates ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/conftest.py b/test/conftest.py index ef23a27a3e..55994116db 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -11,6 +11,7 @@ import pytest import sqlalchemy as sa from dagster import ( + AssetValueLoader, build_init_resource_context, graph, materialize_to_memory, @@ -18,6 +19,7 @@ import pudl from pudl import resources +from pudl.etl import defs from pudl.etl.cli import pudl_etl_job_factory from pudl.extract.ferc1 import Ferc1DbfExtractor, raw_ferc1_xbrl__metadata_json from pudl.extract.ferc714 import raw_ferc714_xbrl__metadata_json @@ -105,6 +107,17 @@ def live_databases(request) -> bool: return request.config.getoption("--live-dbs") +@pytest.fixture(scope="session") +def asset_value_loader() -> AssetValueLoader: + """Fixture that initializes an asset value loader. + + Use this as ``asset_value_loader.load_asset_value`` instead + of ``defs.load_asset_value`` to not reinitialize the asset + value loader over and over again. + """ + return defs.get_asset_value_loader() + + @pytest.fixture(scope="session", name="save_unmapped_ids") def save_unmapped_ids(request) -> bool: """Fixture that tells whether to use existing live FERC1/PUDL DBs).""" diff --git a/test/validate/ferc1_test.py b/test/validate/ferc1_test.py index 34e43fd67c..92991ece17 100644 --- a/test/validate/ferc1_test.py +++ b/test/validate/ferc1_test.py @@ -50,9 +50,9 @@ @pytest.mark.parametrize("table_name", unique_record_tables) -def test_record_id_dupes(pudl_engine, table_name): +def test_record_id_dupes(table_name, asset_value_loader): """Verify that the generated ferc1 record_ids are unique.""" - table = pd.read_sql(table_name, pudl_engine) + table = asset_value_loader.load_asset_value(table_name) n_dupes = table.record_id.duplicated().to_numpy().sum() if n_dupes: @@ -63,76 +63,102 @@ def test_record_id_dupes(pudl_engine, table_name): @pytest.mark.parametrize( - "df_name,cols", + "asset_key,cols", [ - ("fbp_ferc1", "all"), - ("fuel_ferc1", "all"), - ("plant_in_service_ferc1", "all"), - ("plants_all_ferc1", "all"), - ("plants_hydro_ferc1", "all"), - ("plants_pumped_storage_ferc1", "all"), - ("plants_small_ferc1", "all"), - ("plants_steam_ferc1", "all"), - ("pu_ferc1", "all"), - ("purchased_power_ferc1", "all"), + ("out_ferc1__yearly_steam_plants_fuel_by_plant_sched402", "all"), + ("out_ferc1__yearly_steam_plants_fuel_sched402", "all"), + ("out_ferc1__yearly_plant_in_service_sched204", "all"), + ("out_ferc1__yearly_all_plants", "all"), + ("out_ferc1__yearly_hydroelectric_plants_sched406", "all"), + ("out_ferc1__yearly_pumped_storage_plants_sched408", "all"), + ("out_ferc1__yearly_small_plants_sched410", "all"), + ("out_ferc1__yearly_steam_plants_sched402", "all"), + ("_out_ferc1__yearly_plants_utilities", "all"), + ("out_ferc1__yearly_purchased_power_and_exchanges_sched326", "all"), ], ) -def test_no_null_cols_ferc1(pudl_out_ferc1, live_dbs, cols, df_name): +def test_no_null_cols_ferc1(live_dbs, asset_value_loader, cols, asset_key): """Verify that output DataFrames have no entirely NULL columns.""" if not live_dbs: pytest.skip("Data validation only works with a live PUDL DB.") pv.no_null_cols( - pudl_out_ferc1.__getattribute__(df_name)(), cols=cols, df_name=df_name + asset_value_loader.load_asset_value(asset_key), cols=cols, df_name=asset_key ) @pytest.mark.parametrize( - "df_name,expected_rows", + "asset_key,expected_rows", [ - ("fbp_ferc1", 26_947), - ("fuel_ferc1", 51_238), - ("plant_in_service_ferc1", 355_918), - ("plants_all_ferc1", 58_520), - ("plants_hydro_ferc1", 7_202), - ("plants_pumped_storage_ferc1", 580), - ("plants_small_ferc1", 17_763), - ("plants_steam_ferc1", 32_975), - ("pu_ferc1", 7_887), - ("purchased_power_ferc1", 211_794), + ("_out_ferc1__yearly_plants_utilities", 7_887), + ("out_ferc1__yearly_all_plants", 58_520), + ("out_ferc1__yearly_balance_sheet_assets_sched110", 278_789), + ("out_ferc1__yearly_balance_sheet_liabilities_sched110", 233_383), + ("out_ferc1__yearly_cash_flows_sched120", 306_837), + ("out_ferc1__yearly_depreciation_by_function_sched219", 148_352), + ("out_ferc1__yearly_depreciation_changes_sched219", 263_942), + ("out_ferc1__yearly_depreciation_summary_sched336", 216_710), + ("out_ferc1__yearly_energy_dispositions_sched401", 25_954), + ("out_ferc1__yearly_energy_sources_sched401", 38_315), + ("out_ferc1__yearly_hydroelectric_plants_sched406", 7_202), + ("out_ferc1__yearly_income_statements_sched114", 347_394), + ("out_ferc1__yearly_operating_expenses_sched320", 618_518), + ("out_ferc1__yearly_operating_revenues_sched300", 77_646), + ("out_ferc1__yearly_other_regulatory_liabilities_sched278", 53015), + ("out_ferc1__yearly_plant_in_service_sched204", 355_918), + ("out_ferc1__yearly_pumped_storage_plants_sched408", 580), + ("out_ferc1__yearly_purchased_power_and_exchanges_sched326", 211_794), + ("out_ferc1__yearly_retained_earnings_sched118", 105_585), + ("out_ferc1__yearly_sales_by_rate_schedules_sched304", 303_909), + ("out_ferc1__yearly_small_plants_sched410", 17763), + ("out_ferc1__yearly_steam_plants_fuel_by_plant_sched402", 26_947), + ("out_ferc1__yearly_steam_plants_fuel_sched402", 51_238), + ("out_ferc1__yearly_steam_plants_sched402", 32_975), + ("out_ferc1__yearly_transmission_lines_sched422", 640_619), + ("out_ferc1__yearly_utility_plant_summary_sched200", 198_769), + ("out_ferc1__yearly_small_plants_sched410", 17_763), ], ) -def test_minmax_rows(pudl_out_ferc1, live_dbs, expected_rows, df_name): +def test_minmax_rows(live_dbs, asset_value_loader, expected_rows, asset_key): """Verify that output DataFrames don't have too many or too few rows. Args: - pudl_out_ferc1: A PudlTabl output object. live_dbs: Boolean (wether we're using a live or testing DB). expected_rows (int): Expected number of rows that the dataframe should contain when all data is loaded and is output without aggregation. - df_name (str): Shorthand name identifying the dataframe, corresponding - to the name of the function used to pull it from the PudlTabl - output object. + asset_key (str): The name of the asset. """ if not live_dbs: pytest.skip("Data validation only works with a live PUDL DB.") _ = ( - pudl_out_ferc1.__getattribute__(df_name)() + asset_value_loader.load_asset_value(asset_key) .pipe( - pv.check_min_rows, expected_rows=expected_rows, margin=0.0, df_name=df_name + pv.check_min_rows, + expected_rows=expected_rows, + margin=0.0, + df_name=asset_key, ) .pipe( - pv.check_max_rows, expected_rows=expected_rows, margin=0.0, df_name=df_name + pv.check_max_rows, + expected_rows=expected_rows, + margin=0.0, + df_name=asset_key, ) ) @pytest.mark.parametrize( - "df_name,unique_subset", + "asset_key,unique_subset", [ - ("pu_ferc1", ["utility_id_ferc1", "plant_name_ferc1"]), - ("fbp_ferc1", ["report_year", "utility_id_ferc1", "plant_name_ferc1"]), ( - "plants_hydro_ferc1", + "_out_ferc1__yearly_plants_utilities", + ["utility_id_ferc1", "plant_name_ferc1"], + ), + ( + "out_ferc1__yearly_steam_plants_fuel_by_plant_sched402", + ["report_year", "utility_id_ferc1", "plant_name_ferc1"], + ), + ( + "out_ferc1__yearly_hydroelectric_plants_sched406", [ "report_year", "utility_id_ferc1", @@ -141,7 +167,7 @@ def test_minmax_rows(pudl_out_ferc1, live_dbs, expected_rows, df_name): ], ), ( - "plants_pumped_storage_ferc1", + "out_ferc1__yearly_pumped_storage_plants_sched408", [ "report_year", "utility_id_ferc1", @@ -150,19 +176,19 @@ def test_minmax_rows(pudl_out_ferc1, live_dbs, expected_rows, df_name): ], ), ( - "plant_in_service_ferc1", + "out_ferc1__yearly_plant_in_service_sched204", ["report_year", "utility_id_ferc1", "ferc_account_label"], ), ], ) -def test_unique_rows_ferc1(pudl_out_ferc1, live_dbs, df_name, unique_subset): +def test_unique_rows_ferc1(live_dbs, asset_value_loader, asset_key, unique_subset): """Test whether dataframe has unique records within a subset of columns.""" if not live_dbs: pytest.skip("Data validation only works with a live PUDL DB.") pv.check_unique_rows( - pudl_out_ferc1.__getattribute__(df_name)(), + asset_value_loader.load_asset_value(asset_key), subset=unique_subset, - df_name=df_name, + df_name=asset_key, ) From c33a675d9931ef96ab8c58461ab920bba0dec5f9 Mon Sep 17 00:00:00 2001 From: PUDL Bot <74792863+pudlbot@users.noreply.github.com> Date: Mon, 2 Dec 2024 18:56:03 -0600 Subject: [PATCH 2/2] Update conda-lock.yml and rendered conda environment files. (#3981) Co-authored-by: zaneselvans <596279+zaneselvans@users.noreply.github.com> --- environments/conda-linux-64.lock.yml | 12 +-- environments/conda-lock.yml | 144 +++++++++++++------------- environments/conda-osx-64.lock.yml | 12 +-- environments/conda-osx-arm64.lock.yml | 12 +-- 4 files changed, 90 insertions(+), 90 deletions(-) diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index 17171bfd4f..8227cbe0a0 100644 --- a/environments/conda-linux-64.lock.yml +++ b/environments/conda-linux-64.lock.yml @@ -10,7 +10,7 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.8=py312h178313f_0 + - aiohttp=3.11.9=py312h178313f_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -196,7 +196,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.122.0=pyha770c72_0 + - hypothesis=6.122.1=pyha770c72_0 - icu=75.1=he02047a_0 - identify=2.6.3=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -339,7 +339,7 @@ dependencies: - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.3=pyhd8ed1ab_0 + - narwhals=1.15.1=pyhd8ed1ab_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.1=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -427,7 +427,7 @@ dependencies: - pyproj=3.7.0=py312he630544_0 - pyproject_hooks=1.2.0=pyh7850678_0 - pysocks=1.7.1=pyha2e5f31_6 - - pytest=8.3.3=pyhd8ed1ab_0 + - pytest=8.3.4=pyhd8ed1ab_0 - pytest-console-scripts=1.4.1=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_0 - pytest-mock=3.14.0=pyhd8ed1ab_0 @@ -440,7 +440,7 @@ dependencies: - python-duckdb=1.1.3=py312h2ec8cdc_0 - python-fastjsonschema=2.21.0=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-multipart=0.0.18=pyhff2d567_1 + - python-multipart=0.0.19=pyhff2d567_0 - python-slugify=8.0.4=pyhd8ed1ab_0 - python-tzdata=2024.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 @@ -559,7 +559,7 @@ dependencies: - websockets=11.0.3=py312h98912ed_1 - werkzeug=3.1.3=pyhff2d567_0 - wheel=0.45.1=pyhd8ed1ab_0 - - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 - wrapt=1.17.0=py312h66e93f0_0 - xerces-c=3.2.5=h988505b_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index fe27dcf194..2ea365b2e3 100644 --- a/environments/conda-lock.yml +++ b/environments/conda-lock.yml @@ -164,7 +164,7 @@ package: category: main optional: false - name: aiohttp - version: 3.11.8 + version: 3.11.9 manager: conda platform: linux-64 dependencies: @@ -179,14 +179,14 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* yarl: ">=1.17.0,<2.0" - url: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.8-py312h178313f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.9-py312h178313f_0.conda hash: - md5: 63eb2bd555d446218c7bbdec2dd746c5 - sha256: 5a51cfa8c17a1c545f07c8a9bae637b233c803f92f922ce3badb7a81f6e7eba8 + md5: eeaf9831f262132fb12ce3921de09651 + sha256: 875a8ad0da035b33ba8037c40a2ffc0412b9545bc3d15455a8a75db22a3ee471 category: main optional: false - name: aiohttp - version: 3.11.8 + version: 3.11.9 manager: conda platform: osx-64 dependencies: @@ -200,14 +200,14 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* yarl: ">=1.17.0,<2.0" - url: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.11.8-py312h3520af0_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.11.9-py312h3520af0_0.conda hash: - md5: aedb3bea26a66b8f35b13496e44434e1 - sha256: 229f8a254a59f8934a2f1f1e384e948dda7b70d2139fe0705f41e11d9ec52b0e + md5: ea412f0f0280322bdc76a6d763d42993 + sha256: a51129609bd7baecdf6e9b48e9078c9a2ffd7411ca1fc815ad46c1c00d0b523b category: main optional: false - name: aiohttp - version: 3.11.8 + version: 3.11.9 manager: conda platform: osx-arm64 dependencies: @@ -221,10 +221,10 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* yarl: ">=1.17.0,<2.0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.8-py312h998013c_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.9-py312h998013c_0.conda hash: - md5: 8caf80b1f8510c2c626831f463fac611 - sha256: 991fccd7387b08127a8398cdd499ebb9be7a16a612b024f7f82d0ecbae456b00 + md5: 0bb2657d1215a89fb586d387ce9c4daa + sha256: 521b7c97a1122c0a6740a3200163e29bc8aa1d7efa273deb6e4c58a47779114b category: main optional: false - name: aiosignal @@ -8503,7 +8503,7 @@ package: category: main optional: false - name: hypothesis - version: 6.122.0 + version: 6.122.1 manager: conda platform: linux-64 dependencies: @@ -8514,14 +8514,14 @@ package: python: ">=3.8" setuptools: "" sortedcontainers: ">=2.1.0,<3.0.0" - url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.1-pyha770c72_0.conda hash: - md5: a0a15e6722dd7b116818b6337ba20786 - sha256: 2b5bc0c289ab1cc715797420fc3270979e7ec7bef9b446b71223b09de537eef3 + md5: b1b35ef8bd42dee309af02ade8a68936 + sha256: 25812646689060c5257bfd62a0e628c87db79950cd6b403064013f23d9248e98 category: main optional: false - name: hypothesis - version: 6.122.0 + version: 6.122.1 manager: conda platform: osx-64 dependencies: @@ -8532,14 +8532,14 @@ package: sortedcontainers: ">=2.1.0,<3.0.0" backports.zoneinfo: ">=0.2.1" exceptiongroup: ">=1.0.0rc8" - url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.1-pyha770c72_0.conda hash: - md5: a0a15e6722dd7b116818b6337ba20786 - sha256: 2b5bc0c289ab1cc715797420fc3270979e7ec7bef9b446b71223b09de537eef3 + md5: b1b35ef8bd42dee309af02ade8a68936 + sha256: 25812646689060c5257bfd62a0e628c87db79950cd6b403064013f23d9248e98 category: main optional: false - name: hypothesis - version: 6.122.0 + version: 6.122.1 manager: conda platform: osx-arm64 dependencies: @@ -8550,10 +8550,10 @@ package: sortedcontainers: ">=2.1.0,<3.0.0" backports.zoneinfo: ">=0.2.1" exceptiongroup: ">=1.0.0rc8" - url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.0-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.122.1-pyha770c72_0.conda hash: - md5: a0a15e6722dd7b116818b6337ba20786 - sha256: 2b5bc0c289ab1cc715797420fc3270979e7ec7bef9b446b71223b09de537eef3 + md5: b1b35ef8bd42dee309af02ade8a68936 + sha256: 25812646689060c5257bfd62a0e628c87db79950cd6b403064013f23d9248e98 category: main optional: false - name: icu @@ -14806,39 +14806,39 @@ package: category: main optional: false - name: narwhals - version: 1.14.3 + version: 1.15.1 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.15.1-pyhd8ed1ab_0.conda hash: - md5: b8f78184db8ff091a164edef21c6c050 - sha256: 32c82a9520b5006d25ee6f6ed806dc9ffa834913f62c1b55094b30d53cb45aa5 + md5: aae74cdba80bb8c7dac72fd745fb9285 + sha256: a6c40c1347371b0b6d4f8035f610e456ea79ceeb565295d9054499d72c7f0fa7 category: main optional: false - name: narwhals - version: 1.14.3 + version: 1.15.1 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.15.1-pyhd8ed1ab_0.conda hash: - md5: b8f78184db8ff091a164edef21c6c050 - sha256: 32c82a9520b5006d25ee6f6ed806dc9ffa834913f62c1b55094b30d53cb45aa5 + md5: aae74cdba80bb8c7dac72fd745fb9285 + sha256: a6c40c1347371b0b6d4f8035f610e456ea79ceeb565295d9054499d72c7f0fa7 category: main optional: false - name: narwhals - version: 1.14.3 + version: 1.15.1 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.15.1-pyhd8ed1ab_0.conda hash: - md5: b8f78184db8ff091a164edef21c6c050 - sha256: 32c82a9520b5006d25ee6f6ed806dc9ffa834913f62c1b55094b30d53cb45aa5 + md5: aae74cdba80bb8c7dac72fd745fb9285 + sha256: a6c40c1347371b0b6d4f8035f610e456ea79ceeb565295d9054499d72c7f0fa7 category: main optional: false - name: nbclassic @@ -18713,7 +18713,7 @@ package: category: main optional: false - name: pytest - version: 8.3.3 + version: 8.3.4 manager: conda platform: linux-64 dependencies: @@ -18724,14 +18724,14 @@ package: pluggy: <2,>=1.5 python: ">=3.8" tomli: ">=1" - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_0.conda hash: - md5: c03d61f31f38fdb9facf70c29958bf7a - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: ff8f2ef7f2636906b3781d0cf92388d0 + sha256: 254256beab3dcf29907fbdccee6fbbb3371e9ac3782d2b1b5864596a0317818e category: main optional: false - name: pytest - version: 8.3.3 + version: 8.3.4 manager: conda platform: osx-64 dependencies: @@ -18742,14 +18742,14 @@ package: exceptiongroup: ">=1.0.0rc8" tomli: ">=1" pluggy: <2,>=1.5 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_0.conda hash: - md5: c03d61f31f38fdb9facf70c29958bf7a - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: ff8f2ef7f2636906b3781d0cf92388d0 + sha256: 254256beab3dcf29907fbdccee6fbbb3371e9ac3782d2b1b5864596a0317818e category: main optional: false - name: pytest - version: 8.3.3 + version: 8.3.4 manager: conda platform: osx-arm64 dependencies: @@ -18760,10 +18760,10 @@ package: exceptiongroup: ">=1.0.0rc8" tomli: ">=1" pluggy: <2,>=1.5 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_0.conda hash: - md5: c03d61f31f38fdb9facf70c29958bf7a - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: ff8f2ef7f2636906b3781d0cf92388d0 + sha256: 254256beab3dcf29907fbdccee6fbbb3371e9ac3782d2b1b5864596a0317818e category: main optional: false - name: pytest-console-scripts @@ -19302,39 +19302,39 @@ package: category: main optional: false - name: python-multipart - version: 0.0.18 + version: 0.0.19 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.18-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.19-pyhff2d567_0.conda hash: - md5: 8057e4cf29236ea2094cc20fe9ef451e - sha256: 464e546b789b8e881e1dc6b4995a11007d1e7c3ef2a533b9fb970146e85f7af8 + md5: fe524346d3a9aa0aaf353dc39f7d1715 + sha256: ff5964cd5eafc118f9d9a15fd31cd88a7ecc756ef83b6095c69b1891a53e2177 category: main optional: false - name: python-multipart - version: 0.0.18 + version: 0.0.19 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.18-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.19-pyhff2d567_0.conda hash: - md5: 8057e4cf29236ea2094cc20fe9ef451e - sha256: 464e546b789b8e881e1dc6b4995a11007d1e7c3ef2a533b9fb970146e85f7af8 + md5: fe524346d3a9aa0aaf353dc39f7d1715 + sha256: ff5964cd5eafc118f9d9a15fd31cd88a7ecc756ef83b6095c69b1891a53e2177 category: main optional: false - name: python-multipart - version: 0.0.18 + version: 0.0.19 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.18-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.19-pyhff2d567_0.conda hash: - md5: 8057e4cf29236ea2094cc20fe9ef451e - sha256: 464e546b789b8e881e1dc6b4995a11007d1e7c3ef2a533b9fb970146e85f7af8 + md5: fe524346d3a9aa0aaf353dc39f7d1715 + sha256: ff5964cd5eafc118f9d9a15fd31cd88a7ecc756ef83b6095c69b1891a53e2177 category: main optional: false - name: python-slugify @@ -24138,11 +24138,11 @@ package: manager: conda platform: linux-64 dependencies: - python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda hash: - md5: 6372cd99502721bd7499f8d16b56268d - sha256: d155adc10f8c96f76d4468dbe37b33b4334dadf5cd4a95841aa009ca9bced5fa + md5: 237db148cc37a466e4222d589029b53e + sha256: a750202ae2a31d8e5ee5a5c127fcc7fa783cd0fbedbc0bf1ab549a109881fa9f category: main optional: false - name: widgetsnbextension @@ -24150,11 +24150,11 @@ package: manager: conda platform: osx-64 dependencies: - python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda hash: - md5: 6372cd99502721bd7499f8d16b56268d - sha256: d155adc10f8c96f76d4468dbe37b33b4334dadf5cd4a95841aa009ca9bced5fa + md5: 237db148cc37a466e4222d589029b53e + sha256: a750202ae2a31d8e5ee5a5c127fcc7fa783cd0fbedbc0bf1ab549a109881fa9f category: main optional: false - name: widgetsnbextension @@ -24162,11 +24162,11 @@ package: manager: conda platform: osx-arm64 dependencies: - python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_0.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda hash: - md5: 6372cd99502721bd7499f8d16b56268d - sha256: d155adc10f8c96f76d4468dbe37b33b4334dadf5cd4a95841aa009ca9bced5fa + md5: 237db148cc37a466e4222d589029b53e + sha256: a750202ae2a31d8e5ee5a5c127fcc7fa783cd0fbedbc0bf1ab549a109881fa9f category: main optional: false - name: wrapt diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index cba9a74ae8..49aa29b369 100644 --- a/environments/conda-osx-64.lock.yml +++ b/environments/conda-osx-64.lock.yml @@ -8,7 +8,7 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.8=py312h3520af0_0 + - aiohttp=3.11.9=py312h3520af0_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -193,7 +193,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.122.0=pyha770c72_0 + - hypothesis=6.122.1=pyha770c72_0 - icu=75.1=h120a0e1_0 - identify=2.6.3=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -328,7 +328,7 @@ dependencies: - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.3=pyhd8ed1ab_0 + - narwhals=1.15.1=pyhd8ed1ab_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.1=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -417,7 +417,7 @@ dependencies: - pyproj=3.7.0=py312h9673cc4_0 - pyproject_hooks=1.2.0=pyh7850678_0 - pysocks=1.7.1=pyha2e5f31_6 - - pytest=8.3.3=pyhd8ed1ab_0 + - pytest=8.3.4=pyhd8ed1ab_0 - pytest-console-scripts=1.4.1=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_0 - pytest-mock=3.14.0=pyhd8ed1ab_0 @@ -430,7 +430,7 @@ dependencies: - python-duckdb=1.1.3=py312haafddd8_0 - python-fastjsonschema=2.21.0=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-multipart=0.0.18=pyhff2d567_1 + - python-multipart=0.0.19=pyhff2d567_0 - python-slugify=8.0.4=pyhd8ed1ab_0 - python-tzdata=2024.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 @@ -547,7 +547,7 @@ dependencies: - websockets=11.0.3=py312h104f124_1 - werkzeug=3.1.3=pyhff2d567_0 - wheel=0.45.1=pyhd8ed1ab_0 - - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 - wrapt=1.17.0=py312h01d7ebd_0 - xerces-c=3.2.5=h197e74d_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index 817b7992d1..9a482ff556 100644 --- a/environments/conda-osx-arm64.lock.yml +++ b/environments/conda-osx-arm64.lock.yml @@ -8,7 +8,7 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.8=py312h998013c_0 + - aiohttp=3.11.9=py312h998013c_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -193,7 +193,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.122.0=pyha770c72_0 + - hypothesis=6.122.1=pyha770c72_0 - icu=75.1=hfee45f7_0 - identify=2.6.3=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -328,7 +328,7 @@ dependencies: - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.3=pyhd8ed1ab_0 + - narwhals=1.15.1=pyhd8ed1ab_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.1=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -417,7 +417,7 @@ dependencies: - pyproj=3.7.0=py312h1ab748d_0 - pyproject_hooks=1.2.0=pyh7850678_0 - pysocks=1.7.1=pyha2e5f31_6 - - pytest=8.3.3=pyhd8ed1ab_0 + - pytest=8.3.4=pyhd8ed1ab_0 - pytest-console-scripts=1.4.1=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_0 - pytest-mock=3.14.0=pyhd8ed1ab_0 @@ -430,7 +430,7 @@ dependencies: - python-duckdb=1.1.3=py312hd8f9ff3_0 - python-fastjsonschema=2.21.0=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-multipart=0.0.18=pyhff2d567_1 + - python-multipart=0.0.19=pyhff2d567_0 - python-slugify=8.0.4=pyhd8ed1ab_0 - python-tzdata=2024.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 @@ -547,7 +547,7 @@ dependencies: - websockets=11.0.3=py312h02f2b3b_1 - werkzeug=3.1.3=pyhff2d567_0 - wheel=0.45.1=pyhd8ed1ab_0 - - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 - wrapt=1.17.0=py312hea69d52_0 - xerces-c=3.2.5=h92fc2f4_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0