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

1import re 

2from typing import ( 

3 Union, 

4 Sequence, 

5 Optional, 

6) 

7 

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) 

48 

49try: 

50 from debputy.lsp.vendoring._deb822_repro.locatable import ( 

51 Position as TEPosition, 

52 Range as TERange, 

53 START_POSITION, 

54 ) 

55 

56 from pygls.server import LanguageServer 

57 from pygls.workspace import TextDocument 

58except ImportError: 

59 pass 

60 

61 

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) 

73 

74_DTESTS_CTRL_FILE_METADATA = DTestsCtrlFileMetadata() 

75 

76lsp_standard_handler(_DISPATCH_RULE, TEXT_DOCUMENT_CODE_ACTION) 

77 

78 

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) 

85 

86 

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) 

93 

94 

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) 

101 

102 

103@lint_diagnostics(_DISPATCH_RULE) 

104async def _lint_debian_tests_control(lint_state: LintState) -> None: 

105 deb822_file = lint_state.parsed_deb822_file_content 

106 

107 first_error = await scan_for_syntax_errors_and_token_level_diagnostics( 

108 deb822_file, 

109 lint_state, 

110 ) 

111 

112 paragraphs = list(deb822_file) 

113 

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 ) 

130 

131 

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) 

140 

141 

142def _reformat_debian_tests_control( 

143 lint_state: LintState, 

144) -> Optional[Sequence[TextEdit]]: 

145 return deb822_format_file(lint_state, _DTESTS_CTRL_FILE_METADATA) 

146 

147 

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) 

156 

157 

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 )