From aaaabfcc7fdaab92456784dc9bc31548ce8d0939 Mon Sep 17 00:00:00 2001 From: PUDL Bot <74792863+pudlbot@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:25:12 -0600 Subject: [PATCH 1/7] Update conda lockfile for week of 2024-11-18 (#3965) * Bump slackapi/slack-github-action from 1 to 2 Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 1 to 2. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v1...v2) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump codecov/codecov-action from 4 to 5 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update conda-lock.yml and rendered conda environment files. * Re-lock dependencies * Add EIA861 to release notes. Use files instead of file in codecov action. * Update the *other* deprecated parameter too. Whoops. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: zaneselvans <596279+zaneselvans@users.noreply.github.com> Co-authored-by: Zane Selvans --- .github/workflows/build-deploy-pudl.yml | 2 +- .github/workflows/com-dev-notify.yml | 2 +- .github/workflows/pytest.yml | 6 +- docs/release_notes.rst | 5 + environments/conda-linux-64.lock.yml | 24 +- environments/conda-lock.yml | 339 ++++++++++++------------ environments/conda-osx-64.lock.yml | 24 +- environments/conda-osx-arm64.lock.yml | 24 +- 8 files changed, 214 insertions(+), 212 deletions(-) diff --git a/.github/workflows/build-deploy-pudl.yml b/.github/workflows/build-deploy-pudl.yml index 93f3ebea12..0aac42b1dd 100644 --- a/.github/workflows/build-deploy-pudl.yml +++ b/.github/workflows/build-deploy-pudl.yml @@ -163,7 +163,7 @@ jobs: - name: Post to a pudl-deployments channel if: always() id: slack - uses: slackapi/slack-github-action@v1 + uses: slackapi/slack-github-action@v2 with: channel-id: "C03FHB9N0PQ" slack-message: "`${{ env.BUILD_ID }}` build-deploy-pudl status: ${{ (env.SKIP_BUILD == 'true') && 'skipped' || job.status }}\n${{ env.GCS_OUTPUT_BUCKET }}/${{ env.BUILD_ID }}" diff --git a/.github/workflows/com-dev-notify.yml b/.github/workflows/com-dev-notify.yml index f8bc8ec106..95ab2013ad 100644 --- a/.github/workflows/com-dev-notify.yml +++ b/.github/workflows/com-dev-notify.yml @@ -33,7 +33,7 @@ jobs: - name: Post to a Slack channel user isn't a part of Catalyst if: ${{ !steps.is_organization_member.outputs.result }} id: slack - uses: slackapi/slack-github-action@v1.24.0 + uses: slackapi/slack-github-action@v2 with: # Slack channel id, channel name, or user id to post message. diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 269ca66c8a..3ed78be6e7 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -234,13 +234,13 @@ jobs: micromamba run -n coverage coverage combine coverage/*/.coverage micromamba run -n coverage coverage xml --fail-under=0 - name: Upload XML coverage report to CodeCov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: disable_search: true - file: ./coverage.xml + files: ./coverage.xml token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true # optional (default = false) - plugin: noop + plugins: noop verbose: true - name: Display coverage report and ensure it meets required minimum # Required coverage is set in pyproject.toml section [tool.coverage.report] diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 2ae65809f4..f48883681b 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -43,6 +43,11 @@ EIA 860M * Added 2024 EIA 860m data from August, September, and October as part of the Q3 quarterly release. See :issue:`3940` and PR :pr:`3949`. +EIA 861 +~~~~~~~ + +* Added final release EIA 861 data. See :issue:`3905` and PR :pr:`3911`. + EIA Bulk Electricity Data ~~~~~~~~~~~~~~~~~~~~~~~~~ * Updated the EIA Bulk Electricity data to include data published up through diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index 19b0b5534d..e784d93fa7 100644 --- a/environments/conda-linux-64.lock.yml +++ b/environments/conda-linux-64.lock.yml @@ -57,8 +57,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=hef167b5_0 - - boto3=1.35.62=pyhd8ed1ab_0 - - botocore=1.35.62=pyge310_1234567_0 + - boto3=1.35.63=pyhd8ed1ab_0 + - botocore=1.35.63=pyge310_1234567_0 - bottleneck=1.4.2=py312hc0a28a1_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hb9d3cd8_2 @@ -111,7 +111,7 @@ dependencies: - debugpy=1.8.8=py312h2ec8cdc_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - - deprecated=1.2.14=pyh1a96a4e_0 + - deprecated=1.2.15=pyhff2d567_0 - distlib=0.3.9=pyhd8ed1ab_0 - dnspython=2.7.0=pyhff2d567_0 - doc8=1.1.2=pyhd8ed1ab_1 @@ -195,7 +195,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.1=pyha770c72_0 + - hypothesis=6.119.3=pyha770c72_0 - icu=75.1=he02047a_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -236,7 +236,7 @@ dependencies: - jupyter_events=0.10.0=pyhd8ed1ab_0 - jupyter_server=2.14.2=pyhd8ed1ab_0 - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyterlab=4.3.0=pyhd8ed1ab_0 + - jupyterlab=4.3.1=pyhff2d567_0 - jupyterlab-lsp=5.1.0=pyhd8ed1ab_2 - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - jupyterlab_server=2.27.3=pyhd8ed1ab_0 @@ -318,7 +318,7 @@ dependencies: - lxml=5.3.0=py312he28fd5a_2 - lz4-c=1.9.4=hcb278e6_0 - lzo=2.10=hd590300_1001 - - mako=1.3.5=pyhd8ed1ab_0 + - mako=1.3.6=pyhff2d567_0 - mapclassify=2.8.1=pyhd8ed1ab_0 - markdown=3.6=pyhd8ed1ab_0 - markdown-it-py=3.0.0=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.13.5=pyhff2d567_0 + - narwhals=1.14.0=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -350,7 +350,7 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.4.2=pyh267e887_2 - nodeenv=1.9.1=pyhd8ed1ab_0 - - nodejs=22.9.0=hf235a45_0 + - nodejs=22.11.0=hf235a45_0 - nomkl=1.0=h5ca1d4c_0 - notebook=6.5.7=pyha770c72_0 - notebook-shim=0.2.4=pyhd8ed1ab_0 @@ -367,7 +367,7 @@ dependencies: - opentelemetry-semantic-conventions=0.37b0=pyhd8ed1ab_0 - orc=2.0.2=h669347b_0 - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.2=pyhd8ed1ab_0 + - packaging=24.2=pyhff2d567_1 - pandas=2.2.3=py312hf9745cd_1 - pandera-core=0.20.4=pyhd8ed1ab_0 - pandoc=3.5=ha770c72_0 @@ -418,7 +418,7 @@ dependencies: - pygls=1.3.1=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - pygraphviz=1.14=py312h011e53f_0 - - pyjwt=2.9.0=pyhd8ed1ab_1 + - pyjwt=2.10.0=pyhff2d567_0 - pylev=1.4.0=pyhd8ed1ab_0 - pynacl=1.5.0=py312h66e93f0_4 - pyogrio=0.10.0=py312he8b4914_0 @@ -435,7 +435,7 @@ dependencies: - python=3.12.7=hc5c86c4_0_cpython - python-build=1.2.2.post1=pyhff2d567_0 - python-calamine=0.3.1=py312h12e396e_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 + - python-dateutil=2.9.0.post0=pyhff2d567_0 - python-dotenv=1.0.1=pyhd8ed1ab_0 - python-duckdb=1.1.3=py312h2ec8cdc_0 - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 @@ -573,7 +573,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - - yarl=1.17.1=py312h66e93f0_1 + - yarl=1.17.2=py312h66e93f0_0 - zeromq=4.3.5=h3b0a872_7 - zip=3.0=hd590300_3 - zipp=3.21.0=pyhd8ed1ab_0 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index b5aa67abd4..35fb384de7 100644 --- a/environments/conda-lock.yml +++ b/environments/conda-lock.yml @@ -2286,52 +2286,52 @@ package: category: main optional: false - name: boto3 - version: 1.35.62 + version: 1.35.63 manager: conda platform: linux-64 dependencies: - botocore: ">=1.35.62,<1.36.0" + botocore: ">=1.35.63,<1.36.0" jmespath: ">=0.7.1,<2.0.0" python: ">=3.8" s3transfer: ">=0.10.0,<0.11.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.62-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda hash: - md5: f506599c4fcc6d32837f3dd8512a7455 - sha256: 099c2df49f7f9e50cb121b88308b190c611464eb4a2f842bf840a00c354c0a62 + md5: 41ac72c902b3ddfa0764328413a06c7d + sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 category: main optional: false - name: boto3 - version: 1.35.62 + version: 1.35.63 manager: conda platform: osx-64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.62,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.62-pyhd8ed1ab_0.conda + botocore: ">=1.35.63,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda hash: - md5: f506599c4fcc6d32837f3dd8512a7455 - sha256: 099c2df49f7f9e50cb121b88308b190c611464eb4a2f842bf840a00c354c0a62 + md5: 41ac72c902b3ddfa0764328413a06c7d + sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 category: main optional: false - name: boto3 - version: 1.35.62 + version: 1.35.63 manager: conda platform: osx-arm64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.62,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.62-pyhd8ed1ab_0.conda + botocore: ">=1.35.63,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda hash: - md5: f506599c4fcc6d32837f3dd8512a7455 - sha256: 099c2df49f7f9e50cb121b88308b190c611464eb4a2f842bf840a00c354c0a62 + md5: 41ac72c902b3ddfa0764328413a06c7d + sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 category: main optional: false - name: botocore - version: 1.35.62 + version: 1.35.63 manager: conda platform: linux-64 dependencies: @@ -2339,14 +2339,14 @@ package: python: ">=3.10" python-dateutil: ">=2.1,<3.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.62-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda hash: - md5: 3fab8ee950f3ce61342f629099d532df - sha256: e1b315d7f0e2f819a0715db185a6c8a7704b5cbe58f53e191067e19ee15cc4ab + md5: f6ca7743a8eb6a2dd26d82395348eff9 + sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e category: main optional: false - name: botocore - version: 1.35.62 + version: 1.35.63 manager: conda platform: osx-64 dependencies: @@ -2354,14 +2354,14 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.62-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda hash: - md5: 3fab8ee950f3ce61342f629099d532df - sha256: e1b315d7f0e2f819a0715db185a6c8a7704b5cbe58f53e191067e19ee15cc4ab + md5: f6ca7743a8eb6a2dd26d82395348eff9 + sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e category: main optional: false - name: botocore - version: 1.35.62 + version: 1.35.63 manager: conda platform: osx-arm64 dependencies: @@ -2369,10 +2369,10 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.62-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda hash: - md5: 3fab8ee950f3ce61342f629099d532df - sha256: e1b315d7f0e2f819a0715db185a6c8a7704b5cbe58f53e191067e19ee15cc4ab + md5: f6ca7743a8eb6a2dd26d82395348eff9 + sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e category: main optional: false - name: bottleneck @@ -4584,8 +4584,8 @@ package: typing_extensions: ">=4.0.0" click: ">=7.1.1" httpx: ">=0.20" - asgi-csrf: ">=0.9" click-default-group: ">=1.2.3" + asgi-csrf: ">=0.9" itsdangerous: ">=1.1" pluggy: ">=1.0" hupper: ">=1.9" @@ -4616,8 +4616,8 @@ package: typing_extensions: ">=4.0.0" click: ">=7.1.1" httpx: ">=0.20" - asgi-csrf: ">=0.9" click-default-group: ">=1.2.3" + asgi-csrf: ">=0.9" itsdangerous: ">=1.1" pluggy: ">=1.0" hupper: ">=1.9" @@ -4768,42 +4768,42 @@ package: category: main optional: false - name: deprecated - version: 1.2.14 + version: 1.2.15 manager: conda platform: linux-64 dependencies: python: ">=2.7" wrapt: <2,>=1.10 - url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhff2d567_0.conda hash: - md5: 4e4c4236e1ca9bcd8816b921a4805882 - sha256: 8f61539b00ea315c99f8b6f9e2408caa6894593617676741214cc0280e875ca0 + md5: ca75e235b44ab995655fae392f99595e + sha256: 48182a27a8fd855db3a402ed914823802f94c3344c87b0d074facc51411296ee category: main optional: false - name: deprecated - version: 1.2.14 + version: 1.2.15 manager: conda platform: osx-64 dependencies: python: ">=2.7" wrapt: <2,>=1.10 - url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhff2d567_0.conda hash: - md5: 4e4c4236e1ca9bcd8816b921a4805882 - sha256: 8f61539b00ea315c99f8b6f9e2408caa6894593617676741214cc0280e875ca0 + md5: ca75e235b44ab995655fae392f99595e + sha256: 48182a27a8fd855db3a402ed914823802f94c3344c87b0d074facc51411296ee category: main optional: false - name: deprecated - version: 1.2.14 + version: 1.2.15 manager: conda platform: osx-arm64 dependencies: python: ">=2.7" wrapt: <2,>=1.10 - url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhff2d567_0.conda hash: - md5: 4e4c4236e1ca9bcd8816b921a4805882 - sha256: 8f61539b00ea315c99f8b6f9e2408caa6894593617676741214cc0280e875ca0 + md5: ca75e235b44ab995655fae392f99595e + sha256: 48182a27a8fd855db3a402ed914823802f94c3344c87b0d074facc51411296ee category: main optional: false - name: distlib @@ -8467,7 +8467,7 @@ package: category: main optional: false - name: hypothesis - version: 6.119.1 + version: 6.119.3 manager: conda platform: linux-64 dependencies: @@ -8478,14 +8478,14 @@ package: python: ">=3.8" setuptools: "" sortedcontainers: ">=2.1.0,<3.0.0" - url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.3-pyha770c72_0.conda hash: - md5: 2df500b6bb015e8aa9955fb57e6999bf - sha256: 11f35616c90fc68e8aa83dd7dfe4559b5e2812f811b408ef540a41564d0d94c5 + md5: 7e30097443f140d83aa5ff416eb47fce + sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 category: main optional: false - name: hypothesis - version: 6.119.1 + version: 6.119.3 manager: conda platform: osx-64 dependencies: @@ -8496,14 +8496,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.119.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.3-pyha770c72_0.conda hash: - md5: 2df500b6bb015e8aa9955fb57e6999bf - sha256: 11f35616c90fc68e8aa83dd7dfe4559b5e2812f811b408ef540a41564d0d94c5 + md5: 7e30097443f140d83aa5ff416eb47fce + sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 category: main optional: false - name: hypothesis - version: 6.119.1 + version: 6.119.3 manager: conda platform: osx-arm64 dependencies: @@ -8514,10 +8514,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.119.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.3-pyha770c72_0.conda hash: - md5: 2df500b6bb015e8aa9955fb57e6999bf - sha256: 11f35616c90fc68e8aa83dd7dfe4559b5e2812f811b408ef540a41564d0d94c5 + md5: 7e30097443f140d83aa5ff416eb47fce + sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 category: main optional: false - name: icu @@ -10285,14 +10285,13 @@ package: category: main optional: false - name: jupyterlab - version: 4.3.0 + version: 4.3.1 manager: conda platform: linux-64 dependencies: async-lru: ">=1.0.0" httpx: ">=0.25.0" importlib-metadata: ">=4.8.3" - importlib_resources: ">=1.4" ipykernel: ">=6.5.0" jinja2: ">=3.0.3" jupyter-lsp: ">=2.0.0" @@ -10301,32 +10300,31 @@ package: jupyterlab_server: ">=2.27.1,<3" notebook-shim: ">=0.2" packaging: "" - python: ">=3.8" + python: ">=3.9" setuptools: ">=40.1.0" tomli: ">=1.2.2" tornado: ">=6.2.0" traitlets: "" - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.1-pyhff2d567_0.conda hash: - md5: 4e51411b565d07405d7d3245b9a3b8c1 - sha256: a27e5227a11c2ce7b299d02f2f2c99713df4c9bb0e78ddd6cf8ffc6a77593dc2 + md5: b4f3d579fc21a44518d52c52507461b4 + sha256: ff1035eb0020dbaf4e332ef4b81a7068b595dfc57dde3313e9c4a37583772644 category: dev optional: true - name: jupyterlab - version: 4.3.0 + version: 4.3.1 manager: conda platform: osx-64 dependencies: packaging: "" traitlets: "" jupyter_core: "" - python: ">=3.8" + python: ">=3.9" tornado: ">=6.2.0" tomli: ">=1.2.2" jinja2: ">=3.0.3" importlib-metadata: ">=4.8.3" jupyter_server: ">=2.4.0,<3" - importlib_resources: ">=1.4" jupyter-lsp: ">=2.0.0" async-lru: ">=1.0.0" notebook-shim: ">=0.2" @@ -10334,27 +10332,26 @@ package: httpx: ">=0.25.0" jupyterlab_server: ">=2.27.1,<3" ipykernel: ">=6.5.0" - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.1-pyhff2d567_0.conda hash: - md5: 4e51411b565d07405d7d3245b9a3b8c1 - sha256: a27e5227a11c2ce7b299d02f2f2c99713df4c9bb0e78ddd6cf8ffc6a77593dc2 + md5: b4f3d579fc21a44518d52c52507461b4 + sha256: ff1035eb0020dbaf4e332ef4b81a7068b595dfc57dde3313e9c4a37583772644 category: dev optional: true - name: jupyterlab - version: 4.3.0 + version: 4.3.1 manager: conda platform: osx-arm64 dependencies: packaging: "" traitlets: "" jupyter_core: "" - python: ">=3.8" + python: ">=3.9" tornado: ">=6.2.0" tomli: ">=1.2.2" jinja2: ">=3.0.3" importlib-metadata: ">=4.8.3" jupyter_server: ">=2.4.0,<3" - importlib_resources: ">=1.4" jupyter-lsp: ">=2.0.0" async-lru: ">=1.0.0" notebook-shim: ">=0.2" @@ -10362,10 +10359,10 @@ package: httpx: ">=0.25.0" jupyterlab_server: ">=2.27.1,<3" ipykernel: ">=6.5.0" - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.1-pyhff2d567_0.conda hash: - md5: 4e51411b565d07405d7d3245b9a3b8c1 - sha256: a27e5227a11c2ce7b299d02f2f2c99713df4c9bb0e78ddd6cf8ffc6a77593dc2 + md5: b4f3d579fc21a44518d52c52507461b4 + sha256: ff1035eb0020dbaf4e332ef4b81a7068b595dfc57dde3313e9c4a37583772644 category: dev optional: true - name: jupyterlab-lsp @@ -10480,9 +10477,9 @@ package: importlib-metadata: ">=4.8.3" requests: ">=2.31" jupyter_server: ">=1.21,<3" + jsonschema: ">=4.18" babel: ">=2.10" json5: ">=0.9.0" - jsonschema: ">=4.18" url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda hash: md5: af8239bf1ba7e8c69b689f780f653488 @@ -10500,9 +10497,9 @@ package: importlib-metadata: ">=4.8.3" requests: ">=2.31" jupyter_server: ">=1.21,<3" + jsonschema: ">=4.18" babel: ">=2.10" json5: ">=0.9.0" - jsonschema: ">=4.18" url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda hash: md5: af8239bf1ba7e8c69b689f780f653488 @@ -13810,45 +13807,45 @@ package: category: main optional: false - name: mako - version: 1.3.5 + version: 1.3.6 manager: conda platform: linux-64 dependencies: importlib-metadata: "" markupsafe: ">=0.9.2" - python: ">=3.6" - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.6-pyhff2d567_0.conda hash: - md5: 29fddbfa0e2361636a98de4f46ead2ac - sha256: f0b982e18e31ad373dd8f22ef5ffa0ae112fc13c573a5eb614814b4081c3ddcb + md5: bcd0b2d006b1d1b3725a9fa0ad4243f0 + sha256: 58d87748483313d271835db14e136a1f1138e79a30cd726aaeaf949b51a25a93 category: main optional: false - name: mako - version: 1.3.5 + version: 1.3.6 manager: conda platform: osx-64 dependencies: importlib-metadata: "" - python: ">=3.6" + python: ">=3.9" markupsafe: ">=0.9.2" - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.6-pyhff2d567_0.conda hash: - md5: 29fddbfa0e2361636a98de4f46ead2ac - sha256: f0b982e18e31ad373dd8f22ef5ffa0ae112fc13c573a5eb614814b4081c3ddcb + md5: bcd0b2d006b1d1b3725a9fa0ad4243f0 + sha256: 58d87748483313d271835db14e136a1f1138e79a30cd726aaeaf949b51a25a93 category: main optional: false - name: mako - version: 1.3.5 + version: 1.3.6 manager: conda platform: osx-arm64 dependencies: importlib-metadata: "" - python: ">=3.6" + python: ">=3.9" markupsafe: ">=0.9.2" - url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mako-1.3.6-pyhff2d567_0.conda hash: - md5: 29fddbfa0e2361636a98de4f46ead2ac - sha256: f0b982e18e31ad373dd8f22ef5ffa0ae112fc13c573a5eb614814b4081c3ddcb + md5: bcd0b2d006b1d1b3725a9fa0ad4243f0 + sha256: 58d87748483313d271835db14e136a1f1138e79a30cd726aaeaf949b51a25a93 category: main optional: false - name: mapclassify @@ -14803,39 +14800,39 @@ package: category: main optional: false - name: narwhals - version: 1.13.5 + version: 1.14.0 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.13.5-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda hash: - md5: 4a7235fac3384d4aee1c3f75b04271b3 - sha256: 1c58786f25fd5ed5ca6ffdb20ecb2b9ad97799ba295234a37f4bd8230f025d4b + md5: dc78d38bb510dc63524b17cdd1ef3e99 + sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 category: main optional: false - name: narwhals - version: 1.13.5 + version: 1.14.0 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.13.5-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda hash: - md5: 4a7235fac3384d4aee1c3f75b04271b3 - sha256: 1c58786f25fd5ed5ca6ffdb20ecb2b9ad97799ba295234a37f4bd8230f025d4b + md5: dc78d38bb510dc63524b17cdd1ef3e99 + sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 category: main optional: false - name: narwhals - version: 1.13.5 + version: 1.14.0 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.13.5-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda hash: - md5: 4a7235fac3384d4aee1c3f75b04271b3 - sha256: 1c58786f25fd5ed5ca6ffdb20ecb2b9ad97799ba295234a37f4bd8230f025d4b + md5: dc78d38bb510dc63524b17cdd1ef3e99 + sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 category: main optional: false - name: nbclassic @@ -15293,7 +15290,7 @@ package: category: main optional: false - name: nodejs - version: 22.9.0 + version: 22.11.0 manager: conda platform: linux-64 dependencies: @@ -15301,50 +15298,50 @@ package: icu: ">=75.1,<76.0a0" libgcc: ">=13" libstdcxx: ">=13" - libuv: ">=1.48.0,<2.0a0" + libuv: ">=1.49.2,<2.0a0" libzlib: ">=1.3.1,<2.0a0" - openssl: ">=3.3.2,<4.0a0" + openssl: ">=3.4.0,<4.0a0" zlib: "" - url: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.11.0-hf235a45_0.conda hash: - md5: 40255c9ffb722d614b02ca7aaee6abcb - sha256: 1bc6445b7ecb3bff478d5a11eb3504e45eb5a3cdde24c6ec7339f80c193d24c8 + md5: 64cd0bde7dffac5baa4d9fb0ac3ae713 + sha256: b90c26267d12d5dd97ef09b4393235be3a3cbe5eef07c5a2ada4230623f0b0b1 category: main optional: false - name: nodejs - version: 22.9.0 + version: 22.11.0 manager: conda platform: osx-64 dependencies: __osx: ">=10.15" icu: ">=75.1,<76.0a0" - libcxx: ">=17" - libuv: ">=1.48.0,<2.0a0" + libcxx: ">=18" + libuv: ">=1.49.2,<2.0a0" libzlib: ">=1.3.1,<2.0a0" - openssl: ">=3.3.2,<4.0a0" + openssl: ">=3.4.0,<4.0a0" zlib: "" - url: https://conda.anaconda.org/conda-forge/osx-64/nodejs-22.9.0-hd71786a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/nodejs-22.11.0-hf4117ec_0.conda hash: - md5: 0302658eb45c23a7438415bf0ba7541d - sha256: 072cc60a3bad30e5dc4a0f9773d655b1ccd73766ca56d7b0eba54f07dc65c096 + md5: 076c12f64b455b71958dfdfdcd6b6d96 + sha256: d86709c3c2e2a58331b1642bab314b22d030e3d8738e19429f967d3ab0314604 category: main optional: false - name: nodejs - version: 22.9.0 + version: 22.11.0 manager: conda platform: osx-arm64 dependencies: __osx: ">=11.0" icu: ">=75.1,<76.0a0" - libcxx: ">=17" - libuv: ">=1.48.0,<2.0a0" + libcxx: ">=18" + libuv: ">=1.49.2,<2.0a0" libzlib: ">=1.3.1,<2.0a0" - openssl: ">=3.3.2,<4.0a0" + openssl: ">=3.4.0,<4.0a0" zlib: "" - url: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.11.0-haa7c7e9_0.conda hash: - md5: 3771a3a6abe5a8db8910d5ebf144811b - sha256: 736a4738aba32a03401aa25c8f740e4afe4aea02bc06651b59b06f0fdc024fdf + md5: 34da600f0addaef949d28953e23482b4 + sha256: 304a2bf558f262a8e29f6b6abcc5fabde3b31d903bc699381b1b57f41e7c34d0 category: main optional: false - name: nomkl @@ -16091,10 +16088,10 @@ package: platform: linux-64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhff2d567_1.conda hash: - md5: c16469afe1ec91aaafcf4bea966c0465 - sha256: 0f8273bf66c2a5c1de72312a509deae07f163bb0ae8de8273c52e6fe945a0850 + md5: 8508b703977f4c4ada34d657d051972c + sha256: 74843f871e5cd8a1baf5ed8c406c571139c287141efe532f8ffbdafa3664d244 category: main optional: false - name: packaging @@ -16103,10 +16100,10 @@ package: platform: osx-64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhff2d567_1.conda hash: - md5: c16469afe1ec91aaafcf4bea966c0465 - sha256: 0f8273bf66c2a5c1de72312a509deae07f163bb0ae8de8273c52e6fe945a0850 + md5: 8508b703977f4c4ada34d657d051972c + sha256: 74843f871e5cd8a1baf5ed8c406c571139c287141efe532f8ffbdafa3664d244 category: main optional: false - name: packaging @@ -16115,10 +16112,10 @@ package: platform: osx-arm64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhff2d567_1.conda hash: - md5: c16469afe1ec91aaafcf4bea966c0465 - sha256: 0f8273bf66c2a5c1de72312a509deae07f163bb0ae8de8273c52e6fe945a0850 + md5: 8508b703977f4c4ada34d657d051972c + sha256: 74843f871e5cd8a1baf5ed8c406c571139c287141efe532f8ffbdafa3664d244 category: main optional: false - name: pandas @@ -18261,39 +18258,39 @@ package: category: dev optional: true - name: pyjwt - version: 2.9.0 + version: 2.10.0 manager: conda platform: linux-64 dependencies: - python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.0-pyhff2d567_0.conda hash: - md5: 5ba575830ec18d5c51c59f403310e2c7 - sha256: b6f47cd0737cb1f5aca10be771641466ec1a3be585382d44877140eb2cb2dd46 + md5: ae45081e9e726f978c514ae1977bd1fb + sha256: 49a20637a285f7c9acb2064b91d8c63bce5821f007598cfa64e3913ed4264354 category: main optional: false - name: pyjwt - version: 2.9.0 + version: 2.10.0 manager: conda platform: osx-64 dependencies: - python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.0-pyhff2d567_0.conda hash: - md5: 5ba575830ec18d5c51c59f403310e2c7 - sha256: b6f47cd0737cb1f5aca10be771641466ec1a3be585382d44877140eb2cb2dd46 + md5: ae45081e9e726f978c514ae1977bd1fb + sha256: 49a20637a285f7c9acb2064b91d8c63bce5821f007598cfa64e3913ed4264354 category: main optional: false - name: pyjwt - version: 2.9.0 + version: 2.10.0 manager: conda platform: osx-arm64 dependencies: - python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.9.0-pyhd8ed1ab_1.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.0-pyhff2d567_0.conda hash: - md5: 5ba575830ec18d5c51c59f403310e2c7 - sha256: b6f47cd0737cb1f5aca10be771641466ec1a3be585382d44877140eb2cb2dd46 + md5: ae45081e9e726f978c514ae1977bd1fb + sha256: 49a20637a285f7c9acb2064b91d8c63bce5821f007598cfa64e3913ed4264354 category: main optional: false - name: pylev @@ -19099,42 +19096,42 @@ package: category: main optional: false - name: python-dateutil - version: 2.9.0 + version: 2.9.0.post0 manager: conda platform: linux-64 dependencies: - python: ">=3.7" + python: ">=3.9" six: ">=1.5" - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_0.conda hash: - md5: 2cf4264fffb9e6eff6031c5b6884d61c - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: b6dfd90a2141e573e4b6a81630b56df5 + sha256: 3888012c5916efaef45d503e3e544bbcc571b84426c1bb9577799ada9efefb54 category: main optional: false - name: python-dateutil - version: 2.9.0 + version: 2.9.0.post0 manager: conda platform: osx-64 dependencies: - python: ">=3.7" + python: ">=3.9" six: ">=1.5" - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_0.conda hash: - md5: 2cf4264fffb9e6eff6031c5b6884d61c - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: b6dfd90a2141e573e4b6a81630b56df5 + sha256: 3888012c5916efaef45d503e3e544bbcc571b84426c1bb9577799ada9efefb54 category: main optional: false - name: python-dateutil - version: 2.9.0 + version: 2.9.0.post0 manager: conda platform: osx-arm64 dependencies: - python: ">=3.7" + python: ">=3.9" six: ">=1.5" - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_0.conda hash: - md5: 2cf4264fffb9e6eff6031c5b6884d61c - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: b6dfd90a2141e573e4b6a81630b56df5 + sha256: 3888012c5916efaef45d503e3e544bbcc571b84426c1bb9577799ada9efefb54 category: main optional: false - name: python-dotenv @@ -24510,7 +24507,7 @@ package: category: main optional: false - name: yarl - version: 1.17.1 + version: 1.17.2 manager: conda platform: linux-64 dependencies: @@ -24521,14 +24518,14 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.17.1-py312h66e93f0_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.17.2-py312h66e93f0_0.conda hash: - md5: ec87a401644dafa3887b268e100cd8b0 - sha256: b0addeacbe45e5ed148ec3b61cab0298dab1a6a244daf7bbb6c1fac052f955b2 + md5: 99518ade67138dcce4f2751b47ab5b00 + sha256: 4e870938d29f38cd2aa43247efff6f99f6ecd8973735509122cd3167ccc22add category: main optional: false - name: yarl - version: 1.17.1 + version: 1.17.2 manager: conda platform: osx-64 dependencies: @@ -24538,14 +24535,14 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.17.1-py312h01d7ebd_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.17.2-py312h01d7ebd_0.conda hash: - md5: d07fb6b3b4160580cbc244289a415c36 - sha256: aa6e140f6d9c0e225d2845fbdc2a49101a24b76c4d4899a95adf7838eb777124 + md5: 18f8e01081e8f87d09c159912a15bc74 + sha256: 61b286071ad6485fffc540fe0bee33dff26af7b40d15de94ed098496bc92ae30 category: main optional: false - name: yarl - version: 1.17.1 + version: 1.17.2 manager: conda platform: osx-arm64 dependencies: @@ -24555,10 +24552,10 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.17.1-py312hea69d52_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.17.2-py312hea69d52_0.conda hash: - md5: 64b70173136092b3b6b07c8d27e3f8fb - sha256: 3530756352b69d5fb689080b5902420e6336c42b7df2f56635520d09a8bc6f51 + md5: e3d4600d565bac01340b12d3c4cba2b2 + sha256: 43d85ffae29642b81e1ef4191560a7700911f3753078ab23248b8275952abcec category: main optional: false - name: zeromq diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index a1332ddaa8..2ba8ee1a95 100644 --- a/environments/conda-osx-64.lock.yml +++ b/environments/conda-osx-64.lock.yml @@ -56,8 +56,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h7d75f6d_0 - - boto3=1.35.62=pyhd8ed1ab_0 - - botocore=1.35.62=pyge310_1234567_0 + - boto3=1.35.63=pyhd8ed1ab_0 + - botocore=1.35.63=pyge310_1234567_0 - bottleneck=1.4.2=py312h59f7578_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=h00291cd_2 @@ -109,7 +109,7 @@ dependencies: - debugpy=1.8.8=py312haafddd8_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - - deprecated=1.2.14=pyh1a96a4e_0 + - deprecated=1.2.15=pyhff2d567_0 - distlib=0.3.9=pyhd8ed1ab_0 - dnspython=2.7.0=pyhff2d567_0 - doc8=1.1.2=pyhd8ed1ab_1 @@ -192,7 +192,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.1=pyha770c72_0 + - hypothesis=6.119.3=pyha770c72_0 - icu=75.1=h120a0e1_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -232,7 +232,7 @@ dependencies: - jupyter_events=0.10.0=pyhd8ed1ab_0 - jupyter_server=2.14.2=pyhd8ed1ab_0 - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyterlab=4.3.0=pyhd8ed1ab_0 + - jupyterlab=4.3.1=pyhff2d567_0 - jupyterlab-lsp=5.1.0=pyhd8ed1ab_2 - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - jupyterlab_server=2.27.3=pyhd8ed1ab_0 @@ -307,7 +307,7 @@ dependencies: - lxml=5.3.0=py312h4feaf87_2 - lz4-c=1.9.4=hf0c8a7f_0 - lzo=2.10=h10d778d_1001 - - mako=1.3.5=pyhd8ed1ab_0 + - mako=1.3.6=pyhff2d567_0 - mapclassify=2.8.1=pyhd8ed1ab_0 - markdown=3.6=pyhd8ed1ab_0 - markdown-it-py=3.0.0=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.13.5=pyhff2d567_0 + - narwhals=1.14.0=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -339,7 +339,7 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.4.2=pyh267e887_2 - nodeenv=1.9.1=pyhd8ed1ab_0 - - nodejs=22.9.0=hd71786a_0 + - nodejs=22.11.0=hf4117ec_0 - notebook=6.5.7=pyha770c72_0 - notebook-shim=0.2.4=pyhd8ed1ab_0 - numba=0.60.0=py312hc3b515d_0 @@ -355,7 +355,7 @@ dependencies: - opentelemetry-semantic-conventions=0.37b0=pyhd8ed1ab_0 - orc=2.0.2=h22b2039_0 - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.2=pyhd8ed1ab_0 + - packaging=24.2=pyhff2d567_1 - pandas=2.2.3=py312h98e817e_1 - pandera-core=0.20.4=pyhd8ed1ab_0 - pandoc=3.5=h694c41f_0 @@ -406,7 +406,7 @@ dependencies: - pygls=1.3.1=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - pygraphviz=1.14=py312hc79309e_0 - - pyjwt=2.9.0=pyhd8ed1ab_1 + - pyjwt=2.10.0=pyhff2d567_0 - pylev=1.4.0=pyhd8ed1ab_0 - pynacl=1.5.0=py312hb553811_4 - pyobjc-core=10.3.1=py312hab44e94_1 @@ -425,7 +425,7 @@ dependencies: - python=3.12.7=h8f8b54e_0_cpython - python-build=1.2.2.post1=pyhff2d567_0 - python-calamine=0.3.1=py312h0d0de52_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 + - python-dateutil=2.9.0.post0=pyhff2d567_0 - python-dotenv=1.0.1=pyhd8ed1ab_0 - python-duckdb=1.1.3=py312haafddd8_0 - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 @@ -555,7 +555,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - - yarl=1.17.1=py312h01d7ebd_1 + - yarl=1.17.2=py312h01d7ebd_0 - zeromq=4.3.5=h7130eaa_7 - zip=3.0=h0dc2134_3 - zipp=3.21.0=pyhd8ed1ab_0 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index 330808fc9d..37b8315f52 100644 --- a/environments/conda-osx-arm64.lock.yml +++ b/environments/conda-osx-arm64.lock.yml @@ -56,8 +56,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h5499902_0 - - boto3=1.35.62=pyhd8ed1ab_0 - - botocore=1.35.62=pyge310_1234567_0 + - boto3=1.35.63=pyhd8ed1ab_0 + - botocore=1.35.63=pyge310_1234567_0 - bottleneck=1.4.2=py312h147345f_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hd74edd7_2 @@ -109,7 +109,7 @@ dependencies: - debugpy=1.8.8=py312hd8f9ff3_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - - deprecated=1.2.14=pyh1a96a4e_0 + - deprecated=1.2.15=pyhff2d567_0 - distlib=0.3.9=pyhd8ed1ab_0 - dnspython=2.7.0=pyhff2d567_0 - doc8=1.1.2=pyhd8ed1ab_1 @@ -192,7 +192,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.1=pyha770c72_0 + - hypothesis=6.119.3=pyha770c72_0 - icu=75.1=hfee45f7_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -232,7 +232,7 @@ dependencies: - jupyter_events=0.10.0=pyhd8ed1ab_0 - jupyter_server=2.14.2=pyhd8ed1ab_0 - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyterlab=4.3.0=pyhd8ed1ab_0 + - jupyterlab=4.3.1=pyhff2d567_0 - jupyterlab-lsp=5.1.0=pyhd8ed1ab_2 - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - jupyterlab_server=2.27.3=pyhd8ed1ab_0 @@ -307,7 +307,7 @@ dependencies: - lxml=5.3.0=py312ha59c1f6_2 - lz4-c=1.9.4=hb7217d7_0 - lzo=2.10=h93a5062_1001 - - mako=1.3.5=pyhd8ed1ab_0 + - mako=1.3.6=pyhff2d567_0 - mapclassify=2.8.1=pyhd8ed1ab_0 - markdown=3.6=pyhd8ed1ab_0 - markdown-it-py=3.0.0=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.13.5=pyhff2d567_0 + - narwhals=1.14.0=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -339,7 +339,7 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.4.2=pyh267e887_2 - nodeenv=1.9.1=pyhd8ed1ab_0 - - nodejs=22.9.0=h08fde81_0 + - nodejs=22.11.0=haa7c7e9_0 - notebook=6.5.7=pyha770c72_0 - notebook-shim=0.2.4=pyhd8ed1ab_0 - numba=0.60.0=py312h41cea2d_0 @@ -355,7 +355,7 @@ dependencies: - opentelemetry-semantic-conventions=0.37b0=pyhd8ed1ab_0 - orc=2.0.2=h75dedd0_0 - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.2=pyhd8ed1ab_0 + - packaging=24.2=pyhff2d567_1 - pandas=2.2.3=py312hcd31e36_1 - pandera-core=0.20.4=pyhd8ed1ab_0 - pandoc=3.5=hce30654_0 @@ -406,7 +406,7 @@ dependencies: - pygls=1.3.1=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - pygraphviz=1.14=py312h1fbede1_0 - - pyjwt=2.9.0=pyhd8ed1ab_1 + - pyjwt=2.10.0=pyhff2d567_0 - pylev=1.4.0=pyhd8ed1ab_0 - pynacl=1.5.0=py312h024a12e_4 - pyobjc-core=10.3.1=py312hd24fc31_1 @@ -425,7 +425,7 @@ dependencies: - python=3.12.7=h739c21a_0_cpython - python-build=1.2.2.post1=pyhff2d567_0 - python-calamine=0.3.1=py312hcd83bfe_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 + - python-dateutil=2.9.0.post0=pyhff2d567_0 - python-dotenv=1.0.1=pyhd8ed1ab_0 - python-duckdb=1.1.3=py312hd8f9ff3_0 - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 @@ -555,7 +555,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h57fd34a_0 - yaml=0.2.5=h3422bc3_2 - - yarl=1.17.1=py312hea69d52_1 + - yarl=1.17.2=py312hea69d52_0 - zeromq=4.3.5=hc1bb282_7 - zip=3.0=hb547adb_3 - zipp=3.21.0=pyhd8ed1ab_0 From f3cdf14e546b06c464eeed3007fa15a4ce0fabdf Mon Sep 17 00:00:00 2001 From: Zane Selvans Date: Tue, 19 Nov 2024 19:38:50 -0600 Subject: [PATCH 2/7] Clean up some nightly build infrastructure cruft (#3962) * Bump docker container to mamba v2.0.3 * Warn against using nightly build outputs directly for Zenodo. * Remove obsolete refs to GCE_INSTANCE in nightly build workflow. * Update RTD backend link to new interface. * Update nightly build docs to reflect use of Google Batch. * Bump a couple of non-python dependency versions. * Simplify nightly/stable/workflow_dispatch logic in nightly build script. * Make VCE RARE row count asset check non-blocking for fast ETL testing * Add test distribution of parquet and other outputs. * Use BUILD_ID as test distribution path to ensure uniqueness. * Discontinue parquet distribution. Remove test distribution files. * Remove AWS CLI commands and use gcloud storage instead. * Add AWS credentials from envvars * Create ~/.aws directory before attempting to write credentials * Remove dangling && from now separate commands in build script. * Remove AWS S3 access test. * Don't && the removal of existing paths, in case it isn't there. * Fix source path for AWS S3 distribution. * Remove all testing shortcuts and revert to FULL ETL. * Remove unnecessary copy_to_dist_path function * Use more specific verstion tag matching pattern. * Use more specific version tag matching pattern. * Remove unnecessary conditional in stable deployment * Use more generous timeouts/retries in Zenodo data release script * Relock dependencies. * Switch to new Slack GitHub Action syntax. * Switch to using postgres 17 and fast ETL to run a quick test deployment. * Use postgres 16 since 17 isn't yet available in our Docker image sources. * Update comment about postgres version. * Use Ubuntu 24.04 micromamba image. * Go back to doing full ETL after Postgres 16 test. * Re-lock dependencies * Remove jq, use envvar for PG_VERSION, test fast ETL. * Add a little workflow to test pattern matching. * Fix typo in regex-test workflow. * Use a more restrictive tag matching pattern. * Use a more specific tag pattern to trigger data releases. * Revert to a simple version tag pattern v20* * revert to running full ETL. * Relock dependencies --- .github/ISSUE_TEMPLATE/versioned_release.md | 2 +- .github/workflows/build-deploy-pudl.yml | 24 +- devtools/zenodo/zenodo_data_release.py | 29 +- docker/Dockerfile | 19 +- docker/gcp_pudl_etl.sh | 237 +++++++------ docs/dev/nightly_data_builds.rst | 211 ++++-------- environments/conda-linux-64.lock.yml | 25 +- environments/conda-lock.yml | 360 +++++++++----------- environments/conda-osx-64.lock.yml | 27 +- environments/conda-osx-arm64.lock.yml | 27 +- pyproject.toml | 4 +- 11 files changed, 419 insertions(+), 546 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/versioned_release.md b/.github/ISSUE_TEMPLATE/versioned_release.md index 54e34be01a..5736ac5dc1 100644 --- a/.github/ISSUE_TEMPLATE/versioned_release.md +++ b/.github/ISSUE_TEMPLATE/versioned_release.md @@ -24,7 +24,7 @@ assignees: "" - [ ] Verify [`catalystcoop.pudl` PyPI (software) release](https://pypi.org/project/catalystcoop.pudl/) - [ ] Verify that [PUDL repo archive on Zenodo](https://zenodo.org/doi/10.5281/zenodo.3404014) has been updated w/ new version - [ ] Wait 6-10 hours for a successful build to complete -- [ ] Activate new version on the [RTD admin panel](https://readthedocs.org/projects/catalystcoop-pudl/versions/) and verify that it builds successfully. +- [ ] Activate new version on the [RTD admin panel](https://app.readthedocs.org/projects/catalystcoop-pudl/) and verify that it builds successfully. - [ ] Verify that `stable` and the version tag point at same git ref - [ ] Verify that [`stable` docs on RTD](https://catalystcoop-pudl.readthedocs.io/en/stable/) have been updated - [ ] Verify `gs://pudl.catalyst.coop/vYYYY.M.x` has the new expected data. diff --git a/.github/workflows/build-deploy-pudl.yml b/.github/workflows/build-deploy-pudl.yml index 0aac42b1dd..6c74eae2b2 100644 --- a/.github/workflows/build-deploy-pudl.yml +++ b/.github/workflows/build-deploy-pudl.yml @@ -1,3 +1,4 @@ +--- name: build-deploy-pudl on: workflow_dispatch: @@ -11,8 +12,6 @@ on: env: GCP_BILLING_PROJECT: ${{ secrets.GCP_BILLING_PROJECT }} - GCE_INSTANCE: pudl-deployment-tag # This is changed to pudl-deployment-dev if running on a schedule - GCE_INSTANCE_ZONE: ${{ secrets.GCE_INSTANCE_ZONE }} GCS_OUTPUT_BUCKET: gs://builds.catalyst.coop BATCH_JOB_JSON: batch_job.json @@ -24,12 +23,6 @@ jobs: contents: write id-token: write steps: - - name: Use pudl-deployment-dev vm if running on a schedule - if: ${{ (github.event_name == 'schedule') }} - run: | - echo "This action was triggered by a schedule." - echo "GCE_INSTANCE=pudl-deployment-dev" >> $GITHUB_ENV - - name: Checkout Repository uses: actions/checkout@v4 with: @@ -56,7 +49,6 @@ jobs: - name: Show freshly set envvars if: ${{ env.SKIP_BUILD != 'true' }} run: | - echo "GCE_INSTANCE: $GCE_INSTANCE" echo "NIGHTLY_TAG: $NIGHTLY_TAG" echo "BUILD_ID: $BUILD_ID" echo "BATCH_JOB_ID: $BATCH_JOB_ID" @@ -140,8 +132,6 @@ jobs: --container-env BUILD_ID=${{ env.BUILD_ID }} \ --container-env BUILD_REF=${{ github.ref_name }} \ --container-env FLY_ACCESS_TOKEN=${{ secrets.FLY_ACCESS_TOKEN }} \ - --container-env GCE_INSTANCE=${{ env.GCE_INSTANCE }} \ - --container-env GCE_INSTANCE_ZONE=${{ env.GCE_INSTANCE_ZONE }} \ --container-env GCP_BILLING_PROJECT=${{ secrets.GCP_BILLING_PROJECT }} \ --container-env GITHUB_ACTION_TRIGGER=${{ github.event_name }} \ --container-env NIGHTLY_TAG=${{ env.NIGHTLY_TAG }} \ @@ -160,13 +150,13 @@ jobs: if: ${{ env.SKIP_BUILD != 'true' }} run: gcloud batch jobs submit run-etl-${{ env.BATCH_JOB_ID }} --config ${{ env.BATCH_JOB_JSON }} --location us-west1 - - name: Post to a pudl-deployments channel + - name: Post to pudl-deployments channel if: always() id: slack uses: slackapi/slack-github-action@v2 with: - channel-id: "C03FHB9N0PQ" - slack-message: "`${{ env.BUILD_ID }}` build-deploy-pudl status: ${{ (env.SKIP_BUILD == 'true') && 'skipped' || job.status }}\n${{ env.GCS_OUTPUT_BUCKET }}/${{ env.BUILD_ID }}" - env: - channel-id: "C03FHB9N0PQ" - SLACK_BOT_TOKEN: ${{ secrets.PUDL_DEPLOY_SLACK_TOKEN }} + method: chat.postMessage + token: ${{ secrets.PUDL_DEPLOY_SLACK_TOKEN }} + payload: | + text: "`${{ env.BUILD_ID }}` build-deploy-pudl status: ${{ (env.SKIP_BUILD == 'true') && 'skipped' || job.status }}\n${{ env.GCS_OUTPUT_BUCKET }}/${{ env.BUILD_ID }}" + channel: "C03FHB9N0PQ" diff --git a/devtools/zenodo/zenodo_data_release.py b/devtools/zenodo/zenodo_data_release.py index 57861d767a..0cbd761d9c 100755 --- a/devtools/zenodo/zenodo_data_release.py +++ b/devtools/zenodo/zenodo_data_release.py @@ -87,24 +87,26 @@ def __init__(self, env: str): logger.info(f"Using Zenodo token: {token[:4]}...{token[-4:]}") - def retry_request(self, *, method, url, max_tries=5, timeout=5, **kwargs): + def retry_request(self, *, method, url, max_tries=6, timeout=2, **kwargs): """Wrap requests.request in retry logic. Passes method, url, and **kwargs to requests.request. """ - base_timeout = 2 for try_num in range(1, max_tries): try: return requests.request( - method=method, url=url, timeout=timeout, **kwargs + method=method, url=url, timeout=timeout**try_num, **kwargs ) except requests.RequestException as e: - timeout = base_timeout**try_num - logger.warning(f"Attempt #{try_num} Got {e}, retrying in {timeout} s") - time.sleep(timeout) + logger.warning( + f"Attempt #{try_num} Got {e}, retrying in {timeout**try_num} s" + ) + time.sleep(timeout**try_num) # don't catch errors on the last try. - return requests.request(method=method, url=url, timeout=timeout, **kwargs) + return requests.request( + method=method, url=url, timeout=timeout**max_tries, **kwargs + ) def get_deposition(self, deposition_id: int) -> _LegacyDeposition: """LEGACY API: Get JSON describing a deposition. @@ -115,7 +117,6 @@ def get_deposition(self, deposition_id: int) -> _LegacyDeposition: method="GET", url=f"{self.base_url}/deposit/depositions/{deposition_id}", headers=self.auth_headers, - timeout=5, ) logger.debug( f"License from JSON for {deposition_id} is " @@ -132,7 +133,6 @@ def get_record(self, record_id: int) -> _NewRecord: method="GET", url=f"{self.base_url}/records/{record_id}", headers=self.auth_headers, - timeout=5, ) return _NewRecord(**response.json()) @@ -146,7 +146,6 @@ def new_record_version(self, record_id: int) -> _NewRecord: method="POST", url=f"{self.base_url}/records/{record_id}/versions", headers=self.auth_headers, - timeout=5, ) return _NewRecord(**response.json()) @@ -162,7 +161,7 @@ def update_deposition_metadata( data = {"metadata": metadata.model_dump()} logger.debug(f"Setting metadata for {deposition_id} to {data}") response = self.retry_request( - method="PUT", url=url, json=data, headers=self.auth_headers, timeout=5 + method="PUT", url=url, json=data, headers=self.auth_headers ) return _LegacyDeposition(**response.json()) @@ -175,7 +174,6 @@ def delete_deposition_file(self, deposition_id: int, file_id) -> requests.Respon method="DELETE", url=f"{self.base_url}/deposit/depositions/{deposition_id}/files/{file_id}", headers=self.auth_headers, - timeout=5, ) def create_bucket_file( @@ -196,7 +194,6 @@ def create_bucket_file( url=url, headers=self.auth_headers, data=file_content, - timeout=5, ) return response @@ -206,7 +203,6 @@ def publish_deposition(self, deposition_id: int) -> _LegacyDeposition: method="POST", url=f"{self.base_url}/deposit/depositions/{deposition_id}/actions/publish", headers=self.auth_headers, - timeout=5, ) return _LegacyDeposition(**response.json()) @@ -375,7 +371,10 @@ def get_html_url(self): required=True, help="Path to a directory whose contents will be uploaded to Zenodo. " "Subdirectories are ignored. Can get files from GCS as well - just prefix " - "with gs://.", + "with gs://. NOTE: nightly build outputs are NOT suitable for creating a Zenodo " + "data release, as they include hundreds of individual Parquet files, which we " + "archive on Zenodo as a single zipfile. Check what files should actually be " + "distributed. E.g. it may be *.log *.zip *.json ", ) @click.option( "--publish/--no-publish", diff --git a/docker/Dockerfile b/docker/Dockerfile index 0009a70167..156006cd32 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM mambaorg/micromamba:2.0.2 +FROM mambaorg/micromamba:2.0.3-ubuntu24.04 ENV CONTAINER_HOME=/home/$MAMBA_USER ENV PGDATA=${CONTAINER_HOME}/pgdata @@ -8,10 +8,9 @@ USER root SHELL [ "/bin/bash", "-exo", "pipefail", "-c" ] # Install some linux packages -# awscli requires unzip, less, groff and mandoc # hadolint ignore=DL3008 RUN apt-get update && \ - apt-get install --no-install-recommends -y git jq unzip less groff mandoc postgresql && \ + apt-get install --no-install-recommends -y git postgresql && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* @@ -23,10 +22,13 @@ RUN printf '[GoogleCompute]\nservice_account = default' > /etc/boto.cfg # hadolint ignore=DL3059 RUN usermod -aG postgres "$MAMBA_USER" +# We use an enviroment variable to set the Postgres version because it is also used in +# the nightly build script and this makes it easier to ensure they are all the same. +# Remember to bump the Postgres version. Postgres 17 was released in September, 2024. +ENV PG_VERSION=16 # Create new cluster for Dagster usage that's owned by $MAMBA_USER. -# When the PG major version changes we'll have to update this from 15 to 16 # hadolint ignore=DL3059 -RUN pg_createcluster 15 dagster -u "$MAMBA_USER" -- -A trust +RUN pg_createcluster ${PG_VERSION} dagster -u "$MAMBA_USER" -- -A trust # Switch back to being non-root user and get into the home directory USER $MAMBA_USER @@ -62,13 +64,6 @@ COPY --chown=${MAMBA_USER}:${MAMBA_USER} . ${PUDL_REPO} ENV LD_LIBRARY_PATH=${CONDA_PREFIX}/lib RUN ${CONDA_RUN} pip install --no-cache-dir --no-deps --editable ${PUDL_REPO} -# Install awscli2 -# Change back to root because the install script needs access to /usr/local/aws-cli -# curl commands run within conda environment because curl is installed by conda. -USER root -RUN ${CONDA_RUN} bash -c 'curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && unzip awscliv2.zip && ./aws/install' -USER $MAMBA_USER - # Install flyctl # hadolint ignore=DL3059 RUN ${CONDA_RUN} bash -c 'curl -L https://fly.io/install.sh | sh' diff --git a/docker/gcp_pudl_etl.sh b/docker/gcp_pudl_etl.sh index 7a9b79e9e1..192e7cc540 100644 --- a/docker/gcp_pudl_etl.sh +++ b/docker/gcp_pudl_etl.sh @@ -2,8 +2,6 @@ # This script runs the entire ETL and validation tests in a docker container on a Google Compute Engine instance. # This script won't work locally because it needs adequate GCP permissions. -LOGFILE="${PUDL_OUTPUT}/${BUILD_ID}-pudl-etl.log" - function send_slack_msg() { echo "sending Slack message" curl -X POST -H "Content-type: application/json" -H "Authorization: Bearer ${SLACK_TOKEN}" https://slack.com/api/chat.postMessage --data "{\"channel\": \"C03FHB9N0PQ\", \"text\": \"$1\"}" @@ -30,9 +28,7 @@ function initialize_postgres() { # 3. tell it to actually fail when we mess up, instead of continuing blithely # 4. create a *dagster* user, whose creds correspond with those in docker/dagster.yaml # 5. make a database for dagster, which is owned by the dagster user - # - # When the PG major version changes we'll have to update this from 15 to 16 - pg_ctlcluster 15 dagster start && \ + pg_ctlcluster "$PG_VERSION" dagster start && \ createdb -h127.0.0.1 -p5433 && \ psql -v "ON_ERROR_STOP=1" -h127.0.0.1 -p5433 && \ psql -c "CREATE USER dagster WITH SUPERUSER PASSWORD 'dagster_password'" -h127.0.0.1 -p5433 && \ @@ -75,72 +71,42 @@ function save_outputs_to_gcs() { rm -f "$PUDL_OUTPUT/success" } -function upload_to_dist_path() { - GCS_PATH="gs://pudl.catalyst.coop/$1/" - AWS_PATH="s3://pudl.catalyst.coop/$1/" - +function remove_dist_path() { + DIST_PATH=$1 # Only attempt to update outputs if we have an argument # This avoids accidentally blowing away the whole bucket if it's not set. - if [[ -n "$1" ]]; then + if [[ -n "$DIST_PATH" ]]; then + GCS_PATH="gs://pudl.catalyst.coop/$DIST_PATH/" + AWS_PATH="s3://pudl.catalyst.coop/$DIST_PATH/" # If the old outputs don't exist, these will exit with status 1, so we - # don't && them with the rest of the commands. + # don't && them like with many of the other commands. echo "Removing old outputs from $GCS_PATH." - gcloud storage --quiet --billing-project="$GCP_BILLING_PROJECT" rm -r "$GCS_PATH" + gcloud storage rm --quiet --recursive --billing-project="$GCP_BILLING_PROJECT" "$GCS_PATH" echo "Removing old outputs from $AWS_PATH." - aws s3 rm --quiet --recursive "$AWS_PATH" - - echo "Copying outputs to $GCS_PATH:" && \ - gcloud storage --quiet --billing-project="$GCP_BILLING_PROJECT" cp -r "$PUDL_OUTPUT/*" "$GCS_PATH" && \ - echo "Copying outputs to $AWS_PATH" && \ - aws s3 cp --quiet --recursive "$PUDL_OUTPUT/" "$AWS_PATH" + gcloud storage rm --quiet --recursive "$AWS_PATH" else echo "No distribution path provided. Not updating outputs." exit 1 fi } -function distribute_parquet() { - PARQUET_BUCKET="gs://parquet.catalyst.coop" - # Only attempt to update outputs if we have a real value of BUILD_REF - # This avoids accidentally blowing away the whole bucket if it's not set. - echo "Copying outputs to parquet distribution bucket" - if [[ -n "$BUILD_REF" ]]; then - if [[ "$GITHUB_ACTION_TRIGGER" == "schedule" ]]; then - # If running nightly builds, copy outputs to the "nightly" bucket path - DIST_PATH="nightly" - else - # Otherwise we want to copy them to a directory named after the tag/ref - DIST_PATH="$BUILD_REF" - fi - echo "Copying outputs to $PARQUET_BUCKET/$DIST_PATH" && \ - gcloud storage --quiet --billing-project="$GCP_BILLING_PROJECT" cp -r "$PUDL_OUTPUT/parquet/*" "$PARQUET_BUCKET/$DIST_PATH" - - # If running a tagged release, ALSO update the stable distribution bucket path: - if [[ "$GITHUB_ACTION_TRIGGER" == "push" && "$BUILD_REF" == v20* ]]; then - echo "Copying outputs to $PARQUET_BUCKET/stable" && \ - gcloud storage --quiet --billing-project="$GCP_BILLING_PROJECT" cp -r "$PUDL_OUTPUT/parquet/*" "$PARQUET_BUCKET/stable" - fi - fi -} - -function copy_outputs_to_distribution_bucket() { - # Only attempt to update outputs if we have a real value of BUILD_REF +function upload_to_dist_path() { + DIST_PATH=$1 + # Only attempt to update outputs if we have an argument # This avoids accidentally blowing away the whole bucket if it's not set. - echo "Copying outputs to distribution buckets" - if [[ -n "$BUILD_REF" ]]; then - if [[ "$GITHUB_ACTION_TRIGGER" == "schedule" ]]; then - # If running nightly builds, copy outputs to the "nightly" bucket path - DIST_PATH="nightly" - else - # Otherwise we want to copy them to a directory named after the tag/ref - DIST_PATH="$BUILD_REF" - fi - upload_to_dist_path "$DIST_PATH" - - # If running a tagged release, ALSO update the stable distribution bucket path: - if [[ "$GITHUB_ACTION_TRIGGER" == "push" && "$BUILD_REF" == v20* ]]; then - upload_to_dist_path "stable" - fi + if [[ -n "$DIST_PATH" ]]; then + GCS_PATH="gs://pudl.catalyst.coop/$DIST_PATH/" + AWS_PATH="s3://pudl.catalyst.coop/$DIST_PATH/" + # Do not && this command with the others, as it will exit with status 1 if the + # old outputs don't exist. + remove_dist_path "$DIST_PATH" + echo "Copying outputs to $GCS_PATH:" && \ + gcloud storage cp --quiet --recursive --billing-project="$GCP_BILLING_PROJECT" "$PUDL_OUTPUT/*" "$GCS_PATH" && \ + echo "Copying outputs to $AWS_PATH" && \ + gcloud storage cp --quiet --recursive "$PUDL_OUTPUT/*" "$AWS_PATH" + else + echo "No distribution path provided. Not updating outputs." + exit 1 fi } @@ -149,8 +115,11 @@ function zenodo_data_release() { if [[ "$1" == "production" ]]; then ~/pudl/devtools/zenodo/zenodo_data_release.py --no-publish --env "$1" --source-dir "$PUDL_OUTPUT" - else + elif [[ "$1" == "sandbox" ]]; then ~/pudl/devtools/zenodo/zenodo_data_release.py --publish --env "$1" --source-dir "$PUDL_OUTPUT" + else + echo "Invalid Zenodo environment" + exit 1 fi } @@ -177,11 +146,8 @@ function notify_slack() { message+="DISTRIBUTION_BUCKET_SUCCESS: $DISTRIBUTION_BUCKET_SUCCESS\n" message+="GCS_TEMPORARY_HOLD_SUCCESS: $GCS_TEMPORARY_HOLD_SUCCESS \n" message+="ZENODO_SUCCESS: $ZENODO_SUCCESS\n\n" - message+="*Query* logs on .\n\n" - - message+="*Download* logs at \n\n" - + message+="*Download* logs at \n\n" message+="Get *full outputs* at ." send_slack_msg "$message" @@ -230,21 +196,46 @@ function clean_up_outputs_for_distribution() { ######################################################################################## # MAIN SCRIPT ######################################################################################## +LOGFILE="${PUDL_OUTPUT}/${BUILD_ID}.log" + # Initialize our success variables so they all definitely have a value to check ETL_SUCCESS=0 SAVE_OUTPUTS_SUCCESS=0 UPDATE_NIGHTLY_SUCCESS=0 UPDATE_STABLE_SUCCESS=0 DATASETTE_SUCCESS=0 -DISTRIBUTE_PARQUET_SUCCESS=0 CLEAN_UP_OUTPUTS_SUCCESS=0 DISTRIBUTION_BUCKET_SUCCESS=0 ZENODO_SUCCESS=0 GCS_TEMPORARY_HOLD_SUCCESS=0 +# Set the build type based on the action trigger and tag +if [[ "$GITHUB_ACTION_TRIGGER" == "push" && "$BUILD_REF" =~ ^v20.*$ ]]; then + BUILD_TYPE="stable" +elif [[ "$GITHUB_ACTION_TRIGGER" == "schedule" ]]; then + BUILD_TYPE="nightly" +elif [[ "$GITHUB_ACTION_TRIGGER" == "workflow_dispatch" ]]; then + BUILD_TYPE="workflow_dispatch" +else + echo "Unknown build type, exiting!" + echo "GITHUB_ACTION_TRIGGER: $GITHUB_ACTION_TRIGGER" + echo "BUILD_REF: $BUILD_REF" + exit 1 +fi + # Set these variables *only* if they are not already set by the container or workflow: : "${PUDL_GCS_OUTPUT:=gs://builds.catalyst.coop/$BUILD_ID}" -: "${PUDL_SETTINGS_YML:=home/mambauser/pudl/src/pudl/package_data/settings/etl_full.yml}" +: "${PUDL_SETTINGS_YML:=/home/mambauser/pudl/src/pudl/package_data/settings/etl_full.yml}" + +# Save credentials for working with AWS S3 +# set +x / set -x is used to avoid printing the AWS credentials in the logs +echo "Setting AWS credentials" +mkdir -p ~/.aws +echo "[default]" > ~/.aws/credentials +set +x +echo "aws_access_key_id = ${AWS_ACCESS_KEY_ID}" >> ~/.aws/credentials +echo "aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}" >> ~/.aws/credentials +set -x # Run ETL. Copy outputs to GCS and shutdown VM if ETL succeeds or fails # 2>&1 redirects stderr to stdout. @@ -252,59 +243,86 @@ run_pudl_etl 2>&1 | tee "$LOGFILE" ETL_SUCCESS=${PIPESTATUS[0]} # This needs to happen regardless of the ETL outcome: -pg_ctlcluster 15 dagster stop 2>&1 | tee -a "$LOGFILE" +pg_ctlcluster "$PG_VERSION" dagster stop 2>&1 | tee -a "$LOGFILE" save_outputs_to_gcs 2>&1 | tee -a "$LOGFILE" SAVE_OUTPUTS_SUCCESS=${PIPESTATUS[0]} -# if pipeline is successful, distribute + publish datasette -if [[ $ETL_SUCCESS == 0 ]]; then - if [[ "$GITHUB_ACTION_TRIGGER" == "schedule" ]]; then - merge_tag_into_branch "$NIGHTLY_TAG" nightly 2>&1 | tee -a "$LOGFILE" - UPDATE_NIGHTLY_SUCCESS=${PIPESTATUS[0]} - fi - # If running a tagged release, merge the tag into the stable branch - if [[ "$GITHUB_ACTION_TRIGGER" == "push" && "$BUILD_REF" == v20* ]]; then - merge_tag_into_branch "$BUILD_REF" stable 2>&1 | tee -a "$LOGFILE" - UPDATE_STABLE_SUCCESS=${PIPESTATUS[0]} - fi +if [[ $ETL_SUCCESS != 0 ]]; then + notify_slack "failure" + exit 1 +fi - # Deploy the updated data to datasette if we're on main - if [[ "$BUILD_REF" == "main" ]]; then - python ~/pudl/devtools/datasette/publish.py --production 2>&1 | tee -a "$LOGFILE" - DATASETTE_SUCCESS=${PIPESTATUS[0]} - fi +if [[ "$BUILD_TYPE" == "nightly" ]]; then + merge_tag_into_branch "$NIGHTLY_TAG" nightly 2>&1 | tee -a "$LOGFILE" + UPDATE_NIGHTLY_SUCCESS=${PIPESTATUS[0]} + # Update our datasette deployment + python ~/pudl/devtools/datasette/publish.py --production 2>&1 | tee -a "$LOGFILE" + DATASETTE_SUCCESS=${PIPESTATUS[0]} + # Remove files we don't want to distribute and zip SQLite and Parquet outputs + clean_up_outputs_for_distribution 2>&1 | tee -a "$LOGFILE" + CLEAN_UP_OUTPUTS_SUCCESS=${PIPESTATUS[0]} + # Copy cleaned up outputs to the S3 and GCS distribution buckets + upload_to_dist_path "nightly" | tee -a "$LOGFILE" + DISTRIBUTION_BUCKET_SUCCESS=${PIPESTATUS[0]} + # Remove individual parquet outputs and distribute just the zipped parquet + # archives on Zenodo, due to their number of files limit + rm -f "$PUDL_OUTPUT"/*.parquet + # push a data release to Zenodo sandbox + zenodo_data_release "$ZENODO_TARGET_ENV" 2>&1 | tee -a "$LOGFILE" + ZENODO_SUCCESS=${PIPESTATUS[0]} + +elif [[ "$BUILD_TYPE" == "stable" ]]; then + merge_tag_into_branch "$BUILD_REF" stable 2>&1 | tee -a "$LOGFILE" + UPDATE_STABLE_SUCCESS=${PIPESTATUS[0]} + # Remove files we don't want to distribute and zip SQLite and Parquet outputs + clean_up_outputs_for_distribution 2>&1 | tee -a "$LOGFILE" + CLEAN_UP_OUTPUTS_SUCCESS=${PIPESTATUS[0]} + # Copy cleaned up outputs to the S3 and GCS distribution buckets + upload_to_dist_path "$BUILD_REF" | tee -a "$LOGFILE" && \ + upload_to_dist_path "stable" | tee -a "$LOGFILE" + DISTRIBUTION_BUCKET_SUCCESS=${PIPESTATUS[0]} + # Remove individual parquet outputs and distribute just the zipped parquet + # archives on Zenodo, due to their number of files limit + rm -f "$PUDL_OUTPUT"/*.parquet + # push a data release to Zenodo production + zenodo_data_release "$ZENODO_TARGET_ENV" 2>&1 | tee -a "$LOGFILE" + ZENODO_SUCCESS=${PIPESTATUS[0]} + # This is a versioned release. Ensure that outputs can't be accidentally deleted. + # We can only do this on the GCS bucket, not S3 + gcloud storage --billing-project="$GCP_BILLING_PROJECT" objects update "gs://pudl.catalyst.coop/$BUILD_REF/*" --temporary-hold 2>&1 | tee -a "$LOGFILE" + GCS_TEMPORARY_HOLD_SUCCESS=${PIPESTATUS[0]} + +elif [[ "$BUILD_TYPE" == "workflow_dispatch" ]]; then + # Remove files we don't want to distribute and zip SQLite and Parquet outputs + clean_up_outputs_for_distribution 2>&1 | tee -a "$LOGFILE" + CLEAN_UP_OUTPUTS_SUCCESS=${PIPESTATUS[0]} + # Upload to GCS / S3 just to test that it works. + upload_to_dist_path "$BUILD_ID" | tee -a "$LOGFILE" + DISTRIBUTION_BUCKET_SUCCESS=${PIPESTATUS[0]} + Remove the uploaded files: + # Remove those uploads since they were just for testing. + remove_dist_path "$BUILD_ID" | tee -a "$LOGFILE" + # Remove individual parquet outputs and distribute just the zipped parquet + # archives on Zenodo, due to their number of files limit + rm -f "$PUDL_OUTPUT"/*.parquet + # push a data release to Zenodo sandbox + zenodo_data_release "$ZENODO_TARGET_ENV" 2>&1 | tee -a "$LOGFILE" + ZENODO_SUCCESS=${PIPESTATUS[0]} - # TODO: this behavior should be controlled by on/off switch here and this logic - # should be moved to the triggering github action. Having it here feels fragmented. - # Distribute outputs if branch is main or the build was triggered by tag push - if [[ "$GITHUB_ACTION_TRIGGER" == "push" || "$BUILD_REF" == "main" ]]; then - # Distribute Parquet outputs to a private bucket - distribute_parquet 2>&1 | tee -a "$LOGFILE" - DISTRIBUTE_PARQUET_SUCCESS=${PIPESTATUS[0]} - # Remove some cruft from the builds that we don't want to distribute - clean_up_outputs_for_distribution 2>&1 | tee -a "$LOGFILE" - CLEAN_UP_OUTPUTS_SUCCESS=${PIPESTATUS[0]} - # Copy cleaned up outputs to the S3 and GCS distribution buckets - copy_outputs_to_distribution_bucket | tee -a "$LOGFILE" - DISTRIBUTION_BUCKET_SUCCESS=${PIPESTATUS[0]} - # Remove individual parquet outputs and distribute just the zipped parquet - # archives on Zenodo, due to their number of files limit - rm -f "$PUDL_OUTPUT"/*.parquet && \ - # Push a data release to Zenodo for long term accessiblity - zenodo_data_release "$ZENODO_TARGET_ENV" 2>&1 | tee -a "$LOGFILE" - ZENODO_SUCCESS=${PIPESTATUS[0]} - fi - # If running a tagged release, ensure that outputs can't be accidentally deleted - # It's not clear that an object lock can be applied in S3 with the AWS CLI - if [[ "$GITHUB_ACTION_TRIGGER" == "push" && "$BUILD_REF" == v20* ]]; then - gcloud storage --billing-project="$GCP_BILLING_PROJECT" objects update "gs://pudl.catalyst.coop/$BUILD_REF/*" --temporary-hold 2>&1 | tee -a "$LOGFILE" - GCS_TEMPORARY_HOLD_SUCCESS=${PIPESTATUS[0]} - fi +else + echo "Unknown build type, exiting!" + echo "BUILD_TYPE: $BUILD_TYPE" + echo "GITHUB_ACTION_TRIGGER: $GITHUB_ACTION_TRIGGER" + echo "BUILD_REF: $BUILD_REF" + notify_slack "failure" + exit 1 fi # This way we also save the logs from latter steps in the script gcloud storage --quiet cp "$LOGFILE" "$PUDL_GCS_OUTPUT" +# Remove the AWS credentials file just in case the disk image sticks around +rm -f ~/.aws/credentials # Notify slack about entire pipeline's success or failure; if [[ $ETL_SUCCESS == 0 && \ @@ -312,7 +330,6 @@ if [[ $ETL_SUCCESS == 0 && \ $UPDATE_NIGHTLY_SUCCESS == 0 && \ $UPDATE_STABLE_SUCCESS == 0 && \ $DATASETTE_SUCCESS == 0 && \ - $DISTRIBUTE_PARQUET_SUCCESS == 0 && \ $CLEAN_UP_OUTPUTS_SUCCESS == 0 && \ $DISTRIBUTION_BUCKET_SUCCESS == 0 && \ $GCS_TEMPORARY_HOLD_SUCCESS == 0 && \ diff --git a/docs/dev/nightly_data_builds.rst b/docs/dev/nightly_data_builds.rst index 34d302912e..475a820c95 100644 --- a/docs/dev/nightly_data_builds.rst +++ b/docs/dev/nightly_data_builds.rst @@ -56,64 +56,6 @@ occurred: process. If the "transient" problem persists, bring it up with the person managing the builds. -Debugging a Broken Build ------------------------- - -If a build has failed, usually the VM will have shut down. You'll have to figure out -which VM it was running on and then restart it before you can do anything else. - -To find the VM name, go into the `Github Action listing -`__ -and click on your run. The ``GCE_INSTANCE_NAME`` that gets printed in "Print -action vars" is what you're after. - -Then you can go to the `Google Compute Engine -`__ -page and restart it. - -Once that's started, you should be able to SSH to the VM using a command like: - -.. code:: - - gcloud compute ssh pudl-deployment-tag --zone=us-west1-a - -You may run into some permissions issues here, in which case you probably need the -``Service Account User`` role on your gcloud user. - -Now you want to get some logs about what's failing. - -First, try ``docker ps`` - this should show two images, one ``pudl``-ey one and -one that's the Google ``stackdriver-agent`` which handles monitoring:: - - CONTAINER ID IMAGE NAMES - d678f709d1f5 catalystcoop/pudl-etl... klt-pudl-deployment-tag-luui - aa3163671da4 gcr.io/stackdriver-ag... stackdriver-logging-agent - -If the image is running, great! You can get logs via ``docker logs -`` (use ``docker logs -f`` if the process is still -going and you want to stream logs from the container.) - -You can also attach a shell to the container and poke around with ``docker exec --it bash``. This is really helpful if something has failed and you -want to try to fix the code & re-run, without having to re-run everything -before the failed task. - -.. Warning:: - - If you use ``docker attach`` as recommended by the login message, and then - hit Ctrl-C, you will interrupt the running build! - -Sometimes you'll see two containers running, but neither of them are PUDL. -That's because the VM first spins up a "loader" container that downloads the -PUDL image, then exits the loader and starts the PUDL image. - -If you don't see two containers running, then there's probably some issue with -the PUDL container startup itself. To find logs about that, run ``sudo -journalctl -u konlet-startup | tail -n 1000 | less``. You should be able to see -any errors that occurred during container startup, and also the container ID, -which you can then boot into via ``docker run -it bash``. - - The GitHub Action ----------------- The ``build-deploy-pudl`` GitHub action contains the main coordination logic for @@ -123,35 +65,24 @@ on code releases, and PUDL's code and data are tested every night. The action is modeled after an `example from the setup-gcloud GitHub action repository `__. The ``gcloud`` command in ``build-deploy-pudl`` requires certain Google Cloud -Platform (GCP) permissions to start and update the GCE instance. The -``gcloud`` command authenticates using a service account key for the -``deploy-pudl-github-action`` service account stored in PUDL's GitHub secrets -as ``DEPLOY_PUDL_SA_KEY``. The ``deploy-pudl-github-action`` service account has -the `Compute Instance Admin (v1) IAM `__ -role on the GCE instances to update the container and start the instance. +Platform (GCP) permissions to start and update the GCE instance. We use Workflow +Identity Federation to authenticate the GitHub Action with GCP in the GitHub Action +workflow. Google Compute Engine --------------------- The PUDL image is deployed on a `Container Optimized GCE `__ -instance, a type of virtual machine (VM) built to run containers. The -``pudl-deployment-dev`` and ``pudl-deployment-tag`` instances in the -``catalyst-cooperative-pudl`` GCP project handle deployments from the ``main`` branch -and tags or manually initiated ``workflow_dispatch`` runs respectively. There are two -VMs so a scheduled and a tag build can run at the same time. - -.. note:: +instance, a type of virtual machine (VM) built to run containers. - If a tag build starts before the previous tag build has finished, the previous build - will be interrupted. +We use ephemeral VMs created with `Google Batch `__ +to run the nightly builds. Once the build has finished -- successfully or not -- the VM +is shut down. The build VMs use the ``e2-highmem-8`` machine type (8 CPUs and 64GB of +RAM) to accommodate the PUDL ETL's memory-intensive steps. Currently, these VMs do not +have swap space enabled, so if they run out of memory, the build will immediately +terminate. -The build VMs use the e2-highmem-8 machine type (64 GB of RAM and 8 CPUs) to accommodate -the PUDL ETL's memory-intensive steps. Currently, these VMs do not have swap space -enabled, so if they run out of memory, the build will immediately terminate. - -Each GCE VM has a service account that gives the VM permissions to GCP resources. -The two PUDL deployment VMs share the ``deploy-pudl-vm-service-account``. This -service account has permissions to: +The ``deploy-pudl-vm-service-account`` service account has permissions to: 1. Write logs to Cloud Logging. 2. Start and stop the VM so the container can shut the instance off when the ETL @@ -159,12 +90,16 @@ service account has permissions to: 3. Bill the ``catalyst-cooperative-pudl`` project for egress fees from accessing the ``zenodo-cache.catalyst.coop`` bucket. Note: The ``catalyst-cooperative-pudl`` won't be charged anything because the data stays within Google's network. -4. Write logs and outputs to the ``gs://builds.catalyst.coop``, +4. Write logs and build outputs to the ``gs://builds.catalyst.coop``, ``gs://pudl.catalyst.coop`` and ``s3://pudl.catalyst.coop`` buckets. - The egress and storage fees of the s3 bucket are covered by + Egress and storage costs for the S3 bucket are covered by `Amazon Web Services's Open Data Sponsorship Program `__. +Build outputs and logs are saved to the ``gs://builds.catalyst.coop`` bucket so you can +access them later. Build logs and outputs are retained for 30 days and then deleted +automatically. + Docker ------ The Docker image the VMs pull installs PUDL into a mamba environment. The VMs @@ -173,8 +108,9 @@ are configured to run the ``docker/gcp_pudl_etl.sh`` script. This script: 1. Notifies the ``pudl-deployments`` Slack channel that a deployment has started. Note: if the container is manually stopped, slack will not be notified. 2. Runs the ETL and full test suite. -3. Copies the outputs and logs to a directory in the ``pudl-etl-logs`` bucket. The - directory is named using the git SHA of the commit that launched the build. +3. Copies the outputs and logs to a directory in the ``gs://builds.catalyst.coop`` + bucket. The directory is named using the git SHA of the commit that launched the + build. 4. Copies the outputs to the ``gs://pudl.catalyst.coop`` and ``s3://pudl.catalyst.coop`` buckets if the ETL and test suite run successfully. 5. Notifies the ``pudl-deployments`` Slack channel with the final build status. @@ -184,8 +120,8 @@ permissions. How to access the nightly build outputs from AWS ------------------------------------------------ -To access the nightly build outputs you can download -the data directly from the ``s3://pudl.catalyst.coop`` bucket. To do this, you'll +You can download the outputs from a successful nightly build data directly from the +``s3://pudl.catalyst.coop`` bucket. To do this, you'll need to `follow the instructions `__ for installing the AWS CLI tool. @@ -206,10 +142,9 @@ You should see a list of directories with version names: PRE v2023.12.01/ ... -The ``--no-sign-request`` flag allows you to make requsts to the -public bucket without having to load AWS credentials. If you don't -include this flag when interacting with the ``s3://pudl.catalyst.coop`` -bucket, ``aws`` will give you an authentication error. +The ``--no-sign-request`` flag allows you to make requsts to the public bucket without +having to load AWS credentials. If you don't include this flag when interacting with the +``s3://pudl.catalyst.coop`` bucket, ``aws`` will give you an authentication error. .. warning:: @@ -222,23 +157,10 @@ which behaves very much like the Unix ``cp`` command: .. code:: - aws s3 cp s3://pudl.catalyst.coop/nightly/pudl.sqlite.gz ./ --no-sign-request - -.. note:: - - To reduce network transfer times, we ``gzip`` the SQLite database files, which can - be quite large when uncompressed. To decompress them locally, at the command line - on Linux, MacOS, or Windows you can use the ``gunzip`` command. + aws s3 cp s3://pudl.catalyst.coop/nightly/pudl.sqlite.zip ./ --no-sign-request - .. code-block:: console - - $ gunzip *.sqlite.gz - - On Windows you can also use a 3rd party tool like - `7zip `__. - -If you wanted to download all of the build outputs (more than 10GB!) you could use ``cp ---recursive`` flag on the whole directory: +If you wanted to download all of the build outputs (more than 10GB!) you can use a +recursive copy: .. code:: @@ -254,20 +176,11 @@ For more details on how to use ``aws`` in general see the How to access the nightly build outputs and logs (for the Catalyst team only) ----------------------------------------------------------------------------- -Sometimes it is helpful to download the logs and data outputs of -nightly builds when debugging failures. To do this you'll need to -set up the Google Cloud software Development Kit (SDK). - -Install the `gcloud utilities `__ on your -computer. There are several ways to do this. We recommend using ``conda`` or its faster -sibling ``mamba``. If you're not using ``conda`` environments, there are other -ways to install the Google Cloud SDK explained in the link above. - -.. code:: - - mamba install -c conda-forge google-cloud-sdk +Sometimes it is helpful to download the logs and data outputs of nightly builds when +debugging failures. To do this you'll need to set up the Google Cloud software +Development Kit (SDK). It is installed as part of the ``pudl-dev`` conda environment. -Log into the account you used to create your new project above by running: +To authenticate with Google Cloud Platform (GCP) you'll need to run the following: .. code:: @@ -307,35 +220,33 @@ like this: .. code:: - gcloud storage ls --long --readable-sizes gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ - - 804.57 MiB 2024-01-03T11:19:15Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/censusdp1tract.sqlite - 5.01 GiB 2024-01-03T11:20:02Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/core_epacems__hourly_emissions.parquet - 759.32 MiB 2024-01-03T11:19:17Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc1_dbf.sqlite - 813.52 MiB 2024-01-03T11:19:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc1_xbrl.sqlite - 1.65 MiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc1_xbrl_datapackage.json - 6.94 MiB 2024-01-03T11:18:19Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc1_xbrl_taxonomy_metadata.json - 282.71 MiB 2024-01-03T11:19:02Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc2_dbf.sqlite - 89.55 MiB 2024-01-03T11:18:40Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc2_xbrl.sqlite - 1.88 MiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc2_xbrl_datapackage.json - 6.78 MiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc2_xbrl_taxonomy_metadata.json - 8.25 MiB 2024-01-03T11:18:20Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc60_dbf.sqlite - 20.02 MiB 2024-01-03T11:18:22Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc60_xbrl.sqlite - 731.31 KiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc60_xbrl_datapackage.json - 1.77 MiB 2024-01-03T11:18:19Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc60_xbrl_taxonomy_metadata.json - 153.72 MiB 2024-01-03T11:18:54Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc6_dbf.sqlite - 62.01 MiB 2024-01-03T11:18:28Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc6_xbrl.sqlite - 1.02 MiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc6_xbrl_datapackage.json - 2.74 MiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc6_xbrl_taxonomy_metadata.json - 905.31 MiB 2024-01-03T11:19:17Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc714_xbrl.sqlite - 58.41 KiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc714_xbrl_datapackage.json - 187.86 KiB 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/ferc714_xbrl_taxonomy_metadata.json - 4.05 MiB 2024-01-03T11:18:19Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/metadata.yml - 4 MiB 2024-01-03T12:09:34Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/pudl-etl.log - 13.1 GiB 2024-01-03T11:21:41Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/pudl.sqlite - 0 B 2024-01-03T11:18:18Z gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/success - gs://builds.catalyst.coop/2024-01-03-0605-e9a91be-dev/core_epacems__hourly_emissions/ - TOTAL: 25 objects, 23557650395 bytes (21.94 GiB) + gcloud storage ls --long --readable-sizes gcloud storage ls --long --readable-sizes gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main + + 6.60MiB 2024-11-15T13:28:20Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/2024-11-15-0603-60f488239-main-pudl-etl.log + 804.57MiB 2024-11-15T12:40:35Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/censusdp1tract.sqlite + 759.32MiB 2024-11-15T12:41:01Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc1_dbf.sqlite + 1.19GiB 2024-11-15T12:41:12Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc1_xbrl.sqlite + 2.16MiB 2024-11-15T12:39:23Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc1_xbrl_datapackage.json + 6.95MiB 2024-11-15T12:39:23Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc1_xbrl_taxonomy_metadata.json + 282.71MiB 2024-11-15T12:40:40Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc2_dbf.sqlite + 127.39MiB 2024-11-15T12:39:59Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc2_xbrl.sqlite + 2.46MiB 2024-11-15T12:40:54Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc2_xbrl_datapackage.json + 6.82MiB 2024-11-15T12:40:48Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc2_xbrl_taxonomy_metadata.json + 8.25MiB 2024-11-15T12:39:22Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc60_dbf.sqlite + 27.89MiB 2024-11-15T12:39:24Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc60_xbrl.sqlite + 942.19kiB 2024-11-15T12:39:22Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc60_xbrl_datapackage.json + 1.77MiB 2024-11-15T12:39:22Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc60_xbrl_taxonomy_metadata.json + 153.72MiB 2024-11-15T12:41:03Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc6_dbf.sqlite + 90.51MiB 2024-11-15T12:41:09Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc6_xbrl.sqlite + 1.32MiB 2024-11-15T12:40:47Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc6_xbrl_datapackage.json + 2.74MiB 2024-11-15T12:39:22Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc6_xbrl_taxonomy_metadata.json + 1.38GiB 2024-11-15T12:41:06Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc714_xbrl.sqlite + 83.39kiB 2024-11-15T12:40:46Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc714_xbrl_datapackage.json + 187.86kiB 2024-11-15T12:40:46Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/ferc714_xbrl_taxonomy_metadata.json + 15.06GiB 2024-11-15T12:42:17Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/pudl.sqlite + 0B 2024-11-15T12:39:22Z gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/success + gs://builds.catalyst.coop/2024-11-15-0603-60f488239-main/parquet/ + TOTAL: 23 objects, 21331056422 bytes (19.87GiB) If you want to copy these files down directly to your computer, you can use the ``gcloud storage cp`` command, which behaves very much like the Unix ``cp`` command: @@ -344,8 +255,8 @@ the ``gcloud storage cp`` command, which behaves very much like the Unix ``cp`` gcloud storage cp gs://builds.catalyst.coop//pudl.sqlite ./ -If you wanted to download all of the build outputs (more than 10GB!) you could use ``cp --r`` on the whole directory: +If you need to download all of the build outputs (~20GB!) you can do a recursive copy of +the whole directory hierarchy (note that this will incurr egress charges): .. code:: diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index e784d93fa7..c851c61783 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: 6cc1175217c86c9eda2619a9f1debb83afde9256846ae4b2355ba02488c7883b +# input_hash: c1ed864e3eed9f6346940754a63fe1f5957a0e2d1cfd95d12a856a1ebdbef548 channels: - conda-forge @@ -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.2=py312h178313f_0 + - aiohttp=3.11.4=py312h178313f_1 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -57,8 +57,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=hef167b5_0 - - boto3=1.35.63=pyhd8ed1ab_0 - - botocore=1.35.63=pyge310_1234567_0 + - boto3=1.35.64=pyhd8ed1ab_0 + - botocore=1.35.64=pyge310_1234567_0 - bottleneck=1.4.2=py312hc0a28a1_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hb9d3cd8_2 @@ -103,9 +103,9 @@ dependencies: - dagster-pipes=1.9.2=pyhd8ed1ab_0 - dagster-postgres=0.25.2=pyhd8ed1ab_0 - dagster-webserver=1.9.2=pyhd8ed1ab_0 - - dask-core=2024.11.2=pyhd8ed1ab_0 + - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - - databricks-sdk=0.37.0=pyhd8ed1ab_0 + - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - dbus=1.13.6=h5008d03_3 - debugpy=1.8.8=py312h2ec8cdc_0 @@ -201,7 +201,6 @@ dependencies: - idna=3.10=pyhd8ed1ab_0 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.5.0=pyha770c72_0 - - importlib_metadata=8.5.0=hd8ed1ab_0 - importlib_resources=6.4.5=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_0 - ipykernel=6.29.5=pyh3099207_0 @@ -330,16 +329,16 @@ dependencies: - mergedeep=1.3.4=pyhd8ed1ab_0 - minizip=4.0.7=h401b404_0 - mistune=3.0.2=pyhd8ed1ab_0 - - mlflow=2.17.2=h7900ff3_0 - - mlflow-skinny=2.17.2=py312h7900ff3_0 - - mlflow-ui=2.17.2=py312h7900ff3_0 + - mlflow=2.18.0=h7900ff3_0 + - mlflow-skinny=2.18.0=py312h7900ff3_0 + - mlflow-ui=2.18.0=py312h7900ff3_0 - more-itertools=10.5.0=pyhd8ed1ab_0 - msgpack-python=1.1.0=py312h68727a3_0 - multidict=6.1.0=py312h178313f_1 - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.0=pyhff2d567_0 + - narwhals=1.14.1=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -503,11 +502,11 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h66e93f0_0 - - sqlglot=25.30.0=pyhff2d567_1 + - sqlglot=25.31.4=pyhff2d567_0 - sqlite=3.47.0=h9eae976_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - - starlette=0.41.2=pyha770c72_0 + - starlette=0.41.3=pyh7900ff3_0 - stevedore=5.3.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index 35fb384de7..b96856ea96 100644 --- a/environments/conda-lock.yml +++ b/environments/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - linux-64: 6cc1175217c86c9eda2619a9f1debb83afde9256846ae4b2355ba02488c7883b - osx-64: bcf2452442dc2658e1840c236a2756bc5b5ff91c1c9e4f14e2af898c7efbf1fb - osx-arm64: d195cdc6e756c1121586b7add937cff32983380eb304e5c37cfb159de9b5c6cd + linux-64: c1ed864e3eed9f6346940754a63fe1f5957a0e2d1cfd95d12a856a1ebdbef548 + osx-64: 3b411f767af9c3cf3d53a12e2b181931d0a9d5e8a26eec9844c36f4f2eeafe34 + osx-arm64: 0b79779e9803db47b1e57d14193b913280cf82b1fe3cc43a71d098160a71abe8 channels: - url: conda-forge used_env_vars: [] @@ -164,7 +164,7 @@ package: category: main optional: false - name: aiohttp - version: 3.11.2 + version: 3.11.4 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.2-py312h178313f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.4-py312h178313f_1.conda hash: - md5: e2f92c2c85d3a0d376947847942ed36c - sha256: 020315ba01fcd1b53fcb81280a00b8de7051ecf5c4503fc3b3281df0cbca05ed + md5: cd87a5581629dbe1997740e65ccd4722 + sha256: c421da03a70723966ded071eb9a7dcd3d0efae1de706cf7056522ef803bd0357 category: main optional: false - name: aiohttp - version: 3.11.2 + version: 3.11.4 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.2-py312h3520af0_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.11.4-py312h3520af0_1.conda hash: - md5: 59275e907c94aea5764ef7a5bb94287e - sha256: db3e98f45d3a2b0c0aa38327a7e266b51994ce556d791bbf908b73f2405f2381 + md5: 8cb26acc42cb098f03fd7567582fcd3a + sha256: f928168b03b4c629c8925e4329b5d484e3e5c1d24ca99e9f07bcce666c0f4139 category: main optional: false - name: aiohttp - version: 3.11.2 + version: 3.11.4 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.2-py312h998013c_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.4-py312h998013c_1.conda hash: - md5: 1c0150beac996afe9d8ee8297d324352 - sha256: 5e619945d37829cde16c5add63abb042ba953f0dc92b94abb990000a6ba3e191 + md5: 31c809c1790430b11963ac29486256bf + sha256: a9ac49857e20ac046b7fcbcb3f9df2d33cdc934480a512f3cfac5b55d295410b category: main optional: false - name: aiosignal @@ -2286,52 +2286,52 @@ package: category: main optional: false - name: boto3 - version: 1.35.63 + version: 1.35.64 manager: conda platform: linux-64 dependencies: - botocore: ">=1.35.63,<1.36.0" + botocore: ">=1.35.64,<1.36.0" jmespath: ">=0.7.1,<2.0.0" python: ">=3.8" s3transfer: ">=0.10.0,<0.11.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda hash: - md5: 41ac72c902b3ddfa0764328413a06c7d - sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 + md5: 9a1fcfa6ff6736efbe88dd67b8277015 + sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 category: main optional: false - name: boto3 - version: 1.35.63 + version: 1.35.64 manager: conda platform: osx-64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.63,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda + botocore: ">=1.35.64,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda hash: - md5: 41ac72c902b3ddfa0764328413a06c7d - sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 + md5: 9a1fcfa6ff6736efbe88dd67b8277015 + sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 category: main optional: false - name: boto3 - version: 1.35.63 + version: 1.35.64 manager: conda platform: osx-arm64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.63,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.63-pyhd8ed1ab_0.conda + botocore: ">=1.35.64,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda hash: - md5: 41ac72c902b3ddfa0764328413a06c7d - sha256: 1bfed989428f04e4552d3e87b6c53109a7ee5d3cb37b0c3d66c8c9e8d33a9390 + md5: 9a1fcfa6ff6736efbe88dd67b8277015 + sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 category: main optional: false - name: botocore - version: 1.35.63 + version: 1.35.64 manager: conda platform: linux-64 dependencies: @@ -2339,14 +2339,14 @@ package: python: ">=3.10" python-dateutil: ">=2.1,<3.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda hash: - md5: f6ca7743a8eb6a2dd26d82395348eff9 - sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e + md5: baf44a99dc095d9ace5a02a51c10858b + sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 category: main optional: false - name: botocore - version: 1.35.63 + version: 1.35.64 manager: conda platform: osx-64 dependencies: @@ -2354,14 +2354,14 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda hash: - md5: f6ca7743a8eb6a2dd26d82395348eff9 - sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e + md5: baf44a99dc095d9ace5a02a51c10858b + sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 category: main optional: false - name: botocore - version: 1.35.63 + version: 1.35.64 manager: conda platform: osx-arm64 dependencies: @@ -2369,10 +2369,10 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.63-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda hash: - md5: f6ca7743a8eb6a2dd26d82395348eff9 - sha256: c484095c92c86c10209d70c54f07e4311531e1ad2e1fa2a9fdc193b0611b720e + md5: baf44a99dc095d9ace5a02a51c10858b + sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 category: main optional: false - name: bottleneck @@ -4400,16 +4400,16 @@ package: click: ">=8.1" cloudpickle: ">=3.0.0" fsspec: ">=2021.09.0" - importlib_metadata: ">=4.13.0" + importlib-metadata: ">=4.13.0" packaging: ">=20.0" partd: ">=1.4.0" python: ">=3.10" pyyaml: ">=5.3.1" toolz: ">=0.10.0" - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhff2d567_1.conda hash: - md5: 86269596fa40b5b59b1eb8187f04ca1c - sha256: f7991985162a9ef8b506192cddfe95a5bee45a42b70c00bea39693dcb340f38d + md5: ae2be36dab764e655a22f240837cef75 + sha256: b5e120fbcab57343aedbb312c22df8faa1a8444fb16b4d66879efbd7fd560d53 category: main optional: false - name: dask-core @@ -4422,14 +4422,14 @@ package: pyyaml: ">=5.3.1" toolz: ">=0.10.0" click: ">=8.1" - importlib_metadata: ">=4.13.0" + importlib-metadata: ">=4.13.0" fsspec: ">=2021.09.0" cloudpickle: ">=3.0.0" partd: ">=1.4.0" - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhff2d567_1.conda hash: - md5: 86269596fa40b5b59b1eb8187f04ca1c - sha256: f7991985162a9ef8b506192cddfe95a5bee45a42b70c00bea39693dcb340f38d + md5: ae2be36dab764e655a22f240837cef75 + sha256: b5e120fbcab57343aedbb312c22df8faa1a8444fb16b4d66879efbd7fd560d53 category: main optional: false - name: dask-core @@ -4442,14 +4442,14 @@ package: pyyaml: ">=5.3.1" toolz: ">=0.10.0" click: ">=8.1" - importlib_metadata: ">=4.13.0" + importlib-metadata: ">=4.13.0" fsspec: ">=2021.09.0" cloudpickle: ">=3.0.0" partd: ">=1.4.0" - url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhff2d567_1.conda hash: - md5: 86269596fa40b5b59b1eb8187f04ca1c - sha256: f7991985162a9ef8b506192cddfe95a5bee45a42b70c00bea39693dcb340f38d + md5: ae2be36dab764e655a22f240837cef75 + sha256: b5e120fbcab57343aedbb312c22df8faa1a8444fb16b4d66879efbd7fd560d53 category: main optional: false - name: dask-expr @@ -4498,45 +4498,45 @@ package: category: main optional: false - name: databricks-sdk - version: 0.37.0 + version: 0.38.0 manager: conda platform: linux-64 dependencies: google-auth: ">=2.0,<3" python: ">=3.7" requests: ">=2.28.1,<3" - url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.37.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.38.0-pyhd8ed1ab_0.conda hash: - md5: 6e5eab6d8b300923c12cde2d7a58394e - sha256: 3df15bd09e686248ceae79229646a6c8a294826faecb236d54fedfffb1996b39 + md5: 1a76130b86eceedd30f5f192afa629b8 + sha256: f8d1155a2104d614fa88d3c3ac0aa8f54937b5fa7ee0266c464e67c2243e8f9f category: main optional: false - name: databricks-sdk - version: 0.37.0 + version: 0.38.0 manager: conda platform: osx-64 dependencies: python: ">=3.7" requests: ">=2.28.1,<3" google-auth: ">=2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.37.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.38.0-pyhd8ed1ab_0.conda hash: - md5: 6e5eab6d8b300923c12cde2d7a58394e - sha256: 3df15bd09e686248ceae79229646a6c8a294826faecb236d54fedfffb1996b39 + md5: 1a76130b86eceedd30f5f192afa629b8 + sha256: f8d1155a2104d614fa88d3c3ac0aa8f54937b5fa7ee0266c464e67c2243e8f9f category: main optional: false - name: databricks-sdk - version: 0.37.0 + version: 0.38.0 manager: conda platform: osx-arm64 dependencies: python: ">=3.7" requests: ">=2.28.1,<3" google-auth: ">=2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.37.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/databricks-sdk-0.38.0-pyhd8ed1ab_0.conda hash: - md5: 6e5eab6d8b300923c12cde2d7a58394e - sha256: 3df15bd09e686248ceae79229646a6c8a294826faecb236d54fedfffb1996b39 + md5: 1a76130b86eceedd30f5f192afa629b8 + sha256: f8d1155a2104d614fa88d3c3ac0aa8f54937b5fa7ee0266c464e67c2243e8f9f category: main optional: false - name: datasette @@ -8291,8 +8291,8 @@ package: platform: osx-64 dependencies: certifi: "" - idna: "" sniffio: "" + idna: "" anyio: "" python: ">=3.8" httpcore: 1.* @@ -8308,8 +8308,8 @@ package: platform: osx-arm64 dependencies: certifi: "" - idna: "" sniffio: "" + idna: "" anyio: "" python: ">=3.8" httpcore: 1.* @@ -8708,42 +8708,6 @@ package: sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c category: main optional: false - - name: importlib_metadata - version: 8.5.0 - manager: conda - platform: linux-64 - dependencies: - importlib-metadata: ">=8.5.0,<8.5.1.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda - hash: - md5: 2a92e152208121afadf85a5e1f3a5f4d - sha256: 313b8a05211bacd6b15ab2621cb73d7f41ea5c6cae98db53367d47833f03fef1 - category: main - optional: false - - name: importlib_metadata - version: 8.5.0 - manager: conda - platform: osx-64 - dependencies: - importlib-metadata: ">=8.5.0,<8.5.1.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda - hash: - md5: 2a92e152208121afadf85a5e1f3a5f4d - sha256: 313b8a05211bacd6b15ab2621cb73d7f41ea5c6cae98db53367d47833f03fef1 - category: main - optional: false - - name: importlib_metadata - version: 8.5.0 - manager: conda - platform: osx-arm64 - dependencies: - importlib-metadata: ">=8.5.0,<8.5.1.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda - hash: - md5: 2a92e152208121afadf85a5e1f3a5f4d - sha256: 313b8a05211bacd6b15ab2621cb73d7f41ea5c6cae98db53367d47833f03fef1 - category: main - optional: false - name: importlib_resources version: 6.4.5 manager: conda @@ -10328,8 +10292,8 @@ package: jupyter-lsp: ">=2.0.0" async-lru: ">=1.0.0" notebook-shim: ">=0.2" - setuptools: ">=40.1.0" httpx: ">=0.25.0" + setuptools: ">=40.1.0" jupyterlab_server: ">=2.27.1,<3" ipykernel: ">=6.5.0" url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.1-pyhff2d567_0.conda @@ -10355,8 +10319,8 @@ package: jupyter-lsp: ">=2.0.0" async-lru: ">=1.0.0" notebook-shim: ">=0.2" - setuptools: ">=40.1.0" httpx: ">=0.25.0" + setuptools: ">=40.1.0" jupyterlab_server: ">=2.27.1,<3" ipykernel: ">=6.5.0" url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.3.1-pyhff2d567_0.conda @@ -11465,27 +11429,27 @@ package: category: main optional: false - name: libcxx - version: 19.1.3 + version: 19.1.4 manager: conda platform: osx-64 dependencies: __osx: ">=10.13" - url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.4-hf95d169_0.conda hash: - md5: 86801fc56d4641e3ef7a63f5d996b960 - sha256: 466f259bb13a8058fef28843977c090d21ad337b71a842ccc0407bccf8d27011 + md5: 5f23923c08151687ff2fc3002b0a7234 + sha256: 48c6d0ab9dd0c66693f79f4a032cd9ebb64fb88329dfa747aeac5299f9b3f33b category: main optional: false - name: libcxx - version: 19.1.3 + version: 19.1.4 manager: conda platform: osx-arm64 dependencies: __osx: ">=11.0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.4-ha82da77_0.conda hash: - md5: bf691071fba4734984231617783225bc - sha256: 6d062760c6439e75b9a44d800d89aff60fe3441998d87506c62dc94c50412ef4 + md5: a2d3d484d95889fccdd09498d8f6bf9a + sha256: 342896ebc1d6acbf022ca6df006a936b9a472579e91e3c502cb1f52f218b78e9 category: main optional: false - name: libdeflate @@ -14344,7 +14308,7 @@ package: category: main optional: false - name: mlflow - version: 2.17.2 + version: 2.18.0 manager: conda platform: linux-64 dependencies: @@ -14356,24 +14320,24 @@ package: jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 - mlflow-ui: 2.17.2 + mlflow-ui: 2.18.0 numpy: <3 pandas: <3 prometheus_flask_exporter: <1 - pyarrow: <18,>=4.0.0 + pyarrow: <19,>=4.0.0 python_abi: 3.12.* querystring_parser: <2 scikit-learn: <2 scipy: <2 sqlalchemy: ">=1.4.0,<3" - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.17.2-h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-2.18.0-h7900ff3_0.conda hash: - md5: e0703d0a12f4d5530ae30313d3cc8ca3 - sha256: 5446b915828e642e4bc61796b2a14a52fb5f16b56dccb19bad04850adfaa99d3 + md5: 34ee68e9926d77fc3235e459b34991bc + sha256: 62fbf0d4f1cb32c0a734cd6c2d771323b9b243b7651781a7267857d9f7ba7ef4 category: main optional: false - name: mlflow - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-64 dependencies: @@ -14385,24 +14349,24 @@ package: jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 - mlflow-ui: 2.17.2 + mlflow-ui: 2.18.0 numpy: <3 pandas: <3 prometheus_flask_exporter: <1 - pyarrow: <18,>=4.0.0 + pyarrow: <19,>=4.0.0 python_abi: 3.12.* querystring_parser: <2 scikit-learn: <2 scipy: <2 sqlalchemy: ">=1.4.0,<3" - url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-2.17.2-hb401068_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-2.18.0-hb401068_0.conda hash: - md5: 7c8f9d65992f318e3ad9d761e350127e - sha256: 34535e4268a7d03cd23ef62d72cc9869c72d7e02cea3bb59f07e17a886540cb8 + md5: 2f88ee852e22c0405db37bd4547c406f + sha256: 26e8e76598b5605b853708ebffa44346954df49fe9807e06b47963fda9b1681b category: main optional: false - name: mlflow - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-arm64 dependencies: @@ -14414,25 +14378,25 @@ package: jinja2: <4,>=2.11 markdown: <4,>=3.3 matplotlib-base: <4 - mlflow-ui: 2.17.2 + mlflow-ui: 2.18.0 numpy: <3 pandas: <3 prometheus_flask_exporter: <1 - pyarrow: <18,>=4.0.0 + pyarrow: <19,>=4.0.0 python: ">=3.12,<3.13.0a0" python_abi: 3.12.* querystring_parser: <2 scikit-learn: <2 scipy: <2 sqlalchemy: ">=1.4.0,<3" - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.17.2-py312h81bd7bf_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-2.18.0-py312h81bd7bf_0.conda hash: - md5: 180655f1d98275c156a407c8bc82be50 - sha256: e0e9fffa6bc1b03838e9b95b5a83309b89978901cc8180d551e29e0dc9434784 + md5: 1b15f30789e0379014ea615de00690ea + sha256: 6ddbefb88a978b8225e5df1ec9ec1e269d6efec74eef5a8a9ce07ee79bfeacbf category: main optional: false - name: mlflow-skinny - version: 2.17.2 + version: 2.18.0 manager: conda platform: linux-64 dependencies: @@ -14453,14 +14417,14 @@ package: pyyaml: ">=5.1,<7" requests: ">=2.17.3,<3" sqlparse: ">=0.4.0,<1" - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-skinny-2.17.2-py312h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-skinny-2.18.0-py312h7900ff3_0.conda hash: - md5: 0dbaa33d7e0d91e0b8b8573973f5ffd8 - sha256: df1e25db2591f50facf46e7097fb80e0e55283ec0dcc9a62345e4c69a8f2cb77 + md5: 19b36b1c50ea845bd1c759a1b777e1b3 + sha256: d4eee9878d2c6c2539227325241c41fb967a3d8751d338f517092d415723d6d8 category: main optional: false - name: mlflow-skinny - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-64 dependencies: @@ -14481,14 +14445,14 @@ package: pyyaml: ">=5.1,<7" requests: ">=2.17.3,<3" sqlparse: ">=0.4.0,<1" - url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-skinny-2.17.2-py312hb401068_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-skinny-2.18.0-py312hb401068_0.conda hash: - md5: 38ce677d23c3f9b4033365a5f02c0572 - sha256: 4bbb7c7ccb68a8e51152296b32001160f321b17da1635509dd7818f8ba67212d + md5: fba04a313c30c6e06d28ac5a90039963 + sha256: 7323aaa4a61c2521c1affc400e5d5cb1250e2721b82a9e25f2a2d4e25bfcd214 category: main optional: false - name: mlflow-skinny - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-arm64 dependencies: @@ -14509,61 +14473,61 @@ package: pyyaml: ">=5.1,<7" requests: ">=2.17.3,<3" sqlparse: ">=0.4.0,<1" - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-skinny-2.17.2-py312h81bd7bf_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-skinny-2.18.0-py312h81bd7bf_0.conda hash: - md5: 7b67fde6b12bfd05913a0efc77e1cce5 - sha256: 9fcb30fe9414aa79dce6f8983175e2314de07e9cc6a4faf1ea5a50394785acea + md5: 6a8c4c7bc0038c4345440396cd604fda + sha256: 95558261545b392aeebf6ba67d780d1dbcf4c76c1059a1e5ea75f8cddab899fc category: main optional: false - name: mlflow-ui - version: 2.17.2 + version: 2.18.0 manager: conda platform: linux-64 dependencies: flask: <4 gunicorn: <23 - mlflow-skinny: 2.17.2 + mlflow-skinny: 2.18.0 python: ">=3.12,<3.13.0a0" python_abi: 3.12.* querystring_parser: <2 - url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-ui-2.17.2-py312h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mlflow-ui-2.18.0-py312h7900ff3_0.conda hash: - md5: 74c90b9f9c86c1d154f336c8bd713a5d - sha256: 6c43d0799996c02dc455ba84d9f6ac6bda0b5116202b98e3ebb4de3a3f24a735 + md5: d8f4aadcb96e11fa4e10552a09a39cef + sha256: df6408620b5fed80cdff38e5aeee93b4a72b1c27a34e6e9718bb9c6200b44b1a category: main optional: false - name: mlflow-ui - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-64 dependencies: flask: <4 gunicorn: <23 - mlflow-skinny: 2.17.2 + mlflow-skinny: 2.18.0 python: ">=3.12,<3.13.0a0" python_abi: 3.12.* querystring_parser: <2 - url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-ui-2.17.2-py312hb401068_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mlflow-ui-2.18.0-py312hb401068_0.conda hash: - md5: 24802598b409a0be749a0a9dca959969 - sha256: 06bce095b15f1c1b556ec2d5c53cfbf7fcfda4fefa73dcf39978ff1f6ac2655d + md5: 857fd014ab9fb0fbdaf4c7e3d3a8587b + sha256: c5c80bb877d7c26be73f3039a5b0f5e9af9683f2851d4bc47a607df9c82f3c33 category: main optional: false - name: mlflow-ui - version: 2.17.2 + version: 2.18.0 manager: conda platform: osx-arm64 dependencies: flask: <4 gunicorn: <23 - mlflow-skinny: 2.17.2 + mlflow-skinny: 2.18.0 python: ">=3.12,<3.13.0a0" python_abi: 3.12.* querystring_parser: <2 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-ui-2.17.2-py312h81bd7bf_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mlflow-ui-2.18.0-py312h81bd7bf_0.conda hash: - md5: 16ec3014dc8b5a4982e9f319c05d985d - sha256: 1d85dcf19f0defcdd859b19c7d42b30f42644ff0d5c80130e0943fb778b7596e + md5: bfa52f1ec6cc55159b40f59c033fc045 + sha256: f7c7f94829a38c5104c9c4fc7b49e69c3c4de7ebc43db17054929e819bda29f2 category: main optional: false - name: more-itertools @@ -14800,39 +14764,39 @@ package: category: main optional: false - name: narwhals - version: 1.14.0 + version: 1.14.1 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda hash: - md5: dc78d38bb510dc63524b17cdd1ef3e99 - sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 + md5: 6aeb2311753a549bb28ceb732d803a9c + sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 category: main optional: false - name: narwhals - version: 1.14.0 + version: 1.14.1 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda hash: - md5: dc78d38bb510dc63524b17cdd1ef3e99 - sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 + md5: 6aeb2311753a549bb28ceb732d803a9c + sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 category: main optional: false - name: narwhals - version: 1.14.0 + version: 1.14.1 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda hash: - md5: dc78d38bb510dc63524b17cdd1ef3e99 - sha256: 4f1f539340b51541ff3c1e3018f8a06fac9c8c4f2d077ceb3ede71fe2e3e6ee4 + md5: 6aeb2311753a549bb28ceb732d803a9c + sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 category: main optional: false - name: nbclassic @@ -21896,39 +21860,39 @@ package: category: main optional: false - name: sqlglot - version: 25.30.0 + version: 25.31.4 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.30.0-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda hash: - md5: 9bc69c2216cb02da285fefcb394e0c7b - sha256: 6d0f8ccf7efa34340a54db27bf2dbf075dbc667049ff5894484a1baa30aa274f + md5: 5901114fc3886a25df43417540d0c76f + sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f category: main optional: false - name: sqlglot - version: 25.30.0 + version: 25.31.4 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.30.0-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda hash: - md5: 9bc69c2216cb02da285fefcb394e0c7b - sha256: 6d0f8ccf7efa34340a54db27bf2dbf075dbc667049ff5894484a1baa30aa274f + md5: 5901114fc3886a25df43417540d0c76f + sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f category: main optional: false - name: sqlglot - version: 25.30.0 + version: 25.31.4 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.30.0-pyhff2d567_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda hash: - md5: 9bc69c2216cb02da285fefcb394e0c7b - sha256: 6d0f8ccf7efa34340a54db27bf2dbf075dbc667049ff5894484a1baa30aa274f + md5: 5901114fc3886a25df43417540d0c76f + sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f category: main optional: false - name: sqlite @@ -22062,45 +22026,45 @@ package: category: main optional: false - name: starlette - version: 0.41.2 + version: 0.41.3 manager: conda platform: linux-64 dependencies: anyio: ">=3.4.0,<5" - python: ">=3.8" + python: ">=3.9" typing_extensions: ">=3.10.0" - url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.2-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyh7900ff3_0.conda hash: - md5: 287492bb6e159da4357a10a2bd05c13c - sha256: 02206e5369944e0fd29e4f5c8e9b51dd926a74a46b621a73323669ad404f1081 + md5: 0889c5a3e95d8c382cff7556757aedb0 + sha256: 33986032cb0515f7e9f6647d07006b7dc49b3f373b73d5a1826e6979c661b27a category: dev optional: true - name: starlette - version: 0.41.2 + version: 0.41.3 manager: conda platform: osx-64 dependencies: - python: ">=3.8" + python: ">=3.9" typing_extensions: ">=3.10.0" anyio: ">=3.4.0,<5" - url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.2-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyh7900ff3_0.conda hash: - md5: 287492bb6e159da4357a10a2bd05c13c - sha256: 02206e5369944e0fd29e4f5c8e9b51dd926a74a46b621a73323669ad404f1081 + md5: 0889c5a3e95d8c382cff7556757aedb0 + sha256: 33986032cb0515f7e9f6647d07006b7dc49b3f373b73d5a1826e6979c661b27a category: dev optional: true - name: starlette - version: 0.41.2 + version: 0.41.3 manager: conda platform: osx-arm64 dependencies: - python: ">=3.8" + python: ">=3.9" typing_extensions: ">=3.10.0" anyio: ">=3.4.0,<5" - url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.2-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyh7900ff3_0.conda hash: - md5: 287492bb6e159da4357a10a2bd05c13c - sha256: 02206e5369944e0fd29e4f5c8e9b51dd926a74a46b621a73323669ad404f1081 + md5: 0889c5a3e95d8c382cff7556757aedb0 + sha256: 33986032cb0515f7e9f6647d07006b7dc49b3f373b73d5a1826e6979c661b27a category: dev optional: true - name: stevedore diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index 2ba8ee1a95..8e8a3014d0 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: bcf2452442dc2658e1840c236a2756bc5b5ff91c1c9e4f14e2af898c7efbf1fb +# input_hash: 3b411f767af9c3cf3d53a12e2b181931d0a9d5e8a26eec9844c36f4f2eeafe34 channels: - conda-forge @@ -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.2=py312h3520af0_0 + - aiohttp=3.11.4=py312h3520af0_1 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -56,8 +56,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h7d75f6d_0 - - boto3=1.35.63=pyhd8ed1ab_0 - - botocore=1.35.63=pyge310_1234567_0 + - boto3=1.35.64=pyhd8ed1ab_0 + - botocore=1.35.64=pyge310_1234567_0 - bottleneck=1.4.2=py312h59f7578_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=h00291cd_2 @@ -102,9 +102,9 @@ dependencies: - dagster-pipes=1.9.2=pyhd8ed1ab_0 - dagster-postgres=0.25.2=pyhd8ed1ab_0 - dagster-webserver=1.9.2=pyhd8ed1ab_0 - - dask-core=2024.11.2=pyhd8ed1ab_0 + - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - - databricks-sdk=0.37.0=pyhd8ed1ab_0 + - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - debugpy=1.8.8=py312haafddd8_0 - decorator=5.1.1=pyhd8ed1ab_0 @@ -198,7 +198,6 @@ dependencies: - idna=3.10=pyhd8ed1ab_0 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.5.0=pyha770c72_0 - - importlib_metadata=8.5.0=hd8ed1ab_0 - importlib_resources=6.4.5=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_0 - ipykernel=6.29.5=pyh57ce528_0 @@ -256,7 +255,7 @@ dependencies: - libcblas=3.9.0=25_osx64_openblas - libcrc32c=1.1.2=he49afe7_0 - libcurl=8.10.1=h58e7537_0 - - libcxx=19.1.3=hf95d169_0 + - libcxx=19.1.4=hf95d169_0 - libdeflate=1.22=h00291cd_0 - libedit=3.1.20191231=h0678c8f_2 - libev=4.33=h10d778d_2 @@ -319,16 +318,16 @@ dependencies: - mergedeep=1.3.4=pyhd8ed1ab_0 - minizip=4.0.7=h62b0c8d_0 - mistune=3.0.2=pyhd8ed1ab_0 - - mlflow=2.17.2=hb401068_0 - - mlflow-skinny=2.17.2=py312hb401068_0 - - mlflow-ui=2.17.2=py312hb401068_0 + - mlflow=2.18.0=hb401068_0 + - mlflow-skinny=2.18.0=py312hb401068_0 + - mlflow-ui=2.18.0=py312hb401068_0 - more-itertools=10.5.0=pyhd8ed1ab_0 - msgpack-python=1.1.0=py312hc5c4d5f_0 - multidict=6.1.0=py312h6f3313d_1 - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.0=pyhff2d567_0 + - narwhals=1.14.1=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -491,11 +490,11 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h3d0f464_0 - - sqlglot=25.30.0=pyhff2d567_1 + - sqlglot=25.31.4=pyhff2d567_0 - sqlite=3.47.0=h6285a30_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - - starlette=0.41.2=pyha770c72_0 + - starlette=0.41.3=pyh7900ff3_0 - stevedore=5.3.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index 37b8315f52..01e8296598 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: d195cdc6e756c1121586b7add937cff32983380eb304e5c37cfb159de9b5c6cd +# input_hash: 0b79779e9803db47b1e57d14193b913280cf82b1fe3cc43a71d098160a71abe8 channels: - conda-forge @@ -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.2=py312h998013c_0 + - aiohttp=3.11.4=py312h998013c_1 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 @@ -56,8 +56,8 @@ dependencies: - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h5499902_0 - - boto3=1.35.63=pyhd8ed1ab_0 - - botocore=1.35.63=pyge310_1234567_0 + - boto3=1.35.64=pyhd8ed1ab_0 + - botocore=1.35.64=pyge310_1234567_0 - bottleneck=1.4.2=py312h147345f_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hd74edd7_2 @@ -102,9 +102,9 @@ dependencies: - dagster-pipes=1.9.2=pyhd8ed1ab_0 - dagster-postgres=0.25.2=pyhd8ed1ab_0 - dagster-webserver=1.9.2=pyhd8ed1ab_0 - - dask-core=2024.11.2=pyhd8ed1ab_0 + - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - - databricks-sdk=0.37.0=pyhd8ed1ab_0 + - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - debugpy=1.8.8=py312hd8f9ff3_0 - decorator=5.1.1=pyhd8ed1ab_0 @@ -198,7 +198,6 @@ dependencies: - idna=3.10=pyhd8ed1ab_0 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.5.0=pyha770c72_0 - - importlib_metadata=8.5.0=hd8ed1ab_0 - importlib_resources=6.4.5=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_0 - ipykernel=6.29.5=pyh57ce528_0 @@ -256,7 +255,7 @@ dependencies: - libcblas=3.9.0=25_osxarm64_openblas - libcrc32c=1.1.2=hbdafb3b_0 - libcurl=8.10.1=h13a7ad3_0 - - libcxx=19.1.3=ha82da77_0 + - libcxx=19.1.4=ha82da77_0 - libdeflate=1.22=hd74edd7_0 - libedit=3.1.20191231=hc8eb9b7_2 - libev=4.33=h93a5062_2 @@ -319,16 +318,16 @@ dependencies: - mergedeep=1.3.4=pyhd8ed1ab_0 - minizip=4.0.7=h27ee973_0 - mistune=3.0.2=pyhd8ed1ab_0 - - mlflow=2.17.2=py312h81bd7bf_0 - - mlflow-skinny=2.17.2=py312h81bd7bf_0 - - mlflow-ui=2.17.2=py312h81bd7bf_0 + - mlflow=2.18.0=py312h81bd7bf_0 + - mlflow-skinny=2.18.0=py312h81bd7bf_0 + - mlflow-ui=2.18.0=py312h81bd7bf_0 - more-itertools=10.5.0=pyhd8ed1ab_0 - msgpack-python=1.1.0=py312h6142ec9_0 - multidict=6.1.0=py312hdb8e49c_1 - multimethod=1.9.1=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - - narwhals=1.14.0=pyhff2d567_0 + - narwhals=1.14.1=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -491,11 +490,11 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h0bf5046_0 - - sqlglot=25.30.0=pyhff2d567_1 + - sqlglot=25.31.4=pyhff2d567_0 - sqlite=3.47.0=hcd14bea_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - - starlette=0.41.2=pyha770c72_0 + - starlette=0.41.3=pyh7900ff3_0 - stevedore=5.3.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 diff --git a/pyproject.toml b/pyproject.toml index d974f4307c..b714fcb199 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -338,13 +338,13 @@ name = "pudl-dev" [tool.conda-lock.dependencies] curl = ">=8.4.0" -google-cloud-sdk = ">=474" +google-cloud-sdk = ">=500" nodejs = ">=20" pandoc = ">=2" pip = ">=24" prettier = ">=3.0" python = ">=3.12,<3.13" -sqlite = ">=3.45" +sqlite = ">=3.47" zip = ">=3.0" [tool.coverage.run] From 272a30eb0caca07c9f9797d0e1d9633d38caf7e6 Mon Sep 17 00:00:00 2001 From: PUDL Bot <74792863+pudlbot@users.noreply.github.com> Date: Mon, 25 Nov 2024 09:21:17 -0600 Subject: [PATCH 3/7] Update conda lockfile for week of 2024-11-25 (#3973) * Update ruff pre-commit hooks * Update conda-lock.yml and rendered conda environment files. --------- Co-authored-by: Zane Selvans Co-authored-by: zaneselvans <596279+zaneselvans@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- environments/conda-linux-64.lock.yml | 76 +- environments/conda-lock.yml | 1086 ++++++++++--------- environments/conda-osx-64.lock.yml | 78 +- environments/conda-osx-arm64.lock.yml | 78 +- test/integration/zenodo_datapackage_test.py | 2 +- 6 files changed, 704 insertions(+), 618 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 35eb26d312..12d17035dd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: # Formatters: hooks that re-write Python & documentation files #################################################################################### - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.4 + rev: v0.8.0 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] diff --git a/environments/conda-linux-64.lock.yml b/environments/conda-linux-64.lock.yml index c851c61783..ba538d9e7a 100644 --- a/environments/conda-linux-64.lock.yml +++ b/environments/conda-linux-64.lock.yml @@ -10,15 +10,16 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.4=py312h178313f_1 + - aiohttp=3.11.7=py312h178313f_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 - - altair=5.4.1=pyhd8ed1ab_1 + - altair=5.5.0=pyhd8ed1ab_0 - annotated-types=0.7.0=pyhd8ed1ab_0 + - antlr-python-runtime=4.13.2=pyhd8ed1ab_0 - anyio=4.6.2.post1=pyhd8ed1ab_0 - appdirs=1.4.4=pyh9f0ad1d_0 - - arelle-release=2.35.6=pyhd8ed1ab_0 + - arelle-release=2.35.9=pyhd8ed1ab_0 - argon2-cffi=23.1.0=pyhd8ed1ab_0 - argon2-cffi-bindings=21.2.0=py312h66e93f0_5 - arrow=1.3.0=pyhd8ed1ab_0 @@ -52,20 +53,20 @@ dependencies: - backports=1.0=pyhd8ed1ab_4 - backports.tarfile=1.2.0=pyhd8ed1ab_0 - backports.zoneinfo=0.2.1=py312h7900ff3_9 - - bcrypt=4.2.0=py312h12e396e_1 + - bcrypt=4.2.1=py312h12e396e_0 - beautifulsoup4=4.12.3=pyha770c72_0 - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=hef167b5_0 - - boto3=1.35.64=pyhd8ed1ab_0 - - botocore=1.35.64=pyge310_1234567_0 + - boto3=1.35.68=pyhd8ed1ab_0 + - botocore=1.35.68=pyge310_1234567_0 - bottleneck=1.4.2=py312hc0a28a1_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hb9d3cd8_2 - brotli-bin=1.1.0=hb9d3cd8_2 - brotli-python=1.1.0=py312h2ec8cdc_2 - bzip2=1.0.8=h4bc722e_7 - - c-ares=1.34.3=heb4867d_0 + - c-ares=1.34.3=hb9d3cd8_1 - ca-certificates=2024.8.30=hbcca054_0 - cachecontrol=0.14.1=pyhd8ed1ab_0 - cachecontrol-with-filecache=0.14.1=pyhd8ed1ab_0 @@ -91,24 +92,24 @@ dependencies: - comm=0.2.2=pyhd8ed1ab_0 - conda-lock=2.5.7=pyhd8ed1ab_0 - contourpy=1.3.1=py312h68727a3_0 - - coverage=7.6.7=py312h178313f_0 + - coverage=7.6.8=py312h178313f_0 - crashtest=0.4.1=pyhd8ed1ab_0 - croniter=3.0.4=pyhd8ed1ab_0 - cryptography=43.0.3=py312hda17c39_0 - curl=8.10.1=hbbe4b11_0 - cycler=0.12.1=pyhd8ed1ab_0 - cyrus-sasl=2.1.27=h54b06d7_7 - - dagster=1.9.2=pyhd8ed1ab_12 - - dagster-graphql=1.9.2=pyhd8ed1ab_0 - - dagster-pipes=1.9.2=pyhd8ed1ab_0 - - dagster-postgres=0.25.2=pyhd8ed1ab_0 - - dagster-webserver=1.9.2=pyhd8ed1ab_0 + - dagster=1.9.3=pyhd8ed1ab_12 + - dagster-graphql=1.9.3=pyhd8ed1ab_0 + - dagster-pipes=1.9.3=pyhd8ed1ab_0 + - dagster-postgres=0.25.3=pyhff2d567_0 + - dagster-webserver=1.9.3=pyhd8ed1ab_0 - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.8=py312h2ec8cdc_0 + - debugpy=1.8.9=py312h2ec8cdc_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - deprecated=1.2.15=pyhff2d567_0 @@ -163,7 +164,7 @@ dependencies: - google-auth=2.36.0=pyhff2d567_0 - google-auth-oauthlib=1.2.1=pyhd8ed1ab_0 - google-cloud-core=2.4.1=pyhd8ed1ab_0 - - google-cloud-sdk=501.0.0=py312h7900ff3_1 + - google-cloud-sdk=502.0.0=py312h7900ff3_0 - google-cloud-storage=2.18.2=pyhff2d567_0 - google-crc32c=1.1.2=py312hb42adb9_6 - google-resumable-media=2.7.2=pyhd8ed1ab_1 @@ -195,7 +196,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.3=pyha770c72_0 + - hypothesis=6.119.4=pyha770c72_0 - icu=75.1=he02047a_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -289,7 +290,7 @@ dependencies: - libopenblas=0.3.28=pthreads_h94d23a6_1 - libparquet=17.0.0=h39682fd_16_cpu - libpng=1.6.44=hadc24fc_0 - - libpq=17.1=h04577a9_0 + - libpq=17.2=h04577a9_0 - libprotobuf=4.25.3=hd5b35b9_1 - libre2-11=2023.09.01=h5a48ba9_2 - librsvg=2.58.4=hc0ffecb_0 @@ -297,7 +298,7 @@ dependencies: - libsodium=1.0.20=h4ab18f5_0 - libspatialite=5.1.0=h1b4f908_11 - libsqlite=3.47.0=hadc24fc_1 - - libssh2=1.11.0=h0841786_0 + - libssh2=1.11.1=hf672d98_0 - libstdcxx=14.2.0=hc0a3c3a_1 - libstdcxx-ng=14.2.0=h4852527_1 - libthrift=0.20.0=h0e7cc3e_1 @@ -338,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.1=pyhff2d567_0 + - narwhals=1.14.2=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -355,7 +356,7 @@ dependencies: - notebook-shim=0.2.4=pyhd8ed1ab_0 - numba=0.60.0=py312h83e6fd3_0 - numexpr=2.10.1=py312h6a710ac_103 - - numpy=2.0.2=py312h58c1407_0 + - numpy=2.0.2=py312h58c1407_1 - oauthlib=3.2.2=pyhd8ed1ab_0 - openjpeg=2.5.2=h488ebb8_0 - openldap=2.6.8=hedd0468_0 @@ -468,15 +469,15 @@ dependencies: - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.6=py312h66e93f0_1 - ruamel.yaml.clib=0.2.8=py312h66e93f0_1 - - ruff=0.7.4=py312h2156523_0 - - ruff-lsp=0.0.58=pyhd8ed1ab_0 + - ruff=0.8.0=py312h2156523_0 + - ruff-lsp=0.0.59=pyhd8ed1ab_0 - s2n=1.5.5=h3931f03_0 - - s3transfer=0.10.3=pyhd8ed1ab_0 + - s3transfer=0.10.4=pyhd8ed1ab_0 - scikit-learn=1.5.2=py312h7a48858_1 - scipy=1.14.1=py312h62794b6_1 - secretstorage=3.3.3=py312h7900ff3_3 - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=75.5.0=pyhff2d567_0 + - setuptools=75.6.0=pyhff2d567_0 - shapely=2.0.6=py312h391bc85_2 - shellingham=1.5.4=pyhd8ed1ab_0 - simpleeval=0.9.13=pyhd8ed1ab_1 @@ -488,7 +489,7 @@ dependencies: - sortedcontainers=2.4.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - sphinx=8.1.3=pyhd8ed1ab_0 - - sphinx-autoapi=3.3.3=pyhd8ed1ab_0 + - sphinx-autoapi=3.3.3=pyhff2d567_1 - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 - sphinx-issues=5.0.0=pyhd8ed1ab_0 - sphinx-reredirects=0.1.5=pyhd8ed1ab_0 @@ -502,12 +503,13 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h66e93f0_0 - - sqlglot=25.31.4=pyhff2d567_0 + - sqlglot=25.32.0=pyhff2d567_0 - sqlite=3.47.0=h9eae976_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.41.3=pyh7900ff3_0 - - stevedore=5.3.0=pyhd8ed1ab_0 + - stdlib-list=0.11.0=pyhd8ed1ab_0 + - stevedore=5.4.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 - tabulate=0.9.0=pyhd8ed1ab_1 @@ -515,7 +517,7 @@ dependencies: - terraform=1.9.8=h76a2195_0 - text-unidecode=1.3=pyhd8ed1ab_1 - threadpoolctl=3.5.0=pyhc1e730c_0 - - timezonefinder=6.5.4=py312h66e93f0_0 + - timezonefinder=6.5.5=py312h66e93f0_0 - tinycss2=1.4.0=pyhd8ed1ab_0 - tk=8.6.13=noxft_h4845f30_101 - toml=0.10.2=pyhd8ed1ab_0 @@ -524,12 +526,12 @@ dependencies: - toolz=0.12.1=pyhd8ed1ab_0 - toposort=1.10=pyhd8ed1ab_0 - tornado=6.4.1=py312h66e93f0_1 - - tqdm=4.67.0=pyhd8ed1ab_0 + - tqdm=4.67.1=pyhd8ed1ab_0 - traitlets=5.14.3=pyhd8ed1ab_0 - typeguard=4.4.1=pyhd8ed1ab_0 - - typer=0.13.0=pyhd8ed1ab_0 - - typer-slim=0.13.0=pyhff2d567_0 - - typer-slim-standard=0.13.0=hd8ed1ab_0 + - typer=0.13.1=pyhd8ed1ab_0 + - typer-slim=0.13.1=pyhff2d567_0 + - typer-slim-standard=0.13.1=hd8ed1ab_0 - types-python-dateutil=2.9.0.20241003=pyhff2d567_0 - types-pyyaml=6.0.12.20240917=pyhd8ed1ab_0 - typing-extensions=4.12.2=hd8ed1ab_0 @@ -543,8 +545,8 @@ dependencies: - uri-template=1.3.0=pyhd8ed1ab_0 - uriparser=0.9.8=hac33072_0 - urllib3=1.26.19=pyhd8ed1ab_0 - - uvicorn=0.32.0=pyh31011fe_1 - - uvicorn-standard=0.32.0=h31011fe_1 + - uvicorn=0.32.1=pyh31011fe_0 + - uvicorn-standard=0.32.1=h31011fe_0 - uvloop=0.21.0=py312h66e93f0_1 - validators=0.34.0=pyhd8ed1ab_0 - virtualenv=20.27.1=pyhd8ed1ab_0 @@ -556,9 +558,9 @@ dependencies: - websocket-client=1.8.0=pyhd8ed1ab_0 - websockets=11.0.3=py312h98912ed_1 - werkzeug=3.1.3=pyhff2d567_0 - - wheel=0.45.0=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - - wrapt=1.16.0=py312h66e93f0_1 + - wrapt=1.17.0=py312h66e93f0_0 - xerces-c=3.2.5=h988505b_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0 - xorg-libice=1.1.1=hb9d3cd8_1 @@ -572,7 +574,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - - yarl=1.17.2=py312h66e93f0_0 + - yarl=1.18.0=py312h66e93f0_0 - zeromq=4.3.5=h3b0a872_7 - zip=3.0=hd590300_3 - zipp=3.21.0=pyhd8ed1ab_0 diff --git a/environments/conda-lock.yml b/environments/conda-lock.yml index b96856ea96..cfcee6cc83 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.4 + version: 3.11.7 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.4-py312h178313f_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.7-py312h178313f_0.conda hash: - md5: cd87a5581629dbe1997740e65ccd4722 - sha256: c421da03a70723966ded071eb9a7dcd3d0efae1de706cf7056522ef803bd0357 + md5: a1dc198dad91736555c27caa420029b1 + sha256: e95adfd637644c9a0641bc5fbec04d53b19330568971a24021253e5054f7750e category: main optional: false - name: aiohttp - version: 3.11.4 + version: 3.11.7 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.4-py312h3520af0_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.11.7-py312h3520af0_0.conda hash: - md5: 8cb26acc42cb098f03fd7567582fcd3a - sha256: f928168b03b4c629c8925e4329b5d484e3e5c1d24ca99e9f07bcce666c0f4139 + md5: b37a0f3498502b4d761e67db908535c0 + sha256: 7422156918ab2b4ac48bffc1a146353e3a656d5ec1d800400358e49becfc746c category: main optional: false - name: aiohttp - version: 3.11.4 + version: 3.11.7 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.4-py312h998013c_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.7-py312h998013c_0.conda hash: - md5: 31c809c1790430b11963ac29486256bf - sha256: a9ac49857e20ac046b7fcbcb3f9df2d33cdc934480a512f3cfac5b55d295410b + md5: 6d8e94bda91469c00eb617a9cdb7f622 + sha256: 6f5fc3177188871418f4112e87b708499f6c9c484e175ad8c3a2e08554143e85 category: main optional: false - name: aiosignal @@ -354,57 +354,57 @@ package: category: main optional: false - name: altair - version: 5.4.1 + version: 5.5.0 manager: conda platform: linux-64 dependencies: importlib-metadata: "" jinja2: "" jsonschema: ">=3.0" - narwhals: ">=1.1.0" + narwhals: ">=1.14.2" packaging: "" - python: ">=3.8" + python: ">=3.9" typing-extensions: ">=4.10.0" - url: https://conda.anaconda.org/conda-forge/noarch/altair-5.4.1-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/altair-5.5.0-pyhd8ed1ab_0.conda hash: - md5: 8431a457f055d4f89569d60583623c6e - sha256: adc8a0ff6052c11e9addbcf329d15180aa5481376f0d5048cfefe314354a2c9e + md5: a36e83a3ca4416a393be9d023f1f9c8d + sha256: de9d4f1211b6f818b9c5b42b641ca7b729e92a265d442f5a471cb9a83d7e10dd category: main optional: false - name: altair - version: 5.4.1 + version: 5.5.0 manager: conda platform: osx-64 dependencies: packaging: "" jinja2: "" importlib-metadata: "" - python: ">=3.8" + python: ">=3.9" jsonschema: ">=3.0" typing-extensions: ">=4.10.0" - narwhals: ">=1.1.0" - url: https://conda.anaconda.org/conda-forge/noarch/altair-5.4.1-pyhd8ed1ab_1.conda + narwhals: ">=1.14.2" + url: https://conda.anaconda.org/conda-forge/noarch/altair-5.5.0-pyhd8ed1ab_0.conda hash: - md5: 8431a457f055d4f89569d60583623c6e - sha256: adc8a0ff6052c11e9addbcf329d15180aa5481376f0d5048cfefe314354a2c9e + md5: a36e83a3ca4416a393be9d023f1f9c8d + sha256: de9d4f1211b6f818b9c5b42b641ca7b729e92a265d442f5a471cb9a83d7e10dd category: main optional: false - name: altair - version: 5.4.1 + version: 5.5.0 manager: conda platform: osx-arm64 dependencies: packaging: "" jinja2: "" importlib-metadata: "" - python: ">=3.8" + python: ">=3.9" jsonschema: ">=3.0" typing-extensions: ">=4.10.0" - narwhals: ">=1.1.0" - url: https://conda.anaconda.org/conda-forge/noarch/altair-5.4.1-pyhd8ed1ab_1.conda + narwhals: ">=1.14.2" + url: https://conda.anaconda.org/conda-forge/noarch/altair-5.5.0-pyhd8ed1ab_0.conda hash: - md5: 8431a457f055d4f89569d60583623c6e - sha256: adc8a0ff6052c11e9addbcf329d15180aa5481376f0d5048cfefe314354a2c9e + md5: a36e83a3ca4416a393be9d023f1f9c8d + sha256: de9d4f1211b6f818b9c5b42b641ca7b729e92a265d442f5a471cb9a83d7e10dd category: main optional: false - name: annotated-types @@ -446,6 +446,42 @@ package: sha256: 668f0825b6c18e4012ca24a0070562b6ec801ebc7008228a428eb52b4038873f category: main optional: false + - name: antlr-python-runtime + version: 4.13.2 + manager: conda + platform: linux-64 + dependencies: + python: ">=3.6" + url: https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.13.2-pyhd8ed1ab_0.conda + hash: + md5: c313ebd3419477fbd356c24b984669ba + sha256: 906b27bdd26a3a15b1485e9b7ac4c280cd329b5cc33a1c778e6a3ff3510570a1 + category: main + optional: false + - name: antlr-python-runtime + version: 4.13.2 + manager: conda + platform: osx-64 + dependencies: + python: ">=3.6" + url: https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.13.2-pyhd8ed1ab_0.conda + hash: + md5: c313ebd3419477fbd356c24b984669ba + sha256: 906b27bdd26a3a15b1485e9b7ac4c280cd329b5cc33a1c778e6a3ff3510570a1 + category: main + optional: false + - name: antlr-python-runtime + version: 4.13.2 + manager: conda + platform: osx-arm64 + dependencies: + python: ">=3.6" + url: https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.13.2-pyhd8ed1ab_0.conda + hash: + md5: c313ebd3419477fbd356c24b984669ba + sha256: 906b27bdd26a3a15b1485e9b7ac4c280cd329b5cc33a1c778e6a3ff3510570a1 + category: main + optional: false - name: anyio version: 4.6.2.post1 manager: conda @@ -555,7 +591,7 @@ package: category: main optional: false - name: arelle-release - version: 2.35.6 + version: 2.35.9 manager: conda platform: linux-64 dependencies: @@ -570,14 +606,14 @@ package: python: ">=3.9,<3.13" python-dateutil: 2.* regex: "" - url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.9-pyhd8ed1ab_0.conda hash: - md5: 57273b5e1898e8e7e91072669da8965b - sha256: b1255aebbc489168fb6af41357388115a02624464b56317dba9ce7098fffbd56 + md5: 29312b95426ad3ec01ca1281c6fc408f + sha256: f44aa66d1edd304cde46f2255a5d2253a93988a51eca1fd3e161940386cc93a6 category: main optional: false - name: arelle-release - version: 2.35.6 + version: 2.35.9 manager: conda platform: osx-64 dependencies: @@ -592,14 +628,14 @@ package: lxml: ">=4,<6" numpy: ">=1,<3" pillow: ">=10,<12" - url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.9-pyhd8ed1ab_0.conda hash: - md5: 57273b5e1898e8e7e91072669da8965b - sha256: b1255aebbc489168fb6af41357388115a02624464b56317dba9ce7098fffbd56 + md5: 29312b95426ad3ec01ca1281c6fc408f + sha256: f44aa66d1edd304cde46f2255a5d2253a93988a51eca1fd3e161940386cc93a6 category: main optional: false - name: arelle-release - version: 2.35.6 + version: 2.35.9 manager: conda platform: osx-arm64 dependencies: @@ -614,10 +650,10 @@ package: lxml: ">=4,<6" numpy: ">=1,<3" pillow: ">=10,<12" - url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/arelle-release-2.35.9-pyhd8ed1ab_0.conda hash: - md5: 57273b5e1898e8e7e91072669da8965b - sha256: b1255aebbc489168fb6af41357388115a02624464b56317dba9ce7098fffbd56 + md5: 29312b95426ad3ec01ca1281c6fc408f + sha256: f44aa66d1edd304cde46f2255a5d2253a93988a51eca1fd3e161940386cc93a6 category: main optional: false - name: argon2-cffi @@ -2078,7 +2114,7 @@ package: category: main optional: false - name: bcrypt - version: 4.2.0 + version: 4.2.1 manager: conda platform: linux-64 dependencies: @@ -2086,38 +2122,38 @@ package: libgcc: ">=13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-4.2.0-py312h12e396e_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-4.2.1-py312h12e396e_0.conda hash: - md5: f9e7bb7088f5a912cf786bbfc6cfb7db - sha256: b8884ffd8fd6c05f0f2da18f4a437566926c06566f0ee5c54cd87797849e86c5 + md5: fbfaa371b5f14cb89756483bb4e030be + sha256: 6f2b82c69893ef33d24975572a03c031a889c0a0e8406ae1d3a09c7f1608bf4b category: main optional: false - name: bcrypt - version: 4.2.0 + version: 4.2.1 manager: conda platform: osx-64 dependencies: __osx: ">=10.13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-4.2.0-py312h669792a_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/bcrypt-4.2.1-py312h0d0de52_0.conda hash: - md5: 9e03d3e67feb1d9f12b40f526e2a5ba5 - sha256: 1f3ea55527e75392b84626a7e6d52acc729c41120248bc3ab4f78cc2e3d075c2 + md5: 6ed8319cec2be2818ce6270645a57d22 + sha256: ed6adbba5e892a5165401c2513b77b570692cc311b8a0d6bb4a2edac353ebdd7 category: main optional: false - name: bcrypt - version: 4.2.0 + version: 4.2.1 manager: conda platform: osx-arm64 dependencies: __osx: ">=11.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-4.2.0-py312he431725_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/bcrypt-4.2.1-py312hcd83bfe_0.conda hash: - md5: bc78af7f9c28d32836515fd5a8be56ba - sha256: f905c8ba030acb17c53bd2076deb14755fb3ac63dcd92c4fddc1f58727d8dfcc + md5: 527903e14dd5572f8e076c6ad6954d67 + sha256: eec3209348e156e7879c20e7f49afe603460889dccac1263d07a6239c086b134 category: main optional: false - name: beautifulsoup4 @@ -2286,52 +2322,52 @@ package: category: main optional: false - name: boto3 - version: 1.35.64 + version: 1.35.68 manager: conda platform: linux-64 dependencies: - botocore: ">=1.35.64,<1.36.0" + botocore: ">=1.35.68,<1.36.0" jmespath: ">=0.7.1,<2.0.0" python: ">=3.8" s3transfer: ">=0.10.0,<0.11.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.68-pyhd8ed1ab_0.conda hash: - md5: 9a1fcfa6ff6736efbe88dd67b8277015 - sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 + md5: 69b82b9e058d5a459d20a6537ab69125 + sha256: 47dea9a5cfc1373e0172d2c71516c6d8124f5b2689b158bccbec3bd673eaec56 category: main optional: false - name: boto3 - version: 1.35.64 + version: 1.35.68 manager: conda platform: osx-64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.64,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda + botocore: ">=1.35.68,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.68-pyhd8ed1ab_0.conda hash: - md5: 9a1fcfa6ff6736efbe88dd67b8277015 - sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 + md5: 69b82b9e058d5a459d20a6537ab69125 + sha256: 47dea9a5cfc1373e0172d2c71516c6d8124f5b2689b158bccbec3bd673eaec56 category: main optional: false - name: boto3 - version: 1.35.64 + version: 1.35.68 manager: conda platform: osx-arm64 dependencies: python: ">=3.8" jmespath: ">=0.7.1,<2.0.0" s3transfer: ">=0.10.0,<0.11.0" - botocore: ">=1.35.64,<1.36.0" - url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.64-pyhd8ed1ab_0.conda + botocore: ">=1.35.68,<1.36.0" + url: https://conda.anaconda.org/conda-forge/noarch/boto3-1.35.68-pyhd8ed1ab_0.conda hash: - md5: 9a1fcfa6ff6736efbe88dd67b8277015 - sha256: 0eb1ad4094212933c93b87e959705493f3b5d12e2079dbd91b893b3e00158214 + md5: 69b82b9e058d5a459d20a6537ab69125 + sha256: 47dea9a5cfc1373e0172d2c71516c6d8124f5b2689b158bccbec3bd673eaec56 category: main optional: false - name: botocore - version: 1.35.64 + version: 1.35.68 manager: conda platform: linux-64 dependencies: @@ -2339,14 +2375,14 @@ package: python: ">=3.10" python-dateutil: ">=2.1,<3.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.68-pyge310_1234567_0.conda hash: - md5: baf44a99dc095d9ace5a02a51c10858b - sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 + md5: 43b1cc0c328d8525b3180beb78a314f6 + sha256: 877f3626f0715ec29906c249ea9b3198172a7583a3453f1e981c4dda7d21794d category: main optional: false - name: botocore - version: 1.35.64 + version: 1.35.68 manager: conda platform: osx-64 dependencies: @@ -2354,14 +2390,14 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.68-pyge310_1234567_0.conda hash: - md5: baf44a99dc095d9ace5a02a51c10858b - sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 + md5: 43b1cc0c328d8525b3180beb78a314f6 + sha256: 877f3626f0715ec29906c249ea9b3198172a7583a3453f1e981c4dda7d21794d category: main optional: false - name: botocore - version: 1.35.64 + version: 1.35.68 manager: conda platform: osx-arm64 dependencies: @@ -2369,10 +2405,10 @@ package: python-dateutil: ">=2.1,<3.0.0" jmespath: ">=0.7.1,<2.0.0" urllib3: ">=1.25.4,!=2.2.0,<3" - url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.64-pyge310_1234567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/botocore-1.35.68-pyge310_1234567_0.conda hash: - md5: baf44a99dc095d9ace5a02a51c10858b - sha256: 58069de1f339e29f41f69343c38d093e8db833644aee2b4021558bfafc614392 + md5: 43b1cc0c328d8525b3180beb78a314f6 + sha256: 877f3626f0715ec29906c249ea9b3198172a7583a3453f1e981c4dda7d21794d category: main optional: false - name: bottleneck @@ -2637,12 +2673,12 @@ package: manager: conda platform: linux-64 dependencies: - __glibc: ">=2.28,<3.0.a0" + __glibc: ">=2.17,<3.0.a0" libgcc: ">=13" - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda hash: - md5: 09a6c610d002e54e18353c06ef61a253 - sha256: 1015d731c05ef7de298834833d680b08dea58980b907f644345bd457f9498c99 + md5: ee228789a85f961d14567252a03e725f + sha256: 732571ba6286dbccbf4c6450078a581b7a5620204faf876ff0ef282d77a6bfa8 category: main optional: false - name: c-ares @@ -2651,10 +2687,10 @@ package: platform: osx-64 dependencies: __osx: ">=10.13" - url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.3-hf13058a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.3-hf13058a_1.conda hash: - md5: c36355bc08d4623c210b00f9935ee632 - sha256: e1bc2520ba9bfa55cd487efabd6bfaa49ccd944847895472133ba919810c9978 + md5: 7d8083876d71fe1316fc18369ee0dc58 + sha256: 37c031f91bb4c7ebec248e283c453b24840764fb53b640768780dcd904093f17 category: main optional: false - name: c-ares @@ -2663,10 +2699,10 @@ package: platform: osx-arm64 dependencies: __osx: ">=11.0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.3-h5505292_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.3-h5505292_1.conda hash: - md5: d0155a4f41f28628c7409ea000eeb19c - sha256: e9e0f737286f9f4173c76fb01a11ffbe87cfc2da4e99760e1e18f47851d7ae06 + md5: fb72102e8a8f9bcd38e40af09ff41c42 + sha256: 6dfa83cbd9acc8671d439fe9c745a5716faf6cbadf2f1e18c841bcf86cbba5f2 category: main optional: false - name: ca-certificates @@ -3774,7 +3810,7 @@ package: category: main optional: false - name: coverage - version: 7.6.7 + version: 7.6.8 manager: conda platform: linux-64 dependencies: @@ -3783,14 +3819,14 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* tomli: "" - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.7-py312h178313f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.8-py312h178313f_0.conda hash: - md5: f64f3206bf9e86338b881957fd498870 - sha256: 2d8f9a588f89fc3df7b98ab5ffcf5968c82c34813db7373f40b5a7de71eabf2a + md5: fe8c93f4c75908fe2a1cc45ed0c47edf + sha256: f81fb017d0312a392d6454f374e69379650108bb5d709c635edf9dcbb9a39eef category: main optional: false - name: coverage - version: 7.6.7 + version: 7.6.8 manager: conda platform: osx-64 dependencies: @@ -3798,14 +3834,14 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* tomli: "" - url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.7-py312h3520af0_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.8-py312h3520af0_0.conda hash: - md5: 93df4f496ebe0d228a94637c9fd59c00 - sha256: 7d8a85ef93500c70284e6369bcf5adb4eb5d5ae71cf18b6c1d03c36e1a5c08fc + md5: 407f22327e2934990bf6b36b080459d6 + sha256: d0eb9a85577b470e8bc0efad8e6bc480ee4153fdb7206e05bfef59cae54a8944 category: main optional: false - name: coverage - version: 7.6.7 + version: 7.6.8 manager: conda platform: osx-arm64 dependencies: @@ -3813,10 +3849,10 @@ package: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* tomli: "" - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.7-py312h998013c_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.8-py312h998013c_0.conda hash: - md5: 0962c6746e00b34ce0584d3ae129d266 - sha256: 2be117611f5c776372b7d12ea8bce2d0452022e612c84e042017eb6c777b9da6 + md5: e5ca7c17efb98bf88fd764fc4544fa98 + sha256: 71135e0a59806897059d60d184877bf581132b0148f492b5ad195dc36e714341 category: main optional: false - name: crashtest @@ -4084,15 +4120,16 @@ package: category: main optional: false - name: dagster - version: 1.9.2 + version: 1.9.3 manager: conda platform: linux-64 dependencies: alembic: ">=1.2.1,!=1.6.3,!=1.7.0,!=1.11.0" + antlr-python-runtime: "" click: ">=5.0" coloredlogs: ">=6.1,<=14.0" croniter: ">=0.3.34,<4" - dagster-pipes: ">=1.9.2,<1.9.3.0a0" + dagster-pipes: ">=1.9.3,<1.9.4.0a0" docstring_parser: "" filelock: "" grpcio: ">=1.44.0" @@ -4120,14 +4157,14 @@ package: tzdata: "" universal_pathlib: ">=0.2.0" watchdog: ">=0.8.3,<6" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.2-pyhd8ed1ab_12.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.3-pyhd8ed1ab_12.conda hash: - md5: fa94d037dc473e721d5aa0fa5ed07b13 - sha256: 8fcb11ba4dc723a970be0eef1476f77f6a0dbefd2e95d6371c09694fc258ab46 + md5: 8b9b6c6ecfd4519473d29a1efca8135f + sha256: 0139f5ad0759d053dc62ce3f39dc45c6ea80f6170aa1da1f971b85fd9c5389c2 category: main optional: false - name: dagster - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-64 dependencies: @@ -4143,6 +4180,7 @@ package: structlog: "" docstring_parser: "" tzdata: "" + antlr-python-runtime: "" pyyaml: ">=5.1" packaging: ">=20.9" click: ">=5.0" @@ -4162,15 +4200,15 @@ package: universal_pathlib: ">=0.2.0" croniter: ">=0.3.34,<4" pydantic: ">=2,<2.10" - dagster-pipes: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.2-pyhd8ed1ab_12.conda + dagster-pipes: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.3-pyhd8ed1ab_12.conda hash: - md5: fa94d037dc473e721d5aa0fa5ed07b13 - sha256: 8fcb11ba4dc723a970be0eef1476f77f6a0dbefd2e95d6371c09694fc258ab46 + md5: 8b9b6c6ecfd4519473d29a1efca8135f + sha256: 0139f5ad0759d053dc62ce3f39dc45c6ea80f6170aa1da1f971b85fd9c5389c2 category: main optional: false - name: dagster - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-arm64 dependencies: @@ -4186,6 +4224,7 @@ package: structlog: "" docstring_parser: "" tzdata: "" + antlr-python-runtime: "" pyyaml: ">=5.1" packaging: ">=20.9" click: ">=5.0" @@ -4205,32 +4244,32 @@ package: universal_pathlib: ">=0.2.0" croniter: ">=0.3.34,<4" pydantic: ">=2,<2.10" - dagster-pipes: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.2-pyhd8ed1ab_12.conda + dagster-pipes: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-1.9.3-pyhd8ed1ab_12.conda hash: - md5: fa94d037dc473e721d5aa0fa5ed07b13 - sha256: 8fcb11ba4dc723a970be0eef1476f77f6a0dbefd2e95d6371c09694fc258ab46 + md5: 8b9b6c6ecfd4519473d29a1efca8135f + sha256: 0139f5ad0759d053dc62ce3f39dc45c6ea80f6170aa1da1f971b85fd9c5389c2 category: main optional: false - name: dagster-graphql - version: 1.9.2 + version: 1.9.3 manager: conda platform: linux-64 dependencies: - dagster: ">=1.9.2,<1.9.3.0a0" + dagster: ">=1.9.3,<1.9.4.0a0" gql-with-requests: ">=3.0.0,<4.0.0" graphene: ">=3,<4" python: ">=3.9,<3.13" requests: "" starlette: "" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.3-pyhd8ed1ab_0.conda hash: - md5: 9dfa1d89465db40f58b79452e44e236a - sha256: bb0157acfc83d07e11066836c8b4646fe022a38ec85345ad329758fb6c192ae3 + md5: 8cbbd20fd4dd18625d169e4d618b8adc + sha256: b06d9c28f8b0f83ee7c96b64b03433f96d8cdf098bbcef2cc7fd8eeda92f4cd7 category: dev optional: true - name: dagster-graphql - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-64 dependencies: @@ -4239,15 +4278,15 @@ package: python: ">=3.9,<3.13" gql-with-requests: ">=3.0.0,<4.0.0" graphene: ">=3,<4" - dagster: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.2-pyhd8ed1ab_0.conda + dagster: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.3-pyhd8ed1ab_0.conda hash: - md5: 9dfa1d89465db40f58b79452e44e236a - sha256: bb0157acfc83d07e11066836c8b4646fe022a38ec85345ad329758fb6c192ae3 + md5: 8cbbd20fd4dd18625d169e4d618b8adc + sha256: b06d9c28f8b0f83ee7c96b64b03433f96d8cdf098bbcef2cc7fd8eeda92f4cd7 category: dev optional: true - name: dagster-graphql - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-arm64 dependencies: @@ -4256,140 +4295,140 @@ package: python: ">=3.9,<3.13" gql-with-requests: ">=3.0.0,<4.0.0" graphene: ">=3,<4" - dagster: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.2-pyhd8ed1ab_0.conda + dagster: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-graphql-1.9.3-pyhd8ed1ab_0.conda hash: - md5: 9dfa1d89465db40f58b79452e44e236a - sha256: bb0157acfc83d07e11066836c8b4646fe022a38ec85345ad329758fb6c192ae3 + md5: 8cbbd20fd4dd18625d169e4d618b8adc + sha256: b06d9c28f8b0f83ee7c96b64b03433f96d8cdf098bbcef2cc7fd8eeda92f4cd7 category: dev optional: true - name: dagster-pipes - version: 1.9.2 + version: 1.9.3 manager: conda platform: linux-64 dependencies: python: ">=3.9,<3.13" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.3-pyhd8ed1ab_0.conda hash: - md5: b8088bc38ea9070e8176bf8bb37cf00c - sha256: 09c89ee20afced17cff248ed96cec45b12521e0390485e2a84ce381742091a8a + md5: fbbaaef9aaa3fe267c1dff3bb3819a36 + sha256: c43587c3afbed3dd985b32fc51df1aa33bcb1ff42ac109ca07b2e3a4e574668a category: main optional: false - name: dagster-pipes - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-64 dependencies: python: ">=3.9,<3.13" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.3-pyhd8ed1ab_0.conda hash: - md5: b8088bc38ea9070e8176bf8bb37cf00c - sha256: 09c89ee20afced17cff248ed96cec45b12521e0390485e2a84ce381742091a8a + md5: fbbaaef9aaa3fe267c1dff3bb3819a36 + sha256: c43587c3afbed3dd985b32fc51df1aa33bcb1ff42ac109ca07b2e3a4e574668a category: main optional: false - name: dagster-pipes - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-arm64 dependencies: python: ">=3.9,<3.13" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-pipes-1.9.3-pyhd8ed1ab_0.conda hash: - md5: b8088bc38ea9070e8176bf8bb37cf00c - sha256: 09c89ee20afced17cff248ed96cec45b12521e0390485e2a84ce381742091a8a + md5: fbbaaef9aaa3fe267c1dff3bb3819a36 + sha256: c43587c3afbed3dd985b32fc51df1aa33bcb1ff42ac109ca07b2e3a4e574668a category: main optional: false - name: dagster-postgres - version: 0.25.2 + version: 0.25.3 manager: conda platform: linux-64 dependencies: - dagster: 1.9.2.* + dagster: 1.9.3.* psycopg2-binary: "" python: ">=3.9,<3.13" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.3-pyhff2d567_0.conda hash: - md5: e44e3231c81db1260f1f0e1a916204db - sha256: f30417e886c8871bfffa1c39b838ae4d03b15ba71c346ec398effaf7ad89aa23 + md5: 4ee66aa40f1e5058e5ddd4a8ce184e67 + sha256: ef404d7b57a5e4c68c38c8ebf1cc89df482012e1a7db17944407533e91c27c23 category: main optional: false - name: dagster-postgres - version: 0.25.2 + version: 0.25.3 manager: conda platform: osx-64 dependencies: psycopg2-binary: "" python: ">=3.9,<3.13" - dagster: 1.9.2.* - url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.2-pyhd8ed1ab_0.conda + dagster: 1.9.3.* + url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.3-pyhff2d567_0.conda hash: - md5: e44e3231c81db1260f1f0e1a916204db - sha256: f30417e886c8871bfffa1c39b838ae4d03b15ba71c346ec398effaf7ad89aa23 + md5: 4ee66aa40f1e5058e5ddd4a8ce184e67 + sha256: ef404d7b57a5e4c68c38c8ebf1cc89df482012e1a7db17944407533e91c27c23 category: main optional: false - name: dagster-postgres - version: 0.25.2 + version: 0.25.3 manager: conda platform: osx-arm64 dependencies: psycopg2-binary: "" python: ">=3.9,<3.13" - dagster: 1.9.2.* - url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.2-pyhd8ed1ab_0.conda + dagster: 1.9.3.* + url: https://conda.anaconda.org/conda-forge/noarch/dagster-postgres-0.25.3-pyhff2d567_0.conda hash: - md5: e44e3231c81db1260f1f0e1a916204db - sha256: f30417e886c8871bfffa1c39b838ae4d03b15ba71c346ec398effaf7ad89aa23 + md5: 4ee66aa40f1e5058e5ddd4a8ce184e67 + sha256: ef404d7b57a5e4c68c38c8ebf1cc89df482012e1a7db17944407533e91c27c23 category: main optional: false - name: dagster-webserver - version: 1.9.2 + version: 1.9.3 manager: conda platform: linux-64 dependencies: click: ">=7.0,<9.0" - dagster: ">=1.9.2,<1.9.3.0a0" - dagster-graphql: ">=1.9.2,<1.9.3.0a0" + dagster: ">=1.9.3,<1.9.4.0a0" + dagster-graphql: ">=1.9.3,<1.9.4.0a0" python: ">=3.9,<3.13" starlette: "!=0.36.0" uvicorn-standard: "" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.3-pyhd8ed1ab_0.conda hash: - md5: a4634ce0ac12c0bdb1f6aeb57aac1d1d - sha256: 2e5da64c48364d9ab2513ce5c51e9fa3b4eff3a061eb7ace93e01a9ba88d7324 + md5: 10e17dc712b0cf32525e05610d9f2aeb + sha256: c03eb536bc07b34e90b37e0f85ccd0a5c074f999ee7893a58984d382a9475d01 category: dev optional: true - name: dagster-webserver - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-64 dependencies: uvicorn-standard: "" - click: ">=7.0,<9.0" python: ">=3.9,<3.13" + click: ">=7.0,<9.0" starlette: "!=0.36.0" - dagster: ">=1.9.2,<1.9.3.0a0" - dagster-graphql: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.2-pyhd8ed1ab_0.conda + dagster: ">=1.9.3,<1.9.4.0a0" + dagster-graphql: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.3-pyhd8ed1ab_0.conda hash: - md5: a4634ce0ac12c0bdb1f6aeb57aac1d1d - sha256: 2e5da64c48364d9ab2513ce5c51e9fa3b4eff3a061eb7ace93e01a9ba88d7324 + md5: 10e17dc712b0cf32525e05610d9f2aeb + sha256: c03eb536bc07b34e90b37e0f85ccd0a5c074f999ee7893a58984d382a9475d01 category: dev optional: true - name: dagster-webserver - version: 1.9.2 + version: 1.9.3 manager: conda platform: osx-arm64 dependencies: uvicorn-standard: "" - click: ">=7.0,<9.0" python: ">=3.9,<3.13" + click: ">=7.0,<9.0" starlette: "!=0.36.0" - dagster: ">=1.9.2,<1.9.3.0a0" - dagster-graphql: ">=1.9.2,<1.9.3.0a0" - url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.2-pyhd8ed1ab_0.conda + dagster: ">=1.9.3,<1.9.4.0a0" + dagster-graphql: ">=1.9.3,<1.9.4.0a0" + url: https://conda.anaconda.org/conda-forge/noarch/dagster-webserver-1.9.3-pyhd8ed1ab_0.conda hash: - md5: a4634ce0ac12c0bdb1f6aeb57aac1d1d - sha256: 2e5da64c48364d9ab2513ce5c51e9fa3b4eff3a061eb7ace93e01a9ba88d7324 + md5: 10e17dc712b0cf32525e05610d9f2aeb + sha256: c03eb536bc07b34e90b37e0f85ccd0a5c074f999ee7893a58984d382a9475d01 category: dev optional: true - name: dask-core @@ -4650,7 +4689,7 @@ package: category: main optional: false - name: debugpy - version: 1.8.8 + version: 1.8.9 manager: conda platform: linux-64 dependencies: @@ -4659,14 +4698,14 @@ package: libstdcxx: ">=13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.8-py312h2ec8cdc_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.9-py312h2ec8cdc_0.conda hash: - md5: eb182854d81037c9cfd95b06aba22c06 - sha256: 9ffdc284d4c67ba9ab88d400fc55890aafba6a559268f2dc3ca5a1c58d1a7ab9 + md5: c522fd70ca7a0c2fe1a861dd13987a57 + sha256: cf79cac70773567382910fcaf7b10bb0f5242d159f8dd93296d8451cd542af9a category: main optional: false - name: debugpy - version: 1.8.8 + version: 1.8.9 manager: conda platform: osx-64 dependencies: @@ -4674,14 +4713,14 @@ package: libcxx: ">=18" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.8-py312haafddd8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.9-py312haafddd8_0.conda hash: - md5: 5370c8f3dd57bfa6c824f1857cc00bd6 - sha256: 68384ba578b83a9effa14e543f04566d3bbdfc31f1d8d7bba1f67f4fbd1590c0 + md5: 9e50ff5d80cdebeda0fe7eabba6d55e0 + sha256: 95b43839332c9bcd7da3f98ad322f371d8a3a40283945fadfecf8043d0a0cf38 category: main optional: false - name: debugpy - version: 1.8.8 + version: 1.8.9 manager: conda platform: osx-arm64 dependencies: @@ -4689,10 +4728,10 @@ package: libcxx: ">=18" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.8-py312hd8f9ff3_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.9-py312hd8f9ff3_0.conda hash: - md5: a47db7a8ec137fa9cc5ba9f20a45394f - sha256: 2a20826d25063bb500a8bda98a02fee024a64da0fa52183a29af026e2d4e81a7 + md5: 51085e5bb7f21019186cc88fd9a03164 + sha256: d588943ac0392300f31115d9852a2ff4213ec22856c382ef56f5650576523ec6 category: main optional: false - name: decorator @@ -7019,42 +7058,42 @@ package: category: main optional: false - name: google-cloud-sdk - version: 501.0.0 + version: 502.0.0 manager: conda platform: linux-64 dependencies: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/google-cloud-sdk-501.0.0-py312h7900ff3_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/google-cloud-sdk-502.0.0-py312h7900ff3_0.conda hash: - md5: eadada510a56c4d942d0ba046f29e2c8 - sha256: 643b7ff1ef18ca9a0d8c71ef25f6fadf1d9c6a65f17a1ffdc457697a089122a4 + md5: 7f6dea9584173f74e79c7cfc453fe14e + sha256: a1e9911d31a5f61ebfbbe3f4ec1f47cd06b4f24e1319d17b424835c8e61b5a68 category: main optional: false - name: google-cloud-sdk - version: 501.0.0 + version: 502.0.0 manager: conda platform: osx-64 dependencies: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/google-cloud-sdk-501.0.0-py312hb401068_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/google-cloud-sdk-502.0.0-py312hb401068_0.conda hash: - md5: a1e137ffe88fa10553de56646c667154 - sha256: ba087935bb289898e2a6b68d6f28d890e71328ec50039cded5519864ce517d4a + md5: 57890a758a313c99533239de1920dbcd + sha256: 3528f575d9eefb4b3801803141682beaee8ebd6439d9547774969eb59139dab2 category: main optional: false - name: google-cloud-sdk - version: 501.0.0 + version: 502.0.0 manager: conda platform: osx-arm64 dependencies: python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/google-cloud-sdk-501.0.0-py312h81bd7bf_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/google-cloud-sdk-502.0.0-py312h81bd7bf_0.conda hash: - md5: a79af76162c3b3e2ed5938cd14feee51 - sha256: fc490c539f7ada3ea6e5a5455d5454845b78876ed178e46541bf6b58ae6bbc80 + md5: aa9155da92c00ca0999e27df3d83dd1e + sha256: 5caa38ab63da02f519890b90b5bdecdc1d3a3840f37156c8e5ea418f80e99445 category: main optional: false - name: google-cloud-storage @@ -7970,8 +8009,8 @@ package: platform: osx-64 dependencies: python: ">=3.6.1" - hpack: ">=4.0,<5" hyperframe: ">=6.0,<7" + hpack: ">=4.0,<5" url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 hash: md5: b748fbf7060927a6e82df7cb5ee8f097 @@ -7984,8 +8023,8 @@ package: platform: osx-arm64 dependencies: python: ">=3.6.1" - hpack: ">=4.0,<5" hyperframe: ">=6.0,<7" + hpack: ">=4.0,<5" url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 hash: md5: b748fbf7060927a6e82df7cb5ee8f097 @@ -8467,7 +8506,7 @@ package: category: main optional: false - name: hypothesis - version: 6.119.3 + version: 6.119.4 manager: conda platform: linux-64 dependencies: @@ -8478,14 +8517,14 @@ package: python: ">=3.8" setuptools: "" sortedcontainers: ">=2.1.0,<3.0.0" - url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.3-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.4-pyha770c72_0.conda hash: - md5: 7e30097443f140d83aa5ff416eb47fce - sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 + md5: f3b187f80d3fc660f95266d484a57c2a + sha256: 42ede3a4ddd04bb640f0da7826becb28518ba0770b19ed4810c71c64546f09ec category: main optional: false - name: hypothesis - version: 6.119.3 + version: 6.119.4 manager: conda platform: osx-64 dependencies: @@ -8496,14 +8535,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.119.3-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.4-pyha770c72_0.conda hash: - md5: 7e30097443f140d83aa5ff416eb47fce - sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 + md5: f3b187f80d3fc660f95266d484a57c2a + sha256: 42ede3a4ddd04bb640f0da7826becb28518ba0770b19ed4810c71c64546f09ec category: main optional: false - name: hypothesis - version: 6.119.3 + version: 6.119.4 manager: conda platform: osx-arm64 dependencies: @@ -8514,10 +8553,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.119.3-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.119.4-pyha770c72_0.conda hash: - md5: 7e30097443f140d83aa5ff416eb47fce - sha256: 7fc98e6287af7852fcf0d43ccb0053a0871a9c65c0416179c4386d00b37bb3f1 + md5: f3b187f80d3fc660f95266d484a57c2a + sha256: 42ede3a4ddd04bb640f0da7826becb28518ba0770b19ed4810c71c64546f09ec category: main optional: false - name: icu @@ -12643,7 +12682,7 @@ package: category: main optional: false - name: libpq - version: "17.1" + version: "17.2" manager: conda platform: linux-64 dependencies: @@ -12653,14 +12692,14 @@ package: libgcc: ">=13" openldap: ">=2.6.8,<2.7.0a0" openssl: ">=3.4.0,<4.0a0" - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.1-h04577a9_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.2-h04577a9_0.conda hash: - md5: c2560bae9f56de89b8c50355f7c84910 - sha256: 6c2ab6113b04d37b59d05bd7d26e5eb986a1c46f43b48f36b52d2ef0342e1389 + md5: 52dd46162c6fb2765b49e6fd06adf8d5 + sha256: d8ed60436b8f1484d74f68b01f98301d6c8174df1d77a3e89ba42f033dcb43c5 category: main optional: false - name: libpq - version: "17.1" + version: "17.2" manager: conda platform: osx-64 dependencies: @@ -12669,14 +12708,14 @@ package: krb5: ">=1.21.3,<1.22.0a0" openldap: ">=2.6.8,<2.7.0a0" openssl: ">=3.4.0,<4.0a0" - url: https://conda.anaconda.org/conda-forge/osx-64/libpq-17.1-hfbed10f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libpq-17.2-hfbed10f_0.conda hash: - md5: 925cd581a610077bef926d2832b7aa6d - sha256: 0d72f1430b34e61f65a88682e3e5495cc47e9cec3661f82258a6c85a1a185832 + md5: e833f32ff8aa5062928c768af987a875 + sha256: 2cdeabc2278ebdee89202a6e380b1032399aa7ee35a52915f181a215ae31f66f category: main optional: false - name: libpq - version: "17.1" + version: "17.2" manager: conda platform: osx-arm64 dependencies: @@ -12685,10 +12724,10 @@ package: krb5: ">=1.21.3,<1.22.0a0" openldap: ">=2.6.8,<2.7.0a0" openssl: ">=3.4.0,<4.0a0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-17.1-h9b1ab17_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-17.2-h9b1ab17_0.conda hash: - md5: 8635ddaacac6a41eb9125d9120117a93 - sha256: f7bde53669dd700c13bee138df40a188948257626169fa84dca6df856d78dab0 + md5: 0ba6b6772a08c40de13427c957ceaf67 + sha256: 3df7defd514d989ead1280cabb13618e03f7cdace828e6b7a307f2e47845123d category: main optional: false - name: libprotobuf @@ -13022,43 +13061,45 @@ package: category: main optional: false - name: libssh2 - version: 1.11.0 + version: 1.11.1 manager: conda platform: linux-64 dependencies: - libgcc-ng: ">=12" - libzlib: ">=1.2.13,<2.0.0a0" - openssl: ">=3.1.1,<4.0a0" - url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + __glibc: ">=2.17,<3.0.a0" + libgcc: ">=13" + libzlib: ">=1.3.1,<2.0a0" + openssl: ">=3.4.0,<4.0a0" + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda hash: - md5: 1f5a58e686b13bcfde88b93f547d23fe - sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + md5: be2de152d8073ef1c01b7728475f2fe7 + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 category: main optional: false - name: libssh2 - version: 1.11.0 + version: 1.11.1 manager: conda platform: osx-64 dependencies: - libzlib: ">=1.2.13,<2.0.0a0" - openssl: ">=3.1.1,<4.0a0" - url: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda + __osx: ">=10.13" + libzlib: ">=1.3.1,<2.0a0" + openssl: ">=3.4.0,<4.0a0" + url: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-h3dc7d44_0.conda hash: - md5: ca3a72efba692c59a90d4b9fc0dfe774 - sha256: f3886763b88f4b24265db6036535ef77b7b77ce91b1cbe588c0fbdd861eec515 + md5: b1caec4561059e43a5d056684c5a2de0 + sha256: ef2a81c9a15080b996a37f0e1712881da90a710b234e63d8539d69892353de90 category: main optional: false - name: libssh2 - version: 1.11.0 + version: 1.11.1 manager: conda platform: osx-arm64 dependencies: - libzlib: ">=1.2.13,<2.0.0a0" - openssl: ">=3.1.1,<4.0a0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda + libzlib: ">=1.3.1,<2.0a0" + openssl: ">=3.4.0,<4.0a0" + url: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda hash: - md5: 029f7dc931a3b626b94823bc77830b01 - sha256: bb57d0c53289721fff1eeb3103a1c6a988178e88d8a8f4345b0b91a35f0e0015 + md5: ddc7194676c285513706e5fc64f214d7 + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 category: main optional: false - name: libstdcxx @@ -13494,27 +13535,27 @@ package: category: main optional: false - name: llvm-openmp - version: 19.1.3 + version: 19.1.4 manager: conda platform: osx-64 dependencies: __osx: ">=10.13" - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.4-ha54dae1_0.conda hash: - md5: 18a8498d57d871da066beaa09263a638 - sha256: 3d28e9938ab1400322ba76968cdbee035009d611bbee94ec6b38a154551954b4 + md5: 193715d512f648fe0865f6f13b1957e3 + sha256: 69fca4a9318d7367ec3e0e7d6e6023a46ae1113dbd67da6d0f93fffa0ef54497 category: main optional: false - name: llvm-openmp - version: 19.1.3 + version: 19.1.4 manager: conda platform: osx-arm64 dependencies: __osx: ">=11.0" - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.4-hdb05f8b_0.conda hash: - md5: dd695d23e78d1ca4fecce969b1e1db61 - sha256: 49a8940e727aa82ee034fa9a60b3fcababec41b3192d955772aab635a5374b82 + md5: 76ca179ec970bea6e275e2fa477c2d3c + sha256: dfdcd8de37899d984326f9734b28f46f80b88c068e44c562933a8b3117f2401a category: main optional: false - name: llvmlite @@ -14764,39 +14805,39 @@ package: category: main optional: false - name: narwhals - version: 1.14.1 + version: 1.14.2 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.2-pyhff2d567_0.conda hash: - md5: 6aeb2311753a549bb28ceb732d803a9c - sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 + md5: c7948f818368f181dea8d4865efd8039 + sha256: 0befc04516cb350cf35beb50a0b2662a6b9319e203234fc54862b9951fa33e42 category: main optional: false - name: narwhals - version: 1.14.1 + version: 1.14.2 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.2-pyhff2d567_0.conda hash: - md5: 6aeb2311753a549bb28ceb732d803a9c - sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 + md5: c7948f818368f181dea8d4865efd8039 + sha256: 0befc04516cb350cf35beb50a0b2662a6b9319e203234fc54862b9951fa33e42 category: main optional: false - name: narwhals - version: 1.14.1 + version: 1.14.2 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.1-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/narwhals-1.14.2-pyhff2d567_0.conda hash: - md5: 6aeb2311753a549bb28ceb732d803a9c - sha256: d0396c1f29adc6654851120c957fe8b7dbbe1154f543d4a276ebe779a90f6fc8 + md5: c7948f818368f181dea8d4865efd8039 + sha256: 0befc04516cb350cf35beb50a0b2662a6b9319e203234fc54862b9951fa33e42 category: main optional: false - name: nbclassic @@ -15554,15 +15595,15 @@ package: __glibc: ">=2.17,<3.0.a0" libblas: ">=3.9.0,<4.0a0" libcblas: ">=3.9.0,<4.0a0" - libgcc-ng: ">=13" + libgcc: ">=13" liblapack: ">=3.9.0,<4.0a0" - libstdcxx-ng: ">=13" + libstdcxx: ">=13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.0.2-py312h58c1407_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.0.2-py312h58c1407_1.conda hash: - md5: c705a6295a3946400a0c0893dbec87bb - sha256: 8c54907fdc60b5f51bb505f2414e9a75d07e0c56d77651010428de91e8343843 + md5: 46c8b5eb9925ef7c228fddd09078e16e + sha256: 02e095740ab89deae5a8563fe60823e375aa2b7234593704980f01caa16a3ded category: main optional: false - name: numpy @@ -15573,14 +15614,14 @@ package: __osx: ">=10.13" libblas: ">=3.9.0,<4.0a0" libcblas: ">=3.9.0,<4.0a0" - libcxx: ">=17" + libcxx: ">=18" liblapack: ">=3.9.0,<4.0a0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.0.2-py312he4d506f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.0.2-py312hfc93d17_1.conda hash: - md5: f565ae6749c3757d3cb87a9d2953bed8 - sha256: 8f766bf4a1d34b9f0150aee5272484adf52a73083c5749261e1e66cfa0c741a4 + md5: 716d5eee22681698bf4463ca754e5a6c + sha256: 7e954718f7e560c796774d05c34cd8c0259ebdfad96aeb40adb767f98ce4d2ac category: main optional: false - name: numpy @@ -15591,14 +15632,14 @@ package: __osx: ">=11.0" libblas: ">=3.9.0,<4.0a0" libcblas: ">=3.9.0,<4.0a0" - libcxx: ">=17" + libcxx: ">=18" liblapack: ">=3.9.0,<4.0a0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.0.2-py312h801f5e3_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.0.2-py312h94ee1e1_1.conda hash: - md5: 88a5aeebbe22894f3819966da7130998 - sha256: 03d8b87f776c02f13bb07307aee024cf9f650dc4b1ade71213e48a5139955d69 + md5: a58476ff56fb71e1c89e2ed972d66368 + sha256: 533741cc6ff2b8379b9e04fdde92aa5c86665d1885964107e01359e40edeb639 category: main optional: false - name: oauthlib @@ -18910,6 +18951,7 @@ package: tk: ">=8.6.13,<8.7.0a0" tzdata: "" xz: ">=5.2.6,<6.0a0" + pip: "" url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda hash: md5: 0515111a9cdf69f83278f7c197db9807 @@ -18933,6 +18975,7 @@ package: tk: ">=8.6.13,<8.7.0a0" tzdata: "" xz: ">=5.2.6,<6.0a0" + pip: "" url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda hash: md5: 7f81191b1ca1113e694e90e15c27a12f @@ -18956,6 +18999,7 @@ package: tk: ">=8.6.13,<8.7.0a0" tzdata: "" xz: ">=5.2.6,<6.0a0" + pip: "" url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda hash: md5: e0d82e57ebb456077565e6d82cd4a323 @@ -20440,7 +20484,7 @@ package: category: main optional: false - name: ruff - version: 0.7.4 + version: 0.8.0 manager: conda platform: linux-64 dependencies: @@ -20449,14 +20493,14 @@ package: libstdcxx: ">=13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.7.4-py312h2156523_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.8.0-py312h2156523_0.conda hash: - md5: 025594b21ff040de6d98e6b1ef699185 - sha256: 41424ae6a027f433d259aa384b29fa2fb8e366f5080e93179c1d228ba8e6bd83 + md5: 8c1d1a4d606a6d822643a44f124af736 + sha256: 4612ed5e995f4735ac8193c1319690b62440598fad9ebf24198b7ba49396cb2c category: main optional: false - name: ruff - version: 0.7.4 + version: 0.8.0 manager: conda platform: osx-64 dependencies: @@ -20464,14 +20508,14 @@ package: libcxx: ">=18" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.7.4-py312h07459cc_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.8.0-py312h07459cc_0.conda hash: - md5: eb613739f9e64b39efa883ee42afb4e5 - sha256: 49c4702be860ab71bb3f95b49f67c887c6baa06e03efe0c6a7e6d4e113890b7c + md5: e1eec96741d6e348b2013ff801c926c0 + sha256: 25a56c92f2257ee34b991b6d2cbd773115f56bbc167f7f056aaa30ba888f254f category: main optional: false - name: ruff - version: 0.7.4 + version: 0.8.0 manager: conda platform: osx-arm64 dependencies: @@ -20479,14 +20523,14 @@ package: libcxx: ">=18" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.7.4-py312h5d18b81_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.8.0-py312h5d18b81_0.conda hash: - md5: e461924d00bf42f3bb3ed3c731fb9a01 - sha256: fddde6d050fa51295541a14ae59dcd9b5f090d0cbc8159ee569d2996b8871e6d + md5: ac6bbf4b4c45d814901840c5807d95f8 + sha256: e948d9a42df7dd256057afcc8566d5b964512ea721019c157d6c6f8952c0d160 category: main optional: false - name: ruff-lsp - version: 0.0.58 + version: 0.0.59 manager: conda platform: linux-64 dependencies: @@ -20496,14 +20540,14 @@ package: python: ">=3.7" ruff: ">=0.0.274" typing-extensions: "" - url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.58-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.59-pyhd8ed1ab_0.conda hash: - md5: 7a3c9626442e117cf83e6f9b8bd08a72 - sha256: daa62c8bf96bdba001b1d6585840bef2847f1dabb92f0e2337ce0d32442a7a11 + md5: 6c59c57c3da7c99f4be64b1a7d69ef55 + sha256: 414d269396391f297ae0622b0a9d3f63269194560baf94c5509d84d8bb227bf2 category: dev optional: true - name: ruff-lsp - version: 0.0.58 + version: 0.0.59 manager: conda platform: osx-64 dependencies: @@ -20513,14 +20557,14 @@ package: pygls: ">=1.1.0" lsprotocol: ">=2023.0.0a1" ruff: ">=0.0.274" - url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.58-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.59-pyhd8ed1ab_0.conda hash: - md5: 7a3c9626442e117cf83e6f9b8bd08a72 - sha256: daa62c8bf96bdba001b1d6585840bef2847f1dabb92f0e2337ce0d32442a7a11 + md5: 6c59c57c3da7c99f4be64b1a7d69ef55 + sha256: 414d269396391f297ae0622b0a9d3f63269194560baf94c5509d84d8bb227bf2 category: dev optional: true - name: ruff-lsp - version: 0.0.58 + version: 0.0.59 manager: conda platform: osx-arm64 dependencies: @@ -20530,10 +20574,10 @@ package: pygls: ">=1.1.0" lsprotocol: ">=2023.0.0a1" ruff: ">=0.0.274" - url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.58-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.59-pyhd8ed1ab_0.conda hash: - md5: 7a3c9626442e117cf83e6f9b8bd08a72 - sha256: daa62c8bf96bdba001b1d6585840bef2847f1dabb92f0e2337ce0d32442a7a11 + md5: 6c59c57c3da7c99f4be64b1a7d69ef55 + sha256: 414d269396391f297ae0622b0a9d3f63269194560baf94c5509d84d8bb227bf2 category: dev optional: true - name: s2n @@ -20551,42 +20595,42 @@ package: category: main optional: false - name: s3transfer - version: 0.10.3 + version: 0.10.4 manager: conda platform: linux-64 dependencies: botocore: ">=1.33.2,<2.0a.0" python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.4-pyhd8ed1ab_0.conda hash: - md5: 0878f8e10cb8b4e069d27db48b95c3b5 - sha256: a8d6061e31cd4e315b26ab1f6a74c618c930d3e14eb3b7c82e4077a11eae2141 + md5: 195d8a4e3f5cc6bcd0d108164f7a3a2b + sha256: e7e54552851f5bc33697b9e79d92225ec9d3500e2a1fcb66f86c844431a76360 category: main optional: false - name: s3transfer - version: 0.10.3 + version: 0.10.4 manager: conda platform: osx-64 dependencies: python: ">=3.8" botocore: ">=1.33.2,<2.0a.0" - url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.4-pyhd8ed1ab_0.conda hash: - md5: 0878f8e10cb8b4e069d27db48b95c3b5 - sha256: a8d6061e31cd4e315b26ab1f6a74c618c930d3e14eb3b7c82e4077a11eae2141 + md5: 195d8a4e3f5cc6bcd0d108164f7a3a2b + sha256: e7e54552851f5bc33697b9e79d92225ec9d3500e2a1fcb66f86c844431a76360 category: main optional: false - name: s3transfer - version: 0.10.3 + version: 0.10.4 manager: conda platform: osx-arm64 dependencies: python: ">=3.8" botocore: ">=1.33.2,<2.0a.0" - url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/s3transfer-0.10.4-pyhd8ed1ab_0.conda hash: - md5: 0878f8e10cb8b4e069d27db48b95c3b5 - sha256: a8d6061e31cd4e315b26ab1f6a74c618c930d3e14eb3b7c82e4077a11eae2141 + md5: 195d8a4e3f5cc6bcd0d108164f7a3a2b + sha256: e7e54552851f5bc33697b9e79d92225ec9d3500e2a1fcb66f86c844431a76360 category: main optional: false - name: scikit-learn @@ -20772,39 +20816,39 @@ package: category: main optional: false - name: setuptools - version: 75.5.0 + version: 75.6.0 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.5.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_0.conda hash: - md5: ade63405adb52eeff89d506cd55908c0 - sha256: 54dcf5f09f74f69641e0063bc695b38340d0349fa8371b1f2ed0c45c5b2fd224 + md5: 68d7d406366926b09a6a023e3d0f71d7 + sha256: eeec4645f70ce0ed03348397dced9d218a650a42df98592419af61d2689163ed category: main optional: false - name: setuptools - version: 75.5.0 + version: 75.6.0 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.5.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_0.conda hash: - md5: ade63405adb52eeff89d506cd55908c0 - sha256: 54dcf5f09f74f69641e0063bc695b38340d0349fa8371b1f2ed0c45c5b2fd224 + md5: 68d7d406366926b09a6a023e3d0f71d7 + sha256: eeec4645f70ce0ed03348397dced9d218a650a42df98592419af61d2689163ed category: main optional: false - name: setuptools - version: 75.5.0 + version: 75.6.0 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.5.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_0.conda hash: - md5: ade63405adb52eeff89d506cd55908c0 - sha256: 54dcf5f09f74f69641e0063bc695b38340d0349fa8371b1f2ed0c45c5b2fd224 + md5: 68d7d406366926b09a6a023e3d0f71d7 + sha256: eeec4645f70ce0ed03348397dced9d218a650a42df98592419af61d2689163ed category: main optional: false - name: shapely @@ -21277,13 +21321,14 @@ package: dependencies: astroid: ">=3.0" jinja2: "" - python: ">=3.8" + python: ">=3.9" pyyaml: "" sphinx: ">=6.1.0" - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhd8ed1ab_0.conda + stdlib-list: "" + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhff2d567_1.conda hash: - md5: 40a7a486120af3182caf8673c3f5efd0 - sha256: 8ec6425de2cd51851b2ba774923db77a6f9469e7def21fdf08f9dee032035c75 + md5: 598660a9347e0eae0cb591133a2a5b9c + sha256: cd112f882c2bd2f45832aa77e51ef47f4d2732214a428f96af091bc97bc06417 category: main optional: false - name: sphinx-autoapi @@ -21293,13 +21338,14 @@ package: dependencies: pyyaml: "" jinja2: "" - python: ">=3.8" + stdlib-list: "" + python: ">=3.9" sphinx: ">=6.1.0" astroid: ">=3.0" - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhff2d567_1.conda hash: - md5: 40a7a486120af3182caf8673c3f5efd0 - sha256: 8ec6425de2cd51851b2ba774923db77a6f9469e7def21fdf08f9dee032035c75 + md5: 598660a9347e0eae0cb591133a2a5b9c + sha256: cd112f882c2bd2f45832aa77e51ef47f4d2732214a428f96af091bc97bc06417 category: main optional: false - name: sphinx-autoapi @@ -21309,13 +21355,14 @@ package: dependencies: pyyaml: "" jinja2: "" - python: ">=3.8" + stdlib-list: "" + python: ">=3.9" sphinx: ">=6.1.0" astroid: ">=3.0" - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-autoapi-3.3.3-pyhff2d567_1.conda hash: - md5: 40a7a486120af3182caf8673c3f5efd0 - sha256: 8ec6425de2cd51851b2ba774923db77a6f9469e7def21fdf08f9dee032035c75 + md5: 598660a9347e0eae0cb591133a2a5b9c + sha256: cd112f882c2bd2f45832aa77e51ef47f4d2732214a428f96af091bc97bc06417 category: main optional: false - name: sphinx-basic-ng @@ -21860,39 +21907,39 @@ package: category: main optional: false - name: sqlglot - version: 25.31.4 + version: 25.32.0 manager: conda platform: linux-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.32.0-pyhff2d567_0.conda hash: - md5: 5901114fc3886a25df43417540d0c76f - sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f + md5: 2081d439c9418e6ab271b1ed3ed51c58 + sha256: 48f6b668870e62189ac7854b0f39b844001f95ed67ad7bb3a76ff03fdd7f122a category: main optional: false - name: sqlglot - version: 25.31.4 + version: 25.32.0 manager: conda platform: osx-64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.32.0-pyhff2d567_0.conda hash: - md5: 5901114fc3886a25df43417540d0c76f - sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f + md5: 2081d439c9418e6ab271b1ed3ed51c58 + sha256: 48f6b668870e62189ac7854b0f39b844001f95ed67ad7bb3a76ff03fdd7f122a category: main optional: false - name: sqlglot - version: 25.31.4 + version: 25.32.0 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.31.4-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/sqlglot-25.32.0-pyhff2d567_0.conda hash: - md5: 5901114fc3886a25df43417540d0c76f - sha256: 3135f25540028d3418796061f29f50e54c5bb91c21b94aa750ef76117bdbf89f + md5: 2081d439c9418e6ab271b1ed3ed51c58 + sha256: 48f6b668870e62189ac7854b0f39b844001f95ed67ad7bb3a76ff03fdd7f122a category: main optional: false - name: sqlite @@ -22067,43 +22114,79 @@ package: sha256: 33986032cb0515f7e9f6647d07006b7dc49b3f373b73d5a1826e6979c661b27a category: dev optional: true + - name: stdlib-list + version: 0.11.0 + manager: conda + platform: linux-64 + dependencies: + python: ">=3.7" + url: https://conda.anaconda.org/conda-forge/noarch/stdlib-list-0.11.0-pyhd8ed1ab_0.conda + hash: + md5: 0f3ae9b96c6072d680c505425515fad1 + sha256: cb17fc652f2fc22a0d8bce647f239b7a10b002f6b5794447f1f154558f6afc26 + category: main + optional: false + - name: stdlib-list + version: 0.11.0 + manager: conda + platform: osx-64 + dependencies: + python: ">=3.7" + url: https://conda.anaconda.org/conda-forge/noarch/stdlib-list-0.11.0-pyhd8ed1ab_0.conda + hash: + md5: 0f3ae9b96c6072d680c505425515fad1 + sha256: cb17fc652f2fc22a0d8bce647f239b7a10b002f6b5794447f1f154558f6afc26 + category: main + optional: false + - name: stdlib-list + version: 0.11.0 + manager: conda + platform: osx-arm64 + dependencies: + python: ">=3.7" + url: https://conda.anaconda.org/conda-forge/noarch/stdlib-list-0.11.0-pyhd8ed1ab_0.conda + hash: + md5: 0f3ae9b96c6072d680c505425515fad1 + sha256: cb17fc652f2fc22a0d8bce647f239b7a10b002f6b5794447f1f154558f6afc26 + category: main + optional: false - name: stevedore - version: 5.3.0 + version: 5.4.0 manager: conda platform: linux-64 dependencies: pbr: "!=2.1.0,>=2.0.0" - python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.3.0-pyhd8ed1ab_0.conda + python: ">=3.9" + url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.4.0-pyhd8ed1ab_0.conda hash: - md5: 709a01a260da0a9408f639e8b06e17a1 - sha256: 6132f977840a47d6cb45d0ce39d06b613c825918156c2cdf9de54909824779f6 + md5: 6425c81bfdd25313b20b17c84d47275a + sha256: 957c434886c04a779ae8da3ecffc5964be42a2ddb637194747bea538b1b3e918 category: main optional: false - name: stevedore - version: 5.3.0 + version: 5.4.0 manager: conda platform: osx-64 dependencies: - python: ">=3.8" + python: ">=3.9" pbr: "!=2.1.0,>=2.0.0" - url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.4.0-pyhd8ed1ab_0.conda hash: - md5: 709a01a260da0a9408f639e8b06e17a1 - sha256: 6132f977840a47d6cb45d0ce39d06b613c825918156c2cdf9de54909824779f6 + md5: 6425c81bfdd25313b20b17c84d47275a + sha256: 957c434886c04a779ae8da3ecffc5964be42a2ddb637194747bea538b1b3e918 category: main optional: false - name: stevedore - version: 5.3.0 + version: 5.4.0 manager: conda platform: osx-arm64 dependencies: - python: ">=3.8" + python: ">=3.9" pbr: "!=2.1.0,>=2.0.0" - url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/stevedore-5.4.0-pyhd8ed1ab_0.conda hash: - md5: 709a01a260da0a9408f639e8b06e17a1 - sha256: 6132f977840a47d6cb45d0ce39d06b613c825918156c2cdf9de54909824779f6 + md5: 6425c81bfdd25313b20b17c84d47275a + sha256: 957c434886c04a779ae8da3ecffc5964be42a2ddb637194747bea538b1b3e918 category: main optional: false - name: stringcase @@ -22368,7 +22451,7 @@ package: category: main optional: false - name: timezonefinder - version: 6.5.4 + version: 6.5.5 manager: conda platform: linux-64 dependencies: @@ -22379,15 +22462,14 @@ package: numpy: ">=1.23,<3" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - setuptools: ">=65.5" - url: https://conda.anaconda.org/conda-forge/linux-64/timezonefinder-6.5.4-py312h66e93f0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/timezonefinder-6.5.5-py312h66e93f0_0.conda hash: - md5: 5fe4b18aea928776553e23870480e7b7 - sha256: f1c48609e4ecd373a91d67da8ec5f21395d08548318a99e6d4bd1636b04320b6 + md5: 0ab37100ad8aa3195e5529ad52b5754f + sha256: 137f5ffc5ca61af97c0edeeab2e007fe84037c8095c6b3a123aeb74c6a937450 category: main optional: false - name: timezonefinder - version: 6.5.4 + version: 6.5.5 manager: conda platform: osx-64 dependencies: @@ -22397,15 +22479,14 @@ package: numpy: ">=1.23,<3" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - setuptools: ">=65.5" - url: https://conda.anaconda.org/conda-forge/osx-64/timezonefinder-6.5.4-py312h3d0f464_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/timezonefinder-6.5.5-py312h01d7ebd_0.conda hash: - md5: 6bf5a88de2f0641ec367061428ac5740 - sha256: 09f8236cf99e3c440274ed7ddba3190d1146a1a9c5bd1c18404e68a65a67238b + md5: 7145ac52a96ed92e216a80972cfcdbc0 + sha256: 6477c39ce84f88873cbb6d8e9d66d883fbb96da6eabeb95ad2a6c8d0f6927e37 category: main optional: false - name: timezonefinder - version: 6.5.4 + version: 6.5.5 manager: conda platform: osx-arm64 dependencies: @@ -22415,11 +22496,10 @@ package: numpy: ">=1.23,<3" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - setuptools: ">=65.5" - url: https://conda.anaconda.org/conda-forge/osx-arm64/timezonefinder-6.5.4-py312h0bf5046_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/timezonefinder-6.5.5-py312hea69d52_0.conda hash: - md5: 634b091a80ddd67bcc5c41a5f79baece - sha256: cf8c99a5646fffa49ba67e72e0b4cc76b74528ac754d5bb00009f8b78ee7162b + md5: caef99bdcbd6bfd2f57b2a4957a10a48 + sha256: f925c0fe17372b308bafd580e07435464a7df63620596dc565960a8e40b70479 category: main optional: false - name: tinycss2 @@ -22722,42 +22802,42 @@ package: category: main optional: false - name: tqdm - version: 4.67.0 + version: 4.67.1 manager: conda platform: linux-64 dependencies: colorama: "" python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda hash: - md5: 196a9e6ab4e036ceafa516ea036619b0 - sha256: fb25b18cec1ebae56e7d7ebbd3e504f063b61a0fac17b1ca798fcaf205bdc874 + md5: 4085c9db273a148e149c03627350e22c + sha256: 5673b7104350a6998cb86cccf1d0058217d86950e8d6c927d8530606028edb1d category: main optional: false - name: tqdm - version: 4.67.0 + version: 4.67.1 manager: conda platform: osx-64 dependencies: colorama: "" python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda hash: - md5: 196a9e6ab4e036ceafa516ea036619b0 - sha256: fb25b18cec1ebae56e7d7ebbd3e504f063b61a0fac17b1ca798fcaf205bdc874 + md5: 4085c9db273a148e149c03627350e22c + sha256: 5673b7104350a6998cb86cccf1d0058217d86950e8d6c927d8530606028edb1d category: main optional: false - name: tqdm - version: 4.67.0 + version: 4.67.1 manager: conda platform: osx-arm64 dependencies: colorama: "" python: ">=3.7" - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda hash: - md5: 196a9e6ab4e036ceafa516ea036619b0 - sha256: fb25b18cec1ebae56e7d7ebbd3e504f063b61a0fac17b1ca798fcaf205bdc874 + md5: 4085c9db273a148e149c03627350e22c + sha256: 5673b7104350a6998cb86cccf1d0058217d86950e8d6c927d8530606028edb1d category: main optional: false - name: traitlets @@ -22842,126 +22922,126 @@ package: category: main optional: false - name: typer - version: 0.13.0 + version: 0.13.1 manager: conda platform: linux-64 dependencies: python: ">=3.9" - typer-slim-standard: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.0-pyhd8ed1ab_0.conda + typer-slim-standard: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.1-pyhd8ed1ab_0.conda hash: - md5: 0d2754390dab3d584823f497d1ab8704 - sha256: f3661edc36aaf69c03323f0a2b71bbbfdf3c11ed1fe1c9c6f486ac1b53e11aa1 + md5: 82a4704166144f27e9c83803bff5bf53 + sha256: 2f12a5af13d440aa75970e3d0d1ea3192916848473967b4ecb483627c01333cb category: main optional: false - name: typer - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-64 dependencies: python: ">=3.9" - typer-slim-standard: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.0-pyhd8ed1ab_0.conda + typer-slim-standard: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.1-pyhd8ed1ab_0.conda hash: - md5: 0d2754390dab3d584823f497d1ab8704 - sha256: f3661edc36aaf69c03323f0a2b71bbbfdf3c11ed1fe1c9c6f486ac1b53e11aa1 + md5: 82a4704166144f27e9c83803bff5bf53 + sha256: 2f12a5af13d440aa75970e3d0d1ea3192916848473967b4ecb483627c01333cb category: main optional: false - name: typer - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" - typer-slim-standard: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.0-pyhd8ed1ab_0.conda + typer-slim-standard: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.13.1-pyhd8ed1ab_0.conda hash: - md5: 0d2754390dab3d584823f497d1ab8704 - sha256: f3661edc36aaf69c03323f0a2b71bbbfdf3c11ed1fe1c9c6f486ac1b53e11aa1 + md5: 82a4704166144f27e9c83803bff5bf53 + sha256: 2f12a5af13d440aa75970e3d0d1ea3192916848473967b4ecb483627c01333cb category: main optional: false - name: typer-slim - version: 0.13.0 + version: 0.13.1 manager: conda platform: linux-64 dependencies: click: ">=8.0.0" python: ">=3.9" typing_extensions: ">=3.7.4.3" - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.1-pyhff2d567_0.conda hash: - md5: 5fcd867cf0b4498002731d44621c0b58 - sha256: 6e23932ebef6b09b68a9667596952af4f81167b4b50a182ac70316ec224322fc + md5: 85283fb942fa2604c3db03483027ced2 + sha256: b190bcd5f341ba8843f2f1ce43b5e8dae770bb84d49e2ce5b346e4d8098367a1 category: main optional: false - name: typer-slim - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-64 dependencies: python: ">=3.9" click: ">=8.0.0" typing_extensions: ">=3.7.4.3" - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.1-pyhff2d567_0.conda hash: - md5: 5fcd867cf0b4498002731d44621c0b58 - sha256: 6e23932ebef6b09b68a9667596952af4f81167b4b50a182ac70316ec224322fc + md5: 85283fb942fa2604c3db03483027ced2 + sha256: b190bcd5f341ba8843f2f1ce43b5e8dae770bb84d49e2ce5b346e4d8098367a1 category: main optional: false - name: typer-slim - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-arm64 dependencies: python: ">=3.9" click: ">=8.0.0" typing_extensions: ">=3.7.4.3" - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.0-pyhff2d567_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.13.1-pyhff2d567_0.conda hash: - md5: 5fcd867cf0b4498002731d44621c0b58 - sha256: 6e23932ebef6b09b68a9667596952af4f81167b4b50a182ac70316ec224322fc + md5: 85283fb942fa2604c3db03483027ced2 + sha256: b190bcd5f341ba8843f2f1ce43b5e8dae770bb84d49e2ce5b346e4d8098367a1 category: main optional: false - name: typer-slim-standard - version: 0.13.0 + version: 0.13.1 manager: conda platform: linux-64 dependencies: rich: "" shellingham: "" - typer-slim: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.0-hd8ed1ab_0.conda + typer-slim: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.1-hd8ed1ab_0.conda hash: - md5: fe8bb6071bf1c47b38bc65f848847059 - sha256: 402d1c872adb1dda436d563e03280750419367fb808a9ee7811f1335f218e8bc + md5: a9bf95ed3c65bf936292d944bf3df36d + sha256: 14ac72d0533bc2f37f8dc85b90b45a91ca28ee0995c520b16a40f34629749c7a category: main optional: false - name: typer-slim-standard - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-64 dependencies: rich: "" shellingham: "" - typer-slim: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.0-hd8ed1ab_0.conda + typer-slim: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.1-hd8ed1ab_0.conda hash: - md5: fe8bb6071bf1c47b38bc65f848847059 - sha256: 402d1c872adb1dda436d563e03280750419367fb808a9ee7811f1335f218e8bc + md5: a9bf95ed3c65bf936292d944bf3df36d + sha256: 14ac72d0533bc2f37f8dc85b90b45a91ca28ee0995c520b16a40f34629749c7a category: main optional: false - name: typer-slim-standard - version: 0.13.0 + version: 0.13.1 manager: conda platform: osx-arm64 dependencies: rich: "" shellingham: "" - typer-slim: 0.13.0 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.0-hd8ed1ab_0.conda + typer-slim: 0.13.1 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.13.1-hd8ed1ab_0.conda hash: - md5: fe8bb6071bf1c47b38bc65f848847059 - sha256: 402d1c872adb1dda436d563e03280750419367fb808a9ee7811f1335f218e8bc + md5: a9bf95ed3c65bf936292d944bf3df36d + sha256: 14ac72d0533bc2f37f8dc85b90b45a91ca28ee0995c520b16a40f34629749c7a category: main optional: false - name: types-python-dateutil @@ -23468,7 +23548,7 @@ package: category: main optional: false - name: uvicorn - version: 0.32.0 + version: 0.32.1 manager: conda platform: linux-64 dependencies: @@ -23477,14 +23557,14 @@ package: h11: ">=0.8" python: ">=3.8" typing_extensions: ">=4.0" - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.0-pyh31011fe_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.1-pyh31011fe_0.conda hash: - md5: 3936b8ca7212040c07565e1379ced362 - sha256: bc1dd02dfe8ba9654c7ba4f359af1a36f88fdc8299e57e25394c26075e7f5ff2 + md5: fa77fc8110207b3bfc5ccc9d316744f4 + sha256: a310c494c817a9f6c985fc6d2772acb953a20170d03b0eabfae0e9d8c76c97ee category: main optional: false - name: uvicorn - version: 0.32.0 + version: 0.32.1 manager: conda platform: osx-64 dependencies: @@ -23493,14 +23573,14 @@ package: click: ">=7.0" typing_extensions: ">=4.0" h11: ">=0.8" - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.0-pyh31011fe_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.1-pyh31011fe_0.conda hash: - md5: 3936b8ca7212040c07565e1379ced362 - sha256: bc1dd02dfe8ba9654c7ba4f359af1a36f88fdc8299e57e25394c26075e7f5ff2 + md5: fa77fc8110207b3bfc5ccc9d316744f4 + sha256: a310c494c817a9f6c985fc6d2772acb953a20170d03b0eabfae0e9d8c76c97ee category: main optional: false - name: uvicorn - version: 0.32.0 + version: 0.32.1 manager: conda platform: osx-arm64 dependencies: @@ -23509,14 +23589,14 @@ package: click: ">=7.0" typing_extensions: ">=4.0" h11: ">=0.8" - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.0-pyh31011fe_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.32.1-pyh31011fe_0.conda hash: - md5: 3936b8ca7212040c07565e1379ced362 - sha256: bc1dd02dfe8ba9654c7ba4f359af1a36f88fdc8299e57e25394c26075e7f5ff2 + md5: fa77fc8110207b3bfc5ccc9d316744f4 + sha256: a310c494c817a9f6c985fc6d2772acb953a20170d03b0eabfae0e9d8c76c97ee category: main optional: false - name: uvicorn-standard - version: 0.32.0 + version: 0.32.1 manager: conda platform: linux-64 dependencies: @@ -23524,52 +23604,52 @@ package: httptools: ">=0.5.0" python-dotenv: ">=0.13" pyyaml: ">=5.1" - uvicorn: 0.32.0 + uvicorn: 0.32.1 uvloop: ">=0.14.0,!=0.15.0,!=0.15.1" watchfiles: ">=0.13" websockets: ">=10.4" - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.0-h31011fe_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.1-h31011fe_0.conda hash: - md5: ee1094a994894ddd2cdf63174131a589 - sha256: 955132d5f09fab2041cb15fe7d85af4526d95b3629b96c90c8191c60001475a5 + md5: 49c2820e0f39cb710becd856ff14d683 + sha256: 52545f7c88a7c779376900de5f9d81ce36738cd8770b543e89592ad7d1003c40 category: dev optional: true - name: uvicorn-standard - version: 0.32.0 + version: 0.32.1 manager: conda platform: osx-64 dependencies: __unix: "" pyyaml: ">=5.1" websockets: ">=10.4" + httptools: ">=0.5.0" python-dotenv: ">=0.13" watchfiles: ">=0.13" - httptools: ">=0.5.0" uvloop: ">=0.14.0,!=0.15.0,!=0.15.1" - uvicorn: 0.32.0 - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.0-h31011fe_1.conda + uvicorn: 0.32.1 + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.1-h31011fe_0.conda hash: - md5: ee1094a994894ddd2cdf63174131a589 - sha256: 955132d5f09fab2041cb15fe7d85af4526d95b3629b96c90c8191c60001475a5 + md5: 49c2820e0f39cb710becd856ff14d683 + sha256: 52545f7c88a7c779376900de5f9d81ce36738cd8770b543e89592ad7d1003c40 category: dev optional: true - name: uvicorn-standard - version: 0.32.0 + version: 0.32.1 manager: conda platform: osx-arm64 dependencies: __unix: "" pyyaml: ">=5.1" websockets: ">=10.4" + httptools: ">=0.5.0" python-dotenv: ">=0.13" watchfiles: ">=0.13" - httptools: ">=0.5.0" uvloop: ">=0.14.0,!=0.15.0,!=0.15.1" - uvicorn: 0.32.0 - url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.0-h31011fe_1.conda + uvicorn: 0.32.1 + url: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.32.1-h31011fe_0.conda hash: - md5: ee1094a994894ddd2cdf63174131a589 - sha256: 955132d5f09fab2041cb15fe7d85af4526d95b3629b96c90c8191c60001475a5 + md5: 49c2820e0f39cb710becd856ff14d683 + sha256: 52545f7c88a7c779376900de5f9d81ce36738cd8770b543e89592ad7d1003c40 category: dev optional: true - name: uvloop @@ -24013,39 +24093,39 @@ package: category: main optional: false - name: wheel - version: 0.45.0 + version: 0.45.1 manager: conda platform: linux-64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda hash: - md5: f9751d7c71df27b2d29f5cab3378982e - sha256: 8a51067f8e1a2cb0b5e89672dbcc0369e344a92e869c38b2946584aa09ab7088 + md5: bdb2f437ce62fd2f1fef9119a37a12d9 + sha256: 24f6851a336a50c53d6b50b142c1654872494a62528d57c3ff40240cbd8b13be category: main optional: false - name: wheel - version: 0.45.0 + version: 0.45.1 manager: conda platform: osx-64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda hash: - md5: f9751d7c71df27b2d29f5cab3378982e - sha256: 8a51067f8e1a2cb0b5e89672dbcc0369e344a92e869c38b2946584aa09ab7088 + md5: bdb2f437ce62fd2f1fef9119a37a12d9 + sha256: 24f6851a336a50c53d6b50b142c1654872494a62528d57c3ff40240cbd8b13be category: main optional: false - name: wheel - version: 0.45.0 + version: 0.45.1 manager: conda platform: osx-arm64 dependencies: python: ">=3.8" - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda hash: - md5: f9751d7c71df27b2d29f5cab3378982e - sha256: 8a51067f8e1a2cb0b5e89672dbcc0369e344a92e869c38b2946584aa09ab7088 + md5: bdb2f437ce62fd2f1fef9119a37a12d9 + sha256: 24f6851a336a50c53d6b50b142c1654872494a62528d57c3ff40240cbd8b13be category: main optional: false - name: widgetsnbextension @@ -24085,7 +24165,7 @@ package: category: main optional: false - name: wrapt - version: 1.16.0 + version: 1.17.0 manager: conda platform: linux-64 dependencies: @@ -24093,38 +24173,38 @@ package: libgcc: ">=13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py312h66e93f0_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.0-py312h66e93f0_0.conda hash: - md5: 2eebcffe80e2a7bb2f0a77e621a7f124 - sha256: 3a15a399eb61a999f0f14b4d243acc14e2dff1ead92ef52fcff30c84be89b21c + md5: ddbe3bb0e1356cb9074dd848570694f9 + sha256: a6fc0f4e90643d0c1fd4aab669b6a79f44a305a5474256f6f2da3354d2310fb4 category: main optional: false - name: wrapt - version: 1.16.0 + version: 1.17.0 manager: conda platform: osx-64 dependencies: __osx: ">=10.13" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.16.0-py312hb553811_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.0-py312h01d7ebd_0.conda hash: - md5: 6385725172f8712d54b5af6b86bf8236 - sha256: 31e3fdd934cdb8ac47764d1daf13edddd7844a17b229e8ef438fc16e06576b00 + md5: 484f71fd8c0f57f789f64a50a3cf0f6c + sha256: 19adc4442e18d292770f2c47d5bb1e093882e7dba4f973f985b0d19c44fe3399 category: main optional: false - name: wrapt - version: 1.16.0 + version: 1.17.0 manager: conda platform: osx-arm64 dependencies: __osx: ">=11.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.16.0-py312h024a12e_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.0-py312hea69d52_0.conda hash: - md5: f97c9abfeb8292f5f8353607ca8a1127 - sha256: 54a5d3d9e1b45022b28c5ca3ceaa7ec2db4a40968b2b556804becfdff98f4efe + md5: 73414acdb779a8694a14527865b4357a + sha256: 0fb35c3d1642f9f47db87bdb33148f88ef19a3af1eb0ee99b5491551c57269c7 category: main optional: false - name: xerces-c @@ -24471,7 +24551,7 @@ package: category: main optional: false - name: yarl - version: 1.17.2 + version: 1.18.0 manager: conda platform: linux-64 dependencies: @@ -24482,14 +24562,14 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.17.2-py312h66e93f0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.0-py312h66e93f0_0.conda hash: - md5: 99518ade67138dcce4f2751b47ab5b00 - sha256: 4e870938d29f38cd2aa43247efff6f99f6ecd8973735509122cd3167ccc22add + md5: 601d2b19a54fd9346ba18c07c2516339 + sha256: 8a1e51303ecac64f10dd0ec548d472c49954c3e2f38023ef28899191580795e1 category: main optional: false - name: yarl - version: 1.17.2 + version: 1.18.0 manager: conda platform: osx-64 dependencies: @@ -24499,14 +24579,14 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.17.2-py312h01d7ebd_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.18.0-py312h01d7ebd_0.conda hash: - md5: 18f8e01081e8f87d09c159912a15bc74 - sha256: 61b286071ad6485fffc540fe0bee33dff26af7b40d15de94ed098496bc92ae30 + md5: 568eba0c8021ecf4aa5be6e7a42d5d3d + sha256: 298c1c6f692c6bfb61020e7058a863697d4341e8ff075cbeaf57d1c1a9ad3db9 category: main optional: false - name: yarl - version: 1.17.2 + version: 1.18.0 manager: conda platform: osx-arm64 dependencies: @@ -24516,10 +24596,10 @@ package: propcache: ">=0.2.0" python: ">=3.12,<3.13.0a0" python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.17.2-py312hea69d52_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.0-py312hea69d52_0.conda hash: - md5: e3d4600d565bac01340b12d3c4cba2b2 - sha256: 43d85ffae29642b81e1ef4191560a7700911f3753078ab23248b8275952abcec + md5: f538709098e1642d50f4a01707e7dfdb + sha256: 4c90de12b1569f85126a12dbbb89f3dc10cee5838335b9c9993ead8bf1594cd3 category: main optional: false - name: zeromq diff --git a/environments/conda-osx-64.lock.yml b/environments/conda-osx-64.lock.yml index 8e8a3014d0..f264256c9f 100644 --- a/environments/conda-osx-64.lock.yml +++ b/environments/conda-osx-64.lock.yml @@ -8,16 +8,17 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.4=py312h3520af0_1 + - aiohttp=3.11.7=py312h3520af0_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 - - altair=5.4.1=pyhd8ed1ab_1 + - altair=5.5.0=pyhd8ed1ab_0 - annotated-types=0.7.0=pyhd8ed1ab_0 + - antlr-python-runtime=4.13.2=pyhd8ed1ab_0 - anyio=4.6.2.post1=pyhd8ed1ab_0 - appdirs=1.4.4=pyh9f0ad1d_0 - appnope=0.1.4=pyhd8ed1ab_0 - - arelle-release=2.35.6=pyhd8ed1ab_0 + - arelle-release=2.35.9=pyhd8ed1ab_0 - argon2-cffi=23.1.0=pyhd8ed1ab_0 - argon2-cffi-bindings=21.2.0=py312hb553811_5 - arrow=1.3.0=pyhd8ed1ab_0 @@ -51,20 +52,20 @@ dependencies: - backports=1.0=pyhd8ed1ab_4 - backports.tarfile=1.2.0=pyhd8ed1ab_0 - backports.zoneinfo=0.2.1=py312hb401068_9 - - bcrypt=4.2.0=py312h669792a_1 + - bcrypt=4.2.1=py312h0d0de52_0 - beautifulsoup4=4.12.3=pyha770c72_0 - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h7d75f6d_0 - - boto3=1.35.64=pyhd8ed1ab_0 - - botocore=1.35.64=pyge310_1234567_0 + - boto3=1.35.68=pyhd8ed1ab_0 + - botocore=1.35.68=pyge310_1234567_0 - bottleneck=1.4.2=py312h59f7578_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=h00291cd_2 - brotli-bin=1.1.0=h00291cd_2 - brotli-python=1.1.0=py312h5861a67_2 - bzip2=1.0.8=hfdf4475_7 - - c-ares=1.34.3=hf13058a_0 + - c-ares=1.34.3=hf13058a_1 - ca-certificates=2024.8.30=h8857fd0_0 - cachecontrol=0.14.1=pyhd8ed1ab_0 - cachecontrol-with-filecache=0.14.1=pyhd8ed1ab_0 @@ -90,23 +91,23 @@ dependencies: - comm=0.2.2=pyhd8ed1ab_0 - conda-lock=2.5.7=pyhd8ed1ab_0 - contourpy=1.3.1=py312hc47a885_0 - - coverage=7.6.7=py312h3520af0_0 + - coverage=7.6.8=py312h3520af0_0 - crashtest=0.4.1=pyhd8ed1ab_0 - croniter=3.0.4=pyhd8ed1ab_0 - cryptography=43.0.3=py312h83535b2_0 - curl=8.10.1=h58e7537_0 - cycler=0.12.1=pyhd8ed1ab_0 - cyrus-sasl=2.1.27=hf9bab2b_7 - - dagster=1.9.2=pyhd8ed1ab_12 - - dagster-graphql=1.9.2=pyhd8ed1ab_0 - - dagster-pipes=1.9.2=pyhd8ed1ab_0 - - dagster-postgres=0.25.2=pyhd8ed1ab_0 - - dagster-webserver=1.9.2=pyhd8ed1ab_0 + - dagster=1.9.3=pyhd8ed1ab_12 + - dagster-graphql=1.9.3=pyhd8ed1ab_0 + - dagster-pipes=1.9.3=pyhd8ed1ab_0 + - dagster-postgres=0.25.3=pyhff2d567_0 + - dagster-webserver=1.9.3=pyhd8ed1ab_0 - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - - debugpy=1.8.8=py312haafddd8_0 + - debugpy=1.8.9=py312haafddd8_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - deprecated=1.2.15=pyhff2d567_0 @@ -160,7 +161,7 @@ dependencies: - google-auth=2.36.0=pyhff2d567_0 - google-auth-oauthlib=1.2.1=pyhd8ed1ab_0 - google-cloud-core=2.4.1=pyhd8ed1ab_0 - - google-cloud-sdk=501.0.0=py312hb401068_1 + - google-cloud-sdk=502.0.0=py312hb401068_0 - google-cloud-storage=2.18.2=pyhff2d567_0 - google-crc32c=1.1.2=py312hfee8fbb_6 - google-resumable-media=2.7.2=pyhd8ed1ab_1 @@ -192,7 +193,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.3=pyha770c72_0 + - hypothesis=6.119.4=pyha770c72_0 - icu=75.1=h120a0e1_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -281,7 +282,7 @@ dependencies: - libopenblas=0.3.28=openmp_hbf64a52_1 - libparquet=17.0.0=hf1b0f52_16_cpu - libpng=1.6.44=h4b8f8c9_0 - - libpq=17.1=hfbed10f_0 + - libpq=17.2=hfbed10f_0 - libprotobuf=4.25.3=hd4aba4c_1 - libre2-11=2023.09.01=h81f5012_2 - librsvg=2.58.4=h2682814_0 @@ -289,7 +290,7 @@ dependencies: - libsodium=1.0.20=hfdf4475_0 - libspatialite=5.1.0=hc43c327_11 - libsqlite=3.47.0=h2f8c449_1 - - libssh2=1.11.0=hd019ec5_0 + - libssh2=1.11.1=h3dc7d44_0 - libthrift=0.20.0=h75589b3_1 - libtiff=4.7.0=h583c2ba_1 - libutf8proc=2.8.0=hb7f2c08_0 @@ -299,7 +300,7 @@ dependencies: - libxml2=2.13.5=h495214b_0 - libxslt=1.1.39=h03b04e6_0 - libzlib=1.3.1=hd23fc13_2 - - llvm-openmp=19.1.3=hf78d878_0 + - llvm-openmp=19.1.4=ha54dae1_0 - llvmlite=0.43.0=py312hcc8fd36_1 - locket=1.0.0=pyhd8ed1ab_0 - lsprotocol=2023.0.1=pyhd8ed1ab_0 @@ -327,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.1=pyhff2d567_0 + - narwhals=1.14.2=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -343,7 +344,7 @@ dependencies: - notebook-shim=0.2.4=pyhd8ed1ab_0 - numba=0.60.0=py312hc3b515d_0 - numexpr=2.10.1=py312h6b48bed_3 - - numpy=2.0.2=py312he4d506f_0 + - numpy=2.0.2=py312hfc93d17_1 - oauthlib=3.2.2=pyhd8ed1ab_0 - openjpeg=2.5.2=h7310d3a_0 - openldap=2.6.8=hcd2896d_0 @@ -458,13 +459,13 @@ dependencies: - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.6=py312h3d0f464_1 - ruamel.yaml.clib=0.2.8=py312h3d0f464_1 - - ruff=0.7.4=py312h07459cc_0 - - ruff-lsp=0.0.58=pyhd8ed1ab_0 - - s3transfer=0.10.3=pyhd8ed1ab_0 + - ruff=0.8.0=py312h07459cc_0 + - ruff-lsp=0.0.59=pyhd8ed1ab_0 + - s3transfer=0.10.4=pyhd8ed1ab_0 - scikit-learn=1.5.2=py312h9d777eb_1 - scipy=1.14.1=py312h888eae2_1 - send2trash=1.8.3=pyh31c8845_0 - - setuptools=75.5.0=pyhff2d567_0 + - setuptools=75.6.0=pyhff2d567_0 - shapely=2.0.6=py312h4ff98d2_2 - shellingham=1.5.4=pyhd8ed1ab_0 - simpleeval=0.9.13=pyhd8ed1ab_1 @@ -476,7 +477,7 @@ dependencies: - sortedcontainers=2.4.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - sphinx=8.1.3=pyhd8ed1ab_0 - - sphinx-autoapi=3.3.3=pyhd8ed1ab_0 + - sphinx-autoapi=3.3.3=pyhff2d567_1 - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 - sphinx-issues=5.0.0=pyhd8ed1ab_0 - sphinx-reredirects=0.1.5=pyhd8ed1ab_0 @@ -490,12 +491,13 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h3d0f464_0 - - sqlglot=25.31.4=pyhff2d567_0 + - sqlglot=25.32.0=pyhff2d567_0 - sqlite=3.47.0=h6285a30_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.41.3=pyh7900ff3_0 - - stevedore=5.3.0=pyhd8ed1ab_0 + - stdlib-list=0.11.0=pyhd8ed1ab_0 + - stevedore=5.4.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 - tabulate=0.9.0=pyhd8ed1ab_1 @@ -503,7 +505,7 @@ dependencies: - terraform=1.9.8=hb61a267_0 - text-unidecode=1.3=pyhd8ed1ab_1 - threadpoolctl=3.5.0=pyhc1e730c_0 - - timezonefinder=6.5.4=py312h3d0f464_0 + - timezonefinder=6.5.5=py312h01d7ebd_0 - tinycss2=1.4.0=pyhd8ed1ab_0 - tk=8.6.13=h1abcd95_1 - toml=0.10.2=pyhd8ed1ab_0 @@ -512,12 +514,12 @@ dependencies: - toolz=0.12.1=pyhd8ed1ab_0 - toposort=1.10=pyhd8ed1ab_0 - tornado=6.4.1=py312hb553811_1 - - tqdm=4.67.0=pyhd8ed1ab_0 + - tqdm=4.67.1=pyhd8ed1ab_0 - traitlets=5.14.3=pyhd8ed1ab_0 - typeguard=4.4.1=pyhd8ed1ab_0 - - typer=0.13.0=pyhd8ed1ab_0 - - typer-slim=0.13.0=pyhff2d567_0 - - typer-slim-standard=0.13.0=hd8ed1ab_0 + - typer=0.13.1=pyhd8ed1ab_0 + - typer-slim=0.13.1=pyhff2d567_0 + - typer-slim-standard=0.13.1=hd8ed1ab_0 - types-python-dateutil=2.9.0.20241003=pyhff2d567_0 - types-pyyaml=6.0.12.20240917=pyhd8ed1ab_0 - typing-extensions=4.12.2=hd8ed1ab_0 @@ -531,8 +533,8 @@ dependencies: - uri-template=1.3.0=pyhd8ed1ab_0 - uriparser=0.9.8=h6aefe2f_0 - urllib3=1.26.19=pyhd8ed1ab_0 - - uvicorn=0.32.0=pyh31011fe_1 - - uvicorn-standard=0.32.0=h31011fe_1 + - uvicorn=0.32.1=pyh31011fe_0 + - uvicorn-standard=0.32.1=h31011fe_0 - uvloop=0.21.0=py312h3d0f464_1 - validators=0.34.0=pyhd8ed1ab_0 - virtualenv=20.27.1=pyhd8ed1ab_0 @@ -544,9 +546,9 @@ dependencies: - websocket-client=1.8.0=pyhd8ed1ab_0 - websockets=11.0.3=py312h104f124_1 - werkzeug=3.1.3=pyhff2d567_0 - - wheel=0.45.0=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - - wrapt=1.16.0=py312hb553811_1 + - wrapt=1.17.0=py312h01d7ebd_0 - xerces-c=3.2.5=h197e74d_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0 - xorg-libxau=1.0.11=h00291cd_1 @@ -554,7 +556,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h775f41a_0 - yaml=0.2.5=h0d85af4_2 - - yarl=1.17.2=py312h01d7ebd_0 + - yarl=1.18.0=py312h01d7ebd_0 - zeromq=4.3.5=h7130eaa_7 - zip=3.0=h0dc2134_3 - zipp=3.21.0=pyhd8ed1ab_0 diff --git a/environments/conda-osx-arm64.lock.yml b/environments/conda-osx-arm64.lock.yml index 01e8296598..48e92c2e26 100644 --- a/environments/conda-osx-arm64.lock.yml +++ b/environments/conda-osx-arm64.lock.yml @@ -8,16 +8,17 @@ dependencies: - addfips=0.4.2=pyhd8ed1ab_0 - aiofiles=24.1.0=pyhd8ed1ab_0 - aiohappyeyeballs=2.4.3=pyhd8ed1ab_0 - - aiohttp=3.11.4=py312h998013c_1 + - aiohttp=3.11.7=py312h998013c_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alabaster=1.0.0=pyhd8ed1ab_0 - alembic=1.14.0=pyhd8ed1ab_0 - - altair=5.4.1=pyhd8ed1ab_1 + - altair=5.5.0=pyhd8ed1ab_0 - annotated-types=0.7.0=pyhd8ed1ab_0 + - antlr-python-runtime=4.13.2=pyhd8ed1ab_0 - anyio=4.6.2.post1=pyhd8ed1ab_0 - appdirs=1.4.4=pyh9f0ad1d_0 - appnope=0.1.4=pyhd8ed1ab_0 - - arelle-release=2.35.6=pyhd8ed1ab_0 + - arelle-release=2.35.9=pyhd8ed1ab_0 - argon2-cffi=23.1.0=pyhd8ed1ab_0 - argon2-cffi-bindings=21.2.0=py312h024a12e_5 - arrow=1.3.0=pyhd8ed1ab_0 @@ -51,20 +52,20 @@ dependencies: - backports=1.0=pyhd8ed1ab_4 - backports.tarfile=1.2.0=pyhd8ed1ab_0 - backports.zoneinfo=0.2.1=py312h81bd7bf_9 - - bcrypt=4.2.0=py312he431725_1 + - bcrypt=4.2.1=py312hcd83bfe_0 - beautifulsoup4=4.12.3=pyha770c72_0 - bleach=6.2.0=pyhd8ed1ab_0 - blinker=1.9.0=pyhff2d567_0 - blosc=1.21.6=h5499902_0 - - boto3=1.35.64=pyhd8ed1ab_0 - - botocore=1.35.64=pyge310_1234567_0 + - boto3=1.35.68=pyhd8ed1ab_0 + - botocore=1.35.68=pyge310_1234567_0 - bottleneck=1.4.2=py312h147345f_0 - branca=0.7.2=pyhd8ed1ab_0 - brotli=1.1.0=hd74edd7_2 - brotli-bin=1.1.0=hd74edd7_2 - brotli-python=1.1.0=py312hde4cb15_2 - bzip2=1.0.8=h99b78c6_7 - - c-ares=1.34.3=h5505292_0 + - c-ares=1.34.3=h5505292_1 - ca-certificates=2024.8.30=hf0a4a13_0 - cachecontrol=0.14.1=pyhd8ed1ab_0 - cachecontrol-with-filecache=0.14.1=pyhd8ed1ab_0 @@ -90,23 +91,23 @@ dependencies: - comm=0.2.2=pyhd8ed1ab_0 - conda-lock=2.5.7=pyhd8ed1ab_0 - contourpy=1.3.1=py312hb23fbb9_0 - - coverage=7.6.7=py312h998013c_0 + - coverage=7.6.8=py312h998013c_0 - crashtest=0.4.1=pyhd8ed1ab_0 - croniter=3.0.4=pyhd8ed1ab_0 - cryptography=43.0.3=py312h5fad481_0 - curl=8.10.1=h13a7ad3_0 - cycler=0.12.1=pyhd8ed1ab_0 - cyrus-sasl=2.1.27=h60b93bd_7 - - dagster=1.9.2=pyhd8ed1ab_12 - - dagster-graphql=1.9.2=pyhd8ed1ab_0 - - dagster-pipes=1.9.2=pyhd8ed1ab_0 - - dagster-postgres=0.25.2=pyhd8ed1ab_0 - - dagster-webserver=1.9.2=pyhd8ed1ab_0 + - dagster=1.9.3=pyhd8ed1ab_12 + - dagster-graphql=1.9.3=pyhd8ed1ab_0 + - dagster-pipes=1.9.3=pyhd8ed1ab_0 + - dagster-postgres=0.25.3=pyhff2d567_0 + - dagster-webserver=1.9.3=pyhd8ed1ab_0 - dask-core=2024.11.2=pyhff2d567_1 - dask-expr=1.1.19=pyhd8ed1ab_0 - databricks-sdk=0.38.0=pyhd8ed1ab_0 - datasette=0.65=pyhd8ed1ab_0 - - debugpy=1.8.8=py312hd8f9ff3_0 + - debugpy=1.8.9=py312hd8f9ff3_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - deprecated=1.2.15=pyhff2d567_0 @@ -160,7 +161,7 @@ dependencies: - google-auth=2.36.0=pyhff2d567_0 - google-auth-oauthlib=1.2.1=pyhd8ed1ab_0 - google-cloud-core=2.4.1=pyhd8ed1ab_0 - - google-cloud-sdk=501.0.0=py312h81bd7bf_1 + - google-cloud-sdk=502.0.0=py312h81bd7bf_0 - google-cloud-storage=2.18.2=pyhff2d567_0 - google-crc32c=1.1.2=py312h1fa1217_6 - google-resumable-media=2.7.2=pyhd8ed1ab_1 @@ -192,7 +193,7 @@ dependencies: - humanize=4.11.0=pyhd8ed1ab_0 - hupper=1.12.1=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - hypothesis=6.119.3=pyha770c72_0 + - hypothesis=6.119.4=pyha770c72_0 - icu=75.1=hfee45f7_0 - identify=2.6.2=pyhd8ed1ab_0 - idna=3.10=pyhd8ed1ab_0 @@ -281,7 +282,7 @@ dependencies: - libopenblas=0.3.28=openmp_hf332438_1 - libparquet=17.0.0=hf0ba9ef_16_cpu - libpng=1.6.44=hc14010f_0 - - libpq=17.1=h9b1ab17_0 + - libpq=17.2=h9b1ab17_0 - libprotobuf=4.25.3=hc39d83c_1 - libre2-11=2023.09.01=h7b2c953_2 - librsvg=2.58.4=h40956f1_0 @@ -289,7 +290,7 @@ dependencies: - libsodium=1.0.20=h99b78c6_0 - libspatialite=5.1.0=hffd3212_11 - libsqlite=3.47.0=hbaaea75_1 - - libssh2=1.11.0=h7a5bd25_0 + - libssh2=1.11.1=h9cc3647_0 - libthrift=0.20.0=h64651cc_1 - libtiff=4.7.0=hfce79cd_1 - libutf8proc=2.8.0=h1a8c8d9_0 @@ -299,7 +300,7 @@ dependencies: - libxml2=2.13.5=hbbdcc80_0 - libxslt=1.1.39=h223e5b9_0 - libzlib=1.3.1=h8359307_2 - - llvm-openmp=19.1.3=hb52a8e5_0 + - llvm-openmp=19.1.4=hdb05f8b_0 - llvmlite=0.43.0=py312ha9ca408_1 - locket=1.0.0=pyhd8ed1ab_0 - lsprotocol=2023.0.1=pyhd8ed1ab_0 @@ -327,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.1=pyhff2d567_0 + - narwhals=1.14.2=pyhff2d567_0 - nbclassic=1.1.0=pyhd8ed1ab_0 - nbclient=0.10.0=pyhd8ed1ab_0 - nbconvert=7.16.4=hd8ed1ab_1 @@ -343,7 +344,7 @@ dependencies: - notebook-shim=0.2.4=pyhd8ed1ab_0 - numba=0.60.0=py312h41cea2d_0 - numexpr=2.10.1=py312hd9debc8_3 - - numpy=2.0.2=py312h801f5e3_0 + - numpy=2.0.2=py312h94ee1e1_1 - oauthlib=3.2.2=pyhd8ed1ab_0 - openjpeg=2.5.2=h9f1df11_0 - openldap=2.6.8=h50f2afc_0 @@ -458,13 +459,13 @@ dependencies: - rsa=4.9=pyhd8ed1ab_0 - ruamel.yaml=0.18.6=py312h0bf5046_1 - ruamel.yaml.clib=0.2.8=py312h0bf5046_1 - - ruff=0.7.4=py312h5d18b81_0 - - ruff-lsp=0.0.58=pyhd8ed1ab_0 - - s3transfer=0.10.3=pyhd8ed1ab_0 + - ruff=0.8.0=py312h5d18b81_0 + - ruff-lsp=0.0.59=pyhd8ed1ab_0 + - s3transfer=0.10.4=pyhd8ed1ab_0 - scikit-learn=1.5.2=py312h387f99c_1 - scipy=1.14.1=py312h20deb59_1 - send2trash=1.8.3=pyh31c8845_0 - - setuptools=75.5.0=pyhff2d567_0 + - setuptools=75.6.0=pyhff2d567_0 - shapely=2.0.6=py312h3a6007a_2 - shellingham=1.5.4=pyhd8ed1ab_0 - simpleeval=0.9.13=pyhd8ed1ab_1 @@ -476,7 +477,7 @@ dependencies: - sortedcontainers=2.4.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - sphinx=8.1.3=pyhd8ed1ab_0 - - sphinx-autoapi=3.3.3=pyhd8ed1ab_0 + - sphinx-autoapi=3.3.3=pyhff2d567_1 - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 - sphinx-issues=5.0.0=pyhd8ed1ab_0 - sphinx-reredirects=0.1.5=pyhd8ed1ab_0 @@ -490,12 +491,13 @@ dependencies: - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - splink=4.0.5=pyhd8ed1ab_0 - sqlalchemy=2.0.36=py312h0bf5046_0 - - sqlglot=25.31.4=pyhff2d567_0 + - sqlglot=25.32.0=pyhff2d567_0 - sqlite=3.47.0=hcd14bea_1 - sqlparse=0.5.2=pyhff2d567_0 - stack_data=0.6.2=pyhd8ed1ab_0 - starlette=0.41.3=pyh7900ff3_0 - - stevedore=5.3.0=pyhd8ed1ab_0 + - stdlib-list=0.11.0=pyhd8ed1ab_0 + - stevedore=5.4.0=pyhd8ed1ab_0 - stringcase=1.2.0=pyhd8ed1ab_1 - structlog=24.4.0=pyhd8ed1ab_0 - tabulate=0.9.0=pyhd8ed1ab_1 @@ -503,7 +505,7 @@ dependencies: - terraform=1.9.8=hd02bf31_0 - text-unidecode=1.3=pyhd8ed1ab_1 - threadpoolctl=3.5.0=pyhc1e730c_0 - - timezonefinder=6.5.4=py312h0bf5046_0 + - timezonefinder=6.5.5=py312hea69d52_0 - tinycss2=1.4.0=pyhd8ed1ab_0 - tk=8.6.13=h5083fa2_1 - toml=0.10.2=pyhd8ed1ab_0 @@ -512,12 +514,12 @@ dependencies: - toolz=0.12.1=pyhd8ed1ab_0 - toposort=1.10=pyhd8ed1ab_0 - tornado=6.4.1=py312h024a12e_1 - - tqdm=4.67.0=pyhd8ed1ab_0 + - tqdm=4.67.1=pyhd8ed1ab_0 - traitlets=5.14.3=pyhd8ed1ab_0 - typeguard=4.4.1=pyhd8ed1ab_0 - - typer=0.13.0=pyhd8ed1ab_0 - - typer-slim=0.13.0=pyhff2d567_0 - - typer-slim-standard=0.13.0=hd8ed1ab_0 + - typer=0.13.1=pyhd8ed1ab_0 + - typer-slim=0.13.1=pyhff2d567_0 + - typer-slim-standard=0.13.1=hd8ed1ab_0 - types-python-dateutil=2.9.0.20241003=pyhff2d567_0 - types-pyyaml=6.0.12.20240917=pyhd8ed1ab_0 - typing-extensions=4.12.2=hd8ed1ab_0 @@ -531,8 +533,8 @@ dependencies: - uri-template=1.3.0=pyhd8ed1ab_0 - uriparser=0.9.8=h00cdb27_0 - urllib3=1.26.19=pyhd8ed1ab_0 - - uvicorn=0.32.0=pyh31011fe_1 - - uvicorn-standard=0.32.0=h31011fe_1 + - uvicorn=0.32.1=pyh31011fe_0 + - uvicorn-standard=0.32.1=h31011fe_0 - uvloop=0.21.0=py312h0bf5046_1 - validators=0.34.0=pyhd8ed1ab_0 - virtualenv=20.27.1=pyhd8ed1ab_0 @@ -544,9 +546,9 @@ dependencies: - websocket-client=1.8.0=pyhd8ed1ab_0 - websockets=11.0.3=py312h02f2b3b_1 - werkzeug=3.1.3=pyhff2d567_0 - - wheel=0.45.0=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - - wrapt=1.16.0=py312h024a12e_1 + - wrapt=1.17.0=py312hea69d52_0 - xerces-c=3.2.5=h92fc2f4_2 - xlsxwriter=3.2.0=pyhd8ed1ab_0 - xorg-libxau=1.0.11=hd74edd7_1 @@ -554,7 +556,7 @@ dependencies: - xyzservices=2024.9.0=pyhd8ed1ab_0 - xz=5.2.6=h57fd34a_0 - yaml=0.2.5=h3422bc3_2 - - yarl=1.17.2=py312hea69d52_0 + - yarl=1.18.0=py312hea69d52_0 - zeromq=4.3.5=hc1bb282_7 - zip=3.0=hb547adb_3 - zipp=3.21.0=pyhd8ed1ab_0 diff --git a/test/integration/zenodo_datapackage_test.py b/test/integration/zenodo_datapackage_test.py index a0a02593f7..df5999b98d 100644 --- a/test/integration/zenodo_datapackage_test.py +++ b/test/integration/zenodo_datapackage_test.py @@ -1,7 +1,7 @@ """Integration tests that verify that Zenodo datapackages are correct.""" import pytest -from requests.exceptions import ConnectionError, RetryError +from requests.exceptions import ConnectionError, RetryError # noqa: A004 from urllib3.exceptions import MaxRetryError, ResponseError from pudl.workspace.datastore import Datastore From 9dd1ab9fe483c58541547703b6bd85c922a2aaa5 Mon Sep 17 00:00:00 2001 From: Chad Dougherty Date: Mon, 25 Nov 2024 13:59:35 -0500 Subject: [PATCH 4/7] Update CONTRIBUTING.rst (#3974) fix nested list in first issue section Co-authored-by: Zane Selvans --- CONTRIBUTING.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index fc6eb0e37e..24a7709580 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -45,6 +45,7 @@ You'll need to fork this repository and get the * Once you have an idea of how you want to tackle this issue, write out your plan so we can guide you around obstacles in your way! Post a comment outlining: + * what steps have you broken this down into? * what is the output of each step? * how will one know that each step is working? From 7163863ad923ee54dc91642b57ea87c3ae0f3e1d Mon Sep 17 00:00:00 2001 From: David Mudrauskas Date: Wed, 27 Nov 2024 11:52:00 -0500 Subject: [PATCH 5/7] Eia176 wide table (#3590) * Function for getting a column per variable for EIA-176 data * Transpose rows to columns for entity variables, initial test/check ideas * Dagster job for eia176 core data * Use unstack instead of looping to create wide table * Extract testable function for wide table, validation function * Test for wide table function * Test for validating totals * Information-hide drop columns * Normalize string values in raw dataframe * Mutate data types * Reusable df in tests, label index --- src/pudl/etl/__init__.py | 1 + src/pudl/extract/eia176.py | 9 ++ src/pudl/transform/__init__.py | 1 + src/pudl/transform/eia176.py | 113 ++++++++++++++++ test/unit/transform/eia176_test.py | 207 +++++++++++++++++++++++++++++ 5 files changed, 331 insertions(+) create mode 100644 src/pudl/transform/eia176.py create mode 100644 test/unit/transform/eia176_test.py diff --git a/src/pudl/etl/__init__.py b/src/pudl/etl/__init__.py index 9b859c6448..4406825934 100644 --- a/src/pudl/etl/__init__.py +++ b/src/pudl/etl/__init__.py @@ -64,6 +64,7 @@ core_module_groups = { + "_core_eia176": [pudl.transform.eia176], "core_assn": [glue_assets], "core_censusdp1tract": [ pudl.convert.censusdp1tract_to_sqlite, diff --git a/src/pudl/extract/eia176.py b/src/pudl/extract/eia176.py index 484fedaf83..4ad9e59ef2 100644 --- a/src/pudl/extract/eia176.py +++ b/src/pudl/extract/eia176.py @@ -35,6 +35,15 @@ def process_raw( selection = self._metadata._get_partition_selection(partition) return df.assign(report_year=selection) + def process_renamed( + self, df: pd.DataFrame, page: str, **partition: PartitionSelection + ) -> pd.DataFrame: + """Strip and lowercase raw text fields (except ID).""" + text_fields = ["area", "atype", "company", "item"] + for tf in text_fields: + df[tf] = df[tf].str.strip().str.lower() + return df + raw_eia176__all_dfs = raw_df_factory(Extractor, name="eia176") diff --git a/src/pudl/transform/__init__.py b/src/pudl/transform/__init__.py index a9faccbd6d..68451cc9b9 100644 --- a/src/pudl/transform/__init__.py +++ b/src/pudl/transform/__init__.py @@ -63,6 +63,7 @@ from . import ( classes, eia, + eia176, eia860, eia860m, eia861, diff --git a/src/pudl/transform/eia176.py b/src/pudl/transform/eia176.py new file mode 100644 index 0000000000..ff6fa2c6ef --- /dev/null +++ b/src/pudl/transform/eia176.py @@ -0,0 +1,113 @@ +"""Module to perform data cleaning functions on EIA176 data tables.""" + +import pandas as pd +from dagster import AssetCheckResult, AssetIn, AssetOut, asset_check, multi_asset + +from pudl.logging_helpers import get_logger + +logger = get_logger(__name__) + + +@multi_asset( + outs={ + "core_eia176__yearly_company_data": AssetOut(), + "core_eia861__yearly_aggregate_data": AssetOut(), + }, +) +def _core_eia176__data( + raw_eia176__data: pd.DataFrame, +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Take raw list and return two wide tables with primary keys and one column per variable. + + One table with data for each year and company, one with state- and US-level aggregates per year. + """ + raw_eia176__data = raw_eia176__data.astype({"report_year": int, "value": float}) + raw_eia176__data["variable_name"] = ( + raw_eia176__data["line"] + "_" + raw_eia176__data["atype"] + ) + + aggregate_primary_key = ["report_year", "area"] + company_primary_key = aggregate_primary_key + ["id"] + company_drop_columns = ["itemsort", "item", "atype", "line", "company"] + # We must drop 'id' here and cannot use as primary key because its arbitrary/duplicate in aggregate records + # 'id' is a reliable ID only in the context of granular company data + aggregate_drop_columns = company_drop_columns + ["id"] + + long_company = raw_eia176__data.loc[ + raw_eia176__data.company != "total of all companies" + ] + wide_company = get_wide_table( + long_table=long_company.drop(columns=company_drop_columns), + primary_key=company_primary_key, + ) + + long_aggregate = raw_eia176__data.loc[ + raw_eia176__data.company == "total of all companies" + ] + wide_aggregate = get_wide_table( + long_table=long_aggregate.drop(columns=aggregate_drop_columns), + primary_key=aggregate_primary_key, + ) + + return wide_company, wide_aggregate + + +def get_wide_table(long_table: pd.DataFrame, primary_key: list[str]) -> pd.DataFrame: + """Take a 'long' or entity-attribute-value table and return a wide table with one column per attribute/variable.""" + unstacked = long_table.set_index(primary_key + ["variable_name"]).unstack( + level="variable_name" + ) + unstacked.columns = unstacked.columns.droplevel(0) + unstacked.columns.name = None # gets rid of "variable_name" name of columns index + return unstacked.reset_index().fillna(0) + + +@asset_check( + asset="core_eia176__yearly_company_data", + additional_ins={"core_eia861__yearly_aggregate_data": AssetIn()}, + blocking=True, +) +def validate_totals( + core_eia176__yearly_company_data: pd.DataFrame, + core_eia861__yearly_aggregate_data: pd.DataFrame, +) -> AssetCheckResult: + """Compare reported and calculated totals for different geographical aggregates, report any differences.""" + # First make it so we can directly compare reported aggregates to groupings of granular data + comparable_aggregates = core_eia861__yearly_aggregate_data.sort_values( + ["report_year", "area"] + ).fillna(0) + + # Group company data into state-level data and compare to reported totals + state_data = ( + core_eia176__yearly_company_data.drop(columns="id") + .groupby(["report_year", "area"]) + .sum() + .reset_index() + ) + aggregate_state = comparable_aggregates[ + comparable_aggregates.area != "u.s. total" + ].reset_index(drop=True) + # Compare using the same columns + state_diff = aggregate_state[state_data.columns].compare(state_data) + + # Group calculated state-level data into US-level data and compare to reported totals + us_data = ( + state_data.drop(columns="area") + .groupby("report_year") + .sum() + .sort_values("report_year") + .reset_index() + ) + aggregate_us = ( + comparable_aggregates[comparable_aggregates.area == "u.s. total"] + .drop(columns="area") + .sort_values("report_year") + .reset_index(drop=True) + ) + # Compare using the same columns + us_diff = aggregate_us[us_data.columns].compare(us_data) + + return AssetCheckResult(passed=bool(us_diff.empty and state_diff.empty)) + + +# TODO: Reasonable boundaries -- in a script/notebook in the 'validate' directory? How are those executed? diff --git a/test/unit/transform/eia176_test.py b/test/unit/transform/eia176_test.py new file mode 100644 index 0000000000..a0f5ced30c --- /dev/null +++ b/test/unit/transform/eia176_test.py @@ -0,0 +1,207 @@ +import pandas as pd +from pytest import fixture + +from pudl.transform.eia176 import _core_eia176__data, get_wide_table, validate_totals + +COLUMN_NAMES = [ + "area", + "atype", + "company", + "id", + "line", + "report_year", + "value", + "itemsort", + "item", +] + +ID_1 = "17673850NM" +VOLUME_1 = 30980426.0 +COMPANY_1 = [ + "new mexico", + "vl", + "new mexico gas company", + ID_1, + "1010", + "2022", + VOLUME_1, + "[10.1]", + "residential sales volume", +] + +ID_2 = "17635017NM" +VOLUME_2 = 532842.0 +COMPANY_2 = [ + "new mexico", + "vl", + "west texas gas inc", + ID_2, + "1010", + "2022", + VOLUME_2, + "[10.1]", + "residential sales volume", +] + +NM_VOLUME = VOLUME_1 + VOLUME_2 +NM_AGGREGATE = [ + "new mexico", + "vl", + "total of all companies", + # Aggregates appear to reuse an arbitrary company ID + ID_1, + "1010", + "2022", + NM_VOLUME, + "[10.1]", + "residential sales volume", +] + +ID_3 = "17635017TX" +VOLUME_3 = 1.0 +COMPANY_3 = [ + "texas", + "vl", + "west texas gas inc", + ID_3, + "1010", + "2022", + VOLUME_3, + "[10.1]", + "residential sales volume", +] + +TX_VOLUME = VOLUME_3 +TX_AGGREGATE = [ + "texas", + "vl", + "total of all companies", + # Aggregates appear to reuse an arbitrary company ID + ID_3, + "1010", + "2022", + VOLUME_3, + "[10.1]", + "residential sales volume", +] + +US_VOLUME = NM_VOLUME + TX_VOLUME +US_AGGREGATE = [ + "u.s. total", + "vl", + "total of all companies", + # Aggregates appear to reuse an arbitrary company ID + ID_1, + "1010", + "2022", + US_VOLUME, + "[10.1]", + "residential sales volume", +] + +ID_4 = "4" +VOLUME_4 = 4.0 +COMPANY_4 = [ + "alaska", + "vl", + "alaska gas inc", + ID_4, + "1020", + "2022", + VOLUME_4, + "[10.2]", + "some other volume", +] + +DROP_COLS = ["itemsort", "item", "atype", "line", "company"] + + +@fixture +def df(): + df = pd.DataFrame(columns=COLUMN_NAMES) + df.loc[0] = COMPANY_1 + df.loc[1] = COMPANY_2 + df.loc[2] = NM_AGGREGATE + df.loc[3] = COMPANY_3 + df.loc[4] = TX_AGGREGATE + df.loc[5] = US_AGGREGATE + df.loc[6] = COMPANY_4 + df = df.set_index(["area", "company"]) + return df + + +def test_core_eia176__data(df): + eav_model = df.loc[ + [ + ("new mexico", "new mexico gas company"), + ("new mexico", "total of all companies"), + ] + ].reset_index() + + wide_company, wide_aggregate = _core_eia176__data(eav_model) + assert wide_company.shape == (1, 4) + + company_row = wide_company.loc[0] + assert list(company_row.index) == ["report_year", "area", "id", "1010_vl"] + assert list(company_row.values) == [2022, "new mexico", ID_1, VOLUME_1] + + assert wide_aggregate.shape == (1, 3) + aggregate_row = wide_aggregate.loc[0] + assert list(aggregate_row.index) == ["report_year", "area", "1010_vl"] + assert list(aggregate_row.values) == [2022, "new mexico", NM_VOLUME] + + +def test_get_wide_table(df): + long_table = df.loc[ + [ + ("new mexico", "new mexico gas company"), + ("new mexico", "west texas gas inc"), + # Row measuring a different variable to test filling NAs + ("alaska", "alaska gas inc"), + ] + ].reset_index() + + long_table["variable_name"] = long_table["line"] + "_" + long_table["atype"] + long_table = long_table.drop(columns=DROP_COLS) + + primary_key = ["report_year", "area", "id"] + wide_table = get_wide_table(long_table, primary_key) + + assert wide_table.shape == (3, 5) + assert list(wide_table.loc[0].index) == [ + "report_year", + "area", + "id", + "1010_vl", + "1020_vl", + ] + assert list(wide_table.loc[0].values) == ["2022", "alaska", ID_4, 0, VOLUME_4] + assert list(wide_table.loc[1].values) == ["2022", "new mexico", ID_2, VOLUME_2, 0] + assert list(wide_table.loc[2].values) == ["2022", "new mexico", ID_1, VOLUME_1, 0] + + +def test_validate__totals(df): + # Our test data will have only measurements for this 1010_vl variable + company_data = df.loc[ + [ + ("new mexico", "new mexico gas company"), + ("new mexico", "west texas gas inc"), + ("texas", "west texas gas inc"), + ] + ].reset_index() + # Add the value for the 1010_vl variable + company_data["1010_vl"] = [str(v) for v in [VOLUME_1, VOLUME_2, VOLUME_3]] + company_data = company_data.drop(columns=DROP_COLS) + + aggregate_data = df.loc[ + [ + ("new mexico", "total of all companies"), + ("texas", "total of all companies"), + ("u.s. total", "total of all companies"), + ] + ].reset_index() + # Add the value for the 1010_vl variable + aggregate_data["1010_vl"] = [str(v) for v in [NM_VOLUME, TX_VOLUME, US_VOLUME]] + aggregate_data = aggregate_data.drop(columns=DROP_COLS + ["id"]) + + validate_totals(company_data, aggregate_data) From 6d9e272783e61d9229985386a7125d8d4273814c Mon Sep 17 00:00:00 2001 From: Katie Lamb <95320980+katie-lamb@users.noreply.github.com> Date: Wed, 27 Nov 2024 12:29:05 -0500 Subject: [PATCH 6/7] Updates to splink FERC to EIA record linkage notebook (#3976) * updates to splink ferc to eia notebook * update release notes * take out casting to datetime from plant parts list creation --- devtools/splink-ferc1-eia-match.ipynb | 244 +++++++++++++++++++------- docs/release_notes.rst | 6 + src/pudl/analysis/plant_parts_eia.py | 2 +- 3 files changed, 185 insertions(+), 67 deletions(-) diff --git a/devtools/splink-ferc1-eia-match.ipynb b/devtools/splink-ferc1-eia-match.ipynb index d51deb6475..6479ee3ccf 100644 --- a/devtools/splink-ferc1-eia-match.ipynb +++ b/devtools/splink-ferc1-eia-match.ipynb @@ -7,9 +7,9 @@ "source": [ "# Use Splink to match FERC1 plants to EIA plant parts\n", "\n", - "This notebook walks through how to use splink to match FERC1 plants to EIA plant parts, as is done in `pudl.analysis.record_linkage.eia_ferc1_record_linkage_model.py`. Splink has several visualizations during the model training process that are helpful for understanding model weights and the input datasets. Thos visualizations are not captured in the PUDL module that implements this model, so this companion notebook provides insight into how to use splink for model development.\n", + "This notebook walks through using splink to match FERC1 plants to EIA plant parts, as is done in `pudl.analysis.record_linkage.eia_ferc1_record_linkage_model.py`. Splink provides several visualizations during the model training process that are helpful for understanding model weights and the input datasets. For now, those visualizations are not captured in the PUDL module that implements this model, so this companion notebook provides additional insight into model development.\n", "\n", - "The [Splink docs](https://moj-analytical-services.github.io/splink/index.html) include helpful tutorials and the Github issues and discussions are also helpful places to look." + "The [Splink docs](https://moj-analytical-services.github.io/splink/index.html) include tutorials and the Github issues and discussions are also helpful places to look." ] }, { @@ -32,46 +32,79 @@ "source": [ "import jellyfish\n", "import sqlalchemy as sa\n", - "from splink.duckdb.linker import DuckDBLinker\n", - "from splink.duckdb.blocking_rule_library import block_on\n", + "from splink import block_on, DuckDBAPI, Linker, SettingsCreator\n", + "from splink.blocking_analysis import count_comparisons_from_blocking_rule, cumulative_comparisons_to_be_scored_from_blocking_rules_chart, n_largest_blocks\n", + "from splink.exploratory import completeness_chart, profile_columns\n", "import pandas as pd\n", "\n", "import pudl\n", "from pudl.analysis.record_linkage import eia_ferc1_record_linkage as eia_ferc1_model\n", "from pudl.analysis.record_linkage.name_cleaner import CompanyNameCleaner\n", "from pudl.analysis.record_linkage.embed_dataframe import _fill_fuel_type_from_name\n", - "from pudl.analysis.record_linkage import eia_ferc1_model_config\n", - "from pudl.etl import defs" + "from pudl.analysis.record_linkage import eia_ferc1_model_config" + ] + }, + { + "cell_type": "markdown", + "id": "46ea387a-2bd7-4240-81b3-ed82ea275c0a", + "metadata": {}, + "source": [ + "# Get model inputs and preprocess" + ] + }, + { + "cell_type": "markdown", + "id": "88efc43b-4571-47a7-8e35-06cb58d8215f", + "metadata": {}, + "source": [ + "Practically speaking, a plant is a collection of generator(s). There are many attributes of generators (i.e. prime mover, primary fuel source, technology type). We can use these generator attributes to group generator records into larger aggregate records which we call \"plant parts\". A plant part is a record which corresponds to a particular collection of generators that all share an identical attribute and utility owner, e.g. all of the generators with unit_id=2, or all of the generators with coal as their primary fuel source.\n", + "\n", + "The EIA data about power plants (from EIA 923 and 860) is reported in tables with records that correspond to mostly generators and plants. FERC 1 is less well organized and include plants, generators and other plant parts all in the same table without any clear labels. This EIA plant part table is an attempt to create records corresponding to many different plant parts in order to connect specific slices of EIA plants to FERC.\n", + "\n", + "Because generators are often owned by multiple utilities, another dimension of this plant part table involves generating two records for each owner: one for the portion of the plant part they own and one for the plant part as a whole. The portion records are labeled in the ``ownership_record_type`` column as ``owned`` and the total records are labeled as ``total``. This table includes A LOT of duplicative information about EIA plants. It is meant for use as an input into the record linkage between FERC1 plants and EIA." ] }, { "cell_type": "code", "execution_count": null, - "id": "fc3fc801-aa7e-4bf2-9748-200461f1c1ff", + "id": "064af8a0-c5a2-49d3-b403-6e9bf31ac080", "metadata": {}, "outputs": [], "source": [ - "pudl_engine = sa.create_engine(pudl.workspace.setup.PudlPaths().pudl_db)" + "# Get a denormalized FERC Form 1 table containing the steam, small generators, hydro, and pumped storage tables\n", + "out_ferc1__yearly_all_plants = pd.read_parquet(\"s3://pudl.catalyst.coop/stable/out_ferc1__yearly_all_plants.parquet\")" ] }, { - "cell_type": "markdown", - "id": "46ea387a-2bd7-4240-81b3-ed82ea275c0a", + "cell_type": "code", + "execution_count": null, + "id": "5aa3a188-b39c-45ab-88c7-800aefde4a52", "metadata": {}, + "outputs": [], "source": [ - "# Get model inputs and preprocess" + "# Get a table summarizing fuel data by plant, using FERC Form 1 data\n", + "out_ferc1__yearly_steam_plants_fuel_by_plant_sched402 = pd.read_parquet(\"s3://pudl.catalyst.coop/stable/out_ferc1__yearly_steam_plants_fuel_by_plant_sched402.parquet\",)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "651cb03f-85b0-4390-8a3c-8249ca9d06e4", + "metadata": {}, + "outputs": [], + "source": [ + "# Get a table with the aggregation of all EIA \"plant parts\"\n", + "out_eia__yearly_plant_parts = pd.read_parquet(\"s3://pudl.catalyst.coop/stable/out_eia__yearly_plant_parts.parquet\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "b81d9beb-2385-450a-af45-e4e0541a8df4", + "id": "b52f0a91-3ab6-44ea-ae96-050ea3155978", "metadata": {}, "outputs": [], "source": [ - "out_ferc1__yearly_all_plants = defs.load_asset_value(\"out_ferc1__yearly_all_plants\")\n", - "out_ferc1__yearly_steam_plants_fuel_by_plant_sched402 = defs.load_asset_value(\"out_ferc1__yearly_steam_plants_fuel_by_plant_sched402\")\n", - "out_eia__yearly_plant_parts = defs.load_asset_value(\"out_eia__yearly_plant_parts\")" + "out_eia__yearly_plant_parts[\"report_date\"] = pd.to_datetime(out_eia__yearly_plant_parts[\"report_date\"])" ] }, { @@ -86,6 +119,14 @@ " out_eia__yearly_plant_parts)" ] }, + { + "cell_type": "markdown", + "id": "e3ce845f-aa7c-4515-b06d-20a87c049eb8", + "metadata": {}, + "source": [ + "Do a little preprocessing so the datasets have the same columns. Also, load in a dataset of manually matched training data, found [here](https://github.com/catalyst-cooperative/pudl/blob/main/src/pudl/package_data/glue/eia_ferc1_train.csv) . We'll use this to train and validate the model." + ] + }, { "cell_type": "code", "execution_count": null, @@ -94,9 +135,20 @@ "outputs": [], "source": [ "eia_df, ferc_df = eia_ferc1_model.get_input_dfs(inputs)\n", + "# we have a dataset of manually matched training data\n", "train_df = eia_ferc1_model.get_training_data_df(inputs)" ] }, + { + "cell_type": "markdown", + "id": "8b89a255-af77-4531-9688-223f6f9de14a", + "metadata": {}, + "source": [ + "Normalize plant and utility name strings. Do things like expand legal terms (e.g. llc -> limited liability company), remove punctuation, remove numbers, etc.\n", + "\n", + "This name cleaner is being refactored and will soon be 3x faster." + ] + }, { "cell_type": "code", "execution_count": null, @@ -145,6 +197,14 @@ "eia_df[\"construction_year\"] = pd.to_datetime(eia_df[\"construction_year\"], format=\"%Y\")" ] }, + { + "cell_type": "markdown", + "id": "c0a7541a-ef2c-41b5-9e22-e264e30e0757", + "metadata": {}, + "source": [ + "We can use metaphones of the plant and utility names as columns for blocking. With splink, metaphones can work better/faster than string similarity." + ] + }, { "cell_type": "code", "execution_count": null, @@ -194,78 +254,68 @@ }, { "cell_type": "markdown", - "id": "ddaed355-501a-4a38-b7fa-7d1b5f355306", + "id": "e2777501-8cc5-4a05-95ae-0616a8e9a794", "metadata": {}, "source": [ - "# Set settings dictionary and create linker" + "# Data Exploration" ] }, { "cell_type": "code", "execution_count": null, - "id": "fdc68f8a-e4a0-4b3a-bde3-bea1e0ac1338", + "id": "14dc9e4c-551c-4a7f-ad84-72ed72138fe0", "metadata": {}, "outputs": [], "source": [ - "settings_dict = {\"link_type\": \"link_only\",\n", - " \"unique_id_column_name\": \"record_id\",\n", - " \"additional_columns_to_retain\": [\"plant_id_pudl\", \"utility_id_pudl\", \"utility_name_mphone\", \"plant_name_mphone\"]}" + "db_api = DuckDBAPI()" ] }, { "cell_type": "code", "execution_count": null, - "id": "730c9bfe-dade-494e-aaec-ae1827f2c9de", + "id": "bf24b3ef-2cc0-455b-9f7e-89fd1fca8a1d", "metadata": {}, "outputs": [], "source": [ - "linker = DuckDBLinker([eia_df, ferc_df], input_table_aliases = [\"eia_df\", \"ferc_df\"], settings_dict=settings_dict)" + "completeness_chart(eia_df, db_api=db_api, cols=eia_ferc1_model.MATCHING_COLS)" ] }, { "cell_type": "code", "execution_count": null, - "id": "5f4b43ad-61a0-4c7f-957e-3094576db86d", + "id": "bf465746-3a39-408f-98ef-14ad9b22c111", "metadata": {}, "outputs": [], "source": [ - "train_table = linker.register_table(train_df, \"training_labels\", overwrite=True)" + "completeness_chart(ferc_df, db_api=db_api, cols=eia_ferc1_model.MATCHING_COLS)" ] }, { "cell_type": "markdown", - "id": "e2777501-8cc5-4a05-95ae-0616a8e9a794", + "id": "213c8564-0abe-4118-8e79-2377e67f220f", "metadata": {}, "source": [ - "# Data Exploration" + "Columns with higher cardinality are better for matching. Note the skew in `fuel_type_code_pudl` which means we'll need to use a term frequency adjustment." ] }, { "cell_type": "code", "execution_count": null, - "id": "bf24b3ef-2cc0-455b-9f7e-89fd1fca8a1d", + "id": "830d8136-8d21-4958-9c6c-aca6bfeb04b0", "metadata": {}, "outputs": [], "source": [ - "linker.completeness_chart(cols=eia_ferc1_model.MATCHING_COLS)" - ] - }, - { - "cell_type": "markdown", - "id": "213c8564-0abe-4118-8e79-2377e67f220f", - "metadata": {}, - "source": [ - "Columns with higher cardinality are better for matching. Note the skew in `fuel_type_code_pudl` which means we'll need to use a term frequency adjustment." + "profile_columns(eia_df[eia_ferc1_model.MATCHING_COLS], db_api=DuckDBAPI(), top_n=10, bottom_n=5)" ] }, { "cell_type": "code", "execution_count": null, - "id": "5d728332-839c-42ac-bd72-de534a410962", + "id": "c7820f60-1454-43a0-b8b0-275d8e31e812", "metadata": {}, "outputs": [], "source": [ - "linker.profile_columns(eia_ferc1_model.MATCHING_COLS, top_n=10, bottom_n=5)" + "profile_columns(ferc_df[eia_ferc1_model.MATCHING_COLS], db_api=DuckDBAPI(), top_n=10, bottom_n=5)" ] }, { @@ -285,48 +335,91 @@ { "cell_type": "code", "execution_count": null, - "id": "68d5a3cf-2e0b-426d-aab5-86babd6d2751", + "id": "b39f7633-c97e-4c31-a553-6cfd3ccc0a4a", "metadata": {}, "outputs": [], "source": [ - "linker.cumulative_num_comparisons_from_blocking_rules_chart(eia_ferc1_model_config.BLOCKING_RULES)" + "br0 = eia_ferc1_model_config.BLOCKING_RULES[0]" ] }, { - "cell_type": "markdown", - "id": "573573a2-056b-41a0-86a3-6477877acf6c", + "cell_type": "code", + "execution_count": null, + "id": "b52e9c62-6502-4ae5-91fb-ffedeca383ec", "metadata": {}, + "outputs": [], "source": [ - "# Define Comparison Levels" + "count_comparisons_from_blocking_rule(\n", + " table_or_tables=[eia_df, ferc_df],\n", + " blocking_rule=br0,\n", + " link_type=\"link_only\",\n", + " unique_id_column_name='record_id',\n", + " db_api=db_api,\n", + ")\n" ] }, { "cell_type": "code", "execution_count": null, - "id": "7d95b129-3422-4069-bfda-a4ad504a6b54", + "id": "891915e3-564f-43dc-af86-be0ea21f49d7", "metadata": {}, "outputs": [], "source": [ - "print(eia_ferc1_model_config.plant_name_comparison.human_readable_description)" + "result = n_largest_blocks(\n", + " table_or_tables=[eia_df, ferc_df],\n", + " blocking_rule=br0,\n", + " link_type=\"link_only\",\n", + " db_api=db_api,\n", + " n_largest=3\n", + ")\n", + "\n", + "result.as_pandas_dataframe()" ] }, { "cell_type": "code", "execution_count": null, - "id": "b979157e-f46d-4bfb-b9b5-0900e2545753", + "id": "3a20be45-152e-4e82-9cc0-4e57c0f1dca7", "metadata": {}, "outputs": [], "source": [ - "settings_dict.update({\n", - " \"comparisons\": eia_ferc1_model_config.COMPARISONS,\n", - " \"blocking_rules_to_generate_predictions\": eia_ferc1_model_config.BLOCKING_RULES,\n", - " \"retain_matching_columns\": True,\n", - " \"retain_intermediate_calculation_columns\": True,\n", - " \"probability_two_random_records_match\": 1/len(eia_df) # this parameter can also be estimated if it's unknown\n", - " }\n", + "blocking_rules_for_analysis = eia_ferc1_model_config.BLOCKING_RULES\n", + "\n", + "cumulative_comparisons_to_be_scored_from_blocking_rules_chart(\n", + " table_or_tables=[eia_df, ferc_df],\n", + " blocking_rules=blocking_rules_for_analysis,\n", + " db_api=db_api,\n", + " unique_id_column_name='record_id',\n", + " link_type=\"link_only\",\n", ")" ] }, + { + "cell_type": "markdown", + "id": "573573a2-056b-41a0-86a3-6477877acf6c", + "metadata": {}, + "source": [ + "# Define Model Settings" + ] + }, + { + "cell_type": "markdown", + "id": "7301917f-e753-4f3e-a2dd-fb996ab6633c", + "metadata": {}, + "source": [ + "See the [splink settings guide](https://moj-analytical-services.github.io/splink/api_docs/settings_dict_guide.html) for more on model parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d95b129-3422-4069-bfda-a4ad504a6b54", + "metadata": {}, + "outputs": [], + "source": [ + "print(eia_ferc1_model_config.plant_name_comparison.get_comparison(\"duckdb\").human_readable_description)" + ] + }, { "cell_type": "markdown", "id": "1b3e1002-60cf-43dd-9176-e3f23c76168d", @@ -345,11 +438,30 @@ { "cell_type": "code", "execution_count": null, - "id": "5e205d00-da15-4c20-8d7b-a7d08e0ff815", + "id": "d6f30b15-3480-4253-8763-8bcaf3345ebc", + "metadata": {}, + "outputs": [], + "source": [ + "settings = SettingsCreator(\n", + " link_type=\"link_only\",\n", + " unique_id_column_name=\"record_id\",\n", + " comparisons=eia_ferc1_model_config.COMPARISONS,\n", + " blocking_rules_to_generate_predictions=eia_ferc1_model_config.BLOCKING_RULES,\n", + " retain_intermediate_calculation_columns=True,\n", + " probability_two_random_records_match=1/len(eia_df) # this parameter can also be estimated if it's unknown\n", + ")\n", + "\n", + "linker = Linker([eia_df, ferc_df], settings, db_api=DuckDBAPI())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "180d48cc-bacf-4115-9a89-4450f04097d6", "metadata": {}, "outputs": [], "source": [ - "linker.load_settings(settings_dict)" + "train_table = linker.table_management.register_table(train_df, \"training_labels\", overwrite=True)" ] }, { @@ -369,7 +481,7 @@ "metadata": {}, "outputs": [], "source": [ - "linker.estimate_u_using_random_sampling(max_pairs=1e7)" + "linker.training.estimate_u_using_random_sampling(max_pairs=1e7)" ] }, { @@ -387,7 +499,7 @@ "metadata": {}, "outputs": [], "source": [ - "linker.estimate_m_from_pairwise_labels(\"training_labels\")" + "linker.training.estimate_m_from_pairwise_labels(\"training_labels\")" ] }, { @@ -397,7 +509,7 @@ "metadata": {}, "outputs": [], "source": [ - "# if we do it unsupervised, we need to define training blocking rules\n", + "# if we want this to be unsupervised, we need to define training blocking rules\n", "# training_blocking_rule_1 = \"l.plant_name = r.plant_name\"\n", "# training_session_1 = linker.estimate_parameters_using_expectation_maximisation(training_blocking_rule_1)\n", "# training_session_2 = linker.estimate_parameters_using_expectation_maximisation(block_on([\"utility_name\", \"net_generation_mwh\"]))\n", @@ -411,7 +523,7 @@ "metadata": {}, "outputs": [], "source": [ - "linker.match_weights_chart()" + "linker.visualisations.match_weights_chart()" ] }, { @@ -421,7 +533,7 @@ "metadata": {}, "outputs": [], "source": [ - "linker.m_u_parameters_chart()" + "linker.visualisations.m_u_parameters_chart()" ] }, { @@ -442,7 +554,7 @@ "outputs": [], "source": [ "# save model settings to a chosen directory\n", - "settings = linker.save_model_to_json(f\"./model_settings_{model_name}.json\", overwrite=True)" + "settings = linker.misc.save_model_to_json(f\"./model_settings_{model_name}.json\", overwrite=True)" ] }, { @@ -461,7 +573,7 @@ "outputs": [], "source": [ "# predict matches above a certain threshold match probability or match weight\n", - "df_preds = linker.predict(threshold_match_probability=.25)" + "df_preds = linker.inference.predict(threshold_match_probability=.25)" ] }, { @@ -710,7 +822,7 @@ "outputs": [], "source": [ "rec_true = rec_true.to_dict(orient=\"records\")\n", - "linker.waterfall_chart(rec_true, filter_nulls=False)" + "linker.visualisations.waterfall_chart(rec_true, filter_nulls=False)" ] }, { @@ -721,7 +833,7 @@ "outputs": [], "source": [ "rec_pred = rec_pred.to_dict(orient=\"records\")\n", - "linker.waterfall_chart(rec_pred, filter_nulls=False)" + "linker.visualisations.waterfall_chart(rec_pred, filter_nulls=False)" ] }, { @@ -749,7 +861,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/docs/release_notes.rst b/docs/release_notes.rst index f48883681b..d5e86fc284 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -57,6 +57,12 @@ EPA CEMS ~~~~~~~~ * Added 2024 Q3 of CEMS data. See :issue:`3943` and :pr:`3948`. +FERC to EIA Record Linkage +^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Updated the ``splink`` FERC to EIA development notebook to be compatible with + the latest version of ``splink``. This notebook is not run in production but + is helpful for visualizing model weights and what is happening under the hood. + .. _release-v2024.10.0: --------------------------------------------------------------------------------------- diff --git a/src/pudl/analysis/plant_parts_eia.py b/src/pudl/analysis/plant_parts_eia.py index bea9238e95..c35174b602 100644 --- a/src/pudl/analysis/plant_parts_eia.py +++ b/src/pudl/analysis/plant_parts_eia.py @@ -1486,7 +1486,7 @@ def match_to_single_plant_part( # convert the date to year start - this is necessary because the # depreciation data is often reported as EOY and the ppe is always SOY multi_gran_df.loc[:, "report_date"] = pd.to_datetime( - multi_gran_df.report_date.dt.year, format="%Y" + multi_gran_df["report_date"].dt.year, format="%Y" ) out_dfs = [] for merge_part in PLANT_PARTS: From 740212a7ab135f34a1fbe47968a002004315b515 Mon Sep 17 00:00:00 2001 From: Dazhong Xia Date: Wed, 27 Nov 2024 16:57:20 -0500 Subject: [PATCH 7/7] Revert "Eia176 wide table (#3590)" This reverts commit 7163863ad923ee54dc91642b57ea87c3ae0f3e1d. --- src/pudl/etl/__init__.py | 1 - src/pudl/extract/eia176.py | 9 -- src/pudl/transform/__init__.py | 1 - src/pudl/transform/eia176.py | 113 ---------------- test/unit/transform/eia176_test.py | 207 ----------------------------- 5 files changed, 331 deletions(-) delete mode 100644 src/pudl/transform/eia176.py delete mode 100644 test/unit/transform/eia176_test.py diff --git a/src/pudl/etl/__init__.py b/src/pudl/etl/__init__.py index 4406825934..9b859c6448 100644 --- a/src/pudl/etl/__init__.py +++ b/src/pudl/etl/__init__.py @@ -64,7 +64,6 @@ core_module_groups = { - "_core_eia176": [pudl.transform.eia176], "core_assn": [glue_assets], "core_censusdp1tract": [ pudl.convert.censusdp1tract_to_sqlite, diff --git a/src/pudl/extract/eia176.py b/src/pudl/extract/eia176.py index 4ad9e59ef2..484fedaf83 100644 --- a/src/pudl/extract/eia176.py +++ b/src/pudl/extract/eia176.py @@ -35,15 +35,6 @@ def process_raw( selection = self._metadata._get_partition_selection(partition) return df.assign(report_year=selection) - def process_renamed( - self, df: pd.DataFrame, page: str, **partition: PartitionSelection - ) -> pd.DataFrame: - """Strip and lowercase raw text fields (except ID).""" - text_fields = ["area", "atype", "company", "item"] - for tf in text_fields: - df[tf] = df[tf].str.strip().str.lower() - return df - raw_eia176__all_dfs = raw_df_factory(Extractor, name="eia176") diff --git a/src/pudl/transform/__init__.py b/src/pudl/transform/__init__.py index 68451cc9b9..a9faccbd6d 100644 --- a/src/pudl/transform/__init__.py +++ b/src/pudl/transform/__init__.py @@ -63,7 +63,6 @@ from . import ( classes, eia, - eia176, eia860, eia860m, eia861, diff --git a/src/pudl/transform/eia176.py b/src/pudl/transform/eia176.py deleted file mode 100644 index ff6fa2c6ef..0000000000 --- a/src/pudl/transform/eia176.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Module to perform data cleaning functions on EIA176 data tables.""" - -import pandas as pd -from dagster import AssetCheckResult, AssetIn, AssetOut, asset_check, multi_asset - -from pudl.logging_helpers import get_logger - -logger = get_logger(__name__) - - -@multi_asset( - outs={ - "core_eia176__yearly_company_data": AssetOut(), - "core_eia861__yearly_aggregate_data": AssetOut(), - }, -) -def _core_eia176__data( - raw_eia176__data: pd.DataFrame, -) -> tuple[pd.DataFrame, pd.DataFrame]: - """Take raw list and return two wide tables with primary keys and one column per variable. - - One table with data for each year and company, one with state- and US-level aggregates per year. - """ - raw_eia176__data = raw_eia176__data.astype({"report_year": int, "value": float}) - raw_eia176__data["variable_name"] = ( - raw_eia176__data["line"] + "_" + raw_eia176__data["atype"] - ) - - aggregate_primary_key = ["report_year", "area"] - company_primary_key = aggregate_primary_key + ["id"] - company_drop_columns = ["itemsort", "item", "atype", "line", "company"] - # We must drop 'id' here and cannot use as primary key because its arbitrary/duplicate in aggregate records - # 'id' is a reliable ID only in the context of granular company data - aggregate_drop_columns = company_drop_columns + ["id"] - - long_company = raw_eia176__data.loc[ - raw_eia176__data.company != "total of all companies" - ] - wide_company = get_wide_table( - long_table=long_company.drop(columns=company_drop_columns), - primary_key=company_primary_key, - ) - - long_aggregate = raw_eia176__data.loc[ - raw_eia176__data.company == "total of all companies" - ] - wide_aggregate = get_wide_table( - long_table=long_aggregate.drop(columns=aggregate_drop_columns), - primary_key=aggregate_primary_key, - ) - - return wide_company, wide_aggregate - - -def get_wide_table(long_table: pd.DataFrame, primary_key: list[str]) -> pd.DataFrame: - """Take a 'long' or entity-attribute-value table and return a wide table with one column per attribute/variable.""" - unstacked = long_table.set_index(primary_key + ["variable_name"]).unstack( - level="variable_name" - ) - unstacked.columns = unstacked.columns.droplevel(0) - unstacked.columns.name = None # gets rid of "variable_name" name of columns index - return unstacked.reset_index().fillna(0) - - -@asset_check( - asset="core_eia176__yearly_company_data", - additional_ins={"core_eia861__yearly_aggregate_data": AssetIn()}, - blocking=True, -) -def validate_totals( - core_eia176__yearly_company_data: pd.DataFrame, - core_eia861__yearly_aggregate_data: pd.DataFrame, -) -> AssetCheckResult: - """Compare reported and calculated totals for different geographical aggregates, report any differences.""" - # First make it so we can directly compare reported aggregates to groupings of granular data - comparable_aggregates = core_eia861__yearly_aggregate_data.sort_values( - ["report_year", "area"] - ).fillna(0) - - # Group company data into state-level data and compare to reported totals - state_data = ( - core_eia176__yearly_company_data.drop(columns="id") - .groupby(["report_year", "area"]) - .sum() - .reset_index() - ) - aggregate_state = comparable_aggregates[ - comparable_aggregates.area != "u.s. total" - ].reset_index(drop=True) - # Compare using the same columns - state_diff = aggregate_state[state_data.columns].compare(state_data) - - # Group calculated state-level data into US-level data and compare to reported totals - us_data = ( - state_data.drop(columns="area") - .groupby("report_year") - .sum() - .sort_values("report_year") - .reset_index() - ) - aggregate_us = ( - comparable_aggregates[comparable_aggregates.area == "u.s. total"] - .drop(columns="area") - .sort_values("report_year") - .reset_index(drop=True) - ) - # Compare using the same columns - us_diff = aggregate_us[us_data.columns].compare(us_data) - - return AssetCheckResult(passed=bool(us_diff.empty and state_diff.empty)) - - -# TODO: Reasonable boundaries -- in a script/notebook in the 'validate' directory? How are those executed? diff --git a/test/unit/transform/eia176_test.py b/test/unit/transform/eia176_test.py deleted file mode 100644 index a0f5ced30c..0000000000 --- a/test/unit/transform/eia176_test.py +++ /dev/null @@ -1,207 +0,0 @@ -import pandas as pd -from pytest import fixture - -from pudl.transform.eia176 import _core_eia176__data, get_wide_table, validate_totals - -COLUMN_NAMES = [ - "area", - "atype", - "company", - "id", - "line", - "report_year", - "value", - "itemsort", - "item", -] - -ID_1 = "17673850NM" -VOLUME_1 = 30980426.0 -COMPANY_1 = [ - "new mexico", - "vl", - "new mexico gas company", - ID_1, - "1010", - "2022", - VOLUME_1, - "[10.1]", - "residential sales volume", -] - -ID_2 = "17635017NM" -VOLUME_2 = 532842.0 -COMPANY_2 = [ - "new mexico", - "vl", - "west texas gas inc", - ID_2, - "1010", - "2022", - VOLUME_2, - "[10.1]", - "residential sales volume", -] - -NM_VOLUME = VOLUME_1 + VOLUME_2 -NM_AGGREGATE = [ - "new mexico", - "vl", - "total of all companies", - # Aggregates appear to reuse an arbitrary company ID - ID_1, - "1010", - "2022", - NM_VOLUME, - "[10.1]", - "residential sales volume", -] - -ID_3 = "17635017TX" -VOLUME_3 = 1.0 -COMPANY_3 = [ - "texas", - "vl", - "west texas gas inc", - ID_3, - "1010", - "2022", - VOLUME_3, - "[10.1]", - "residential sales volume", -] - -TX_VOLUME = VOLUME_3 -TX_AGGREGATE = [ - "texas", - "vl", - "total of all companies", - # Aggregates appear to reuse an arbitrary company ID - ID_3, - "1010", - "2022", - VOLUME_3, - "[10.1]", - "residential sales volume", -] - -US_VOLUME = NM_VOLUME + TX_VOLUME -US_AGGREGATE = [ - "u.s. total", - "vl", - "total of all companies", - # Aggregates appear to reuse an arbitrary company ID - ID_1, - "1010", - "2022", - US_VOLUME, - "[10.1]", - "residential sales volume", -] - -ID_4 = "4" -VOLUME_4 = 4.0 -COMPANY_4 = [ - "alaska", - "vl", - "alaska gas inc", - ID_4, - "1020", - "2022", - VOLUME_4, - "[10.2]", - "some other volume", -] - -DROP_COLS = ["itemsort", "item", "atype", "line", "company"] - - -@fixture -def df(): - df = pd.DataFrame(columns=COLUMN_NAMES) - df.loc[0] = COMPANY_1 - df.loc[1] = COMPANY_2 - df.loc[2] = NM_AGGREGATE - df.loc[3] = COMPANY_3 - df.loc[4] = TX_AGGREGATE - df.loc[5] = US_AGGREGATE - df.loc[6] = COMPANY_4 - df = df.set_index(["area", "company"]) - return df - - -def test_core_eia176__data(df): - eav_model = df.loc[ - [ - ("new mexico", "new mexico gas company"), - ("new mexico", "total of all companies"), - ] - ].reset_index() - - wide_company, wide_aggregate = _core_eia176__data(eav_model) - assert wide_company.shape == (1, 4) - - company_row = wide_company.loc[0] - assert list(company_row.index) == ["report_year", "area", "id", "1010_vl"] - assert list(company_row.values) == [2022, "new mexico", ID_1, VOLUME_1] - - assert wide_aggregate.shape == (1, 3) - aggregate_row = wide_aggregate.loc[0] - assert list(aggregate_row.index) == ["report_year", "area", "1010_vl"] - assert list(aggregate_row.values) == [2022, "new mexico", NM_VOLUME] - - -def test_get_wide_table(df): - long_table = df.loc[ - [ - ("new mexico", "new mexico gas company"), - ("new mexico", "west texas gas inc"), - # Row measuring a different variable to test filling NAs - ("alaska", "alaska gas inc"), - ] - ].reset_index() - - long_table["variable_name"] = long_table["line"] + "_" + long_table["atype"] - long_table = long_table.drop(columns=DROP_COLS) - - primary_key = ["report_year", "area", "id"] - wide_table = get_wide_table(long_table, primary_key) - - assert wide_table.shape == (3, 5) - assert list(wide_table.loc[0].index) == [ - "report_year", - "area", - "id", - "1010_vl", - "1020_vl", - ] - assert list(wide_table.loc[0].values) == ["2022", "alaska", ID_4, 0, VOLUME_4] - assert list(wide_table.loc[1].values) == ["2022", "new mexico", ID_2, VOLUME_2, 0] - assert list(wide_table.loc[2].values) == ["2022", "new mexico", ID_1, VOLUME_1, 0] - - -def test_validate__totals(df): - # Our test data will have only measurements for this 1010_vl variable - company_data = df.loc[ - [ - ("new mexico", "new mexico gas company"), - ("new mexico", "west texas gas inc"), - ("texas", "west texas gas inc"), - ] - ].reset_index() - # Add the value for the 1010_vl variable - company_data["1010_vl"] = [str(v) for v in [VOLUME_1, VOLUME_2, VOLUME_3]] - company_data = company_data.drop(columns=DROP_COLS) - - aggregate_data = df.loc[ - [ - ("new mexico", "total of all companies"), - ("texas", "total of all companies"), - ("u.s. total", "total of all companies"), - ] - ].reset_index() - # Add the value for the 1010_vl variable - aggregate_data["1010_vl"] = [str(v) for v in [NM_VOLUME, TX_VOLUME, US_VOLUME]] - aggregate_data = aggregate_data.drop(columns=DROP_COLS + ["id"]) - - validate_totals(company_data, aggregate_data)