mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-29 05:15:12 +00:00

## Summary This PR adds a playground for Red Knot [Screencast from 2024-08-14 10-33-54.webm](https://github.com/user-attachments/assets/ae81d85f-74a3-4ba6-bb61-4a871b622f05) Sharing does work 😆 I just forgot to start wrangler. It supports: * Multiple files * Showing the AST * Showing the tokens * Sharing * Persistence to local storage Future extensions: * Configuration support: The `pyproject.toml` would *just* be another file. * Showing type information on hover ## Blockers ~~Salsa uses `catch_unwind` to break cycles, which Red Knot uses extensively when inferring types in the standard library. However, WASM (at least `wasm32-unknown-unknown`) doesn't support `catch_unwind` today, so the playground always crashes when the type inference encounters a cycle.~~ ~~I created a discussion in the [salsa zulip](https://salsa.zulipchat.com/#narrow/stream/333573-salsa-3.2E0/topic/WASM.20support) to see if it would be possible to **not** use catch unwind to break cycles.~~ ~~[Rust tracking issue for WASM catch unwind support](https://github.com/rust-lang/rust/issues/118168)~~ ~~I tried to build the WASM with the nightly compiler option but ran into problems because wasm-bindgen doesn't support WASM-exceptions. We could try to write the binding code by hand.~~ ~~Another alternative is to use `wasm32-unknown-emscripten` but it's rather painful to build~~
40 lines
1.7 KiB
Markdown
40 lines
1.7 KiB
Markdown
# playground
|
|
|
|
In-browser playground for Ruff. Available [https://play.ruff.rs/](https://play.ruff.rs/).
|
|
|
|
## Getting started
|
|
|
|
Install the NPM dependencies with `npm install`, and run, and run the development server with
|
|
`npm start --workspace ruff-playground` or `npm start --workspace knot-playground`.
|
|
You may need to restart the server after making changes to Ruff or Red Knot to re-build the WASM
|
|
module.
|
|
|
|
To run the datastore, which is based
|
|
on [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/),
|
|
install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/),
|
|
then run `npx wrangler dev --local` from the `./playground/api` directory. Note that the datastore
|
|
is
|
|
only required to generate shareable URLs for code snippets. The development datastore does not
|
|
require Cloudflare authentication or login, but in turn only persists data locally.
|
|
|
|
## Architecture
|
|
|
|
The playground is implemented as a single-page React application powered by
|
|
[Vite](https://vitejs.dev/), with the editor experience itself powered by
|
|
[Monaco](https://github.com/microsoft/monaco-editor).
|
|
|
|
The playground stores state in `localStorage`, but supports persisting code snippets to
|
|
a persistent datastore based
|
|
on [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/)
|
|
and exposed via
|
|
a [Cloudflare Worker](https://developers.cloudflare.com/workers/learning/how-workers-works/).
|
|
|
|
The playground design is originally based on [Tailwind Play](https://play.tailwindcss.com/), with
|
|
additional inspiration from the [Biome Playground](https://biomejs.dev/playground/).
|
|
|
|
## Known issues
|
|
|
|
### Stack overflows
|
|
|
|
If you see stack overflows in the playground, build the WASM module in release mode:
|
|
`npm run --workspace knot-playground build:wasm`.
|