mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-03 15:15:33 +00:00

## Summary Closes https://github.com/astral-sh/ruff/issues/10858. `ruff server` now supports `*.ipynb` (aka Jupyter Notebook) files. Extensive internal changes have been made to facilitate this, which I've done some work to contextualize with documentation and an pre-review that highlights notable sections of the code. `*.ipynb` cells should behave similarly to `*.py` documents, with one major exception. The format command `ruff.applyFormat` will only apply to the currently selected notebook cell - if you want to format an entire notebook document, use `Format Notebook` from the VS Code context menu. ## Test Plan The VS Code extension does not yet have Jupyter Notebook support enabled, so you'll first need to enable it manually. To do this, checkout the `pre-release` branch and modify `src/common/server.ts` as follows: Before:  After:  I recommend testing this PR with large, complicated notebook files. I used notebook files from [this popular repository](https://github.com/jakevdp/PythonDataScienceHandbook/tree/master/notebooks) in my preliminary testing. The main thing to test is ensuring that notebook cells behave the same as Python documents, besides the aforementioned issue with `ruff.applyFormat`. You should also test adding and deleting cells (in particular, deleting all the code cells and ensure that doesn't break anything), changing the kind of a cell (i.e. from markup -> code or vice versa), and creating a new notebook file from scratch. Finally, you should also test that source actions work as expected (and across the entire notebook). Note: `ruff.applyAutofix` and `ruff.applyOrganizeImports` are currently broken for notebook files, and I suspect it has something to do with https://github.com/astral-sh/ruff/issues/11248. Once this is fixed, I will update the test plan accordingly. --------- Co-authored-by: nolan <nolan.king90@gmail.com>
55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
use crate::{
|
|
lint::Diagnostics,
|
|
server::client::Notifier,
|
|
session::{DocumentQuery, DocumentSnapshot},
|
|
};
|
|
|
|
use super::LSPResult;
|
|
|
|
pub(super) fn generate_diagnostics(snapshot: &DocumentSnapshot) -> Diagnostics {
|
|
if snapshot.client_settings().lint() {
|
|
crate::lint::check(
|
|
snapshot.query(),
|
|
snapshot.query().settings().linter(),
|
|
snapshot.encoding(),
|
|
)
|
|
} else {
|
|
Diagnostics::default()
|
|
}
|
|
}
|
|
|
|
pub(super) fn publish_diagnostics_for_document(
|
|
snapshot: &DocumentSnapshot,
|
|
notifier: &Notifier,
|
|
) -> crate::server::Result<()> {
|
|
for (uri, diagnostics) in generate_diagnostics(snapshot) {
|
|
notifier
|
|
.notify::<lsp_types::notification::PublishDiagnostics>(
|
|
lsp_types::PublishDiagnosticsParams {
|
|
uri,
|
|
diagnostics,
|
|
version: Some(snapshot.query().version()),
|
|
},
|
|
)
|
|
.with_failure_code(lsp_server::ErrorCode::InternalError)?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
pub(super) fn clear_diagnostics_for_document(
|
|
query: &DocumentQuery,
|
|
notifier: &Notifier,
|
|
) -> crate::server::Result<()> {
|
|
notifier
|
|
.notify::<lsp_types::notification::PublishDiagnostics>(
|
|
lsp_types::PublishDiagnosticsParams {
|
|
uri: query.make_key().into_url(),
|
|
diagnostics: vec![],
|
|
version: Some(query.version()),
|
|
},
|
|
)
|
|
.with_failure_code(lsp_server::ErrorCode::InternalError)?;
|
|
|
|
Ok(())
|
|
}
|