From 6f603e91a934204df3a9cf5dde297e2afd7b9093 Mon Sep 17 00:00:00 2001 From: zaneselvans Date: Fri, 17 Nov 2023 15:48:33 +0000 Subject: [PATCH 1/2] Update PUDL to use SQLAlchemy 2.0 * Use replace engine.connect() with engine.begin() * Update unit tests to work with SQLAlchemy 2.0 * Require SQLAlchemy 2.0. Again. Oops. * Remove deprecated use_nullable_dtypes arg from read_parquet calls. * Use string 'sum' rather than callable sum() in groupby transforms. * Use explicit observed=True in timezone groupby * Update conda-lock.yml and rendered conda environment files. --- environments/conda-linux-64.lock.yml | 4 +- environments/conda-lock.yml | 95 +++++++++++++------------- environments/conda-osx-64.lock.yml | 4 +- environments/conda-osx-arm64.lock.yml | 4 +- pyproject.toml | 4 +- src/pudl/analysis/allocate_gen_fuel.py | 6 +- src/pudl/analysis/state_demand.py | 16 ++--- src/pudl/io_managers.py | 24 +++---- src/pudl/output/epacems.py | 1 - test/unit/io_managers_test.py | 25 +++++++ 10 files changed, 105 insertions(+), 78 deletions(-) diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index b771c192ef..c7b1a067d8 100644 --- a/environments/conda-linux-64.lock.yml +++ b/environments/conda-linux-64.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 62bcd0fc7d50df96982d048631ad45bff7910db618111621e212e7f3c28a44bc +# input_hash: 3488f1f8b42f706745fb582d78e40be692fed5eb08accbfb1ebf539a089d87bd channels: - conda-forge @@ -384,7 +384,6 @@ dependencies: - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.5=py311h459d7ec_0 - - sqlalchemy=1.4.49=py311h459d7ec_1 - terminado=0.18.0=pyh0d859eb_0 - tinycss2=1.2.1=pyhd8ed1ab_0 - tqdm=4.66.1=pyhd8ed1ab_0 @@ -438,6 +437,7 @@ dependencies: - python-build=1.0.3=pyhd8ed1ab_0 - requests=2.31.0=pyhd8ed1ab_0 - rich=13.7.0=pyhd8ed1ab_0 + - sqlalchemy=2.0.23=py311h459d7ec_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.32.0.post1=pyhd8ed1ab_0 - tiledb=2.16.3=h8c794c1_3 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index 28082c732e..c816066471 100644 --- a/environments/conda-lock.yml +++ b/environments/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - linux-64: 62bcd0fc7d50df96982d048631ad45bff7910db618111621e212e7f3c28a44bc - osx-64: bcf38db86781af22df7f496ce0dafe43a905c359e9c7d6d038429569b874c305 - osx-arm64: 8d8eb4c72944efa02bab31f0274acad445146594b4cad129cc341a304e08ebb2 + linux-64: 3488f1f8b42f706745fb582d78e40be692fed5eb08accbfb1ebf539a089d87bd + osx-64: b0e3c33170a43614c2f811caf4b3f1572d74d3cfac308aaa1d7b7440f6b126a0 + osx-arm64: 4741766e82a5d953aa4d5bc129ecfb5a9580d7cc918942e6ef8d36fc0bf4daa4 channels: - url: conda-forge used_env_vars: [] @@ -5073,21 +5073,6 @@ package: sha256: c92e7bbb1d02286bcd3d3292208006f796ae45df82af3deec940339493415c04 category: main optional: false - - name: sqlalchemy - version: 1.4.49 - manager: conda - platform: linux-64 - dependencies: - greenlet: "!=0.4.17" - libgcc-ng: ">=12" - python: ">=3.11,<3.12.0a0" - python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.49-py311h459d7ec_1.conda - hash: - md5: 17392bcb4ceac1b2c95db9d54b4ac018 - sha256: 542dea4823e2e1283936fbd25c9f3fa960ec6df2dd54589b192b4dac68af7295 - category: main - optional: false - name: terminado version: 0.18.0 manager: conda @@ -5892,6 +5877,22 @@ package: sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb category: main optional: false + - name: sqlalchemy + version: 2.0.23 + manager: conda + platform: linux-64 + dependencies: + greenlet: "!=0.4.17" + libgcc-ng: ">=12" + python: ">=3.11,<3.12.0a0" + python_abi: 3.11.* + typing-extensions: ">=4.2.0" + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.23-py311h459d7ec_0.conda + hash: + md5: caccc840985d972796a3c94e69376177 + sha256: b616e46d0e4c914d29a9860384a6e44e33106cef565ba238d669766e658faa80 + category: main + optional: false - name: stack_data version: 0.6.2 manager: conda @@ -12972,20 +12973,6 @@ package: sha256: afdaab0d0f5a288b31450c3da260381da5916c61f122a0b3f5dea76d1ca863bb category: main optional: false - - name: sqlalchemy - version: 1.4.49 - manager: conda - platform: osx-64 - dependencies: - greenlet: "!=0.4.17" - python: ">=3.11,<3.12.0a0" - python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/osx-64/sqlalchemy-1.4.49-py311he705e18_1.conda - hash: - md5: 04845132cd5d140b638c4927e1895e12 - sha256: 39569dfc13e742e1b61fcc92948e02bc7f361d05bb5100e5226251b70fcdf1af - category: main - optional: false - name: terminado version: 0.18.0 manager: conda @@ -13768,6 +13755,21 @@ package: sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb category: main optional: false + - name: sqlalchemy + version: 2.0.23 + manager: conda + platform: osx-64 + dependencies: + greenlet: "!=0.4.17" + python: ">=3.11,<3.12.0a0" + python_abi: 3.11.* + typing-extensions: ">=4.2.0" + url: https://conda.anaconda.org/conda-forge/osx-64/sqlalchemy-2.0.23-py311he705e18_0.conda + hash: + md5: f06f912df000cc6bd840011c703c607a + sha256: da5ab07c9148d561586f7fa8110a0794b136e96e168cd591cb7aa87e9805f1da + category: main + optional: false - name: stack_data version: 0.6.2 manager: conda @@ -20785,20 +20787,6 @@ package: sha256: 33c770e213c233e80b48256d17ce0e7bfe504576f2778307826cf1fd1db058d6 category: main optional: false - - name: sqlalchemy - version: 1.4.49 - manager: conda - platform: osx-arm64 - dependencies: - greenlet: "!=0.4.17" - python: ">=3.11,<3.12.0a0" - python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-1.4.49-py311h05b510d_1.conda - hash: - md5: 1460f703e4ed3a7bda01ef1baee3a2ea - sha256: 99fbaaa9374f694a2fa86ca37b9c7d5044b3a21f2fdaff23048f1423031f03ac - category: main - optional: false - name: terminado version: 0.18.0 manager: conda @@ -21581,6 +21569,21 @@ package: sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb category: main optional: false + - name: sqlalchemy + version: 2.0.23 + manager: conda + platform: osx-arm64 + dependencies: + greenlet: "!=0.4.17" + python: ">=3.11,<3.12.0a0" + python_abi: 3.11.* + typing-extensions: ">=4.2.0" + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.23-py311h05b510d_0.conda + hash: + md5: 33795a9c237e7c3ec9cf01a2e89f11dd + sha256: ccf2046118ab2d32d41dc8e90aa3e701e9938522533e39332738f8654d9268cb + category: main + optional: false - name: stack_data version: 0.6.2 manager: conda diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index e7b68ceec1..a831f7b891 100644 --- a/environments/conda-osx-64.lock.yml +++ b/environments/conda-osx-64.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: bcf38db86781af22df7f496ce0dafe43a905c359e9c7d6d038429569b874c305 +# input_hash: b0e3c33170a43614c2f811caf4b3f1572d74d3cfac308aaa1d7b7440f6b126a0 channels: - conda-forge @@ -364,7 +364,6 @@ dependencies: - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.5=py311he705e18_0 - - sqlalchemy=1.4.49=py311he705e18_1 - terminado=0.18.0=pyh31c8845_0 - tinycss2=1.2.1=pyhd8ed1ab_0 - tqdm=4.66.1=pyhd8ed1ab_0 @@ -418,6 +417,7 @@ dependencies: - python-build=1.0.3=pyhd8ed1ab_0 - requests=2.31.0=pyhd8ed1ab_0 - rich=13.7.0=pyhd8ed1ab_0 + - sqlalchemy=2.0.23=py311he705e18_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.32.0.post1=pyhd8ed1ab_0 - tiledb=2.16.3=hd3a41d5_3 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index ce2dfcb44a..cb25f9bea9 100644 --- a/environments/conda-osx-arm64.lock.yml +++ b/environments/conda-osx-arm64.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: osx-arm64 -# input_hash: 8d8eb4c72944efa02bab31f0274acad445146594b4cad129cc341a304e08ebb2 +# input_hash: 4741766e82a5d953aa4d5bc129ecfb5a9580d7cc918942e6ef8d36fc0bf4daa4 channels: - conda-forge @@ -364,7 +364,6 @@ dependencies: - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.5=py311h05b510d_0 - - sqlalchemy=1.4.49=py311h05b510d_1 - terminado=0.18.0=pyh31c8845_0 - tinycss2=1.2.1=pyhd8ed1ab_0 - tqdm=4.66.1=pyhd8ed1ab_0 @@ -418,6 +417,7 @@ dependencies: - python-build=1.0.3=pyhd8ed1ab_0 - requests=2.31.0=pyhd8ed1ab_0 - rich=13.7.0=pyhd8ed1ab_0 + - sqlalchemy=2.0.23=py311h05b510d_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.32.0.post1=pyhd8ed1ab_0 - tiledb=2.16.3=he15c4da_3 diff --git a/pyproject.toml b/pyproject.toml index 9dde334c93..cb0ea78f88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "grpcio==1.59.2", # Required by dagster, binary dependencies are flaky "grpcio-health-checking==1.59.2", # Required by dagster, binary dependencies are flaky "grpcio-status==1.59.2", # Required by dagster, binary dependencies are flaky - "hypothesis>=6.87,<7.0", + "hypothesis>=6.87", "jinja2>=3.1", "jupyter", "matplotlib>=3.8", @@ -75,7 +75,7 @@ dependencies = [ "sphinx-reredirects>=0.1.2", "sphinx>=7", "sphinxcontrib_bibtex>=2.6", - "sqlalchemy>=1.4,<2", + "sqlalchemy>=2", "timezonefinder>=6.2", "xlrd>=2.0.1", # pandas[excel] "xlsxwriter>=3.1", # pandas[excel] diff --git a/src/pudl/analysis/allocate_gen_fuel.py b/src/pudl/analysis/allocate_gen_fuel.py index 8742ee8987..d5163bf9b1 100644 --- a/src/pudl/analysis/allocate_gen_fuel.py +++ b/src/pudl/analysis/allocate_gen_fuel.py @@ -1012,7 +1012,7 @@ def _allocate_unassociated_pm_records( eia_generators_connected = gen_assoc.loc[connected_mask].assign( capacity_mw_minus_one=lambda x: x.groupby(idx_minus_one)[ "capacity_mw" - ].transform(sum), + ].transform("sum"), frac_cap_minus_one=lambda x: x.capacity_mw / x.capacity_mw_minus_one, ) @@ -1192,7 +1192,7 @@ def prep_alloction_fraction(gen_assoc: pd.DataFrame) -> pd.DataFrame: ) gen_pm_fuel["capacity_mw_fuel_in_bf_tbl_group"] = gen_pm_fuel.groupby( IDX_PM_ESC + ["in_bf_tbl"], dropna=False - )[["capacity_mw"]].transform(sum, min_count=1) + )[["capacity_mw"]].transform("sum", min_count=1) return gen_pm_fuel @@ -1534,7 +1534,7 @@ def assign_plant_year(df): | np.isclose(reporters[data_column_name], 0) ) .groupby(key_columns_annual, dropna=False)[["missing_data"]] - .transform(sum) + .transform("sum") ) # seperate annual and monthly reporters diff --git a/src/pudl/analysis/state_demand.py b/src/pudl/analysis/state_demand.py index 68a5660d20..bcec43c064 100644 --- a/src/pudl/analysis/state_demand.py +++ b/src/pudl/analysis/state_demand.py @@ -128,13 +128,13 @@ def local_to_utc(local: pd.Series, tz: Iterable, **kwargs: Any) -> pd.Series: """Convert local times to UTC. Args: - local: Local times (tz-naive `datetime64[ns]`). + local: Local times (tz-naive ``datetime64[ns]``). tz: For each time, a timezone (see :meth:`DatetimeIndex.tz_localize`) - or UTC offset in hours (`int` or `float`). + or UTC offset in hours (``int`` or ``float``). kwargs: Optional arguments to :meth:`DatetimeIndex.tz_localize`. Returns: - UTC times (tz-naive `datetime64[ns]`). + UTC times (tz-naive ``datetime64[ns]``). Examples: >>> s = pd.Series([pd.Timestamp(2020, 1, 1), pd.Timestamp(2020, 1, 1)]) @@ -147,7 +147,7 @@ def local_to_utc(local: pd.Series, tz: Iterable, **kwargs: Any) -> pd.Series: 1 2020-01-01 06:00:00 dtype: datetime64[ns] """ - return local.groupby(tz).transform( + return local.groupby(tz, observed=True).transform( lambda x: x.dt.tz_localize( datetime.timezone(datetime.timedelta(hours=x.name)) if isinstance(x.name, int | float) @@ -161,12 +161,12 @@ def utc_to_local(utc: pd.Series, tz: Iterable) -> pd.Series: """Convert UTC times to local. Args: - utc: UTC times (tz-naive `datetime64[ns]` or `datetime64[ns, UTC]`). + utc: UTC times (tz-naive ``datetime64[ns]`` or ``datetime64[ns, UTC]``). tz: For each time, a timezone (see :meth:`DatetimeIndex.tz_localize`) - or UTC offset in hours (`int` or `float`). + or UTC offset in hours (``int`` or ``float``). Returns: - Local times (tz-naive `datetime64[ns]`). + Local times (tz-naive ``datetime64[ns]``). Examples: >>> s = pd.Series([pd.Timestamp(2020, 1, 1), pd.Timestamp(2020, 1, 1)]) @@ -181,7 +181,7 @@ def utc_to_local(utc: pd.Series, tz: Iterable) -> pd.Series: """ if utc.dt.tz is None: utc = utc.dt.tz_localize("UTC") - return utc.groupby(tz).transform( + return utc.groupby(tz, observed=True).transform( lambda x: x.dt.tz_convert( datetime.timezone(datetime.timedelta(hours=x.name)) if isinstance(x.name, int | float) diff --git a/src/pudl/io_managers.py b/src/pudl/io_managers.py index a8b8512c61..2114584517 100644 --- a/src/pudl/io_managers.py +++ b/src/pudl/io_managers.py @@ -193,7 +193,7 @@ def _get_fk_list(self, table: str) -> pd.DataFrame: method collapses foreign keys with multiple fields into one record for readability. """ - with self.engine.connect() as con: + with self.engine.begin() as con: table_fks = pd.read_sql_query(f"PRAGMA foreign_key_list({table});", con) # Foreign keys with multiple fields are reported in separate records. @@ -224,7 +224,7 @@ def check_foreign_keys(self) -> None: ForeignKeyErrors: if data in the database violate foreign key constraints. """ logger.info(f"Running foreign key check on {self.db_name} database.") - with self.engine.connect() as con: + with self.engine.begin() as con: fk_errors = pd.read_sql_query("PRAGMA foreign_key_check;", con) if not fk_errors.empty: @@ -284,10 +284,11 @@ def _handle_pandas_output(self, context: OutputContext, df: pd.DataFrame): ) engine = self.engine - with engine.connect() as con: + with engine.begin() as con: # Remove old table records before loading to db con.execute(sa_table.delete()) + with engine.begin() as con: df.to_sql( table_name, con, @@ -314,7 +315,7 @@ def _handle_str_output(self, context: OutputContext, query: str): # Make sure the metadata has been created for the view _ = self._get_sqlalchemy_table(table_name) - with engine.connect() as con: + with engine.begin() as con: # Drop the existing view if it exists and create the new view. # TODO (bendnorman): parameterize this safely. con.execute(f"DROP VIEW IF EXISTS {table_name}") @@ -357,7 +358,7 @@ def load_input(self, context: InputContext) -> pd.DataFrame: engine = self.engine - with engine.connect() as con: + with engine.begin() as con: try: df = pd.read_sql_table(table_name, con) except ValueError: @@ -369,7 +370,7 @@ def load_input(self, context: InputContext) -> pd.DataFrame: if df.empty: raise AssertionError( f"The {table_name} table is empty. Materialize " - "the {table_name} asset so it is available in the database." + f"the {table_name} asset so it is available in the database." ) return df @@ -461,7 +462,7 @@ def _handle_str_output(self, context: OutputContext, query: str): "it's a work in progress or is distributed in Apache Parquet format." ) - with engine.connect() as con: + with engine.begin() as con: # Drop the existing view if it exists and create the new view. # TODO (bendnorman): parameterize this safely. con.execute(f"DROP VIEW IF EXISTS {table_name}") @@ -476,7 +477,7 @@ def _handle_pandas_output(self, context: OutputContext, df: pd.DataFrame): df = res.enforce_schema(df) - with self.engine.connect() as con: + with self.engine.begin() as con: # Remove old table records before loading to db con.execute(sa_table.delete()) @@ -510,7 +511,7 @@ def load_input(self, context: InputContext) -> pd.DataFrame: "it's a work in progress or is distributed in Apache Parquet format." ) - with self.engine.connect() as con: + with self.engine.begin() as con: try: df = pd.concat( [ @@ -656,7 +657,7 @@ def load_input(self, context: InputContext) -> pd.DataFrame: engine = self.engine - with engine.connect() as con: + with engine.begin() as con: return pd.read_sql_query( f"SELECT * FROM {table_name} " # noqa: S608 "WHERE report_year BETWEEN :min_year AND :max_year;", @@ -812,7 +813,7 @@ def load_input(self, context: InputContext) -> pd.DataFrame: engine = self.engine sched_table_name = re.sub("_instant|_duration", "", table_name) - with engine.connect() as con: + with engine.begin() as con: df = pd.read_sql( f"SELECT {table_name}.* FROM {table_name}", # noqa: S608 - table names not supplied by user con=con, @@ -861,7 +862,6 @@ def load_from_path(self, context: InputContext, path: UPath) -> dd.DataFrame: logger.info(f"Reading parquet file from {path}") return dd.read_parquet( path, - use_nullable_dtypes=True, engine="pyarrow", index=False, split_row_groups=True, diff --git a/src/pudl/output/epacems.py b/src/pudl/output/epacems.py index 6d509412ce..564c2fadc1 100644 --- a/src/pudl/output/epacems.py +++ b/src/pudl/output/epacems.py @@ -137,7 +137,6 @@ def epacems( epacems = dd.read_parquet( epacems_path, - use_nullable_dtypes=True, columns=columns, engine="pyarrow", index=False, diff --git a/test/unit/io_managers_test.py b/test/unit/io_managers_test.py index 7934877901..2a3371632e 100644 --- a/test/unit/io_managers_test.py +++ b/test/unit/io_managers_test.py @@ -217,6 +217,31 @@ def fake_pudl_sqlite_io_manager_fixture(tmp_path, test_pkg, monkeypatch): return PudlSQLiteIOManager(base_dir=tmp_path, db_name="fake", package=test_pkg) +def test_pudl_sqlite_io_manager_delete_stmt(fake_pudl_sqlite_io_manager_fixture): + """Test we are replacing the data without dropping the table schema.""" + manager = fake_pudl_sqlite_io_manager_fixture + + asset_key = "artist" + artist = pd.DataFrame({"artistid": [1], "artistname": ["Co-op Mop"]}) + output_context = build_output_context(asset_key=AssetKey(asset_key)) + manager.handle_output(output_context, artist) + + # Read the table back into pandas + input_context = build_input_context(asset_key=AssetKey(asset_key)) + returned_df = manager.load_input(input_context) + assert len(returned_df) == 1 + + # Rerun the asset + # Load the dataframe to a sqlite table + output_context = build_output_context(asset_key=AssetKey(asset_key)) + manager.handle_output(output_context, artist) + + # Read the table back into pandas + input_context = build_input_context(asset_key=AssetKey(asset_key)) + returned_df = manager.load_input(input_context) + assert len(returned_df) == 1 + + def test_migrations_match_metadata(tmp_path, monkeypatch): """If you create a `PudlSQLiteIOManager` that points at a non-existing `pudl.sqlite` - it will initialize the DB based on the `package`. From 831d569616073eaaeaac3ec624023b4a8f9d0da8 Mon Sep 17 00:00:00 2001 From: zaneselvans Date: Fri, 17 Nov 2023 21:07:14 +0000 Subject: [PATCH 2/2] Update conda-lock.yml and rendered conda environment files. --- environments/conda-linux-64.lock.yml | 2 +- environments/conda-lock.yml | 24 ++++++++++++------------ environments/conda-osx-64.lock.yml | 2 +- environments/conda-osx-arm64.lock.yml | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index c7b1a067d8..75ea19ecb2 100644 --- a/environments/conda-linux-64.lock.yml +++ b/environments/conda-linux-64.lock.yml @@ -101,7 +101,7 @@ dependencies: - libsqlite=3.44.0=h2797004_0 - libssh2=1.11.0=h0841786_0 - libxcb=1.15=h0b41bf4_0 - - libxml2=2.11.5=h232c23b_1 + - libxml2=2.11.6=h232c23b_0 - libzip=1.10.1=h2629f0a_3 - pcre2=10.42=hcad00b1_0 - readline=8.2=h8228510_1 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index c816066471..e55ee45705 100644 --- a/environments/conda-lock.yml +++ b/environments/conda-lock.yml @@ -1223,7 +1223,7 @@ package: category: main optional: false - name: libxml2 - version: 2.11.5 + version: 2.11.6 manager: conda platform: linux-64 dependencies: @@ -1232,10 +1232,10 @@ package: libiconv: ">=1.17,<2.0a0" libzlib: ">=1.2.13,<1.3.0a0" xz: ">=5.2.6,<6.0a0" - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.6-h232c23b_0.conda hash: - md5: f3858448893839820d4bcfb14ad3ecdf - sha256: 1b3cb6864de1a558ea5fb144c780121d52507837d15df0600491d8ed92cff90c + md5: 427a3e59d66cb5d145020bd9c6493334 + sha256: e6183d5e57ee48cc1fc4340477c31a6bd8be4d3ba5dded82cbca0d5280591086 category: main optional: false - name: libzip @@ -9010,7 +9010,7 @@ package: category: main optional: false - name: libxml2 - version: 2.11.5 + version: 2.11.6 manager: conda platform: osx-64 dependencies: @@ -9018,10 +9018,10 @@ package: libiconv: ">=1.17,<2.0a0" libzlib: ">=1.2.13,<1.3.0a0" xz: ">=5.2.6,<6.0a0" - url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.11.5-h3346baf_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.11.6-hc0ae0f7_0.conda hash: - md5: 7584dee6af7de378aed0ae49aebedb8a - sha256: d901fab32e57a43c44e630fb1c4d0a163d23b109eecd6c68b9ee371800760bca + md5: 2b6ec8c6366ea74db4b910469addad1d + sha256: b5b1c3df3e6d0d294764938e79d7f413191cc5b1af2ede49f42b1df04d068a18 category: main optional: false - name: lz4-c @@ -16837,7 +16837,7 @@ package: category: main optional: false - name: libxml2 - version: 2.11.5 + version: 2.11.6 manager: conda platform: osx-arm64 dependencies: @@ -16845,10 +16845,10 @@ package: libiconv: ">=1.17,<2.0a0" libzlib: ">=1.2.13,<1.3.0a0" xz: ">=5.2.6,<6.0a0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.11.5-h25269f3_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.11.6-h0d0cfa8_0.conda hash: - md5: 627b5d1377536b5b632ba53cd1455555 - sha256: 8291549b87aca48e9cd4aec124af01b5037acd16f8ad14083d7af23c8bb6bebe + md5: 37e112ce9494adfcee6c0c7bf3b5d98d + sha256: 07d2da8f3fb00fb6f84cd36b5329174b878105889f0fe21e79981f27573b47af category: main optional: false - name: lz4-c diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index a831f7b891..1dafb41669 100644 --- a/environments/conda-osx-64.lock.yml +++ b/environments/conda-osx-64.lock.yml @@ -67,7 +67,7 @@ dependencies: - libspatialindex=1.9.3=he49afe7_4 - libsqlite=3.44.0=h92b6c6a_0 - libxcb=1.15=hb7f2c08_0 - - libxml2=2.11.5=h3346baf_1 + - libxml2=2.11.6=hc0ae0f7_0 - lz4-c=1.9.4=hf0c8a7f_0 - ncurses=6.4=h93d8f39_2 - nspr=4.35=hea0b92c_0 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index cb25f9bea9..49eec446a7 100644 --- a/environments/conda-osx-arm64.lock.yml +++ b/environments/conda-osx-arm64.lock.yml @@ -68,7 +68,7 @@ dependencies: - libspatialindex=1.9.3=hbdafb3b_4 - libsqlite=3.44.0=h091b4b1_0 - libxcb=1.15=hf346824_0 - - libxml2=2.11.5=h25269f3_1 + - libxml2=2.11.6=h0d0cfa8_0 - lz4-c=1.9.4=hb7217d7_0 - ncurses=6.4=h463b476_2 - nspr=4.35=hb7217d7_0