diff --git a/.github/workflows/check-codegen.yml b/.github/workflows/check-codegen.yml new file mode 100644 index 0000000000..25feaad68f --- /dev/null +++ b/.github/workflows/check-codegen.yml @@ -0,0 +1,46 @@ +name: Check Python codegen + +on: + push: + branches: + - main + pull_request: + types: [opened, reopened, synchronize] + +jobs: + check-python-codegen: + name: Check Python codegen + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.x" + + - name: Set up uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 + + - name: Install dependencies + run: | + uv venv + source .venv/bin/activate + uv lock --check + uv sync --extra dev_codegen + - name: Run codegen + run: | + source .venv/bin/activate + python commands.py codegen + - name: Check for changes + run: | + # Fail if codegen produced any changes to the working directory. + # This means the committed generated files are out of date and codegen + # needs to be re-run locally and the results committed. + if [ -n "$(git status --porcelain)" ]; then + echo "::error::Generated files are out of date. Please run 'python commands.py codegen' locally and commit the result." + echo "The following files differ after running codegen:" + git status --porcelain + echo "" + exit 1 + fi + echo "Generated files are up to date." \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 204927b2df..42de0a6adf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,8 +53,13 @@ dev_build = [ "build", "jupyterlab" ] +dev_codegen = [ # Dependencies for running Python codegen + "plotly[dev_core]", + "inflect" +] dev_optional = [ "plotly[dev_build]", + "plotly[dev_codegen]", "plotly[express]", "plotly[kaleido]", "anywidget", @@ -62,7 +67,6 @@ dev_optional = [ # fiona>1.9.6 is not compatible with geopandas<1; geopandas>=1 is not compatible with python 3.8 "fiona<=1.9.6;python_version<='3.8'", "geopandas", - "inflect", "orjson", "pandas", "pdfrw", diff --git a/uv.lock b/uv.lock index c6f2fc8ac0..ab756fa2d4 100644 --- a/uv.lock +++ b/uv.lock @@ -63,7 +63,7 @@ conflicts = [[ ]] [options] -exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer = "2026-07-25T16:47:51.95233Z" exclude-newer-span = "PT72H" [options.exclude-newer-package] @@ -6724,6 +6724,17 @@ dev-build = [ { name = "requests", version = "2.33.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "ruff" }, ] +dev-codegen = [ + { name = "inflect", version = "7.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "inflect", version = "7.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pytest", version = "9.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.33.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "ruff" }, +] dev-core = [ { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, @@ -6823,7 +6834,7 @@ requires-dist = [ { name = "colorcet", marker = "extra == 'dev-optional'" }, { name = "fiona", marker = "python_full_version < '3.9' and extra == 'dev-optional'", specifier = "<=1.9.6" }, { name = "geopandas", marker = "extra == 'dev-optional'" }, - { name = "inflect", marker = "extra == 'dev-optional'" }, + { name = "inflect", marker = "extra == 'dev-codegen'" }, { name = "jupyterlab", marker = "extra == 'dev-build'" }, { name = "kaleido", marker = "extra == 'kaleido'", specifier = ">=1.3.0" }, { name = "narwhals", specifier = ">=1.15.1" }, @@ -6838,7 +6849,9 @@ requires-dist = [ { name = "pdfrw", marker = "extra == 'dev-optional'" }, { name = "pillow", marker = "extra == 'dev-optional'" }, { name = "plotly", extras = ["dev-build"], marker = "extra == 'dev-optional'" }, + { name = "plotly", extras = ["dev-codegen"], marker = "extra == 'dev-optional'" }, { name = "plotly", extras = ["dev-core"], marker = "extra == 'dev-build'" }, + { name = "plotly", extras = ["dev-core"], marker = "extra == 'dev-codegen'" }, { name = "plotly", extras = ["dev-optional"], marker = "extra == 'dev'" }, { name = "plotly", extras = ["express"], marker = "extra == 'dev-optional'" }, { name = "plotly", extras = ["kaleido"], marker = "extra == 'dev-optional'" }, @@ -6855,7 +6868,7 @@ requires-dist = [ { name = "vaex", marker = "python_full_version < '3.10' and extra == 'dev-optional'" }, { name = "xarray", marker = "extra == 'dev-optional'" }, ] -provides-extras = ["express", "kaleido", "dev-core", "dev-build", "dev-optional", "dev", "dev-pandas1", "dev-pandas2", "dev-pandas3"] +provides-extras = ["express", "kaleido", "dev-core", "dev-build", "dev-codegen", "dev-optional", "dev", "dev-pandas1", "dev-pandas2", "dev-pandas3"] [[package]] name = "pluggy"