robotcode 2.6.2__py3-none-any.whl → 2.8.0.dev548__py3-none-any.whl
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.
- robotcode/cli/__init__.py +179 -5
- robotcode/cli/__version__.py +1 -1
- {robotcode-2.6.2.dist-info → robotcode-2.8.0.dev548.dist-info}/METADATA +41 -27
- robotcode-2.8.0.dev548.dist-info/RECORD +12 -0
- {robotcode-2.6.2.dist-info → robotcode-2.8.0.dev548.dist-info}/WHEEL +1 -1
- robotcode-2.6.2.dist-info/RECORD +0 -12
- {robotcode-2.6.2.dist-info → robotcode-2.8.0.dev548.dist-info}/entry_points.txt +0 -0
- {robotcode-2.6.2.dist-info → robotcode-2.8.0.dev548.dist-info}/licenses/LICENSE.txt +0 -0
robotcode/cli/__init__.py
CHANGED
|
@@ -2,8 +2,11 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import logging.config
|
|
4
4
|
import os
|
|
5
|
+
import shlex
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
5
8
|
from pathlib import Path
|
|
6
|
-
from typing import Any, List, Literal, Optional
|
|
9
|
+
from typing import IO, Any, List, Literal, Optional
|
|
7
10
|
|
|
8
11
|
import click
|
|
9
12
|
|
|
@@ -17,7 +20,9 @@ from robotcode.plugin import (
|
|
|
17
20
|
)
|
|
18
21
|
from robotcode.plugin._agent_detection import is_running_in_ai_agent
|
|
19
22
|
from robotcode.plugin.click_helper.aliases import AliasedGroup
|
|
23
|
+
from robotcode.plugin.click_helper.exit_codes import has_robot_exit_codes
|
|
20
24
|
from robotcode.plugin.click_helper.types import EnumChoice
|
|
25
|
+
from robotcode.plugin.click_helper.wrappable import WRAPPER_APPLIED_ENV, is_wrappable
|
|
21
26
|
from robotcode.plugin.manager import PluginManager
|
|
22
27
|
|
|
23
28
|
from .__version__ import __version__
|
|
@@ -46,8 +51,155 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
46
51
|
super().__init__(*args, defaults=defaults, **kwargs)
|
|
47
52
|
|
|
48
53
|
|
|
54
|
+
def _maybe_reexec_under_wrapper(
|
|
55
|
+
ctx: click.Context, app: Application, cli_wrapper: Optional[str] = None, no_wrapper: bool = False
|
|
56
|
+
) -> None:
|
|
57
|
+
"""Re-execute this process through a configured ``wrapper`` command.
|
|
58
|
+
|
|
59
|
+
When a ``wrapper`` is configured - either via ``--wrapper`` on the command
|
|
60
|
+
line (``cli_wrapper``) or the selected profile's ``wrapper`` (e.g. to run
|
|
61
|
+
the tests inside a specific X11/Wayland session) - and the invoked command
|
|
62
|
+
is ``@wrappable`` (i.e. it executes Robot Framework), the process
|
|
63
|
+
re-executes itself **once** through that command before Robot Framework
|
|
64
|
+
starts. ``--wrapper`` overrides the profile; ``--no-wrapper`` disables
|
|
65
|
+
wrapping for this run. The guard env var prevents infinite recursion and
|
|
66
|
+
lets an outer layer suppress the re-exec by setting it itself.
|
|
67
|
+
"""
|
|
68
|
+
if no_wrapper:
|
|
69
|
+
if cli_wrapper:
|
|
70
|
+
app.warning("Ignoring --wrapper because --no-wrapper was given.")
|
|
71
|
+
return
|
|
72
|
+
if os.environ.get(WRAPPER_APPLIED_ENV):
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
sub_name = ctx.invoked_subcommand
|
|
76
|
+
if not sub_name:
|
|
77
|
+
return
|
|
78
|
+
# The command itself opts in via @wrappable; aliases resolve to the same
|
|
79
|
+
# command object, so this is alias-safe and needs no central name list.
|
|
80
|
+
sub_cmd = ctx.command.get_command(ctx, sub_name) if isinstance(ctx.command, click.Group) else None
|
|
81
|
+
if sub_cmd is None or not is_wrappable(sub_cmd):
|
|
82
|
+
if cli_wrapper:
|
|
83
|
+
app.warning(f"Ignoring --wrapper: '{sub_name}' does not execute Robot Framework.")
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
from robotcode.robot.config.loader import load_robot_config_from_path
|
|
87
|
+
from robotcode.robot.config.utils import get_config_files
|
|
88
|
+
|
|
89
|
+
profile_wrapper = None
|
|
90
|
+
try:
|
|
91
|
+
config_files, _, _ = get_config_files(
|
|
92
|
+
config_files=app.config.config_files,
|
|
93
|
+
root_folder=app.config.root,
|
|
94
|
+
no_vcs=app.config.no_vcs,
|
|
95
|
+
verbose_callback=app.verbose,
|
|
96
|
+
)
|
|
97
|
+
# `evaluated_with_env` also applies the profile's `env` to `os.environ`,
|
|
98
|
+
# so the wrapper command can rely on it. Profile errors are swallowed
|
|
99
|
+
# here: the command loads the config again and reports them, so they
|
|
100
|
+
# show up once. (Without a callback they would raise, and an unknown
|
|
101
|
+
# profile would make us skip the wrapper of a valid one.)
|
|
102
|
+
profile = (
|
|
103
|
+
load_robot_config_from_path(*config_files, verbose_callback=app.verbose)
|
|
104
|
+
.combine_profiles(*(app.config.profiles or []), verbose_callback=app.verbose, error_callback=lambda _: None)
|
|
105
|
+
.evaluated_with_env(verbose_callback=app.verbose, error_callback=lambda _: None)
|
|
106
|
+
)
|
|
107
|
+
profile_wrapper = profile.wrapper
|
|
108
|
+
except Exception as e:
|
|
109
|
+
# Don't fail early on config problems here; the actual command loads the
|
|
110
|
+
# config again and reports errors properly. An explicit --wrapper is
|
|
111
|
+
# still honored below.
|
|
112
|
+
message = str(e)
|
|
113
|
+
app.verbose(lambda: f"Skipping profile wrapper detection: {message}")
|
|
114
|
+
|
|
115
|
+
# `--wrapper` overrides the profile's `wrapper`. The evaluated profile turns
|
|
116
|
+
# StringExpression entries into plain strings.
|
|
117
|
+
if cli_wrapper:
|
|
118
|
+
wrapper = shlex.split(cli_wrapper)
|
|
119
|
+
elif profile_wrapper:
|
|
120
|
+
wrapper = [str(w) for w in profile_wrapper]
|
|
121
|
+
else:
|
|
122
|
+
return
|
|
123
|
+
|
|
124
|
+
# A dry run must not start the wrapper: it would set up and tear down the
|
|
125
|
+
# real environment. Show it instead; the command itself then prints its own
|
|
126
|
+
# dry-run output.
|
|
127
|
+
if app.config.dry:
|
|
128
|
+
app.echo(f"Dry run, not executing the wrapper. Would run robotcode under: {' '.join(wrapper)}")
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
# Rebuild the invocation the way this process was actually started, so the
|
|
132
|
+
# re-exec finds robotcode even when it runs from a bundled path (VS Code) and
|
|
133
|
+
# is not installed in the interpreter. `launcher_script` is set only when we
|
|
134
|
+
# were started through a bundled entry (its `__main__` sets it) or an explicit
|
|
135
|
+
# `--launcher-script`; otherwise robotcode is importable directly and
|
|
136
|
+
# `-m robotcode.cli` is correct. We deliberately do NOT consult the
|
|
137
|
+
# ROBOTCODE_BUNDLED_ROBOTCODE_MAIN env var: VS Code sets it in every terminal,
|
|
138
|
+
# so a directly started robotcode would be diverted to the bundled copy.
|
|
139
|
+
# Mirrors the debug launcher's `debugger_script` handling.
|
|
140
|
+
entry = [str(app.config.launcher_script)] if app.config.launcher_script else ["-m", "robotcode.cli"]
|
|
141
|
+
command = [*wrapper, sys.executable, *entry, *sys.argv[1:]]
|
|
142
|
+
app.verbose(lambda: "Running under wrapper: " + " ".join(command))
|
|
143
|
+
|
|
144
|
+
# Run robotcode again under the wrapper; the guard env stops the spawned
|
|
145
|
+
# robotcode from wrapping a second time. On POSIX we replace this process with
|
|
146
|
+
# execvp (no extra process); Windows has no such exec, so there we spawn the
|
|
147
|
+
# command, wait, and forward its exit code.
|
|
148
|
+
os.environ[WRAPPER_APPLIED_ENV] = "1"
|
|
149
|
+
try:
|
|
150
|
+
if sys.platform == "win32":
|
|
151
|
+
sys.exit(subprocess.run(command).returncode)
|
|
152
|
+
os.execvp(command[0], command)
|
|
153
|
+
except OSError as e:
|
|
154
|
+
raise click.ClickException(f"Failed to execute wrapper command {wrapper!r}: {e}") from e
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class RobotDataError(click.ClickException):
|
|
158
|
+
"""An error robotcode reports itself for a command that passes on Robot Framework's
|
|
159
|
+
exit codes.
|
|
160
|
+
|
|
161
|
+
Shows the original error unchanged, but exits with Robot Framework's code for invalid
|
|
162
|
+
data or command line options instead of Click's 1 or 2.
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
exit_code = 252
|
|
166
|
+
|
|
167
|
+
def __init__(self, error: click.ClickException) -> None:
|
|
168
|
+
super().__init__(error.message)
|
|
169
|
+
self.error = error
|
|
170
|
+
|
|
171
|
+
def show(self, file: Optional[IO[Any]] = None) -> None:
|
|
172
|
+
self.error.show(file)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class RobotCodeGroup(AliasedGroup):
|
|
176
|
+
"""The root command group.
|
|
177
|
+
|
|
178
|
+
Commands that run Robot Framework (`wrappable`) or pass on the exit code of a Robot
|
|
179
|
+
Framework tool (`robot_exit_codes`) answer with its exit codes, where 1-250 counts the
|
|
180
|
+
failed tests. An error robotcode reports itself for such a command - a Click error with
|
|
181
|
+
exit code 1 or 2, such as a broken configuration, a wrapper that doesn't start or an
|
|
182
|
+
invalid option - exits with Robot Framework's 252 instead. Robot Framework's own exit
|
|
183
|
+
codes never arrive as Click errors, so they pass through unchanged, and so does any
|
|
184
|
+
other code.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
def invoke(self, ctx: click.Context) -> Any:
|
|
188
|
+
try:
|
|
189
|
+
return super().invoke(ctx)
|
|
190
|
+
except click.ClickException as e:
|
|
191
|
+
if e.exit_code in (1, 2) and self._passes_on_robot_exit_codes(ctx):
|
|
192
|
+
raise RobotDataError(e) from e
|
|
193
|
+
raise
|
|
194
|
+
|
|
195
|
+
def _passes_on_robot_exit_codes(self, ctx: click.Context) -> bool:
|
|
196
|
+
name = ctx.invoked_subcommand
|
|
197
|
+
cmd = self.get_command(ctx, name) if name else None
|
|
198
|
+
return cmd is not None and (is_wrappable(cmd) or has_robot_exit_codes(cmd))
|
|
199
|
+
|
|
200
|
+
|
|
49
201
|
@click.group(
|
|
50
|
-
cls=
|
|
202
|
+
cls=RobotCodeGroup,
|
|
51
203
|
context_settings={"auto_envvar_prefix": "ROBOTCODE"},
|
|
52
204
|
invoke_without_command=False,
|
|
53
205
|
)
|
|
@@ -108,8 +260,9 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
108
260
|
"color",
|
|
109
261
|
default=None,
|
|
110
262
|
help=(
|
|
111
|
-
"
|
|
112
|
-
"
|
|
263
|
+
"Enable or disable colored output. Color codes are written only to a terminal; set `FORCE_COLOR` to get"
|
|
264
|
+
" them in a pipe. Default (no flag): auto-detect — colors only when stdout is a TTY, disabled if `NO_COLOR`"
|
|
265
|
+
" is set, forced if `FORCE_COLOR` is set."
|
|
113
266
|
),
|
|
114
267
|
show_envvar=True,
|
|
115
268
|
)
|
|
@@ -118,7 +271,8 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
118
271
|
"pager",
|
|
119
272
|
default=None,
|
|
120
273
|
help=(
|
|
121
|
-
"Force or disable the pager
|
|
274
|
+
"Force or disable the pager on a terminal; no pager starts when stdout isn't a TTY. Default (no flag):"
|
|
275
|
+
" auto-page when the rendered output exceeds the terminal height."
|
|
122
276
|
),
|
|
123
277
|
show_envvar=True,
|
|
124
278
|
)
|
|
@@ -129,6 +283,20 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
129
283
|
help="Enables verbose mode.",
|
|
130
284
|
show_envvar=True,
|
|
131
285
|
)
|
|
286
|
+
@click.option(
|
|
287
|
+
"--wrapper",
|
|
288
|
+
type=str,
|
|
289
|
+
default=None,
|
|
290
|
+
show_envvar=True,
|
|
291
|
+
help='Command prefix to run the test execution through, e.g. `--wrapper "xvfb-run -a"`. '
|
|
292
|
+
"Split like a shell command. Applies only to commands that execute Robot Framework "
|
|
293
|
+
"(run/debug/repl). Overrides the profile's `wrapper`.",
|
|
294
|
+
)
|
|
295
|
+
@click.option(
|
|
296
|
+
"--no-wrapper",
|
|
297
|
+
is_flag=True,
|
|
298
|
+
help="Disable any configured `wrapper` (profile or --wrapper) for this run.",
|
|
299
|
+
)
|
|
132
300
|
@click.option("--log", is_flag=True, help="Enables logging.", show_envvar=True)
|
|
133
301
|
@click.option(
|
|
134
302
|
"--log-level",
|
|
@@ -230,7 +398,9 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
230
398
|
)
|
|
231
399
|
@click.version_option(version=__version__, prog_name="robotcode")
|
|
232
400
|
@pass_application
|
|
401
|
+
@click.pass_context
|
|
233
402
|
def robotcode(
|
|
403
|
+
ctx: click.Context,
|
|
234
404
|
app: Application,
|
|
235
405
|
config_files: Optional[List[Path]],
|
|
236
406
|
profiles: Optional[List[str]],
|
|
@@ -249,6 +419,8 @@ def robotcode(
|
|
|
249
419
|
log_calls: bool,
|
|
250
420
|
log_config: Optional[Path],
|
|
251
421
|
default_path: Optional[List[str]],
|
|
422
|
+
wrapper: Optional[str] = None,
|
|
423
|
+
no_wrapper: bool = False,
|
|
252
424
|
launcher_script: Optional[str] = None,
|
|
253
425
|
debugpy: bool = False,
|
|
254
426
|
debugpy_port: int = 5678,
|
|
@@ -295,6 +467,8 @@ def robotcode(
|
|
|
295
467
|
app.config.log_level = log_level
|
|
296
468
|
app.config.log_calls = log_calls
|
|
297
469
|
|
|
470
|
+
_maybe_reexec_under_wrapper(ctx, app, wrapper, no_wrapper)
|
|
471
|
+
|
|
298
472
|
if log_config:
|
|
299
473
|
if log_calls:
|
|
300
474
|
LoggingDescriptor.set_call_tracing(True)
|
robotcode/cli/__version__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2.
|
|
1
|
+
__version__ = "2.8.0-dev.548"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: robotcode
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.8.0-dev.548
|
|
4
4
|
Summary: Command line interface for RobotCode
|
|
5
5
|
Project-URL: Homepage, https://robotcode.io
|
|
6
6
|
Project-URL: Donate, https://opencollective.com/robotcode
|
|
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.12
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.13
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.14
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
26
27
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
27
28
|
Classifier: Topic :: Software Development :: Debuggers
|
|
28
29
|
Classifier: Topic :: Software Development :: Quality Assurance
|
|
@@ -33,35 +34,35 @@ Classifier: Topic :: Text Editors :: Integrated Development Environments (IDE)
|
|
|
33
34
|
Classifier: Topic :: Utilities
|
|
34
35
|
Classifier: Typing :: Typed
|
|
35
36
|
Requires-Python: >=3.10
|
|
36
|
-
Requires-Dist: robotcode-core==2.
|
|
37
|
-
Requires-Dist: robotcode-plugin==2.
|
|
38
|
-
Requires-Dist: robotcode-robot==2.
|
|
37
|
+
Requires-Dist: robotcode-core==2.8.0-dev.548
|
|
38
|
+
Requires-Dist: robotcode-plugin==2.8.0-dev.548
|
|
39
|
+
Requires-Dist: robotcode-robot==2.8.0-dev.548
|
|
39
40
|
Provides-Extra: all
|
|
40
41
|
Requires-Dist: docutils; extra == 'all'
|
|
41
42
|
Requires-Dist: pyyaml>=5.4; extra == 'all'
|
|
42
|
-
Requires-Dist: robotcode-analyze==2.
|
|
43
|
-
Requires-Dist: robotcode-debugger==2.
|
|
44
|
-
Requires-Dist: robotcode-language-server==2.
|
|
45
|
-
Requires-Dist: robotcode-repl-server==2.
|
|
46
|
-
Requires-Dist: robotcode-repl==2.
|
|
47
|
-
Requires-Dist: robotcode-runner==2.
|
|
43
|
+
Requires-Dist: robotcode-analyze==2.8.0-dev.548; extra == 'all'
|
|
44
|
+
Requires-Dist: robotcode-debugger==2.8.0-dev.548; extra == 'all'
|
|
45
|
+
Requires-Dist: robotcode-language-server==2.8.0-dev.548; extra == 'all'
|
|
46
|
+
Requires-Dist: robotcode-repl-server==2.8.0-dev.548; extra == 'all'
|
|
47
|
+
Requires-Dist: robotcode-repl==2.8.0-dev.548; extra == 'all'
|
|
48
|
+
Requires-Dist: robotcode-runner==2.8.0-dev.548; extra == 'all'
|
|
48
49
|
Requires-Dist: robotframework-robocop>=6.0.0; extra == 'all'
|
|
49
50
|
Provides-Extra: analyze
|
|
50
|
-
Requires-Dist: robotcode-analyze==2.
|
|
51
|
+
Requires-Dist: robotcode-analyze==2.8.0-dev.548; extra == 'analyze'
|
|
51
52
|
Provides-Extra: debugger
|
|
52
|
-
Requires-Dist: robotcode-debugger==2.
|
|
53
|
+
Requires-Dist: robotcode-debugger==2.8.0-dev.548; extra == 'debugger'
|
|
53
54
|
Provides-Extra: languageserver
|
|
54
|
-
Requires-Dist: robotcode-language-server==2.
|
|
55
|
+
Requires-Dist: robotcode-language-server==2.8.0-dev.548; extra == 'languageserver'
|
|
55
56
|
Provides-Extra: lint
|
|
56
57
|
Requires-Dist: robotframework-robocop>=2.0.0; extra == 'lint'
|
|
57
58
|
Provides-Extra: repl
|
|
58
|
-
Requires-Dist: robotcode-repl==2.
|
|
59
|
+
Requires-Dist: robotcode-repl==2.8.0-dev.548; extra == 'repl'
|
|
59
60
|
Provides-Extra: replserver
|
|
60
|
-
Requires-Dist: robotcode-repl-server==2.
|
|
61
|
+
Requires-Dist: robotcode-repl-server==2.8.0-dev.548; extra == 'replserver'
|
|
61
62
|
Provides-Extra: rest
|
|
62
63
|
Requires-Dist: docutils; extra == 'rest'
|
|
63
64
|
Provides-Extra: runner
|
|
64
|
-
Requires-Dist: robotcode-runner==2.
|
|
65
|
+
Requires-Dist: robotcode-runner==2.8.0-dev.548; extra == 'runner'
|
|
65
66
|
Provides-Extra: yaml
|
|
66
67
|
Requires-Dist: pyyaml>=5.4; extra == 'yaml'
|
|
67
68
|
Description-Content-Type: text/markdown
|
|
@@ -69,7 +70,7 @@ Description-Content-Type: text/markdown
|
|
|
69
70
|
# RobotCode - The Ultimate Robot Framework Toolset
|
|
70
71
|
|
|
71
72
|
[](https://github.com/robotcodedev/robotcode/blob/main/LICENSE)
|
|
72
|
-
[](https://github.com/robotcodedev/robotcode/actions/workflows/build-test-package.yml)
|
|
73
74
|
[](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode)
|
|
74
75
|
[](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode)
|
|
75
76
|
[](https://plugins.jetbrains.com/plugin/26216)
|
|
@@ -131,9 +132,22 @@ For the complete feature reference, see the [official documentation](https://rob
|
|
|
131
132
|
- Python 3.10 or newer
|
|
132
133
|
- Robot Framework 5.0 or newer
|
|
133
134
|
|
|
135
|
+
**Supported combinations:** each Robot Framework version is supported with the Python versions that it officially supports itself:
|
|
136
|
+
|
|
137
|
+
| Robot Framework | Python |
|
|
138
|
+
|---|---|
|
|
139
|
+
| 5.0 | 3.10 |
|
|
140
|
+
| 6.0 | 3.10 – 3.11 |
|
|
141
|
+
| 6.1, 7.0 | 3.10 – 3.12 |
|
|
142
|
+
| 7.1, 7.2 | 3.10 – 3.13 |
|
|
143
|
+
| 7.3, 7.4 | 3.10 – 3.14 |
|
|
144
|
+
| 7.5 | 3.10 – 3.15 |
|
|
145
|
+
|
|
146
|
+
RobotCode's CI tests only these combinations, to keep the effort low. Other combinations may work, but using them is your own responsibility. For example, Robot Framework versions before 7.5 may not work with Python 3.15.
|
|
147
|
+
|
|
134
148
|
**Editor / IDE — any LSP-capable editor works.** For the dedicated extensions you need one of:
|
|
135
|
-
- Visual Studio Code 1.
|
|
136
|
-
- PyCharm / IntelliJ IDEA
|
|
149
|
+
- Visual Studio Code 1.127.0 or newer
|
|
150
|
+
- PyCharm / IntelliJ IDEA 2026.1 or newer
|
|
137
151
|
|
|
138
152
|
Other editors (Neovim, Sublime Text, Helix, Emacs, …) connect to the language server via the `languageserver` extra from PyPI — see [Command Line and Other Editors](#command-line-and-other-editors) below.
|
|
139
153
|
|
|
@@ -143,7 +157,7 @@ Other editors (Neovim, Sublime Text, Helix, Emacs, …) connect to the language
|
|
|
143
157
|
### Visual Studio Code
|
|
144
158
|
|
|
145
159
|
1. **Install the RobotCode Extension** from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode).
|
|
146
|
-
2. **Continue with the [Getting Started Guide](https://robotcode.io/
|
|
160
|
+
2. **Continue with the [Getting Started Guide](https://robotcode.io/getting-started/)** for setup, your first `robot.toml`, and running your first test.
|
|
147
161
|
|
|
148
162
|
**Extensions:**
|
|
149
163
|
RobotCode declares dependencies on the [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) and [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) extensions so VS Code installs them when required. Additional extensions may be needed depending on your project.
|
|
@@ -157,7 +171,7 @@ RobotCode declares dependencies on the [Python](https://marketplace.visualstudio
|
|
|
157
171
|
- **[JetBrains Marketplace](https://plugins.jetbrains.com/plugin/26216):** click <kbd>Install to ...</kbd> if your IDE is running.
|
|
158
172
|
- **Manual:** download the [latest release](https://github.com/robotcodedev/robotcode/releases/latest) and use <kbd>Settings/Preferences</kbd> > <kbd>Plugins</kbd> > <kbd>⚙️</kbd> > <kbd>Install plugin from disk...</kbd>.
|
|
159
173
|
|
|
160
|
-
2. **Continue with the [Getting Started Guide](https://robotcode.io/
|
|
174
|
+
2. **Continue with the [Getting Started Guide](https://robotcode.io/getting-started/)** for setup, your first `robot.toml`, and running your first test.
|
|
161
175
|
|
|
162
176
|
**Plugins:**
|
|
163
177
|
RobotCode declares a dependency on [LSP4IJ](https://plugins.jetbrains.com/plugin/23257) so your IDE installs it automatically. Additional plugins may be required depending on your project needs.
|
|
@@ -168,10 +182,10 @@ RobotCode declares a dependency on [LSP4IJ](https://plugins.jetbrains.com/plugin
|
|
|
168
182
|
For CI pipelines, the command line, or LSP-compatible editors like Neovim, Sublime Text, or Helix, install RobotCode from PyPI. The base `robotcode` package is only the CLI core; the actual commands live in extras such as `runner`, `analyze`, `debugger`, `languageserver`, and `repl`:
|
|
169
183
|
|
|
170
184
|
```bash
|
|
171
|
-
pip install robotcode[runner,analyze]
|
|
185
|
+
pip install "robotcode[runner,analyze]"
|
|
172
186
|
```
|
|
173
187
|
|
|
174
|
-
Pick the extras that match your use case — see the [CLI reference](https://robotcode.io/
|
|
188
|
+
Pick the extras that match your use case — see the [CLI reference](https://robotcode.io/reference/cli/) for the available packages and how to install them.
|
|
175
189
|
|
|
176
190
|
|
|
177
191
|
## Documentation
|
|
@@ -179,10 +193,10 @@ Pick the extras that match your use case — see the [CLI reference](https://rob
|
|
|
179
193
|
For detailed instructions, visit our **[official documentation](https://robotcode.io)**. Additional resources:
|
|
180
194
|
|
|
181
195
|
- **[Q&A](https://github.com/robotcodedev/robotcode/discussions/categories/q-a):** Answers to common questions about RobotCode.
|
|
182
|
-
- **[
|
|
183
|
-
- **[Command Line Tools Reference](https://robotcode.io/
|
|
196
|
+
- **[Guides](https://robotcode.io/guides/):** How to use RobotCode's commands and set up projects, plus common pitfalls and editor customization.
|
|
197
|
+
- **[Command Line Tools Reference](https://robotcode.io/reference/cli/):** Comprehensive documentation on using RobotCode's CLI tools.
|
|
184
198
|
- **[Changelog](https://github.com/robotcodedev/robotcode/blob/main/CHANGELOG.md):** Track changes, updates, and new features in each release.
|
|
185
|
-
- **[Support & Contribute](https://robotcode.io/
|
|
199
|
+
- **[Support & Contribute](https://robotcode.io/contributing/):** Ways to back the project — financial, code, feedback.
|
|
186
200
|
|
|
187
201
|
|
|
188
202
|
## Sponsor RobotCode
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
robotcode/cli/__init__.py,sha256=kdPYL7SnMNmVf6jZ0p7xAvHIFKo5aUxWMt9TwLcd1Sw,18158
|
|
2
|
+
robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
|
|
3
|
+
robotcode/cli/__version__.py,sha256=4qGR5Sg7VszfoERVpnszHJ_tsWJ0G_bUZdheH0_dqx4,30
|
|
4
|
+
robotcode/cli/py.typed,sha256=bWew9mHgMy8LqMu7RuqQXFXLBxh2CRx0dUbSx-3wE48,27
|
|
5
|
+
robotcode/cli/commands/__init__.py,sha256=XJHRt_YwMO2Ni2EfL2aj4jkJXMVG6NGFTpzvSVgIRnQ,92
|
|
6
|
+
robotcode/cli/commands/config.py,sha256=0Jmf7HDIo7IIaOMU9M_bYi7PdHAfcae6x3SW93NA3EA,10481
|
|
7
|
+
robotcode/cli/commands/profiles.py,sha256=5H9lvSVCMggWXf0IH54QtgDgqupEEvpcUrEsTZvZsNM,6127
|
|
8
|
+
robotcode-2.8.0.dev548.dist-info/METADATA,sha256=sWcpdNk6G0XUk_HjAEqZbDLS5_q8WwT40iqH-u42p7g,15310
|
|
9
|
+
robotcode-2.8.0.dev548.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
10
|
+
robotcode-2.8.0.dev548.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
|
|
11
|
+
robotcode-2.8.0.dev548.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
12
|
+
robotcode-2.8.0.dev548.dist-info/RECORD,,
|
robotcode-2.6.2.dist-info/RECORD
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
robotcode/cli/__init__.py,sha256=-zPNouLiGkJg8KKz6gVzyVm47dXHqM-zv2gJV3r-n7Y,10254
|
|
2
|
-
robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
|
|
3
|
-
robotcode/cli/__version__.py,sha256=53Sii4w6BIWn-1RhaTyqUO46gDe4nDCRQDAcpsWFH24,22
|
|
4
|
-
robotcode/cli/py.typed,sha256=bWew9mHgMy8LqMu7RuqQXFXLBxh2CRx0dUbSx-3wE48,27
|
|
5
|
-
robotcode/cli/commands/__init__.py,sha256=XJHRt_YwMO2Ni2EfL2aj4jkJXMVG6NGFTpzvSVgIRnQ,92
|
|
6
|
-
robotcode/cli/commands/config.py,sha256=0Jmf7HDIo7IIaOMU9M_bYi7PdHAfcae6x3SW93NA3EA,10481
|
|
7
|
-
robotcode/cli/commands/profiles.py,sha256=5H9lvSVCMggWXf0IH54QtgDgqupEEvpcUrEsTZvZsNM,6127
|
|
8
|
-
robotcode-2.6.2.dist-info/METADATA,sha256=OV5izStIuVLT677FLY1vM3MUTPLaRqb7ESS-cm3LkXU,14582
|
|
9
|
-
robotcode-2.6.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
10
|
-
robotcode-2.6.2.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
|
|
11
|
-
robotcode-2.6.2.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
12
|
-
robotcode-2.6.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|