robotcode 2.8.0.dev677__py3-none-any.whl → 2.9.0.dev51__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 +89 -128
- robotcode/cli/__version__.py +1 -1
- robotcode/cli/commands/profiles.py +16 -1
- {robotcode-2.8.0.dev677.dist-info → robotcode-2.9.0.dev51.dist-info}/METADATA +18 -18
- robotcode-2.9.0.dev51.dist-info/RECORD +12 -0
- {robotcode-2.8.0.dev677.dist-info → robotcode-2.9.0.dev51.dist-info}/WHEEL +1 -1
- robotcode-2.8.0.dev677.dist-info/RECORD +0 -12
- {robotcode-2.8.0.dev677.dist-info → robotcode-2.9.0.dev51.dist-info}/entry_points.txt +0 -0
- {robotcode-2.8.0.dev677.dist-info → robotcode-2.9.0.dev51.dist-info}/licenses/LICENSE.txt +0 -0
robotcode/cli/__init__.py
CHANGED
|
@@ -2,11 +2,8 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import logging.config
|
|
4
4
|
import os
|
|
5
|
-
import shlex
|
|
6
|
-
import subprocess
|
|
7
|
-
import sys
|
|
8
5
|
from pathlib import Path
|
|
9
|
-
from typing import IO, Any, List, Literal, Optional
|
|
6
|
+
from typing import IO, Any, List, Literal, Mapping, Optional
|
|
10
7
|
|
|
11
8
|
import click
|
|
12
9
|
|
|
@@ -17,12 +14,13 @@ from robotcode.plugin import (
|
|
|
17
14
|
ColoredOutput,
|
|
18
15
|
OutputFormat,
|
|
19
16
|
pass_application,
|
|
17
|
+
show_error,
|
|
20
18
|
)
|
|
21
19
|
from robotcode.plugin._agent_detection import is_running_in_ai_agent
|
|
22
20
|
from robotcode.plugin.click_helper.aliases import AliasedGroup
|
|
23
21
|
from robotcode.plugin.click_helper.exit_codes import has_robot_exit_codes
|
|
24
22
|
from robotcode.plugin.click_helper.types import EnumChoice
|
|
25
|
-
from robotcode.plugin.click_helper.wrappable import WRAPPER_APPLIED_ENV, is_wrappable
|
|
23
|
+
from robotcode.plugin.click_helper.wrappable import WRAPPER_APPLIED_ENV, invoked_command_is_wrappable, is_wrappable
|
|
26
24
|
from robotcode.plugin.manager import PluginManager
|
|
27
25
|
|
|
28
26
|
from .__version__ import __version__
|
|
@@ -51,125 +49,77 @@ class RobotCodeFormatter(logging.Formatter):
|
|
|
51
49
|
super().__init__(*args, defaults=defaults, **kwargs)
|
|
52
50
|
|
|
53
51
|
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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.
|
|
52
|
+
def _warn_about_ignored_wrapper(ctx: click.Context, app: Application) -> None:
|
|
53
|
+
"""Warn about a ``--wrapper`` that does not apply.
|
|
54
|
+
|
|
55
|
+
The command itself starts robotcode under the ``wrapper``, once it has loaded its
|
|
56
|
+
configuration (see `robotcode.plugin.click_helper.wrappable.run_under_wrapper`).
|
|
67
57
|
"""
|
|
68
|
-
if no_wrapper:
|
|
69
|
-
if
|
|
58
|
+
if app.config.no_wrapper:
|
|
59
|
+
if app.config.wrapper:
|
|
70
60
|
app.warning("Ignoring --wrapper because --no-wrapper was given.")
|
|
71
61
|
return
|
|
72
|
-
if os.environ.get(WRAPPER_APPLIED_ENV):
|
|
62
|
+
if not app.config.wrapper or os.environ.get(WRAPPER_APPLIED_ENV) or not ctx.invoked_subcommand:
|
|
73
63
|
return
|
|
64
|
+
if not invoked_command_is_wrappable(ctx):
|
|
65
|
+
app.warning(f"Ignoring --wrapper: '{ctx.invoked_subcommand}' does not execute Robot Framework.")
|
|
74
66
|
|
|
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
67
|
|
|
86
|
-
|
|
87
|
-
from
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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]
|
|
68
|
+
def _set_output_options(app: Application, color: Optional[bool], pager: Optional[bool]) -> None:
|
|
69
|
+
"""Set the colour and pager choice of `app` from `--color/--no-color` and `--pager/--no-pager`."""
|
|
70
|
+
if color is None:
|
|
71
|
+
app.config.colored_output = ColoredOutput.AUTO
|
|
72
|
+
elif color:
|
|
73
|
+
app.config.colored_output = ColoredOutput.YES
|
|
121
74
|
else:
|
|
122
|
-
|
|
75
|
+
app.config.colored_output = ColoredOutput.NO
|
|
76
|
+
app.config.pager = pager
|
|
123
77
|
|
|
124
|
-
#
|
|
125
|
-
#
|
|
126
|
-
#
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
78
|
+
# AI-agent auto-detect: when running inside a known agent session
|
|
79
|
+
# (Claude Code, Copilot, OpenCode, …) demote colour and pager
|
|
80
|
+
# defaults so the agent's stdout capture stays clean. Explicit CLI
|
|
81
|
+
# flags and `NO_COLOR` / `FORCE_COLOR` keep their precedence.
|
|
82
|
+
if is_running_in_ai_agent():
|
|
83
|
+
if color is None and not os.environ.get("NO_COLOR") and not os.environ.get("FORCE_COLOR"):
|
|
84
|
+
app.config.colored_output = ColoredOutput.NO
|
|
85
|
+
if pager is None:
|
|
86
|
+
app.config.pager = False
|
|
130
87
|
|
|
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
88
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
"""
|
|
89
|
+
def _application_for(params: Mapping[str, Any]) -> Application:
|
|
90
|
+
"""An `Application` for an error that comes before the root command has set one up,
|
|
91
|
+
set up from robotcode's own options `params` as far as they are known."""
|
|
92
|
+
app = Application()
|
|
93
|
+
_set_output_options(app, params.get("color"), params.get("pager"))
|
|
94
|
+
return app
|
|
95
|
+
|
|
164
96
|
|
|
165
|
-
|
|
97
|
+
class RobotCodeError(click.ClickException):
|
|
98
|
+
"""An error that stops a robotcode command, written as robotcode writes the errors it
|
|
99
|
+
reports (`robotcode.plugin.show_error`). Keeps the exit code of the error."""
|
|
166
100
|
|
|
167
|
-
def __init__(self, error: click.ClickException) -> None:
|
|
101
|
+
def __init__(self, error: click.ClickException, app: Application) -> None:
|
|
168
102
|
super().__init__(error.message)
|
|
169
103
|
self.error = error
|
|
104
|
+
self.app = app
|
|
105
|
+
# click declares the exit code on the class; this one is the code of the error
|
|
106
|
+
self.exit_code = error.exit_code # type: ignore[misc]
|
|
170
107
|
|
|
171
108
|
def show(self, file: Optional[IO[Any]] = None) -> None:
|
|
172
|
-
self.error
|
|
109
|
+
show_error(self.app, self.error, file)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class RobotDataError(RobotCodeError):
|
|
113
|
+
"""An error robotcode reports itself for a command that passes on Robot Framework's
|
|
114
|
+
exit codes.
|
|
115
|
+
|
|
116
|
+
Exits with Robot Framework's code for invalid data or command line options instead of
|
|
117
|
+
Click's 1 or 2.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
def __init__(self, error: click.ClickException, app: Application) -> None:
|
|
121
|
+
super().__init__(error, app)
|
|
122
|
+
self.exit_code = 252 # type: ignore[misc]
|
|
173
123
|
|
|
174
124
|
|
|
175
125
|
class RobotCodeGroup(AliasedGroup):
|
|
@@ -182,15 +132,40 @@ class RobotCodeGroup(AliasedGroup):
|
|
|
182
132
|
invalid option - exits with Robot Framework's 252 instead. Robot Framework's own exit
|
|
183
133
|
codes never arrive as Click errors, so they pass through unchanged, and so does any
|
|
184
134
|
other code.
|
|
135
|
+
|
|
136
|
+
Every Click error of a command or of the group's own options is written as
|
|
137
|
+
`[ ERROR ] <message>`, with the `Application` of the command. An error that comes
|
|
138
|
+
before the root command has set it up - a command name that does not exist or is
|
|
139
|
+
missing, an invalid option of robotcode itself - gets one set up from robotcode's own
|
|
140
|
+
options, so that `--no-color` and AI-agent sessions apply to it too.
|
|
185
141
|
"""
|
|
186
142
|
|
|
143
|
+
def make_context(
|
|
144
|
+
self, info_name: Optional[str], args: List[str], parent: Optional[click.Context] = None, **extra: Any
|
|
145
|
+
) -> click.Context:
|
|
146
|
+
# Click's parser takes the arguments out of the list it gets
|
|
147
|
+
command_line = list(args)
|
|
148
|
+
try:
|
|
149
|
+
return super().make_context(info_name, args, parent, **extra)
|
|
150
|
+
except click.ClickException as e:
|
|
151
|
+
# Click stops at an invalid option before it takes any value; read robotcode's
|
|
152
|
+
# own options again as Click's shell completion does, without errors or
|
|
153
|
+
# callbacks, passing over unknown options
|
|
154
|
+
lenient = {**extra, "resilient_parsing": True, "ignore_unknown_options": True}
|
|
155
|
+
try:
|
|
156
|
+
params = super().make_context(info_name, command_line, parent, **lenient).params
|
|
157
|
+
except click.ClickException:
|
|
158
|
+
params = {}
|
|
159
|
+
raise RobotCodeError(e, _application_for(params)) from e
|
|
160
|
+
|
|
187
161
|
def invoke(self, ctx: click.Context) -> Any:
|
|
188
162
|
try:
|
|
189
163
|
return super().invoke(ctx)
|
|
190
164
|
except click.ClickException as e:
|
|
165
|
+
app = ctx.find_object(Application) or _application_for(ctx.params)
|
|
191
166
|
if e.exit_code in (1, 2) and self._passes_on_robot_exit_codes(ctx):
|
|
192
|
-
raise RobotDataError(e) from e
|
|
193
|
-
raise
|
|
167
|
+
raise RobotDataError(e, app) from e
|
|
168
|
+
raise RobotCodeError(e, app) from e
|
|
194
169
|
|
|
195
170
|
def _passes_on_robot_exit_codes(self, ctx: click.Context) -> bool:
|
|
196
171
|
name = ctx.invoked_subcommand
|
|
@@ -443,31 +418,17 @@ def robotcode(
|
|
|
443
418
|
app.config.root = root
|
|
444
419
|
app.config.no_vcs = no_vcs
|
|
445
420
|
|
|
446
|
-
|
|
447
|
-
app.config.colored_output = ColoredOutput.AUTO
|
|
448
|
-
elif color:
|
|
449
|
-
app.config.colored_output = ColoredOutput.YES
|
|
450
|
-
else:
|
|
451
|
-
app.config.colored_output = ColoredOutput.NO
|
|
452
|
-
app.config.pager = pager
|
|
453
|
-
|
|
454
|
-
# AI-agent auto-detect: when running inside a known agent session
|
|
455
|
-
# (Claude Code, Copilot, OpenCode, …) demote colour and pager
|
|
456
|
-
# defaults so the agent's stdout capture stays clean. Explicit CLI
|
|
457
|
-
# flags and `NO_COLOR` / `FORCE_COLOR` keep their precedence.
|
|
458
|
-
if is_running_in_ai_agent():
|
|
459
|
-
if color is None and not os.environ.get("NO_COLOR") and not os.environ.get("FORCE_COLOR"):
|
|
460
|
-
app.config.colored_output = ColoredOutput.NO
|
|
461
|
-
if pager is None:
|
|
462
|
-
app.config.pager = False
|
|
421
|
+
_set_output_options(app, color, pager)
|
|
463
422
|
app.config.output_format = format
|
|
464
423
|
app.config.launcher_script = launcher_script
|
|
465
424
|
app.config.default_paths = default_path
|
|
466
425
|
app.config.log_enabled = log
|
|
467
426
|
app.config.log_level = log_level
|
|
468
427
|
app.config.log_calls = log_calls
|
|
428
|
+
app.config.wrapper = wrapper
|
|
429
|
+
app.config.no_wrapper = no_wrapper
|
|
469
430
|
|
|
470
|
-
|
|
431
|
+
_warn_about_ignored_wrapper(ctx, app)
|
|
471
432
|
|
|
472
433
|
if log_config:
|
|
473
434
|
if log_calls:
|
robotcode/cli/__version__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2.
|
|
1
|
+
__version__ = "2.9.0-dev.51"
|
|
@@ -13,6 +13,7 @@ from robotcode.robot.config.loader import (
|
|
|
13
13
|
DiscoverdBy,
|
|
14
14
|
load_robot_config_from_path,
|
|
15
15
|
)
|
|
16
|
+
from robotcode.robot.config.model import UnknownProfile
|
|
16
17
|
from robotcode.robot.config.utils import get_config_files
|
|
17
18
|
|
|
18
19
|
|
|
@@ -85,8 +86,20 @@ def list(app: Application, paths: List[Path], show_hidden: bool = False, sort_by
|
|
|
85
86
|
|
|
86
87
|
config = load_robot_config_from_path(*config_files, verbose_callback=app.verbose)
|
|
87
88
|
|
|
89
|
+
# the editors fill their profile lists with this command, also when their selection names a profile that is
|
|
90
|
+
# gone, so a name that selects no profile is only reported, and those of the selection are listed for them
|
|
91
|
+
unknown_selected: List[str] = []
|
|
92
|
+
|
|
93
|
+
def report_unknown(unknown: UnknownProfile) -> None:
|
|
94
|
+
app.error(unknown.message)
|
|
95
|
+
if unknown.selected:
|
|
96
|
+
unknown_selected.append(unknown.name)
|
|
97
|
+
|
|
88
98
|
_, selected_profiles, enabled_names = config.combine_profiles_ex(
|
|
89
|
-
*(app.config.profiles or []),
|
|
99
|
+
*(app.config.profiles or []),
|
|
100
|
+
verbose_callback=app.verbose,
|
|
101
|
+
error_callback=app.error,
|
|
102
|
+
unknown_profile_callback=report_unknown,
|
|
90
103
|
)
|
|
91
104
|
|
|
92
105
|
selected_names = [k for k in selected_profiles.keys()]
|
|
@@ -121,6 +134,8 @@ def list(app: Application, paths: List[Path], show_hidden: bool = False, sort_by
|
|
|
121
134
|
messages += ["No profiles defined."]
|
|
122
135
|
if messages:
|
|
123
136
|
result["messages"] = messages
|
|
137
|
+
if unknown_selected:
|
|
138
|
+
result["unknownSelected"] = unknown_selected
|
|
124
139
|
|
|
125
140
|
if app.config.output_format is None or app.config.output_format == OutputFormat.TEXT:
|
|
126
141
|
for v in result["profiles"]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: robotcode
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.0-dev.51
|
|
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
|
|
@@ -34,35 +34,35 @@ Classifier: Topic :: Text Editors :: Integrated Development Environments (IDE)
|
|
|
34
34
|
Classifier: Topic :: Utilities
|
|
35
35
|
Classifier: Typing :: Typed
|
|
36
36
|
Requires-Python: >=3.10
|
|
37
|
-
Requires-Dist: robotcode-core==2.
|
|
38
|
-
Requires-Dist: robotcode-plugin==2.
|
|
39
|
-
Requires-Dist: robotcode-robot==2.
|
|
37
|
+
Requires-Dist: robotcode-core==2.9.0-dev.51
|
|
38
|
+
Requires-Dist: robotcode-plugin==2.9.0-dev.51
|
|
39
|
+
Requires-Dist: robotcode-robot==2.9.0-dev.51
|
|
40
40
|
Provides-Extra: all
|
|
41
41
|
Requires-Dist: docutils; extra == 'all'
|
|
42
42
|
Requires-Dist: pyyaml>=5.4; extra == 'all'
|
|
43
|
-
Requires-Dist: robotcode-analyze==2.
|
|
44
|
-
Requires-Dist: robotcode-debugger==2.
|
|
45
|
-
Requires-Dist: robotcode-language-server==2.
|
|
46
|
-
Requires-Dist: robotcode-repl-server==2.
|
|
47
|
-
Requires-Dist: robotcode-repl==2.
|
|
48
|
-
Requires-Dist: robotcode-runner==2.
|
|
43
|
+
Requires-Dist: robotcode-analyze==2.9.0-dev.51; extra == 'all'
|
|
44
|
+
Requires-Dist: robotcode-debugger==2.9.0-dev.51; extra == 'all'
|
|
45
|
+
Requires-Dist: robotcode-language-server==2.9.0-dev.51; extra == 'all'
|
|
46
|
+
Requires-Dist: robotcode-repl-server==2.9.0-dev.51; extra == 'all'
|
|
47
|
+
Requires-Dist: robotcode-repl==2.9.0-dev.51; extra == 'all'
|
|
48
|
+
Requires-Dist: robotcode-runner==2.9.0-dev.51; extra == 'all'
|
|
49
49
|
Requires-Dist: robotframework-robocop>=6.0.0; extra == 'all'
|
|
50
50
|
Provides-Extra: analyze
|
|
51
|
-
Requires-Dist: robotcode-analyze==2.
|
|
51
|
+
Requires-Dist: robotcode-analyze==2.9.0-dev.51; extra == 'analyze'
|
|
52
52
|
Provides-Extra: debugger
|
|
53
|
-
Requires-Dist: robotcode-debugger==2.
|
|
53
|
+
Requires-Dist: robotcode-debugger==2.9.0-dev.51; extra == 'debugger'
|
|
54
54
|
Provides-Extra: languageserver
|
|
55
|
-
Requires-Dist: robotcode-language-server==2.
|
|
55
|
+
Requires-Dist: robotcode-language-server==2.9.0-dev.51; extra == 'languageserver'
|
|
56
56
|
Provides-Extra: lint
|
|
57
57
|
Requires-Dist: robotframework-robocop>=2.0.0; extra == 'lint'
|
|
58
58
|
Provides-Extra: repl
|
|
59
|
-
Requires-Dist: robotcode-repl==2.
|
|
59
|
+
Requires-Dist: robotcode-repl==2.9.0-dev.51; extra == 'repl'
|
|
60
60
|
Provides-Extra: replserver
|
|
61
|
-
Requires-Dist: robotcode-repl-server==2.
|
|
61
|
+
Requires-Dist: robotcode-repl-server==2.9.0-dev.51; extra == 'replserver'
|
|
62
62
|
Provides-Extra: rest
|
|
63
63
|
Requires-Dist: docutils; extra == 'rest'
|
|
64
64
|
Provides-Extra: runner
|
|
65
|
-
Requires-Dist: robotcode-runner==2.
|
|
65
|
+
Requires-Dist: robotcode-runner==2.9.0-dev.51; extra == 'runner'
|
|
66
66
|
Provides-Extra: yaml
|
|
67
67
|
Requires-Dist: pyyaml>=5.4; extra == 'yaml'
|
|
68
68
|
Description-Content-Type: text/markdown
|
|
@@ -185,7 +185,7 @@ For CI pipelines, the command line, or LSP-compatible editors like Neovim, Subli
|
|
|
185
185
|
pip install "robotcode[runner,analyze]"
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
Pick the extras that match your use case — see the
|
|
188
|
+
Pick the extras that match your use case — see [Get Started on the Command Line](https://robotcode.io/getting-started/command-line/) for the commands each extra brings, installing with pip or uv and a first run, and the [CLI reference](https://robotcode.io/reference/cli/) for every command and option.
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
## Documentation
|
|
@@ -193,7 +193,7 @@ Pick the extras that match your use case — see the [CLI reference](https://rob
|
|
|
193
193
|
For detailed instructions, visit our **[official documentation](https://robotcode.io)**. Additional resources:
|
|
194
194
|
|
|
195
195
|
- **[Q&A](https://github.com/robotcodedev/robotcode/discussions/categories/q-a):** Answers to common questions about RobotCode.
|
|
196
|
-
- **[Guides](https://robotcode.io/guides/):** How to
|
|
196
|
+
- **[Guides](https://robotcode.io/guides/):** How to work with RobotCode in VS Code, in PyCharm and on the command line, how to set up projects with `robot.toml`, and tips for Robot Framework code.
|
|
197
197
|
- **[Command Line Tools Reference](https://robotcode.io/reference/cli/):** Comprehensive documentation on using RobotCode's CLI tools.
|
|
198
198
|
- **[Changelog](https://github.com/robotcodedev/robotcode/blob/main/CHANGELOG.md):** Track changes, updates, and new features in each release.
|
|
199
199
|
- **[Support & Contribute](https://robotcode.io/contributing/):** Ways to back the project — financial, code, feedback.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
robotcode/cli/__init__.py,sha256=pJ9qw0tY7Zh8OKFTtMKhFuFSnAGx7_QMx5r-s3d32U4,16394
|
|
2
|
+
robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
|
|
3
|
+
robotcode/cli/__version__.py,sha256=68lI1Ud2IVxiSKwJTXlHsfwV7s6ASsCia4CPMEdJ8Ls,29
|
|
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=tZ8K5KoPkbol4PwTyR3Qleb09CjvrFJaQVbY36MGVGE,6808
|
|
8
|
+
robotcode-2.9.0.dev51.dist-info/METADATA,sha256=RiMZE6goO_jKNNX7hiWLpQ32QfR4d7Jtt1zTbMyDdMQ,15591
|
|
9
|
+
robotcode-2.9.0.dev51.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
|
|
10
|
+
robotcode-2.9.0.dev51.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
|
|
11
|
+
robotcode-2.9.0.dev51.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
12
|
+
robotcode-2.9.0.dev51.dist-info/RECORD,,
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
robotcode/cli/__init__.py,sha256=kdPYL7SnMNmVf6jZ0p7xAvHIFKo5aUxWMt9TwLcd1Sw,18158
|
|
2
|
-
robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
|
|
3
|
-
robotcode/cli/__version__.py,sha256=0xyLlet74gxp40f05fA-fjXhAr2XdtEik3UuIJs6yAM,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.dev677.dist-info/METADATA,sha256=BBaU7KP1vgbgniX1KWl4JPMM2ACV0cf7OELorlcZHHE,15408
|
|
9
|
-
robotcode-2.8.0.dev677.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
10
|
-
robotcode-2.8.0.dev677.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
|
|
11
|
-
robotcode-2.8.0.dev677.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
12
|
-
robotcode-2.8.0.dev677.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|