Coverage for src/debputy/lsp/lsp_debian_tests_control.py: 82%
53 statements
« prev ^ index » next coverage.py v7.6.0, created at 2025-03-24 16:38 +0000
« prev ^ index » next coverage.py v7.6.0, created at 2025-03-24 16:38 +0000
1import re
2from typing import (
3 Union,
4 Sequence,
5 Optional,
6)
8from debputy.linting.lint_util import LintState
9from debputy.lsp.debputy_ls import DebputyLanguageServer
10from debputy.lsp.lsp_debian_control_reference_data import (
11 DTestsCtrlFileMetadata,
12)
13from debputy.lsp.lsp_features import (
14 lint_diagnostics,
15 lsp_completer,
16 lsp_hover,
17 lsp_standard_handler,
18 lsp_folding_ranges,
19 lsp_semantic_tokens_full,
20 lsp_will_save_wait_until,
21 lsp_format_document,
22 SecondaryLanguage,
23 LanguageDispatchRule,
24)
25from debputy.lsp.lsp_generic_deb822 import (
26 deb822_completer,
27 deb822_hover,
28 deb822_folding_ranges,
29 deb822_semantic_tokens_full,
30 deb822_format_file,
31 scan_for_syntax_errors_and_token_level_diagnostics,
32)
33from debputy.lsprotocol.types import (
34 CompletionItem,
35 CompletionList,
36 CompletionParams,
37 HoverParams,
38 Hover,
39 TEXT_DOCUMENT_CODE_ACTION,
40 SemanticTokens,
41 SemanticTokensParams,
42 FoldingRangeParams,
43 FoldingRange,
44 WillSaveTextDocumentParams,
45 TextEdit,
46 DocumentFormattingParams,
47)
49try:
50 from debputy.lsp.vendoring._deb822_repro.locatable import (
51 Position as TEPosition,
52 Range as TERange,
53 START_POSITION,
54 )
56 from pygls.server import LanguageServer
57 from pygls.workspace import TextDocument
58except ImportError:
59 pass
62_CONTAINS_SPACE_OR_COLON = re.compile(r"[\s:]")
63_DISPATCH_RULE = LanguageDispatchRule.new_rule(
64 "debian/tests/control",
65 "debian/tests/control",
66 [
67 # emacs's name - from elpa-dpkg-dev-el (>> 37.11)
68 SecondaryLanguage("debian-autopkgtest-control-mode"),
69 # Likely to be vim's name if it had support
70 SecondaryLanguage("debtestscontrol"),
71 ],
72)
74_DTESTS_CTRL_FILE_METADATA = DTestsCtrlFileMetadata()
76lsp_standard_handler(_DISPATCH_RULE, TEXT_DOCUMENT_CODE_ACTION)
79@lsp_hover(_DISPATCH_RULE)
80def debian_tests_control_hover(
81 ls: "DebputyLanguageServer",
82 params: HoverParams,
83) -> Optional[Hover]:
84 return deb822_hover(ls, params, _DTESTS_CTRL_FILE_METADATA)
87@lsp_completer(_DISPATCH_RULE)
88def debian_tests_control_completions(
89 ls: "DebputyLanguageServer",
90 params: CompletionParams,
91) -> Optional[Union[CompletionList, Sequence[CompletionItem]]]:
92 return deb822_completer(ls, params, _DTESTS_CTRL_FILE_METADATA)
95@lsp_folding_ranges(_DISPATCH_RULE)
96def debian_tests_control_folding_ranges(
97 ls: "DebputyLanguageServer",
98 params: FoldingRangeParams,
99) -> Optional[Sequence[FoldingRange]]:
100 return deb822_folding_ranges(ls, params, _DTESTS_CTRL_FILE_METADATA)
103@lint_diagnostics(_DISPATCH_RULE)
104async def _lint_debian_tests_control(lint_state: LintState) -> None:
105 deb822_file = lint_state.parsed_deb822_file_content
107 first_error = await scan_for_syntax_errors_and_token_level_diagnostics(
108 deb822_file,
109 lint_state,
110 )
112 paragraphs = list(deb822_file)
114 async for paragraph_no, paragraph in lint_state.slow_iter(
115 enumerate(paragraphs, start=1)
116 ):
117 paragraph_pos = paragraph.position_in_file()
118 if paragraph_pos.line_position >= first_error: 118 ↛ 119line 118 didn't jump to line 119 because the condition on line 118 was never true
119 break
120 stanza_metadata = _DTESTS_CTRL_FILE_METADATA.classify_stanza(
121 paragraph,
122 paragraph_no,
123 )
124 await stanza_metadata.stanza_diagnostics(
125 deb822_file,
126 paragraph,
127 paragraph_pos,
128 lint_state,
129 )
132@lsp_will_save_wait_until(_DISPATCH_RULE)
133def _debian_tests_control_on_save_formatting(
134 ls: "DebputyLanguageServer",
135 params: WillSaveTextDocumentParams,
136) -> Optional[Sequence[TextEdit]]:
137 doc = ls.workspace.get_text_document(params.text_document.uri)
138 lint_state = ls.lint_state(doc)
139 return deb822_format_file(lint_state, _DTESTS_CTRL_FILE_METADATA)
142def _reformat_debian_tests_control(
143 lint_state: LintState,
144) -> Optional[Sequence[TextEdit]]:
145 return deb822_format_file(lint_state, _DTESTS_CTRL_FILE_METADATA)
148@lsp_format_document(_DISPATCH_RULE)
149def _debian_tests_control_on_save_formatting(
150 ls: "DebputyLanguageServer",
151 params: DocumentFormattingParams,
152) -> Optional[Sequence[TextEdit]]:
153 doc = ls.workspace.get_text_document(params.text_document.uri)
154 lint_state = ls.lint_state(doc)
155 return deb822_format_file(lint_state, _DTESTS_CTRL_FILE_METADATA)
158@lsp_semantic_tokens_full(_DISPATCH_RULE)
159async def _debian_tests_control_semantic_tokens_full(
160 ls: "DebputyLanguageServer",
161 request: SemanticTokensParams,
162) -> Optional[SemanticTokens]:
163 return await deb822_semantic_tokens_full(
164 ls,
165 request,
166 _DTESTS_CTRL_FILE_METADATA,
167 )