test(json-yaml): verify real YAML provider through pmacs
Drive Red Hat yaml-language-server 1.24.0 through the default YAML auto-attach path. Disable SchemaStore and the Kubernetes CRD catalog for network-free determinism, require language-specific initialization and a real syntax diagnostic, and prove the server remains alive afterward. Update the framing and runtime commentary with the completed live-provider evidence. The test passes against the pinned provider and fails against the pre-JSON/YAML runtime under scripts/bite. Co-Authored-By: OpenAI Codex <noreply@openai.com>
This commit is contained in:
parent
19ad5cc8ac
commit
5c202c54c1
|
|
@ -240,8 +240,10 @@ pmacs.lsp.config.json = pmacs.lsp.config.json or {
|
||||||
-- live-observed with Red Hat `yaml-language-server@1.24.0`: its initial
|
-- live-observed with Red Hat `yaml-language-server@1.24.0`: its initial
|
||||||
-- pull requests exactly those five sections, and opening a YAML document
|
-- pull requests exactly those five sections, and opening a YAML document
|
||||||
-- requests a second scoped `[yaml]` section. The standalone smoke reached
|
-- requests a second scoped `[yaml]` section. The standalone smoke reached
|
||||||
-- a real syntax diagnostic and clean shutdown; the PATH-gated
|
-- a real syntax diagnostic and clean shutdown. The PATH-gated pmacs
|
||||||
-- pmacs-through-server acceptance remains a transfer task.
|
-- acceptance also proves auto-attach, initialization, config pulls, a
|
||||||
|
-- syntax diagnostic, and continued server liveness with both catalogs
|
||||||
|
-- disabled for network-free determinism.
|
||||||
pmacs.lsp.config.yaml = pmacs.lsp.config.yaml or {
|
pmacs.lsp.config.yaml = pmacs.lsp.config.yaml or {
|
||||||
command = "yaml-language-server",
|
command = "yaml-language-server",
|
||||||
args = { "--stdio" },
|
args = { "--stdio" },
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
# JSON + YAML grammars — framing (side quest, highlight family)
|
# JSON + YAML grammars — framing (side quest, highlight family)
|
||||||
|
|
||||||
**Revision 2 — 2026-07-20. Status: PR #123 open; review-fix
|
**Revision 3 — 2026-07-20. Status: PR #123 open; review-fix
|
||||||
checkpoint preserved on branch `json-yaml-handoff-2026-07-20`.**
|
checkpoint preserved on branch `json-yaml-handoff-2026-07-20`.**
|
||||||
The public PR branch still pointed to the original implementation
|
The public PR branch still pointed to the original implementation
|
||||||
`4be2a65` when this checkpoint was created. JSON provider resolution
|
`4be2a65` when this checkpoint was created. JSON provider resolution
|
||||||
and its real pmacs smoke are complete; the YAML 1.24.0 standalone
|
and its real pmacs smoke are complete; the YAML 1.24.0 standalone
|
||||||
protocol smoke is complete; the real YAML-through-pmacs acceptance,
|
protocol smoke and real YAML-through-pmacs acceptance are complete;
|
||||||
rebase onto current main, and full gates remain.
|
rebase onto current main and full gates remain.
|
||||||
|
|
||||||
**Intent.** Add `tree-sitter-json` and `tree-sitter-yaml` grammars (plus
|
**Intent.** Add `tree-sitter-json` and `tree-sitter-yaml` grammars (plus
|
||||||
their language servers) to the bundle. Two config formats that pmacs
|
their language servers) to the bundle. Two config formats that pmacs
|
||||||
|
|
@ -157,8 +157,8 @@ fences resolve through the #122 engine. Acceptance proves both end to end
|
||||||
3. The two configuration models are now observed: JSON consumes the
|
3. The two configuration models are now observed: JSON consumes the
|
||||||
pushed full settings object; YAML 1.24.0 pulls the five documented
|
pushed full settings object; YAML 1.24.0 pulls the five documented
|
||||||
sections plus a document-scoped `[yaml]` request. The remaining bet
|
sections plus a document-scoped `[yaml]` request. The remaining bet
|
||||||
is that pmacs answers the real YAML server correctly end to end,
|
was that pmacs answers the real YAML server correctly end to end;
|
||||||
which the pending PATH-gated acceptance must prove.
|
the PATH-gated acceptance now proves that against version 1.24.0.
|
||||||
|
|
||||||
## Deferred (named)
|
## Deferred (named)
|
||||||
|
|
||||||
|
|
@ -203,18 +203,17 @@ fences resolve through the #122 engine. Acceptance proves both end to end
|
||||||
pmacs, receive the pushed default config, open invalid JSON, and
|
pmacs, receive the pushed default config, open invalid JSON, and
|
||||||
publish a syntax diagnostic. Skips when the binary is absent.
|
publish a syntax diagnostic. Skips when the binary is absent.
|
||||||
12. `m4_real_yaml_provider_pulls_config_and_reports_diagnostics` —
|
12. `m4_real_yaml_provider_pulls_config_and_reports_diagnostics` —
|
||||||
**pending on the destination machine**. PATH-gated live smoke for
|
PATH-gated live smoke for Red Hat `yaml-language-server@1.24.0`:
|
||||||
Red Hat `yaml-language-server@1.24.0`: auto-attach through pmacs,
|
auto-attach through pmacs, disable SchemaStore and Kubernetes CRD
|
||||||
disable SchemaStore and Kubernetes CRD catalog network access for
|
catalog network access for determinism, reach initialized, open
|
||||||
determinism, reach initialized, open invalid YAML, publish a
|
invalid YAML, publish a diagnostic, and remain alive.
|
||||||
diagnostic, and remain alive.
|
|
||||||
|
|
||||||
## Risks / interactions
|
## Risks / interactions
|
||||||
|
|
||||||
- **LSP configuration** (Q#JY2) — JSON push and YAML standalone pulls
|
- **LSP configuration** (Q#JY2) — JSON push, YAML standalone pulls, and
|
||||||
are observed. The real YAML-through-pmacs path is still pending and
|
the real YAML-through-pmacs path are observed. Both live provider
|
||||||
is an explicit transfer blocker, not implied complete by source
|
tests remain PATH-gated, so release verification must put the pinned
|
||||||
inspection.
|
binaries on PATH rather than accepting their skip paths.
|
||||||
- **Themes / injections** — untouched. This is pure grammar+detection
|
- **Themes / injections** — untouched. This is pure grammar+detection
|
||||||
addition; it consumes the #122 engine, doesn't change it. No protocol
|
addition; it consumes the #122 engine, doesn't change it. No protocol
|
||||||
bump.
|
bump.
|
||||||
|
|
|
||||||
|
|
@ -6496,6 +6496,94 @@ fn m4_real_json_provider_receives_config_and_reports_diagnostics() {
|
||||||
assert_no_lsp_crash(&mut state, "real JSON server");
|
assert_no_lsp_crash(&mut state, "real JSON server");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// PATH-gated provider smoke: drive Red Hat
|
||||||
|
/// `yaml-language-server@1.24.0` through pmacs's default YAML config and
|
||||||
|
/// require a syntax diagnostic for an invalid document. `SchemaStore` and
|
||||||
|
/// the Kubernetes CRD catalog are disabled in this test so the result is
|
||||||
|
/// deterministic and does not depend on network access. CI skips cleanly
|
||||||
|
/// when no compatible binary is installed.
|
||||||
|
#[test]
|
||||||
|
fn m4_real_yaml_provider_pulls_config_and_reports_diagnostics() {
|
||||||
|
use pmacs::editor::EditorState;
|
||||||
|
|
||||||
|
let Ok(command) = which_binary("yaml-language-server") else {
|
||||||
|
eprintln!("yaml-language-server not on PATH; skipping");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let command = command.display().to_string();
|
||||||
|
let dir = tempfile::tempdir().expect("tempdir");
|
||||||
|
let file = std::fs::canonicalize(dir.path())
|
||||||
|
.expect("canonicalize")
|
||||||
|
.join("invalid.yaml");
|
||||||
|
std::fs::write(&file, b"root:\n broken: [one,\n").expect("write invalid yaml");
|
||||||
|
let file_disp = file.display().to_string();
|
||||||
|
let uri = format!("file://{file_disp}");
|
||||||
|
|
||||||
|
let mut state = EditorState::new();
|
||||||
|
state
|
||||||
|
.lua_host
|
||||||
|
.lua()
|
||||||
|
.load(format!(
|
||||||
|
"local c = pmacs.lsp.config.yaml
|
||||||
|
c.command = '{command}'
|
||||||
|
c.settings.yaml.schemaStore = {{ enable = false }}
|
||||||
|
c.settings.yaml.kubernetesCRDStore = {{ enable = false }}
|
||||||
|
pmacs.buffer.find_or_open('{file_disp}')"
|
||||||
|
))
|
||||||
|
.exec()
|
||||||
|
.expect("configure real YAML server + open file");
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
pump_lua_flag(
|
||||||
|
&mut state,
|
||||||
|
"(function() for _,r in ipairs(pmacs.lsp.list()) do \
|
||||||
|
if r.language_id=='yaml' and r.state \
|
||||||
|
and r.state.kind=='initialized' then return true end \
|
||||||
|
end return false end)()",
|
||||||
|
30,
|
||||||
|
),
|
||||||
|
"auto-attached real YAML server never reached initialized"
|
||||||
|
);
|
||||||
|
|
||||||
|
let deadline = Instant::now() + Duration::from_secs(10);
|
||||||
|
let mut got_diagnostic = false;
|
||||||
|
while Instant::now() < deadline {
|
||||||
|
state.tick_processes();
|
||||||
|
state.tick_lsp();
|
||||||
|
state.tick_async();
|
||||||
|
got_diagnostic = state
|
||||||
|
.lua_host
|
||||||
|
.lua()
|
||||||
|
.load(format!("return pmacs.diag.count('{uri}') > 0"))
|
||||||
|
.eval()
|
||||||
|
.unwrap_or(false);
|
||||||
|
if got_diagnostic {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::thread::sleep(Duration::from_millis(10));
|
||||||
|
}
|
||||||
|
assert!(
|
||||||
|
got_diagnostic,
|
||||||
|
"real YAML server produced no diagnostic; config pulls or validation are broken"
|
||||||
|
);
|
||||||
|
assert_no_lsp_crash(&mut state, "real YAML server");
|
||||||
|
let still_initialized: bool = state
|
||||||
|
.lua_host
|
||||||
|
.lua()
|
||||||
|
.load(
|
||||||
|
"for _,r in ipairs(pmacs.lsp.list()) do \
|
||||||
|
if r.language_id=='yaml' and r.state \
|
||||||
|
and r.state.kind=='initialized' then return true end \
|
||||||
|
end return false",
|
||||||
|
)
|
||||||
|
.eval()
|
||||||
|
.expect("inspect YAML server state");
|
||||||
|
assert!(
|
||||||
|
still_initialized,
|
||||||
|
"real YAML server did not remain alive after publishing diagnostics"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// Typing-perf: the default bundle coalesces full-document
|
/// Typing-perf: the default bundle coalesces full-document
|
||||||
/// `didChange` notifications instead of sending one per keystroke
|
/// `didChange` notifications instead of sending one per keystroke
|
||||||
/// (each send copies the whole buffer several times and writes
|
/// (each send copies the whole buffer several times and writes
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue