robotcode-language-server 1.9.0__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/PKG-INFO +9 -8
  2. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/pyproject.toml +10 -9
  3. robotcode_language_server-2.0.0/src/robotcode/language_server/__version__.py +1 -0
  4. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/configuration.py +0 -8
  5. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/completion.py +3 -3
  6. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/folding_range.py +4 -0
  7. robotcode_language_server-2.0.0/src/robotcode/language_server/robotframework/parts/formatting.py +161 -0
  8. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/project_info.py +0 -6
  9. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robocop_helper.py +0 -20
  10. robotcode_language_server-1.9.0/src/robotcode/language_server/__version__.py +0 -1
  11. robotcode_language_server-1.9.0/src/robotcode/language_server/robotframework/parts/formatting.py +0 -287
  12. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/.gitignore +0 -0
  13. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/README.md +0 -0
  14. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/__init__.py +0 -0
  15. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/cli.py +0 -0
  16. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/__init__.py +0 -0
  17. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/decorators.py +0 -0
  18. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/__init__.py +0 -0
  19. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/code_action.py +0 -0
  20. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
  21. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/commands.py +0 -0
  22. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/completion.py +0 -0
  23. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/declaration.py +0 -0
  24. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/definition.py +0 -0
  25. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
  26. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
  27. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
  28. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/documents.py +0 -0
  29. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
  30. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/formatting.py +0 -0
  31. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/hover.py +0 -0
  32. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/implementation.py +0 -0
  33. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
  34. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
  35. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
  36. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
  37. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/references.py +0 -0
  38. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/rename.py +0 -0
  39. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
  40. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
  41. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
  42. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/window.py +0 -0
  43. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/workspace.py +0 -0
  44. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
  45. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/protocol.py +0 -0
  46. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/server.py +0 -0
  47. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/hooks.py +0 -0
  48. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/py.typed +0 -0
  49. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/__init__.py +0 -0
  50. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
  51. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
  52. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
  53. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
  54. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
  55. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
  56. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
  57. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
  58. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
  59. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
  60. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
  61. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
  62. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
  63. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
  64. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
  65. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
  66. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
  67. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
  68. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/references.py +0 -0
  69. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
  70. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +0 -0
  71. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
  72. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
  73. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
  74. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
  75. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
  76. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/protocol.py +0 -0
  77. {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robotcode-language-server
3
- Version: 1.9.0
3
+ Version: 2.0.0
4
4
  Summary: RobotCode Language Server for Robot Framework
5
5
  Project-URL: Homepage, https://robotcode.io
6
6
  Project-URL: Donate, https://opencollective.com/robotcode
@@ -15,19 +15,20 @@ Classifier: Framework :: Robot Framework
15
15
  Classifier: Framework :: Robot Framework :: Tool
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Programming Language :: Python
18
- Classifier: Programming Language :: Python :: 3.8
19
- Classifier: Programming Language :: Python :: 3.9
20
18
  Classifier: Programming Language :: Python :: 3.10
21
19
  Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
22
23
  Classifier: Programming Language :: Python :: Implementation :: CPython
23
24
  Classifier: Programming Language :: Python :: Implementation :: PyPy
24
25
  Classifier: Topic :: Utilities
25
26
  Classifier: Typing :: Typed
26
- Requires-Python: >=3.8
27
- Requires-Dist: robotcode-analyze==1.9.0
28
- Requires-Dist: robotcode-jsonrpc2==1.9.0
29
- Requires-Dist: robotcode-robot==1.9.0
30
- Requires-Dist: robotcode==1.9.0
27
+ Requires-Python: >=3.10
28
+ Requires-Dist: robotcode-analyze==2.0.0
29
+ Requires-Dist: robotcode-jsonrpc2==2.0.0
30
+ Requires-Dist: robotcode-robot==2.0.0
31
+ Requires-Dist: robotcode==2.0.0
31
32
  Requires-Dist: robotframework>=4.1.0
32
33
  Description-Content-Type: text/markdown
33
34
 
@@ -6,17 +6,18 @@ build-backend = "hatchling.build"
6
6
  name = "robotcode-language-server"
7
7
  description = 'RobotCode Language Server for Robot Framework'
8
8
  readme = { "file" = "README.md", "content-type" = "text/markdown" }
9
- requires-python = ">=3.8"
9
+ requires-python = ">=3.10"
10
10
  license = {text = "Apache-2.0"}
11
11
  keywords = []
12
12
  authors = [{ name = "Daniel Biehl", email = "dbiehl@live.de" }]
13
13
  classifiers = [
14
14
  "Development Status :: 5 - Production/Stable",
15
15
  "Programming Language :: Python",
16
- "Programming Language :: Python :: 3.8",
17
- "Programming Language :: Python :: 3.9",
18
16
  "Programming Language :: Python :: 3.10",
19
17
  "Programming Language :: Python :: 3.11",
18
+ "Programming Language :: Python :: 3.12",
19
+ "Programming Language :: Python :: 3.13",
20
+ "Programming Language :: Python :: 3.14",
20
21
  "Programming Language :: Python :: Implementation :: CPython",
21
22
  "Programming Language :: Python :: Implementation :: PyPy",
22
23
  "Operating System :: OS Independent",
@@ -27,10 +28,10 @@ classifiers = [
27
28
  ]
28
29
  dependencies = [
29
30
  "robotframework>=4.1.0",
30
- "robotcode-jsonrpc2==1.9.0",
31
- "robotcode-robot==1.9.0",
32
- "robotcode-analyze==1.9.0",
33
- "robotcode==1.9.0",
31
+ "robotcode-jsonrpc2==2.0.0",
32
+ "robotcode-robot==2.0.0",
33
+ "robotcode-analyze==2.0.0",
34
+ "robotcode==2.0.0",
34
35
  ]
35
36
  dynamic = ["version"]
36
37
 
@@ -53,11 +54,11 @@ dev-mode-dirs = ["src"]
53
54
 
54
55
  [tool.hatch.build.targets.wheel]
55
56
  only-include = ["src/robotcode"]
56
- sources = ["src"]
57
+
57
58
 
58
59
  [tool.hatch.build.targets.sdist]
59
60
  only-include = ["src"]
60
61
 
61
62
  [tool.hatch.envs.build]
62
63
  detached = true
63
- python = "38"
64
+ python = "310"
@@ -39,14 +39,6 @@ class RoboCopConfig(ConfigBase):
39
39
  configurations: List[str] = field(default_factory=list)
40
40
 
41
41
 
42
- @config_section("robotcode.robotidy")
43
- @dataclass
44
- class RoboTidyConfig(ConfigBase):
45
- enabled: bool = True
46
- ignore_git_dir: bool = False
47
- config: Optional[str] = None
48
-
49
-
50
42
  @config_section("robotcode.documentationServer")
51
43
  @dataclass
52
44
  class DocumentationServerConfig(ConfigBase):
@@ -1739,7 +1739,7 @@ class CompletionCollector(ModelHelper):
1739
1739
  )
1740
1740
  ),
1741
1741
  detail=e.kind.value,
1742
- sort_text=f"030_{e}",
1742
+ sort_text=f"030_{e.label}",
1743
1743
  insert_text_format=InsertTextFormat.PLAIN_TEXT,
1744
1744
  text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
1745
1745
  data=CompletionItemData(
@@ -1936,7 +1936,7 @@ class CompletionCollector(ModelHelper):
1936
1936
  )
1937
1937
  ),
1938
1938
  detail=e.kind.value,
1939
- sort_text=f"030_{e}",
1939
+ sort_text=f"030_{e.label}",
1940
1940
  insert_text_format=InsertTextFormat.PLAIN_TEXT,
1941
1941
  text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
1942
1942
  data=CompletionItemData(
@@ -2060,7 +2060,7 @@ class CompletionCollector(ModelHelper):
2060
2060
  )
2061
2061
  ),
2062
2062
  detail=e.kind.value,
2063
- sort_text=f"030_{e}",
2063
+ sort_text=f"030_{e.label}",
2064
2064
  insert_text_format=InsertTextFormat.PLAIN_TEXT,
2065
2065
  text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
2066
2066
  data=CompletionItemData(
@@ -83,6 +83,10 @@ class _Visitor(Visitor):
83
83
  self.__append(node, kind="comment")
84
84
  self.generic_visit(node)
85
85
 
86
+ def visit_Documentation(self, node: ast.AST) -> None: # noqa: N802
87
+ self.__append(node, kind="documentation")
88
+ self.generic_visit(node)
89
+
86
90
  def visit_TestCase(self, node: TestCase) -> None: # noqa: N802
87
91
  if node.name:
88
92
  self.__append(node, kind="testcase")
@@ -0,0 +1,161 @@
1
+ import io
2
+ import os
3
+ from typing import TYPE_CHECKING, Any, List, Optional, cast
4
+
5
+ from robotcode.core.language import language_id
6
+ from robotcode.core.lsp.types import (
7
+ FormattingOptions,
8
+ MessageType,
9
+ Position,
10
+ Range,
11
+ TextEdit,
12
+ )
13
+ from robotcode.core.text_document import TextDocument
14
+ from robotcode.core.utils.logging import LoggingDescriptor
15
+ from robotcode.robot.utils import get_robot_version
16
+
17
+ from ..configuration import RoboCopConfig
18
+ from .protocol_part import RobotLanguageServerProtocolPart
19
+
20
+ if TYPE_CHECKING:
21
+ from ..protocol import RobotLanguageServerProtocol
22
+
23
+
24
+ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart):
25
+ _logger = LoggingDescriptor()
26
+
27
+ def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
28
+ super().__init__(parent)
29
+
30
+ parent.formatting.format.add(self.format)
31
+
32
+ if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
33
+ parent.formatting.format_range.add(self.format_range)
34
+
35
+ self.space_count = 4
36
+ self.use_pipes = False
37
+ self.line_separator = os.linesep
38
+ self.short_test_name_length = 18
39
+ self.setting_and_variable_name_length = 14
40
+ self.is_robocop_notification_shown = False
41
+
42
+ def get_robocop_config(self, document: TextDocument) -> RoboCopConfig:
43
+ folder = self.parent.workspace.get_workspace_folder(document.uri)
44
+ if folder is None:
45
+ return RoboCopConfig()
46
+
47
+ return self.parent.workspace.get_configuration(RoboCopConfig, folder.uri)
48
+
49
+ @language_id("robotframework")
50
+ @_logger.call
51
+ def format(
52
+ self,
53
+ sender: Any,
54
+ document: TextDocument,
55
+ options: FormattingOptions,
56
+ **further_options: Any,
57
+ ) -> Optional[List[TextEdit]]:
58
+ if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
59
+ return self.format_robocop(document, options, **further_options)
60
+
61
+ if get_robot_version() < (5, 0):
62
+ return self.format_internal(document, options, **further_options)
63
+
64
+ self.parent.window.show_message(
65
+ "RobotFramework formatter is not available, please install 'robotframework-robocop'.",
66
+ MessageType.ERROR,
67
+ )
68
+
69
+ return None
70
+
71
+ def format_robocop(
72
+ self,
73
+ document: TextDocument,
74
+ options: FormattingOptions,
75
+ range: Optional[Range] = None,
76
+ **further_options: Any,
77
+ ) -> Optional[List[TextEdit]]:
78
+ from robocop.formatter.runner import RobocopFormatter
79
+
80
+ workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
81
+ if workspace_folder is None:
82
+ return None
83
+
84
+ config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
85
+
86
+ config = config_manager.get_config_for_source_file(document.uri.to_path())
87
+
88
+ if range is not None:
89
+ config.formatter.start_line = range.start.line + 1
90
+ config.formatter.end_line = range.end.line + 1
91
+
92
+ runner = RobocopFormatter(config_manager)
93
+ runner.config = config
94
+
95
+ model = self.parent.documents_cache.get_model(document, False)
96
+ _, _, new, _ = runner.format_until_stable(model)
97
+
98
+ if new.text == document.text():
99
+ return None
100
+
101
+ return [
102
+ TextEdit(
103
+ range=Range(
104
+ start=Position(line=0, character=0),
105
+ end=Position(line=len(document.get_lines()), character=0),
106
+ ),
107
+ new_text=new.text,
108
+ )
109
+ ]
110
+
111
+ def format_internal(
112
+ self,
113
+ document: TextDocument,
114
+ options: FormattingOptions,
115
+ **further_options: Any,
116
+ ) -> Optional[List[TextEdit]]:
117
+ from robot.parsing.model.blocks import File
118
+ from robot.tidypkg import ( # pyright: ignore [reportMissingImports]
119
+ Aligner,
120
+ Cleaner,
121
+ NewlineNormalizer,
122
+ SeparatorNormalizer,
123
+ )
124
+
125
+ model = cast(File, self.parent.documents_cache.get_model(document, False))
126
+
127
+ Cleaner().visit(model)
128
+ NewlineNormalizer(self.line_separator, self.short_test_name_length).visit(model)
129
+ SeparatorNormalizer(self.use_pipes, self.space_count).visit(model)
130
+ Aligner(
131
+ self.short_test_name_length,
132
+ self.setting_and_variable_name_length,
133
+ self.use_pipes,
134
+ ).visit(model)
135
+
136
+ with io.StringIO() as s:
137
+ model.save(s)
138
+
139
+ return [
140
+ TextEdit(
141
+ range=Range(
142
+ start=Position(line=0, character=0),
143
+ end=Position(line=len(document.get_lines()), character=0),
144
+ ),
145
+ new_text=s.getvalue(),
146
+ )
147
+ ]
148
+
149
+ @language_id("robotframework")
150
+ def format_range(
151
+ self,
152
+ sender: Any,
153
+ document: TextDocument,
154
+ range: Range,
155
+ options: FormattingOptions,
156
+ **further_options: Any,
157
+ ) -> Optional[List[TextEdit]]:
158
+ if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
159
+ return self.format_robocop(document, options, range=range, **further_options)
160
+
161
+ return None
@@ -19,7 +19,6 @@ if TYPE_CHECKING:
19
19
  class ProjectInfo(CamelSnakeMixin):
20
20
  robot_version_string: str
21
21
  robocop_version_string: Optional[str]
22
- tidy_version_string: Optional[str] = None
23
22
  python_version_string: Optional[str] = None
24
23
  python_executable: Optional[str] = None
25
24
  robot_code_version_string: Optional[str] = None
@@ -42,14 +41,9 @@ class ProjectInfoPart(RobotLanguageServerProtocolPart):
42
41
  if self.parent.robocop_helper.robocop_installed:
43
42
  robocop_version_string = self.parent.robocop_helper.robocop_version_str
44
43
 
45
- tidy_version_string = None
46
- if self.parent.robocop_helper.robotidy_installed:
47
- tidy_version_string = self.parent.robocop_helper.robotidy_version_str
48
-
49
44
  return ProjectInfo(
50
45
  robot_version_string=get_version(),
51
46
  robocop_version_string=robocop_version_string,
52
- tidy_version_string=tidy_version_string,
53
47
  python_version_string=sys.version,
54
48
  python_executable=sys.executable,
55
49
  robot_code_version_string=robotcode_version,
@@ -29,26 +29,6 @@ class RoboCopHelper(RobotLanguageServerProtocolPart):
29
29
  super().__init__(parent)
30
30
  self._config_managers: Dict[WorkspaceFolder, "ConfigManager"] = {}
31
31
 
32
- @functools.cached_property
33
- def robotidy_installed(self) -> bool:
34
- try:
35
- __import__("robotidy")
36
- except ImportError:
37
- return False
38
- return True
39
-
40
- @functools.cached_property
41
- def robotidy_version(self) -> Version:
42
- from robotidy.version import __version__
43
-
44
- return create_version_from_str(__version__)
45
-
46
- @functools.cached_property
47
- def robotidy_version_str(self) -> str:
48
- from robotidy.version import __version__
49
-
50
- return str(__version__)
51
-
52
32
  @functools.cached_property
53
33
  def robocop_installed(self) -> bool:
54
34
  try:
@@ -1 +0,0 @@
1
- __version__ = "1.9.0"
@@ -1,287 +0,0 @@
1
- import io
2
- import os
3
- from concurrent.futures import CancelledError
4
- from typing import TYPE_CHECKING, Any, List, Optional, cast
5
-
6
- from robotcode.core.language import language_id
7
- from robotcode.core.lsp.types import (
8
- FormattingOptions,
9
- MessageType,
10
- Position,
11
- Range,
12
- TextEdit,
13
- )
14
- from robotcode.core.text_document import TextDocument
15
- from robotcode.core.utils.logging import LoggingDescriptor
16
- from robotcode.robot.utils import get_robot_version
17
-
18
- from ..configuration import RoboCopConfig, RoboTidyConfig
19
- from .protocol_part import RobotLanguageServerProtocolPart
20
-
21
- if TYPE_CHECKING:
22
- from ..protocol import RobotLanguageServerProtocol
23
-
24
-
25
- class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart):
26
- _logger = LoggingDescriptor()
27
-
28
- def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
29
- super().__init__(parent)
30
-
31
- parent.formatting.format.add(self.format)
32
-
33
- if self.parent.robocop_helper.robotidy_installed or (
34
- self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0)
35
- ):
36
- parent.formatting.format_range.add(self.format_range)
37
-
38
- self.space_count = 4
39
- self.use_pipes = False
40
- self.line_separator = os.linesep
41
- self.short_test_name_length = 18
42
- self.setting_and_variable_name_length = 14
43
- self.is_robocop_notification_shown = False
44
-
45
- def get_tidy_config(self, document: TextDocument) -> RoboTidyConfig:
46
- folder = self.parent.workspace.get_workspace_folder(document.uri)
47
- if folder is None:
48
- return RoboTidyConfig()
49
-
50
- return self.parent.workspace.get_configuration(RoboTidyConfig, folder.uri)
51
-
52
- def get_robocop_config(self, document: TextDocument) -> RoboCopConfig:
53
- folder = self.parent.workspace.get_workspace_folder(document.uri)
54
- if folder is None:
55
- return RoboCopConfig()
56
-
57
- return self.parent.workspace.get_configuration(RoboCopConfig, folder.uri)
58
-
59
- @language_id("robotframework")
60
- @_logger.call
61
- def format(
62
- self,
63
- sender: Any,
64
- document: TextDocument,
65
- options: FormattingOptions,
66
- **further_options: Any,
67
- ) -> Optional[List[TextEdit]]:
68
- if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
69
- if not self.is_robocop_notification_shown and self.parent.robocop_helper.robotidy_installed:
70
- self.parent.window.show_message(
71
- "`robotframework-robocop >= 6.0` is installed and will be used for formatting.\n\n"
72
- "`robotframework-tidy` is also detected in the workspace, but its use is redundant.\n"
73
- "Robocop fully supports all formatting tasks and provides a more comprehensive solution.\n\n"
74
- "Note: The use of `robotframework-tidy` is deprecated and should be avoided in favor of Robocop.",
75
- MessageType.INFO,
76
- )
77
- self.is_robocop_notification_shown = True
78
-
79
- return self.format_robocop(document, options, **further_options)
80
-
81
- tidy_config = self.get_tidy_config(document)
82
- if (tidy_config.enabled or get_robot_version() >= (5, 0)) and self.parent.robocop_helper.robotidy_installed:
83
- return self.format_robot_tidy(document, options, config=tidy_config, **further_options)
84
-
85
- if get_robot_version() < (5, 0):
86
- return self.format_internal(document, options, **further_options)
87
-
88
- self.parent.window.show_message(
89
- "RobotFramework formatter is not available, please install 'robotframework-robocop'.",
90
- MessageType.ERROR,
91
- )
92
-
93
- return None
94
-
95
- def format_robot_tidy(
96
- self,
97
- document: TextDocument,
98
- options: FormattingOptions,
99
- range: Optional[Range] = None,
100
- config: Optional[RoboTidyConfig] = None,
101
- **further_options: Any,
102
- ) -> Optional[List[TextEdit]]:
103
- try:
104
- if config is None:
105
- config = self.get_tidy_config(document)
106
-
107
- model = self.parent.documents_cache.get_model(document, False)
108
-
109
- if self.parent.robocop_helper.robotidy_version >= (3, 0):
110
- from robotidy.api import get_robotidy
111
- from robotidy.disablers import RegisterDisablers
112
-
113
- if self.parent.robocop_helper.robotidy_version >= (4, 2):
114
- robot_tidy = get_robotidy(
115
- document.uri.to_path(),
116
- None,
117
- ignore_git_dir=config.ignore_git_dir,
118
- config=config.config,
119
- )
120
- elif self.parent.robocop_helper.robotidy_version >= (4, 1):
121
- robot_tidy = get_robotidy(
122
- document.uri.to_path(),
123
- None,
124
- ignore_git_dir=config.ignore_git_dir,
125
- )
126
- else:
127
- robot_tidy = get_robotidy(document.uri.to_path(), None)
128
-
129
- if range is not None:
130
- robot_tidy.config.formatting.start_line = range.start.line + 1
131
- robot_tidy.config.formatting.end_line = range.end.line + 1
132
-
133
- disabler_finder = RegisterDisablers(
134
- robot_tidy.config.formatting.start_line,
135
- robot_tidy.config.formatting.end_line,
136
- )
137
- disabler_finder.visit(model)
138
-
139
- if self.parent.robocop_helper.robotidy_version >= (4, 11):
140
- if disabler_finder.is_disabled_in_file():
141
- return None
142
- else:
143
- if disabler_finder.file_disabled:
144
- return None
145
-
146
- if self.parent.robocop_helper.robotidy_version >= (4, 0):
147
- _, _, new, _ = robot_tidy.transform_until_stable(model, disabler_finder)
148
- else:
149
- _, _, new = robot_tidy.transform(model, disabler_finder.disablers)
150
-
151
- else:
152
- from robotidy.api import RobotidyAPI
153
-
154
- robot_tidy = RobotidyAPI(document.uri.to_path(), None)
155
-
156
- if range is not None:
157
- robot_tidy.formatting_config.start_line = range.start.line + 1
158
- robot_tidy.formatting_config.end_line = range.end.line + 1
159
-
160
- if self.parent.robocop_helper.robotidy_version >= (2, 2):
161
- from robotidy.disablers import RegisterDisablers
162
-
163
- disabler_finder = RegisterDisablers(
164
- robot_tidy.formatting_config.start_line,
165
- robot_tidy.formatting_config.end_line,
166
- )
167
- disabler_finder.visit(model)
168
- if disabler_finder.file_disabled:
169
- return None
170
- _, _, new = robot_tidy.transform(model, disabler_finder.disablers)
171
- else:
172
- _, _, new = robot_tidy.transform(model)
173
-
174
- if new.text == document.text():
175
- return None
176
-
177
- return [
178
- TextEdit(
179
- range=Range(
180
- start=Position(line=0, character=0),
181
- end=Position(line=len(document.get_lines()), character=0),
182
- ),
183
- new_text=new.text,
184
- )
185
- ]
186
-
187
- except (SystemExit, KeyboardInterrupt, CancelledError):
188
- raise
189
- except BaseException as e:
190
- self._logger.exception(e)
191
- self.parent.window.show_message(f"Executing `robotidy` failed: {e}", MessageType.ERROR)
192
- return None
193
-
194
- def format_robocop(
195
- self,
196
- document: TextDocument,
197
- options: FormattingOptions,
198
- range: Optional[Range] = None,
199
- **further_options: Any,
200
- ) -> Optional[List[TextEdit]]:
201
- from robocop.formatter.runner import RobocopFormatter
202
-
203
- workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
204
- if workspace_folder is None:
205
- return None
206
-
207
- config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
208
-
209
- config = config_manager.get_config_for_source_file(document.uri.to_path())
210
-
211
- if range is not None:
212
- config.formatter.start_line = range.start.line + 1
213
- config.formatter.end_line = range.end.line + 1
214
-
215
- runner = RobocopFormatter(config_manager)
216
- runner.config = config
217
-
218
- model = self.parent.documents_cache.get_model(document, False)
219
- _, _, new, _ = runner.format_until_stable(model)
220
-
221
- if new.text == document.text():
222
- return None
223
-
224
- return [
225
- TextEdit(
226
- range=Range(
227
- start=Position(line=0, character=0),
228
- end=Position(line=len(document.get_lines()), character=0),
229
- ),
230
- new_text=new.text,
231
- )
232
- ]
233
-
234
- def format_internal(
235
- self,
236
- document: TextDocument,
237
- options: FormattingOptions,
238
- **further_options: Any,
239
- ) -> Optional[List[TextEdit]]:
240
- from robot.parsing.model.blocks import File
241
- from robot.tidypkg import ( # pyright: ignore [reportMissingImports]
242
- Aligner,
243
- Cleaner,
244
- NewlineNormalizer,
245
- SeparatorNormalizer,
246
- )
247
-
248
- model = cast(File, self.parent.documents_cache.get_model(document, False))
249
-
250
- Cleaner().visit(model)
251
- NewlineNormalizer(self.line_separator, self.short_test_name_length).visit(model)
252
- SeparatorNormalizer(self.use_pipes, self.space_count).visit(model)
253
- Aligner(
254
- self.short_test_name_length,
255
- self.setting_and_variable_name_length,
256
- self.use_pipes,
257
- ).visit(model)
258
-
259
- with io.StringIO() as s:
260
- model.save(s)
261
-
262
- return [
263
- TextEdit(
264
- range=Range(
265
- start=Position(line=0, character=0),
266
- end=Position(line=len(document.get_lines()), character=0),
267
- ),
268
- new_text=s.getvalue(),
269
- )
270
- ]
271
-
272
- @language_id("robotframework")
273
- def format_range(
274
- self,
275
- sender: Any,
276
- document: TextDocument,
277
- range: Range,
278
- options: FormattingOptions,
279
- **further_options: Any,
280
- ) -> Optional[List[TextEdit]]:
281
- config = self.get_tidy_config(document)
282
- if (config.enabled and self.parent.robocop_helper.robotidy_installed) or (
283
- self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0)
284
- ):
285
- return self.format_robot_tidy(document, options, range=range, config=config, **further_options)
286
-
287
- return None