jupyterlab-contrib / jupyterlab_code_formatter

A JupyterLab plugin to facilitate invocation of code formatters.
https://jupyterlab-code-formatter.readthedocs.io/
MIT License
851 stars 55 forks source link

Cell content removed on syntax errors with `ruffformat` #356

Open redeboer opened 2 months ago

redeboer commented 2 months ago

First of all, thanks a ton for fixing support for Ruff since v3.0.0! 🎉

Bug description

It seems that jupyterlab-code-formatter with ruff deletes all content in cells that contain syntax errors.

record

Reproduce

Running Jupyter Lab in a venv in Python 3.12 with these dependencies

```pip-requirements anyio==4.4.0 argon2-cffi==23.1.0 argon2-cffi-bindings==21.2.0 arrow==1.3.0 asttokens==2.4.1 async-lru==2.0.4 attrs==24.2.0 babel==2.16.0 beautifulsoup4==4.12.3 bleach==6.1.0 certifi==2024.7.4 cffi==1.17.0 charset-normalizer==3.3.2 comm==0.2.2 debugpy==1.8.5 decorator==5.1.1 defusedxml==0.7.1 executing==2.0.1 fastjsonschema==2.20.0 fqdn==1.5.1 h11==0.14.0 httpcore==1.0.5 httpx==0.27.0 idna==3.7 ipykernel==6.29.5 ipython==8.26.0 isoduration==20.11.0 jedi==0.19.1 jinja2==3.1.4 json5==0.9.25 jsonpointer==3.0.0 jsonschema==4.23.0 jsonschema-specifications==2023.12.1 jupyter-client==8.6.2 jupyter-core==5.7.2 jupyter-events==0.10.0 jupyter-lsp==2.2.5 jupyter-server==2.14.2 jupyter-server-terminals==0.5.3 jupyterlab==4.2.4 jupyterlab-code-formatter==3.0.2 jupyterlab-pygments==0.3.0 jupyterlab-server==2.27.3 markupsafe==2.1.5 matplotlib-inline==0.1.7 mistune==3.0.2 nbclient==0.10.0 nbconvert==7.16.4 nbformat==5.10.4 nest-asyncio==1.6.0 notebook-shim==0.2.4 overrides==7.7.0 packaging==24.1 pandocfilters==1.5.1 parso==0.8.4 pexpect==4.9.0 platformdirs==4.2.2 prometheus-client==0.20.0 prompt-toolkit==3.0.47 psutil==6.0.0 ptyprocess==0.7.0 pure-eval==0.2.3 pycparser==2.22 pygments==2.18.0 python-dateutil==2.9.0.post0 python-json-logger==2.0.7 pyyaml==6.0.2 pyzmq==26.1.0 referencing==0.35.1 requests==2.32.3 rfc3339-validator==0.1.4 rfc3986-validator==0.1.1 rpds-py==0.20.0 ruff==0.5.7 send2trash==1.8.3 setuptools==72.2.0 six==1.16.0 sniffio==1.3.1 soupsieve==2.6 stack-data==0.6.3 terminado==0.18.1 tinycss2==1.3.0 tornado==6.4.1 traitlets==5.14.3 types-python-dateutil==2.9.0.20240316 uri-template==1.3.0 urllib3==2.2.2 wcwidth==0.2.13 webcolors==24.8.0 webencodings==0.5.1 websocket-client==1.8.0 ```

and using these minimal settings

{
  "preferences": {
    "default_formatter": {
      "python": ["ruffformat"]
    }
  }
}

Context

devmcp commented 2 months ago

Not sure if it's the same issue, or related, but jupyterlab-code-formatter with ruff also deletes all content in cells that contain non-standard characters. E.g.

print("°")

gets deleted

redeboer commented 2 months ago

Works okay for me. (Same dependencies as in issue description.) record

harrylojames commented 2 months ago

Just to chime in also seeing this issue

Not sure if it's the same issue, or related, but jupyterlab-code-formatter with ruff also deletes all content in cells that contain non-standard characters. E.g.

print("°")

gets deleted

krassowski commented 2 months ago

It seems like the code checks whether the command line formatter wrote to stderr to determine if it cannot handle the input:

https://github.com/jupyterlab-contrib/jupyterlab_code_formatter/blob/9f5bec93ffcdb8f74c66b05a3557a6931d8daa39/jupyterlab_code_formatter/formatters.py#L452-L458

But in case of ruff format this probably does not happen and ruff does not return output to neither standard output nor error. I think it should also check the exit code (https://docs.astral.sh/ruff/formatter/#exit-codes). For backward compatibility with other instances/sub-classes of CommandLineFormatter maybe checking the exit code should be optional (e.g. toggled by class property) and for now default to False but changed to True in ruff format.

dlimpid commented 2 months ago

Just to chime in also seeing this issue

Not sure if it's the same issue, or related, but jupyterlab-code-formatter with ruff also deletes all content in cells that contain non-standard characters. E.g.

print("°")

gets deleted

Same to me. When I used @jbwhit's solution there was the same error, that cells containing non-ascii characters were not formatted. For me adding encoding="utf-8" in the subprocess.run() call would fix it.

yt87 commented 2 months ago

An exception is required in order to pop up the Jupyterlab Code Formatter Error dialog. Black raises InvalidInput when black.format_str fails. My quick and dirty solution is:

  1. Remove quiet option in RuffFormatFormatter.
  2. Replace lines 454and 455 by:
    raise ValueError(process.stdin)
    return code

    I think a proper solution would be to subclass CommandLineFormatter overriding format_code.