Merge pull request #53 from kbwo/feat/update-adapter-spec

adapter: Update specification
This commit is contained in:
Kodai Kabasawa 2024-12-07 23:28:10 +09:00 committed by GitHub
commit 91db91a229
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 168 additions and 123 deletions

10
Cargo.lock generated
View file

@ -723,9 +723,7 @@ dependencies = [
[[package]]
name = "testing-language-server"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fae6ce9cb290e80814d1796e4207a0a0dc21c216807136d48b68c0f27be29b9"
version = "0.1.8"
dependencies = [
"anyhow",
"chrono",
@ -750,6 +748,8 @@ dependencies = [
[[package]]
name = "testing-language-server"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f62894ce27874e8a8bde477d8036fe80acae38a20852f9019d3c881899cc874a"
dependencies = [
"anyhow",
"chrono",
@ -773,7 +773,7 @@ dependencies = [
[[package]]
name = "testing-ls-adapter"
version = "0.0.11"
version = "0.1.0"
dependencies = [
"anyhow",
"clap",
@ -783,7 +783,7 @@ dependencies = [
"serde",
"serde_json",
"tempfile",
"testing-language-server 0.1.7",
"testing-language-server 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"tracing",
"tracing-appender",
"tracing-subscriber",

View file

@ -1,6 +1,6 @@
[package]
name = "testing-ls-adapter"
version = "0.0.11"
version = "0.1.0"
edition = "2021"
description = "testing-language-server adapter"
license = "MIT"
@ -8,7 +8,7 @@ license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
testing-language-server = "0.1.7"
testing-language-server = "0.1.8"
lsp-types = { workspace = true }
serde_json = { workspace = true }
serde = { workspace = true }

View file

@ -7,7 +7,7 @@ use testing_language_server::spec::DetectWorkspaceResult;
use testing_language_server::spec::RunFileTestResult;
use testing_language_server::spec::DiscoverResult;
use testing_language_server::spec::DiscoverResultItem;
use testing_language_server::spec::FoundFileTests;
use testing_language_server::spec::TestItem;
use crate::model::Runner;
@ -18,7 +18,9 @@ use super::util::parse_cargo_diagnostics;
use super::util::write_result_log;
fn detect_workspaces(file_paths: &[String]) -> DetectWorkspaceResult {
detect_workspaces_from_file_list(file_paths, &["Cargo.toml".to_string()])
DetectWorkspaceResult {
data: detect_workspaces_from_file_list(file_paths, &["Cargo.toml".to_string()]),
}
}
#[derive(Eq, PartialEq, Hash, Debug)]
@ -28,11 +30,11 @@ impl Runner for CargoNextestRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
let tests = discover_rust_tests(&file_path)?;
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests,
path: file_path,
});
@ -106,7 +108,7 @@ impl Runner for CargoNextestRunner {
#[cfg(test)]
mod tests {
use lsp_types::{Diagnostic, DiagnosticSeverity, Position, Range};
use testing_language_server::spec::{RunFileTestResultItem, TestItem};
use testing_language_server::spec::{FileDiagnostics, TestItem};
use crate::runner::util::MAX_CHAR_LENGTH;
@ -171,24 +173,27 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
assert_eq!(
diagnostics,
vec![RunFileTestResultItem {
path: file_paths.first().unwrap().to_owned(),
diagnostics: vec![Diagnostic {
range: Range {
start: Position {
line: 85,
character: 63
RunFileTestResult {
data: vec![FileDiagnostics {
path: file_paths.first().unwrap().to_owned(),
diagnostics: vec![Diagnostic {
range: Range {
start: Position {
line: 85,
character: 63
},
end: Position {
line: 85,
character: MAX_CHAR_LENGTH
}
},
end: Position {
line: 85,
character: MAX_CHAR_LENGTH
}
},
message: message.to_string(),
severity: Some(DiagnosticSeverity::ERROR),
..Diagnostic::default()
}]
}]
message: message.to_string(),
severity: Some(DiagnosticSeverity::ERROR),
..Diagnostic::default()
}]
}],
messages: vec!()
}
)
}
@ -211,8 +216,10 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
.collect();
let workspaces = detect_workspaces(&file_paths);
assert_eq!(workspaces.len(), 2);
assert!(workspaces.contains_key(absolute_path_of_demo.to_str().unwrap()));
assert!(workspaces.contains_key(current_dir.to_str().unwrap()));
assert_eq!(workspaces.data.len(), 2);
assert!(workspaces
.data
.contains_key(absolute_path_of_demo.to_str().unwrap()));
assert!(workspaces.data.contains_key(current_dir.to_str().unwrap()));
}
}

View file

@ -7,7 +7,7 @@ use testing_language_server::spec::DetectWorkspaceResult;
use testing_language_server::spec::RunFileTestResult;
use testing_language_server::spec::DiscoverResult;
use testing_language_server::spec::DiscoverResultItem;
use testing_language_server::spec::FoundFileTests;
use testing_language_server::spec::TestItem;
use crate::model::Runner;
@ -18,7 +18,9 @@ use super::util::parse_cargo_diagnostics;
use super::util::write_result_log;
fn detect_workspaces(file_paths: &[String]) -> DetectWorkspaceResult {
detect_workspaces_from_file_list(file_paths, &["Cargo.toml".to_string()])
DetectWorkspaceResult {
data: detect_workspaces_from_file_list(file_paths, &["Cargo.toml".to_string()]),
}
}
#[derive(Eq, PartialEq, Hash, Debug)]
@ -28,11 +30,11 @@ impl Runner for CargoTestRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
let tests = discover_rust_tests(&file_path)?;
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests,
path: file_path,
});
@ -101,7 +103,7 @@ impl Runner for CargoTestRunner {
#[cfg(test)]
mod tests {
use lsp_types::{Diagnostic, DiagnosticSeverity, Position, Range};
use testing_language_server::spec::RunFileTestResultItem;
use testing_language_server::spec::FileDiagnostics;
use crate::runner::util::MAX_CHAR_LENGTH;
@ -166,24 +168,27 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
assert_eq!(
diagnostics,
vec![RunFileTestResultItem {
path: file_paths.first().unwrap().to_owned(),
diagnostics: vec![Diagnostic {
range: Range {
start: Position {
line: 85,
character: 63
RunFileTestResult {
data: vec![FileDiagnostics {
path: file_paths.first().unwrap().to_owned(),
diagnostics: vec![Diagnostic {
range: Range {
start: Position {
line: 85,
character: 63
},
end: Position {
line: 85,
character: MAX_CHAR_LENGTH
}
},
end: Position {
line: 85,
character: MAX_CHAR_LENGTH
}
},
message: message.to_string(),
severity: Some(DiagnosticSeverity::ERROR),
..Diagnostic::default()
}]
}]
message: message.to_string(),
severity: Some(DiagnosticSeverity::ERROR),
..Diagnostic::default()
}]
}],
messages: vec![]
}
)
}
@ -206,8 +211,10 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
.collect();
let workspaces = detect_workspaces(&file_paths);
assert_eq!(workspaces.len(), 2);
assert!(workspaces.contains_key(absolute_path_of_demo.to_str().unwrap()));
assert!(workspaces.contains_key(current_dir.to_str().unwrap()));
assert_eq!(workspaces.data.len(), 2);
assert!(workspaces
.data
.contains_key(absolute_path_of_demo.to_str().unwrap()));
assert!(workspaces.data.contains_key(current_dir.to_str().unwrap()));
}
}

View file

@ -13,9 +13,9 @@ use testing_language_server::error::LSError;
use testing_language_server::spec::DetectWorkspaceResult;
use testing_language_server::spec::DiscoverResult;
use testing_language_server::spec::DiscoverResultItem;
use testing_language_server::spec::FileDiagnostics;
use testing_language_server::spec::FoundFileTests;
use testing_language_server::spec::RunFileTestResult;
use testing_language_server::spec::RunFileTestResultItem;
use testing_language_server::spec::TestItem;
use crate::model::Runner;
@ -89,14 +89,19 @@ fn parse_diagnostics(
message += line;
}
}
Ok(result_map
.into_iter()
.map(|(path, diagnostics)| RunFileTestResultItem { path, diagnostics })
.collect())
Ok(RunFileTestResult {
data: result_map
.into_iter()
.map(|(path, diagnostics)| FileDiagnostics { path, diagnostics })
.collect(),
messages: vec![],
})
}
fn detect_workspaces(file_paths: Vec<String>) -> DetectWorkspaceResult {
detect_workspaces_from_file_list(&file_paths, &["deno.json".to_string()])
DetectWorkspaceResult {
data: detect_workspaces_from_file_list(&file_paths, &["deno.json".to_string()]),
}
}
fn discover(file_path: &str) -> Result<Vec<TestItem>, LSError> {
@ -161,9 +166,9 @@ impl Runner for DenoRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests: discover(&file_path)?,
path: file_path,
})
@ -229,7 +234,7 @@ mod tests {
let target_file_path = "/home/demo/test/dneo/main_test.ts";
let diagnostics =
parse_diagnostics(&test_result, workspace, &[target_file_path.to_string()]).unwrap();
assert_eq!(diagnostics.len(), 1);
assert_eq!(diagnostics.data.len(), 1);
}
#[test]
@ -242,8 +247,8 @@ mod tests {
.map(|file_path| file_path.to_str().unwrap().to_string())
.collect();
let detect_result = detect_workspaces(file_paths);
assert_eq!(detect_result.len(), 1);
detect_result.iter().for_each(|(workspace, _)| {
assert_eq!(detect_result.data.len(), 1);
detect_result.data.iter().for_each(|(workspace, _)| {
assert_eq!(workspace, absolute_path_of_demo.to_str().unwrap());
});
}

View file

@ -13,9 +13,9 @@ use std::process::Output;
use std::str::FromStr;
use testing_language_server::error::LSError;
use testing_language_server::spec::DiscoverResult;
use testing_language_server::spec::DiscoverResultItem;
use testing_language_server::spec::FileDiagnostics;
use testing_language_server::spec::FoundFileTests;
use testing_language_server::spec::RunFileTestResult;
use testing_language_server::spec::RunFileTestResultItem;
use testing_language_server::spec::TestItem;
use super::util::detect_workspaces_from_file_list;
@ -130,10 +130,13 @@ fn parse_diagnostics(
}
}
Ok(result_map
.into_iter()
.map(|(path, diagnostics)| RunFileTestResultItem { path, diagnostics })
.collect())
Ok(RunFileTestResult {
data: result_map
.into_iter()
.map(|(path, diagnostics)| FileDiagnostics { path, diagnostics })
.collect(),
messages: vec![],
})
}
fn discover(file_path: &str) -> Result<Vec<TestItem>, LSError> {
@ -232,11 +235,11 @@ impl Runner for GoTestRunner {
args: testing_language_server::spec::DiscoverArgs,
) -> Result<(), testing_language_server::error::LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
let tests = discover(&file_path)?;
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests,
path: file_path,
});
@ -305,7 +308,7 @@ mod tests {
let target_file_path = "/home/demo/test/go/src/test/cases_test.go";
let result =
parse_diagnostics(&contents, workspace, &[target_file_path.to_string()]).unwrap();
let result = result.first().unwrap();
let result = result.data.first().unwrap();
assert_eq!(result.path, target_file_path);
let diagnostic = result.diagnostics.first().unwrap();
assert_eq!(diagnostic.range.start.line, 30);

View file

@ -8,9 +8,9 @@ use testing_language_server::error::LSError;
use testing_language_server::spec::DetectWorkspaceResult;
use testing_language_server::spec::DiscoverResult;
use testing_language_server::spec::DiscoverResultItem;
use testing_language_server::spec::FileDiagnostics;
use testing_language_server::spec::FoundFileTests;
use testing_language_server::spec::RunFileTestResult;
use testing_language_server::spec::RunFileTestResultItem;
use testing_language_server::spec::TestItem;
use crate::model::Runner;
@ -67,14 +67,19 @@ fn parse_diagnostics(
})
}
}
Ok(result_map
.into_iter()
.map(|(path, diagnostics)| RunFileTestResultItem { path, diagnostics })
.collect())
Ok(RunFileTestResult {
data: result_map
.into_iter()
.map(|(path, diagnostics)| FileDiagnostics { path, diagnostics })
.collect(),
messages: vec![],
})
}
fn detect_workspaces(file_paths: Vec<String>) -> DetectWorkspaceResult {
detect_workspaces_from_file_list(&file_paths, &["package.json".to_string()])
DetectWorkspaceResult {
data: detect_workspaces_from_file_list(&file_paths, &["package.json".to_string()]),
}
}
fn discover(file_path: &str) -> Result<Vec<TestItem>, LSError> {
@ -159,9 +164,9 @@ impl Runner for JestRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests: discover(&file_path)?,
path: file_path,
})
@ -229,7 +234,7 @@ mod tests {
],
)
.unwrap();
assert_eq!(diagnostics.len(), 2);
assert_eq!(diagnostics.data.len(), 2);
}
#[test]
@ -242,8 +247,8 @@ mod tests {
.map(|file_path| file_path.to_str().unwrap().to_string())
.collect();
let detect_result = detect_workspaces(file_paths);
assert_eq!(detect_result.len(), 1);
detect_result.iter().for_each(|(workspace, _)| {
assert_eq!(detect_result.data.len(), 1);
detect_result.data.iter().for_each(|(workspace, _)| {
assert_eq!(workspace, absolute_path_of_demo.to_str().unwrap());
});
}

View file

@ -4,8 +4,8 @@ use regex::Regex;
use testing_language_server::{
error::LSError,
spec::{
DetectWorkspaceResult, DiscoverResult, DiscoverResultItem, RunFileTestResult,
RunFileTestResultItem, TestItem,
DetectWorkspaceResult, DiscoverResult, FileDiagnostics, FoundFileTests, RunFileTestResult,
TestItem,
},
};
use xml::{reader::XmlEvent, ParserConfig};
@ -162,9 +162,9 @@ impl Runner for NodeTestRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests: discover(&file_path)?,
path: file_path,
})
@ -194,14 +194,18 @@ impl Runner for NodeTestRunner {
}
let stdout = String::from_utf8(stdout).unwrap();
let result_from_xml = get_result_from_xml(&stdout, &file_paths)?;
let diagnostics: RunFileTestResult = result_from_xml
let result_item: Vec<FileDiagnostics> = result_from_xml
.into_iter()
.map(|result_from_xml| {
let result_item: RunFileTestResultItem = result_from_xml.into();
let result_item: FileDiagnostics = result_from_xml.into();
result_item
})
.collect();
send_stdout(&diagnostics)?;
let result = RunFileTestResult {
data: result_item,
messages: vec![],
};
send_stdout(&result)?;
Ok(())
}
@ -211,8 +215,9 @@ impl Runner for NodeTestRunner {
args: testing_language_server::spec::DetectWorkspaceArgs,
) -> Result<(), LSError> {
let file_paths = args.file_paths;
let detect_result: DetectWorkspaceResult =
detect_workspaces_from_file_list(&file_paths, &["package.json".to_string()]);
let detect_result: DetectWorkspaceResult = DetectWorkspaceResult {
data: detect_workspaces_from_file_list(&file_paths, &["package.json".to_string()]),
};
send_stdout(&detect_result)?;
Ok(())
}

View file

@ -3,8 +3,8 @@ use std::io::BufReader;
use std::process::Output;
use testing_language_server::error::LSError;
use testing_language_server::spec::{
DetectWorkspaceResult, DiscoverResult, DiscoverResultItem, RunFileTestResult,
RunFileTestResultItem, TestItem,
DetectWorkspaceResult, DiscoverResult, FileDiagnostics, FoundFileTests, RunFileTestResult,
TestItem,
};
use xml::reader::{ParserConfig, XmlEvent};
@ -16,7 +16,9 @@ use super::util::{
};
fn detect_workspaces(file_paths: Vec<String>) -> DetectWorkspaceResult {
detect_workspaces_from_file_list(&file_paths, &["composer.json".to_string()])
DetectWorkspaceResult {
data: detect_workspaces_from_file_list(&file_paths, &["composer.json".to_string()]),
}
}
fn get_result_from_characters(characters: &str) -> Result<ResultFromXml, anyhow::Error> {
@ -125,9 +127,9 @@ impl Runner for PhpunitRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests: discover(&file_path)?,
path: file_path,
})
@ -177,14 +179,18 @@ impl Runner for PhpunitRunner {
return Err(LSError::Adapter(String::from_utf8(stderr).unwrap()));
}
let result_from_xml = get_result_from_xml(log_path.to_str().unwrap())?;
let diagnostics: RunFileTestResult = result_from_xml
let result_item: Vec<FileDiagnostics> = result_from_xml
.into_iter()
.map(|result_from_xml| {
let result_item: RunFileTestResultItem = result_from_xml.into();
let result_item: FileDiagnostics = result_from_xml.into();
result_item
})
.collect();
send_stdout(&diagnostics)?;
let result = RunFileTestResult {
data: result_item,
messages: vec![],
};
send_stdout(&result)?;
Ok(())
}

View file

@ -8,7 +8,7 @@ use std::sync::LazyLock;
use lsp_types::{Diagnostic, DiagnosticSeverity, Position, Range};
use regex::Regex;
use serde::Serialize;
use testing_language_server::spec::{RunFileTestResultItem, TestItem};
use testing_language_server::spec::{FileDiagnostics, TestItem};
use testing_language_server::{error::LSError, spec::RunFileTestResult};
use tree_sitter::{Language, Point, Query, QueryCursor};
@ -30,9 +30,10 @@ pub struct ResultFromXml {
pub col: u32,
}
impl Into<RunFileTestResultItem> for ResultFromXml {
fn into(self) -> RunFileTestResultItem {
RunFileTestResultItem {
#[allow(clippy::from_over_into)]
impl Into<FileDiagnostics> for ResultFromXml {
fn into(self) -> FileDiagnostics {
FileDiagnostics {
path: self.path,
diagnostics: vec![Diagnostic {
message: self.message,
@ -371,10 +372,15 @@ pub fn parse_cargo_diagnostics(
}
}
result_map
let data = result_map
.into_iter()
.map(|(path, diagnostics)| RunFileTestResultItem { path, diagnostics })
.collect()
.map(|(path, diagnostics)| FileDiagnostics { path, diagnostics })
.collect();
RunFileTestResult {
data,
messages: vec![],
}
}
/// remove this function because duplicate implementation

View file

@ -7,9 +7,7 @@ use lsp_types::{Diagnostic, DiagnosticSeverity};
use serde_json::Value;
use testing_language_server::{
error::LSError,
spec::{
DiscoverResult, DiscoverResultItem, RunFileTestResult, RunFileTestResultItem, TestItem,
},
spec::{DiscoverResult, FileDiagnostics, FoundFileTests, RunFileTestResult, TestItem},
};
use crate::model::Runner;
@ -124,21 +122,24 @@ fn parse_diagnostics(
})
}
}
Ok(result_map
.into_iter()
.map(|(path, diagnostics)| RunFileTestResultItem { path, diagnostics })
.collect())
Ok(RunFileTestResult {
data: result_map
.into_iter()
.map(|(path, diagnostics)| FileDiagnostics { path, diagnostics })
.collect(),
messages: vec![],
})
}
impl Runner for VitestRunner {
#[tracing::instrument(skip(self))]
fn discover(&self, args: testing_language_server::spec::DiscoverArgs) -> Result<(), LSError> {
let file_paths = args.file_paths;
let mut discover_results: DiscoverResult = vec![];
let mut discover_results: DiscoverResult = DiscoverResult { data: vec![] };
for file_path in file_paths {
let tests = discover(&file_path)?;
discover_results.push(DiscoverResultItem {
discover_results.data.push(FoundFileTests {
tests,
path: file_path,
});