github-markup 4.0.1 → 5.0.0

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.
@@ -0,0 +1,1303 @@
1
+ <h1>Robot Framework 7.0</h1>
2
+ <p><a href="http://robotframework.org">Robot Framework</a> 7.0 is a new major release with highly enhanced listener interface
3
+ (<a href="https://github.com/robotframework/robotframework/issues/3296">#3296</a>), native <code>VAR</code> syntax for creating variables (<a href="https://github.com/robotframework/robotframework/issues/3761">#3761</a>), support for
4
+ mixing embedded and normal arguments with library keywords (<a href="https://github.com/robotframework/robotframework/issues/4710">#4710</a>), JSON
5
+ result format (<a href="https://github.com/robotframework/robotframework/issues/4847">#4847</a>) and various other enhancements and bug fixes.</p>
6
+ <p>Robot Framework 7.0 was released on Thursday January 11, 2024. Questions and comments
7
+ related to the release can be sent to the <code>#devel</code> channel on <a href="http://slack.robotframework.org">Robot Framework Slack</a>
8
+ and possible bugs submitted to the <a href="https://github.com/robotframework/robotframework/issues">issue tracker</a>.</p>
9
+ <div>
10
+ <ul>
11
+ <li><a href="#installation">Installation</a></li>
12
+ <li>
13
+ <a href="#most-important-enhancements">Most important enhancements</a><ul>
14
+ <li><a href="#listener-enhancements">Listener enhancements</a></li>
15
+ <li><a href="#native-var-syntax">Native <code>VAR</code> syntax</a></li>
16
+ <li><a href="#mixed-argument-support-with-library-keywords">Mixed argument support with library keywords</a></li>
17
+ <li><a href="#json-result-format">JSON result format</a></li>
18
+ <li><a href="#argument-conversion-enhancements">Argument conversion enhancements</a></li>
19
+ <li><a href="#tags-set-globally-can-be-removed-using-tag-syntax">Tags set globally can be removed using <code>-tag</code> syntax</a></li>
20
+ <li><a href="#dynamic-and-hybrid-library-apis-support-asynchronous-execution">Dynamic and hybrid library APIs support asynchronous execution</a></li>
21
+ <li><a href="#timestamps-in-result-model-and-output-xml-use-standard-format">Timestamps in result model and output.xml use standard format</a></li>
22
+ <li><a href="#dark-mode-support-to-report-and-log">Dark mode support to report and log</a></li>
23
+ </ul>
24
+ </li>
25
+ <li>
26
+ <a href="#backwards-incompatible-changes">Backwards incompatible changes</a><ul>
27
+ <li><a href="#python-3-6-and-3-7-are-no-longer-supported">Python 3.6 and 3.7 are no longer supported</a></li>
28
+ <li><a href="#changes-to-output-xml">Changes to output.xml</a></li>
29
+ <li><a href="#changes-to-result-model">Changes to result model</a></li>
30
+ <li><a href="#changes-to-parsing-model">Changes to parsing model</a></li>
31
+ <li><a href="#changes-to-libdoc-spec-files">Changes to Libdoc spec files</a></li>
32
+ <li><a href="#changes-to-selecting-tests-with-suite-test-and-include">Changes to selecting tests with <code>--suite</code>, <code>--test</code> and <code>--include</code></a></li>
33
+ <li><a href="#other-backwards-incompatible-changes">Other backwards incompatible changes</a></li>
34
+ </ul>
35
+ </li>
36
+ <li>
37
+ <a href="#deprecations">Deprecations</a><ul>
38
+ <li><a href="#return-setting"><code>[Return]</code> setting</a></li>
39
+ <li><a href="#singular-section-headers">Singular section headers</a></li>
40
+ <li><a href="#deprecated-attributes-in-parsing-running-and-result-models">Deprecated attributes in parsing, running and result models</a></li>
41
+ <li><a href="#other-deprecated-features">Other deprecated features</a></li>
42
+ </ul>
43
+ </li>
44
+ <li><a href="#acknowledgements">Acknowledgements</a></li>
45
+ <li><a href="#full-list-of-fixes-and-enhancements">Full list of fixes and enhancements</a></li>
46
+ </ul>
47
+ </div>
48
+ <a name="installation"></a>
49
+ <h2><a href="#toc-entry-1">Installation</a></h2>
50
+ <p>If you have <a href="http://pip-installer.org">pip</a> installed, just run</p>
51
+ <pre>
52
+ pip install --upgrade robotframework
53
+ </pre>
54
+ <p>to install the latest available stable release or use</p>
55
+ <pre>
56
+ pip install robotframework==7.0
57
+ </pre>
58
+ <p>to install exactly this version. Alternatively you can download the package
59
+ from <a href="https://pypi.python.org/pypi/robotframework">PyPI</a> and install it manually. For more details and other installation
60
+ approaches, see the <a href="../../INSTALL.rst">installation instructions</a>.</p>
61
+ <a name="most-important-enhancements"></a>
62
+ <h2><a href="#toc-entry-2">Most important enhancements</a></h2>
63
+ <blockquote>
64
+ <p>If you are interested to learn more about the new features in Robot Framework 7.0,
65
+ join the <a href="https://robocon.io">RoboCon conference</a> in February, 2024. <a href="https://github.com/pekkaklarck">Pekka Klärck</a>, Robot Framework
66
+ lead developer, will go through the key features briefly in the <a href="https://robocon.io/#live-opening-the-conference">onsite conference</a>
67
+ in Helsinki and more thoroughly in the <a href="https://robocon.io/#online-opening-the-conference-live">online edition</a>.</p>
68
+ <p>The conference has also dozens of other great talks, workshops and a lot of
69
+ possibilities to meet other community members as well as developers of various
70
+ tools and libraries in the ecosystem. All profits from the conference will be
71
+ used for future Robot Framework development.</p>
72
+ </blockquote>
73
+ <a name="listener-enhancements"></a>
74
+ <h3><a href="#toc-entry-3">Listener enhancements</a></h3>
75
+ <p>Robot Framework's <a href="http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#listener-interface">listener interface</a> is a very powerful mechanism to get
76
+ notifications about various events during execution and it also allows modifying
77
+ data and results on the fly. It is not typically directly used by normal Robot
78
+ Framework users, but they are likely to use tools that use it internally.
79
+ The listener API has been significantly enhanced making it possible
80
+ to create even more powerful and interesting tools in the future.</p>
81
+ <a name="support-keywords-and-control-structures-with-listener-version-3"></a>
82
+ <h4>Support keywords and control structures with listener version 3</h4>
83
+ <p>The major limitation with the listener API has been that the listener
84
+ API version 2 only supports getting notifications, not making modifications,
85
+ and that the more powerful listener API version 3 has only supported suites
86
+ and tests/tasks.</p>
87
+ <p>The biggest enhancement in the whole Robot Framework 7.0 is that the listener
88
+ version 3 has been extended to support also keywords and control structures (<a href="https://github.com/robotframework/robotframework/issues/3296">#3296</a>).
89
+ For example, a listener having the following methods prints information
90
+ about started keywords and ended WHILE loops:</p>
91
+ <pre lang="python">
92
+ from robot import result, running
93
+
94
+
95
+ def start_keyword(data: running.Keyword, result: result.Keyword):
96
+ print(f"Keyword '{result.full_name}' used on line {data.lineno} started.")
97
+
98
+
99
+ def end_while(data: running.While, result: result.While):
100
+ print(f"WHILE loop on line {data.lineno} ended with status {result.status} "
101
+ f"after {len(result.body)} iterations.")
102
+ </pre>
103
+ <p>With keyword calls it is possible to also get more information about the actually
104
+ executed keyword. For example, the following listener prints some information
105
+ about the executed keyword and the library it belongs to:</p>
106
+ <pre lang="python">
107
+ from robot.running import Keyword as KeywordData, LibraryKeyword
108
+ from robot.result import Keyword as KeywordResult
109
+
110
+
111
+ def start_library_keyword(data: KeywordData,
112
+ implementation: LibraryKeyword,
113
+ result: KeywordResult):
114
+ library = implementation.owner
115
+ print(f"Keyword '{implementation.name}' is implemented in library "
116
+ f"'{library.name}' at '{implementation.source}' on line "
117
+ f"{implementation.lineno}. The library has {library.scope.name} "
118
+ f"scope and the current instance is {library.instance}.")
119
+ </pre>
120
+ <p>As the above example already illustrated, it is even possible to get an access to
121
+ the actual library instance. This means that listeners can inspect the library
122
+ state and also modify it. With user keywords it is even possible to modify
123
+ the keyword itself or, via the <code>owner</code> resource file, any other keyword in
124
+ the resource file.</p>
125
+ <p>Listeners can also modify results if needed. Possible use cases include hiding
126
+ sensitive information and adding more details to results based on external sources.</p>
127
+ <p>Notice that although listener can change status of any executed keyword or control
128
+ structure, that does not directly affect the status of the executed test. In general
129
+ listeners cannot directly fail keywords so that execution would stop or handle
130
+ failures so that execution would continue. This kind of functionality may be
131
+ added in the future if there are needs.</p>
132
+ <p>The new listener version 3 methods are so powerful and versatile that going them
133
+ through thoroughly in these release notes is not possible. For more examples, you
134
+ can see the <a href="https://github.com/robotframework/robotframework/tree/master/atest/testdata/output/listener_interface/body_items_v3">acceptance tests</a> using the methods in various interesting and even
135
+ crazy ways.</p>
136
+ <a name="listener-version-3-is-the-default-listener-version"></a>
137
+ <h4>Listener version 3 is the default listener version</h4>
138
+ <p>Earlier listeners always needed to specify the API version they used with the
139
+ <code>ROBOT_LISTENER_API_VERSION</code> attribute. Now that the listener version 3 got
140
+ the new methods, it is considered so much more powerful than the version 2
141
+ that it was made the default listener version (<a href="https://github.com/robotframework/robotframework/issues/4910">#4910</a>).</p>
142
+ <p>The listener version 2 continues to work, but using it requires specifying
143
+ the listener version as earlier. The are no plans to deprecate the listener
144
+ version 2, but we nevertheless highly recommend using the version 3 whenever
145
+ possible.</p>
146
+ <a name="libraries-can-register-themselves-as-listeners-by-using-string-self"></a>
147
+ <h4>Libraries can register themselves as listeners by using string <code>SELF</code>
148
+ </h4>
149
+ <p>Listeners are typically enabled from the command line, but libraries
150
+ can register listeners as well. Often libraries themselves want to act
151
+ as listeners, and that has earlier required using <code>self.ROBOT_LIBRARY_LISTENER = self</code>
152
+ in the <code>__init__</code> method. Robot Framework 7.0 makes it possible to use string
153
+ <code>SELF</code> (case-insensitive) for this purpose as well (<a href="https://github.com/robotframework/robotframework/issues/4910">#4910</a>), which means
154
+ that a listener can be specified as a class attribute and not only in <code>__init__</code>.
155
+ This is especially convenient when using the <code>@library</code> decorator:</p>
156
+ <pre lang="python">
157
+ from robot.api.deco import keyword, library
158
+
159
+
160
+ @library(listener='SELF')
161
+ class Example:
162
+
163
+ def start_suite(self, data, result):
164
+ ...
165
+
166
+ @keyword
167
+ def example(self, arg):
168
+ ...
169
+ </pre>
170
+ <a name="nicer-api-for-modifying-keyword-arguments"></a>
171
+ <h4>Nicer API for modifying keyword arguments</h4>
172
+ <p>Modifying keyword call arguments programmatically has been made more convenient
173
+ (<a href="https://github.com/robotframework/robotframework/issues/5000">#5000</a>). This enhancement eases modifying arguments using the new listener
174
+ version 3 <code>start/end_keyword</code> methods.</p>
175
+ <a name="paths-are-passed-to-version-3-listeners-as-pathlib-path-objects"></a>
176
+ <h4>Paths are passed to version 3 listeners as <code>pathlib.Path</code> objects</h4>
177
+ <p>Listeners have methods like <code>output_file</code> and <code>log_file</code> that are called when
178
+ result files are ready so that they get the file path as an argument. Earlier
179
+ paths were strings, but nowadays listener version 3 methods get them as
180
+ more convenient <a href="https://docs.python.org/3/library/pathlib.html">pathlib.Path</a> objects.</p>
181
+ <a name="native-var-syntax"></a>
182
+ <h3><a href="#toc-entry-4">Native <code>VAR</code> syntax</a></h3>
183
+ <p>The new <code>VAR</code> syntax (<a href="https://github.com/robotframework/robotframework/issues/3761">#3761</a>) makes it possible to create local variables
184
+ as well as global, suite and test/task scoped variables dynamically during
185
+ execution. The motivation is to have a more convenient syntax than using
186
+ the <code>Set Variable</code> keyword for creating local variables and to unify
187
+ the syntax for creating variables in different scopes. Except for the mandatory
188
+ <code>VAR</code> marker, the syntax is also the same as when creating variables in the
189
+ Variables section. The syntax is best explained with examples:</p>
190
+ <pre lang="robotframework">
191
+ *** Test Cases ***
192
+ Example
193
+ # Create a local variable `${local}` with a value `value`.
194
+ VAR ${local} value
195
+
196
+ # Create a variable that is available throughout the whole suite.
197
+ # Supported scopes are GLOBAL, SUITE, TEST, TASK and LOCAL (default).
198
+ VAR ${suite} value scope=SUITE
199
+
200
+ # Validate created variables.
201
+ Should Be Equal ${local} value
202
+ Should Be Equal ${suite} value
203
+
204
+ Example continued
205
+ # Suite level variables are seen also by subsequent tests.
206
+ Should Be Equal ${suite} value
207
+ </pre>
208
+ <p>When creating <code>${scalar}</code> variables having long values, it is possible to split
209
+ the value to multiple lines. Lines are joined together with a space by default,
210
+ but that can be changed with the <code>separator</code> configuration option. Similarly as
211
+ in the Variables section, it is possible to create also <code>@{list}</code> and <code>&amp;{dict}</code>
212
+ variables. Unlike in the Variables section, variables can be created conditionally
213
+ using IF/ELSE structures:</p>
214
+ <pre lang="robotframework">
215
+ *** Test Cases ***
216
+ Long value
217
+ VAR ${long}
218
+ ... This value is rather long.
219
+ ... It has been split to multiple lines.
220
+ ... Parts will be joined together with a space.
221
+
222
+ Multiline
223
+ VAR ${multiline}
224
+ ... First line.
225
+ ... Second line.
226
+ ... Last line.
227
+ ... separator=\n
228
+
229
+ List
230
+ # Creates a list with three items.
231
+ VAR @{list} a b c
232
+
233
+ Dictionary
234
+ # Creates a dictionary with two items.
235
+ VAR &amp;{dict} key=value second=item
236
+
237
+ Normal IF
238
+ IF 1 &gt; 0
239
+ VAR ${x} true value
240
+ ELSE
241
+ VAR ${x} false value
242
+ END
243
+
244
+ Inline IF
245
+ IF 1 &gt; 0 VAR ${x} true value ELSE VAR ${x} false value
246
+ </pre>
247
+ <a name="mixed-argument-support-with-library-keywords"></a>
248
+ <h3><a href="#toc-entry-5">Mixed argument support with library keywords</a></h3>
249
+ <p>User keywords got support to use both embedded and normal arguments in Robot
250
+ Framework 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4234">#4234</a>) and now that support has been added also to library keywords
251
+ (<a href="https://github.com/robotframework/robotframework/issues/4710">#4710</a>). The syntax works so, that if a function or method implementing a keyword
252
+ accepts more arguments than there are embedded arguments, the remaining arguments
253
+ can be passed in as normal arguments. This is illustrated by the following example
254
+ keyword:</p>
255
+ <pre lang="python">
256
+ @keyword('Number of ${animals} should be')
257
+ def example(animals, count):
258
+ ...
259
+ </pre>
260
+ <p>The above keyword could be used like this:</p>
261
+ <pre lang="robotframework">
262
+ *** Test Cases ***
263
+ Example
264
+ Number of horses should be 2
265
+ Number of horses should be count=2
266
+ Number of dogs should be 3
267
+ </pre>
268
+ <a name="json-result-format"></a>
269
+ <h3><a href="#toc-entry-6">JSON result format</a></h3>
270
+ <p>Robot Framework 6.1 added support to <a href="https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-6.1.rst#json-data-format">convert test/task data to JSON and back</a>
271
+ and Robot Framework 7.0 extends the JSON serialization support to execution results
272
+ (<a href="https://github.com/robotframework/robotframework/issues/4847">#4847</a>). One of the core use cases for data serialization was making it easy to
273
+ transfer data between process and machines, and now it is also easy to pass results
274
+ back.</p>
275
+ <p>Also the built-in Rebot tool that is used for post-processing results supports
276
+ JSON files both in output and in input. Creating JSON output files is done using
277
+ the normal <code>--output</code> option so that the specified file has a <code>.json</code> extension:</p>
278
+ <pre>
279
+ rebot --output output.json output.xml
280
+ </pre>
281
+ <p>When reading output files, JSON files are automatically recognized by
282
+ the extension:</p>
283
+ <pre>
284
+ rebot output.json
285
+ rebot output1.json output2.json
286
+ </pre>
287
+ <p>When combining or merging results, it is possible to mix JSON and XML files:</p>
288
+ <pre>
289
+ rebot output1.xml output2.json
290
+ rebot --merge original.xml rerun.json
291
+ </pre>
292
+ <p>The JSON output file structure is documented in the <code>result.json</code> <a href="https://github.com/robotframework/robotframework/tree/master/doc/schema#readme">schema file</a>.</p>
293
+ <p>The plan is to enhance the support for JSON output files in the future so that
294
+ they could be created already during execution. For more details see issue <a href="https://github.com/robotframework/robotframework/issues/3423">#3423</a>.</p>
295
+ <a name="argument-conversion-enhancements"></a>
296
+ <h3><a href="#toc-entry-7">Argument conversion enhancements</a></h3>
297
+ <p>Automatic argument conversion is a very powerful feature that library developers
298
+ can use to avoid converting arguments manually and to get more useful Libdoc
299
+ documentation. There are two important new enhancements to it.</p>
300
+ <a name="support-for-literal"></a>
301
+ <h4>Support for <code>Literal</code>
302
+ </h4>
303
+ <p>In Python, the <a href="https://docs.python.org/3/library/typing.html#typing.Literal">Literal</a> type makes it possible to type arguments so that type
304
+ checkers accept only certain values. For example, this function only accepts
305
+ strings <code>x</code>, <code>y</code> and <code>z</code>:</p>
306
+ <pre lang="python">
307
+ def example(arg: Literal['x', 'y', 'z']):
308
+ ...
309
+ </pre>
310
+ <p>Robot Framework has been enhanced so that it validates that an argument having
311
+ a <code>Literal</code> type can only be used with the specified values (<a href="https://github.com/robotframework/robotframework/issues/4633">#4633</a>). For
312
+ example, using a keyword with the above implementation with a value <code>xxx</code> would
313
+ fail.</p>
314
+ <p>In addition to validation, arguments are also converted. For example, if an
315
+ argument accepts <code>Literal[-1, 0, 1]</code>, used arguments are converted to
316
+ integers and then validated. In addition to that, string matching is case, space,
317
+ underscore and hyphen insensitive. In all cases exact matches have a precedence
318
+ and the argument that is passed to the keyword is guaranteed to be in the exact
319
+ format used with <code>Literal</code>.</p>
320
+ <p><code>Literal</code> conversion is in many ways similar to <a href="https://docs.python.org/3/library/enum.html">Enum</a> conversion that Robot
321
+ Framework has supported for long time. <code>Enum</code> conversion has benefits like
322
+ being able to use a custom documentation and it is typically better when using
323
+ the same type multiple times. In simple cases being able to just use
324
+ <code>arg: Literal[...]</code> without defining a new type is very convenient, though.</p>
325
+ <a name="support-stringified-types-like-list-int-and-int-float"></a>
326
+ <h4>Support "stringified" types like <code>'list[int]'</code> and <code>'int | float'</code>
327
+ </h4>
328
+ <p>Python's type hinting syntax has evolved so that generic types can be parameterized
329
+ like <code>list[int]</code> (new in <a href="https://peps.python.org/pep-0585">Python 3.9</a>) and unions written as <code>int | float</code>
330
+ (new in <a href="https://peps.python.org/pep-0604">Python 3.10</a>). Using these constructs with older Python versions causes
331
+ errors, but Python type checkers support also "stringified" type hints like
332
+ <code>'list[int]'</code> and <code>'int | float'</code> that work regardless the Python version.</p>
333
+ <p>Support for stringified generics and unions has now been added also to
334
+ Robot Framework's argument conversion (<a href="https://github.com/robotframework/robotframework/issues/4711">#4711</a>). For example,
335
+ the following typing now also works with Python 3.8:</p>
336
+ <pre lang="python">
337
+ def example(a: 'list[int]', b: 'int | float'):
338
+ ...
339
+ </pre>
340
+ <p>These stringified types are also compatible with the Remote library API and other
341
+ scenarios where using actual types is not possible.</p>
342
+ <a name="tags-set-globally-can-be-removed-using-tag-syntax"></a>
343
+ <h3><a href="#toc-entry-8">Tags set globally can be removed using <code>-tag</code> syntax</a></h3>
344
+ <p>Individual tests and keywords can nowadays remove tags that have been set in
345
+ the Settings section with <code>Test Tags</code> or <code>Keyword Tags</code> settings by using
346
+ the <code>-tag</code> syntax with their own <code>[Tags]</code> setting (<a href="https://github.com/robotframework/robotframework/issues/4374">#4374</a>). For example,
347
+ tests <code>T1</code> and <code>T3</code> below get tags <code>all</code> and <code>most</code>, and test <code>T2</code> gets
348
+ tags <code>all</code> and <code>one</code>:</p>
349
+ <pre lang="robotframework">
350
+ *** Settings ***
351
+ Test Tags all most
352
+
353
+ *** Test Cases ***
354
+ T1
355
+ No Operation
356
+ T2
357
+ [Tags] one -most
358
+ No Operation
359
+ T3
360
+ No Operation
361
+ </pre>
362
+ <p>With tests it is possible to get the same effect by using the <code>Default Tags</code>
363
+ setting and overriding it where needed. That syntax is, however, considered
364
+ deprecated (<a href="https://github.com/robotframework/robotframework/issues/4365">#4365</a>) and using the new <code>-tag</code> syntax is recommended. With
365
+ keywords there was no similar functionality earlier.</p>
366
+ <a name="dynamic-and-hybrid-library-apis-support-asynchronous-execution"></a>
367
+ <h3><a href="#toc-entry-9">Dynamic and hybrid library APIs support asynchronous execution</a></h3>
368
+ <p>Dynamic and hybrid libraries nowadays support asynchronous execution.
369
+ In practice the special methods like <code>get_keyword_names</code> and <code>run_keyword</code>
370
+ can be implemented as async methods (<a href="https://github.com/robotframework/robotframework/issues/4803">#4803</a>).</p>
371
+ <p>Async support was added to the normal static library API in Robot Framework
372
+ 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4089">#4089</a>). A bug related to handling asynchronous keywords if execution
373
+ is stopped gracefully has also been fixed (<a href="https://github.com/robotframework/robotframework/issues/4808">#4808</a>).</p>
374
+ <a name="timestamps-in-result-model-and-output-xml-use-standard-format"></a>
375
+ <h3><a href="#toc-entry-10">Timestamps in result model and output.xml use standard format</a></h3>
376
+ <p>Timestamps used in the result model and stored to the output.xml file used custom
377
+ format like <code>20231107 19:57:01.123</code> earlier. Non-standard formats are seldom
378
+ a good idea, and in this case parsing the custom format turned out to be slow
379
+ as well.</p>
380
+ <p>Nowadays the result model stores timestamps as standard <a href="https://docs.python.org/3/library/datetime.html#datetime-objects">datetime</a> objects and
381
+ elapsed times as a <a href="https://docs.python.org/3/library/datetime.html#timedelta-objects">timedelta</a> (<a href="https://github.com/robotframework/robotframework/issues/4258">#4258</a>). This makes creating timestamps and
382
+ operating with them more convenient and considerably faster. The new objects can
383
+ be accessed via <code>start_time</code>, <code>end_time</code> and <code>elapsed_time</code> attributes that were
384
+ added as forward compatibility already in Robot Framework 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4765">#4765</a>).
385
+ Old information is still available via the old <code>starttime</code>, <code>endtime</code> and
386
+ <code>elapsedtime</code> attributes, so this change is fully backwards compatible.</p>
387
+ <p>The timestamp format in output.xml has also been changed from the custom
388
+ <code>YYYYMMDD HH:MM:SS.mmm</code> format to <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> compatible
389
+ <code>YYYY-MM-DDTHH:MM:SS.mmmmmm</code>. Using a standard format makes it
390
+ easier to process output.xml files, but this change also has big positive
391
+ performance effect. Now that the result model stores timestamps as <a href="https://docs.python.org/3/library/datetime.html#datetime-objects">datetime</a>
392
+ objects, formatting and parsing them with the available <a href="https://docs.python.org/3/library/datetime.html#datetime.datetime.isoformat">isoformat()</a> and
393
+ <a href="https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat">fromisoformat()</a> methods is very fast compared to custom formatting and parsing.</p>
394
+ <p>A related change is that instead of storing start and end times of each executed
395
+ item in output.xml, we nowadays store their start and elapsed times. Elapsed times
396
+ are represented as floats denoting seconds. Having elapsed times directly available
397
+ is a lot more convenient than calculating them based on start and end times.
398
+ Storing start and elapsed times also takes less space than storing start and end times.</p>
399
+ <p>As the result of these changes, times are available in the result model and in
400
+ output.xml in higher precision than earlier. Earlier times were stored in millisecond
401
+ granularity, but nowadays they use microseconds. Logs and reports still use milliseconds,
402
+ but that can be changed in the future if there are needs.</p>
403
+ <p>Changes to output.xml are backwards incompatible and affect all external tools
404
+ that process timestamps. This is discussed more in <a href="#changes-to-output-xml">Changes to output.xml</a>
405
+ section below along with other output.xml changes.</p>
406
+ <a name="dark-mode-support-to-report-and-log"></a>
407
+ <h3><a href="#toc-entry-11">Dark mode support to report and log</a></h3>
408
+ <p>Report and log got a new dark mode (<a href="https://github.com/robotframework/robotframework/issues/3725">#3725</a>). It is enabled automatically based
409
+ on browser and operating system preferences, but there is also a toggle to
410
+ switch between the modes.</p>
411
+ <a name="backwards-incompatible-changes"></a>
412
+ <h2><a href="#toc-entry-12">Backwards incompatible changes</a></h2>
413
+ <a name="python-3-6-and-3-7-are-no-longer-supported"></a>
414
+ <h3><a href="#toc-entry-13">Python 3.6 and 3.7 are no longer supported</a></h3>
415
+ <p>Robot Framework 7.0 requires Python 3.8 or newer (<a href="https://github.com/robotframework/robotframework/issues/4294">#4294</a>). The last version
416
+ that supports Python 3.6 and 3.7 is Robot Framework 6.1.1.</p>
417
+ <a name="changes-to-output-xml"></a>
418
+ <h3><a href="#toc-entry-14">Changes to output.xml</a></h3>
419
+ <p>The output.xml file has changed in different ways making Robot Framework 7.0
420
+ incompatible with external tools processing output.xml files until these tools
421
+ are updated. We try to avoid this kind of breaking changes, but in this case
422
+ especially the changes to timestamps were considered so important that we
423
+ eventually would have needed to do them anyway.</p>
424
+ <p>Due to the changes being relatively big, it can take some time before external
425
+ tools are updated. To allow users to take Robot Framework 7.0 into use also
426
+ if they depend on an incompatible tool, it is possible to use the new
427
+ <code>--legacy-output</code> option both as part of execution and with the Rebot tool
428
+ to generate output.xml files that are compatible with older versions.</p>
429
+ <a name="timestamp-related-changes"></a>
430
+ <h4>Timestamp related changes</h4>
431
+ <p>The biggest changes in output.xml are related to timestamps (<a href="https://github.com/robotframework/robotframework/issues/4258">#4258</a>).
432
+ With earlier versions start and end times of executed items, as well as timestamps
433
+ of the logged messages, were stored using a custom <code>YYYYMMDD HH:MM:SS.mmm</code> format,
434
+ but nowadays the format is <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> compatible <code>YYYY-MM-DDTHH:MM:SS.mmmmmm</code>.
435
+ In addition to that, instead of saving start and end times to <code>starttime</code> and
436
+ <code>endtime</code> attributes and message times to <code>timestamp</code>, start and elapsed times
437
+ are now stored to <code>start</code> and <code>elapsed</code> attributes and message times to <code>time</code>.</p>
438
+ <p>Examples:</p>
439
+ <pre lang="xml">
440
+ &lt;!-- Old format --&gt;
441
+ &lt;msg timestamp="20231108 15:36:34.278" level="INFO"&gt;Hello world!&lt;/msg&gt;
442
+ &lt;status status="PASS" starttime="20231108 15:37:35.046" endtime="20231108 15:37:35.046"/&gt;
443
+
444
+ &lt;!-- New format --&gt;
445
+ &lt;msg time="2023-11-08T15:36:34.278343" level="INFO"&gt;Hello world!&lt;/msg&gt;
446
+ &lt;status status="PASS" start="2023-11-08T15:37:35.046153" elapsed="0.000161"/&gt;
447
+ </pre>
448
+ <p>The new format is standard compliant, contains more detailed times, makes the elapsed
449
+ time directly available and makes the <code>&lt;status&gt;</code> elements over 10% shorter.
450
+ These are all great benefits, but we are still sorry for all the extra work
451
+ this causes for those developing tools that process output.xml files.</p>
452
+ <a name="keyword-name-related-changes"></a>
453
+ <h4>Keyword name related changes</h4>
454
+ <p>How keyword names are stored in output.xml has changed slightly (<a href="https://github.com/robotframework/robotframework/issues/4884">#4884</a>).
455
+ With each executed keywords we store both the name of the keyword and the name
456
+ of the library or resource file containing it. Earlier the latter was stored to
457
+ attribute <code>library</code> also with resource files, but nowadays the attribute is generic
458
+ <code>owner</code>. In addition to <code>owner</code> being a better name in general, it also
459
+ matches the new <code>owner</code> attribute keywords in the result model have.</p>
460
+ <p>Another change is that the original name stored with keywords using embedded
461
+ arguments is nowadays in <code>source_name</code> attribute when it used to be in <code>sourcename</code>.
462
+ This change was done to make the attribute consistent with the attribute in
463
+ the result model.</p>
464
+ <p>Examples:</p>
465
+ <pre lang="xml">
466
+ &lt;!-- Old format --&gt;
467
+ &lt;kw name="Log" library="BuiltIn"&gt;...&lt;/kw&gt;
468
+ &lt;kw name="Number of horses should be" sourcename="Number of ${animals} should be" library="my_resource"&gt;...&lt;/kw&gt;
469
+
470
+ &lt;!-- New format --&gt;
471
+ &lt;kw name="Log" owner="BuiltIn"&gt;...&lt;/kw&gt;
472
+ &lt;kw name="Number of horses should be" source_name="Number of ${animals} should be" owner="my_resource"&gt;...&lt;/kw&gt;
473
+ </pre>
474
+ <a name="other-changes"></a>
475
+ <h4>Other changes</h4>
476
+ <p>Nowadays keywords and control structures can have a message. Messages are represented
477
+ as the text of the <code>&lt;status&gt;</code> element, and they have been present already earlier with
478
+ tests and suites. Related to this, control structured cannot anymore have <code>&lt;doc&gt;</code>.
479
+ (<a href="https://github.com/robotframework/robotframework/issues/4883">#4883</a>)</p>
480
+ <p>These changes should not cause problems for tools processing output.xml files,
481
+ but storing messages with each failed keyword and control structure may
482
+ increase the output.xml size.</p>
483
+ <a name="schema-updates"></a>
484
+ <h4>Schema updates</h4>
485
+ <p>The output.xml schema has been updated and can be found via
486
+ <a href="https://github.com/robotframework/robotframework/tree/master/doc/schema/">https://github.com/robotframework/robotframework/tree/master/doc/schema/</a>.</p>
487
+ <a name="changes-to-result-model"></a>
488
+ <h3><a href="#toc-entry-15">Changes to result model</a></h3>
489
+ <p>There have been some changes to the result model that unfortunately affect
490
+ external tools using it. The main motivation for these changes has been
491
+ cleaning up the model before creating a JSON representation for it (<a href="https://github.com/robotframework/robotframework/issues/4847">#4847</a>).</p>
492
+ <a name="changes-related-to-keyword-names"></a>
493
+ <h4>Changes related to keyword names</h4>
494
+ <p>The biggest changes are related to keyword names (<a href="https://github.com/robotframework/robotframework/issues/4884">#4884</a>). Earlier <code>Keyword</code>
495
+ objects had a <code>name</code> attribute that contained the full keyword name like
496
+ <code>BuiltIn.Log</code>. The actual keyword name and the name of the library or resource
497
+ file that the keyword belonged to were in <code>kwname</code> and <code>libname</code> attributes,
498
+ respectively. In addition to these, keywords using embedded arguments also had
499
+ a <code>sourcename</code> attribute containing the original keyword name.</p>
500
+ <p>Due to reasons explained in <a href="https://github.com/robotframework/robotframework/issues/4884">#4884</a>, the following changes have been made
501
+ in Robot Framework 7.0:</p>
502
+ <ul>
503
+ <li>Old <code>kwname</code> is renamed to <code>name</code>. This is consistent with the execution side <code>Keyword</code>.</li>
504
+ <li>Old <code>libname</code> is renamed to generic <code>owner</code>.</li>
505
+ <li>New <code>full_name</code> is introduced to replace the old <code>name</code>.</li>
506
+ <li>
507
+ <code>sourcename</code> is renamed to <code>source_name</code>.</li>
508
+ <li>
509
+ <code>kwname</code>, <code>libname</code> and <code>sourcename</code> are preserved as properties. They are considered
510
+ deprecated, but accessing them does not cause a deprecation warning yet.</li>
511
+ </ul>
512
+ <p>The backwards incompatible part of this change is changing the meaning of the
513
+ <code>name</code> attribute. It used to be a read-only property yielding the full name
514
+ like <code>BuiltIn.Log</code>, but now it is a normal attribute that contains just the actual
515
+ keyword name like <code>Log</code>. All other old attributes have been preserved as properties
516
+ and code using them does not need to be updated immediately.</p>
517
+ <a name="deprecated-attributes-have-been-removed"></a>
518
+ <h4>Deprecated attributes have been removed</h4>
519
+ <p>The following attributes that were deprecated already in Robot Framework 4.0
520
+ have been removed (<a href="https://github.com/robotframework/robotframework/issues/4846">#4846</a>):</p>
521
+ <ul>
522
+ <li>
523
+ <code>TestSuite.keywords</code>. Use <code>TestSuite.setup</code> and <code>TestSuite.teardown</code> instead.</li>
524
+ <li>
525
+ <code>TestCase.keywords</code>. Use <code>TestCase.body</code>, <code>TestCase.setup</code> and <code>TestCase.teardown</code> instead.</li>
526
+ <li>
527
+ <code>Keyword.keywords</code>. Use <code>Keyword.body</code> and <code>Keyword.teardown</code> instead.</li>
528
+ <li>
529
+ <code>Keyword.children</code>. Use <code>Keyword.body</code> and <code>Keyword.teardown</code> instead.</li>
530
+ <li>
531
+ <code>TestCase.critical</code>. The whole criticality concept has been removed.</li>
532
+ </ul>
533
+ <p>Additionally, <code>TestSuite.keywords</code> and <code>TestCase.keywords</code> have been removed
534
+ from the execution model.</p>
535
+ <a name="changes-to-parsing-model"></a>
536
+ <h3><a href="#toc-entry-16">Changes to parsing model</a></h3>
537
+ <p>There have been some changes also to the parsing model:</p>
538
+ <ul>
539
+ <li>
540
+ <p>The node representing the deprecated <code>[Return]</code> setting has been renamed from
541
+ <code>Return</code> to <code>ReturnSetting</code>. At the same time, the node representing the
542
+ <code>RETURN</code> statement has been renamed from <code>ReturnStatement</code> to <code>Return</code> (<a href="https://github.com/robotframework/robotframework/issues/4939">#4939</a>).</p>
543
+ <p>To ease transition, <code>ReturnSetting</code> has existed as an alias for <code>Return</code> starting
544
+ from Robot Framework 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4656">#4656</a>) and <code>ReturnStatement</code> is preserved as an alias
545
+ now. In addition to that, the <code>ModelVisitor</code> base class has special handling for
546
+ <code>visit_ReturnSetting</code> and <code>visit_ReturnStatement</code> visitor methods so that they work
547
+ correctly with <code>ReturnSetting</code> and <code>ReturnStatement</code> with Robot Framework 6.1 and
548
+ newer. Issue <a href="https://github.com/robotframework/robotframework/issues/4939">#4939</a> explains this in more detail and has a concrete example
549
+ how to support also older Robot Framework versions.</p>
550
+ </li>
551
+ <li>
552
+ <p>The node representing the <code>Test Tags</code> setting as well as the deprecated
553
+ <code>Force Tags</code> setting has been renamed from <code>ForceTags</code> to <code>TestTags</code> (<a href="https://github.com/robotframework/robotframework/issues/4385">#4385</a>).
554
+ <code>ModelVisitor</code> has special handling for the <code>visit_ForceTags</code> method so
555
+ that it will continue to work also after the change.</p>
556
+ </li>
557
+ <li>
558
+ <p>The token type used with <code>AS</code> (or <code>WITH NAME</code>) in library imports has been changed
559
+ to <code>Token.AS</code> (<a href="https://github.com/robotframework/robotframework/issues/4375">#4375</a>). <code>Token.WITH_NAME</code> still exists as an alias for <code>Token.AS</code>.</p>
560
+ </li>
561
+ <li>
562
+ <p>Statement <code>type</code> and <code>tokens</code> have been moved from <code>_fields</code> to <code>_attributes</code> (<a href="https://github.com/robotframework/robotframework/issues/4912">#4912</a>).
563
+ This may affect debugging the model.</p>
564
+ </li>
565
+ </ul>
566
+ <a name="changes-to-libdoc-spec-files"></a>
567
+ <h3><a href="#toc-entry-17">Changes to Libdoc spec files</a></h3>
568
+ <p>The following deprecated constructs have been removed from Libdoc spec files (<a href="https://github.com/robotframework/robotframework/issues/4667">#4667</a>):</p>
569
+ <ul>
570
+ <li>
571
+ <code>datatypes</code> have been removed from XML or JSON spec files. They were deprecated in
572
+ favor of <code>typedocs</code> already in Robot Framework 5.0 (<a href="https://github.com/robotframework/robotframework/issues/4160">#4160</a>).</li>
573
+ <li>Type names are not anymore written to XML specs as content of the <code>&lt;type&gt;</code> elements.
574
+ The name is available as the <code>name</code> attribute of <code>&lt;type&gt;</code> elements since
575
+ Robot Framework 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4538">#4538</a>).</li>
576
+ <li>
577
+ <code>types</code> and <code>typedocs</code> attributes have been removed from arguments in JSON specs.
578
+ The <code>type</code> attribute introduced in RF 6.1 (<a href="https://github.com/robotframework/robotframework/issues/4538">#4538</a>) needs to be used instead.</li>
579
+ </ul>
580
+ <p>Libdoc schema files have been updated and can be found via
581
+ <a href="https://github.com/robotframework/robotframework/tree/master/doc/schema/">https://github.com/robotframework/robotframework/tree/master/doc/schema/</a>.</p>
582
+ <a name="changes-to-selecting-tests-with-suite-test-and-include"></a>
583
+ <h3><a href="#toc-entry-18">Changes to selecting tests with <code>--suite</code>, <code>--test</code> and <code>--include</code></a></h3>
584
+ <p>There are two changes related to selecting tests:</p>
585
+ <ul>
586
+ <li>When using <code>--test</code> and <code>--include</code> together, tests matching either of them
587
+ are selected (<a href="https://github.com/robotframework/robotframework/issues/4721">#4721</a>). Earlier tests need to match both options to be selected.</li>
588
+ <li>When selecting a suite using its parent suite as a prefix like <code>--suite parent.suite</code>,
589
+ the given name must match the full suite name (<a href="https://github.com/robotframework/robotframework/issues/4720">#4720</a>). Earlier it was enough if
590
+ the prefix matched the closest parent or parents.</li>
591
+ </ul>
592
+ <a name="other-backwards-incompatible-changes"></a>
593
+ <h3><a href="#toc-entry-19">Other backwards incompatible changes</a></h3>
594
+ <ul>
595
+ <li>The default value of the <code>stdin</code> argument used with <code>Process</code> library keyword
596
+ has been changed from <code>subprocess.PIPE</code> to <code>None</code> (<a href="https://github.com/robotframework/robotframework/issues/4103">#4103</a>). This change ought
597
+ to avoid processes hanging in some cases. Those who depend on the old behavior
598
+ need to use <code>stdin=PIPE</code> explicitly to enable that.</li>
599
+ <li>When type hints are specified as strings, they must use format <code>type</code>, <code>type[param]</code>,
600
+ <code>type[p1, p2]</code> or <code>t1 | t2</code> (<a href="https://github.com/robotframework/robotframework/issues/4711">#4711</a>). Using other formats will cause errors taking
601
+ keywords into use. In practice problems occur if the special characters <code>[</code>, <code>]</code>, <code>,</code>
602
+ and <code>|</code> occur in unexpected places. For example, <code>arg: "Hello, world!"</code> will cause
603
+ an error due to the comma.</li>
604
+ <li>
605
+ <code>datetime</code>, <code>date</code> and <code>timedelta</code> objects are sent over the Remote interface
606
+ differently than earlier (<a href="https://github.com/robotframework/robotframework/issues/4784">#4784</a>). They all used to be converted to strings, but
607
+ nowadays <code>datetime</code> is sent as-is, <code>date</code> is converted to <code>datetime</code> and sent like
608
+ that, and <code>timedelta</code> is converted to a <code>float</code> by using <code>timedelta.total_seconds()</code>.</li>
609
+ <li>Argument conversion support with <code>collections.abc.ByteString</code> has been removed (<a href="https://github.com/robotframework/robotframework/issues/4983">#4983</a>).
610
+ The reason is that <code>ByteString</code> is deprecated and will be removed in Python 3.14.
611
+ It has not been too often needed, but if you happen to use it, you can change
612
+ <code>arg: ByteString</code> to <code>arg: bytes | bytearray</code> and the functionality
613
+ stays exactly the same.</li>
614
+ <li>Paths passed to result file related listener version 3 methods like <code>output_file</code>
615
+ and <code>log_file</code> have been changed from strings to <code>pathlib.Path</code> objects (<a href="https://github.com/robotframework/robotframework/issues/4988">#4988</a>).
616
+ Most of the time both kinds of paths work interchangeably, so this change is unlikely
617
+ to cause issues. If you need to handle these paths as strings, they can be converted
618
+ by using <code>str(path)</code>.</li>
619
+ <li>
620
+ <code>robot.utils.normalize</code> does not anymore support bytes (<a href="https://github.com/robotframework/robotframework/issues/4936">#4936</a>).</li>
621
+ <li>Deprecated <code>accept_plain_values</code> argument has been removed from the
622
+ <code>timestr_to_secs</code> utility function (<a href="https://github.com/robotframework/robotframework/issues/4861">#4861</a>).</li>
623
+ </ul>
624
+ <a name="deprecations"></a>
625
+ <h2><a href="#toc-entry-20">Deprecations</a></h2>
626
+ <a name="return-setting"></a>
627
+ <h3><a href="#toc-entry-21"><code>[Return]</code> setting</a></h3>
628
+ <p>The <code>[Return]</code> setting for specifying the return value from user keywords has
629
+ been "loudly" deprecated (<a href="https://github.com/robotframework/robotframework/issues/4876">#4876</a>). It has been "silently" deprecated since
630
+ Robot Framework 5.0 when the much more versatile <code>RETURN</code> setting was introduced
631
+ (<a href="https://github.com/robotframework/robotframework/issues/4078">#4078</a>), but now using it will cause a deprecation warning. The plan is to
632
+ preserve the <code>[Return]</code> setting at least until Robot Framework 8.0.</p>
633
+ <p>If you have lot of data that uses <code>[Return]</code>, the easiest way to update it is
634
+ using the <a href="https://robotidy.readthedocs.io">Robotidy</a> tool that can convert <code>[Return]</code> to <code>RETURN</code> automatically.
635
+ If you have data that is executed also with Robot Framework versions that do
636
+ not support <code>RETURN</code>, you can use the <code>Return From Keyword</code> keyword instead.
637
+ That keyword will eventually be deprecated and removed as well, though.</p>
638
+ <a name="singular-section-headers"></a>
639
+ <h3><a href="#toc-entry-22">Singular section headers</a></h3>
640
+ <p>Using singular section headers like <code>*** Test Case ***</code> or <code>*** Setting ***</code>
641
+ nowadays causes a deprecation warning (<a href="https://github.com/robotframework/robotframework/issues/4432">#4432</a>). They were silently deprecated
642
+ in Robot Framework 6.0 for reasons explained in issue <a href="https://github.com/robotframework/robotframework/issues/4431">#4431</a>.</p>
643
+ <a name="deprecated-attributes-in-parsing-running-and-result-models"></a>
644
+ <h3><a href="#toc-entry-23">Deprecated attributes in parsing, running and result models</a></h3>
645
+ <ul>
646
+ <li>In the parsing model, <code>For.variables</code>, <code>ForHeader.variables</code>, <code>Try.variable</code> and
647
+ <code>ExceptHeader.variable</code> attributes have been deprecated in favor of the new <code>assign</code>
648
+ attribute (<a href="https://github.com/robotframework/robotframework/issues/4708">#4708</a>).</li>
649
+ <li>In running and result models, <code>For.variables</code> and <code>TryBranch.variable</code> have been
650
+ deprecated in favor of the new <code>assign</code> attribute (<a href="https://github.com/robotframework/robotframework/issues/4708">#4708</a>).</li>
651
+ <li>In the result model, control structures like <code>FOR</code> were earlier modeled so that they
652
+ looked like keywords. Nowadays they are considered totally different objects and
653
+ their keyword specific attributes <code>name</code>, <code>kwnane</code>, <code>libname</code>, <code>doc</code>, <code>args</code>,
654
+ <code>assign</code>, <code>tags</code> and <code>timeout</code> have been deprecated (<a href="https://github.com/robotframework/robotframework/issues/4846">#4846</a>).</li>
655
+ <li>
656
+ <code>starttime</code>, <code>endtime</code> and <code>elapsed</code> time attributes in the result model have been
657
+ silently deprecated (<a href="https://github.com/robotframework/robotframework/issues/4258">#4258</a>). Accessing them does not yet cause a deprecation
658
+ warning, but users are recommended to use <code>start_time</code>, <code>end_time</code> and
659
+ <code>elapsed_time</code> attributes that are available since Robot Framework 6.1.</li>
660
+ <li>
661
+ <code>kwname</code>, <code>libname</code> and <code>sourcename</code> attributes used by the <code>Keyword</code> object
662
+ in the result model have been silently deprecated (<a href="https://github.com/robotframework/robotframework/issues/4884">#4884</a>). New code should use
663
+ <code>name</code>, <code>owner</code> and <code>source_name</code> instead.</li>
664
+ </ul>
665
+ <a name="other-deprecated-features"></a>
666
+ <h3><a href="#toc-entry-24">Other deprecated features</a></h3>
667
+ <ul>
668
+ <li>Using embedded arguments with a variable that has a value not matching custom
669
+ embedded argument patterns nowadays causes a deprecation warning (<a href="https://github.com/robotframework/robotframework/issues/4524">#4524</a>).
670
+ Earlier variables used as embedded arguments were always accepted without
671
+ validating values.</li>
672
+ <li>Using <code>FOR IN ZIP</code> loops with lists having different lengths without explicitly
673
+ using <code>mode=SHORTEST</code> has been deprecated (<a href="https://github.com/robotframework/robotframework/issues/4685">#4685</a>). The strict mode where lengths
674
+ must match will be the default mode in the future.</li>
675
+ <li>Various utility functions in the <code>robot.utils</code> package that are no longer used
676
+ by Robot Framework itself, including the whole Python 2/3 compatibility layer,
677
+ have been deprecated (<a href="https://github.com/robotframework/robotframework/issues/4501">#4501</a>). If you need some of these utils, you can copy
678
+ their code to your own tool or library. This change may affect existing
679
+ libraries and tools in the ecosystem.</li>
680
+ <li>
681
+ <code>case_insensitive</code> and <code>whitespace_insensitive</code> arguments used by some
682
+ Collections and String library keywords have been deprecated in favor of
683
+ <code>ignore_case</code> and <code>ignore_whitespace</code>. The new arguments were added for
684
+ consistency reasons (<a href="https://github.com/robotframework/robotframework/issues/4954">#4954</a>) and the old arguments will continue to work
685
+ for the time being.</li>
686
+ <li>Passing time as milliseconds to the <code>elapsed_time_to_string</code> utility function
687
+ has been deprecated (<a href="https://github.com/robotframework/robotframework/issues/4862">#4862</a>).</li>
688
+ </ul>
689
+ <a name="acknowledgements"></a>
690
+ <h2><a href="#toc-entry-25">Acknowledgements</a></h2>
691
+ <p>Robot Framework development is sponsored by the <a href="http://robotframework.org/foundation">Robot Framework Foundation</a>
692
+ and its over 60 member organizations. If your organization is using Robot Framework
693
+ and benefiting from it, consider joining the foundation to support its
694
+ development as well.</p>
695
+ <p>Robot Framework 7.0 team funded by the foundation consists of <a href="https://github.com/pekkaklarck">Pekka Klärck</a> and
696
+ <a href="https://github.com/yanne">Janne Härkönen</a> (part time).
697
+ In addition to work done by them, the community has provided some great contributions:</p>
698
+ <ul>
699
+ <li>
700
+ <a href="https://github.com/ygorpontelo">Ygor Pontelo</a> added async support to the
701
+ dynamic and hybrid library APIs (<a href="https://github.com/robotframework/robotframework/issues/4803">#4803</a>) and fixed a bug with handling async
702
+ keywords when execution is stopped gracefully (<a href="https://github.com/robotframework/robotframework/issues/4808">#4808</a>).</li>
703
+ <li>
704
+ <a href="https://github.com/totu">Topi 'top1' Tuulensuu</a> fixed a performance regression
705
+ when using <code>Run Keyword</code> so that the name of the executed keyword contains a variable
706
+ (<a href="https://github.com/robotframework/robotframework/issues/4659">#4659</a>).</li>
707
+ <li>
708
+ <a href="https://github.com/psaikkonen">Pasi Saikkonen</a> added dark mode to reports
709
+ and logs (<a href="https://github.com/robotframework/robotframework/issues/3725">#3725</a>).</li>
710
+ <li>
711
+ <a href="https://github.com/Snooz82">René</a> added return type information to Libdoc's
712
+ HTML output (<a href="https://github.com/robotframework/robotframework/issues/3017">#3017</a>), fixed <code>DotDict</code> equality comparisons (<a href="https://github.com/robotframework/robotframework/issues/4956">#4956</a>) and
713
+ helped finalizing the dark mode support (<a href="https://github.com/robotframework/robotframework/issues/3725">#3725</a>).</li>
714
+ <li>
715
+ <a href="https://github.com/robinmackaij">Robin</a> added type hints to modules that
716
+ did not yet have them under the public <code>robot.api</code> package (<a href="https://github.com/robotframework/robotframework/issues/4841">#4841</a>).</li>
717
+ <li>
718
+ <a href="https://github.com/MobyNL">Mark Moberts</a> added case-insensitive list and
719
+ dictionary comparison support to the Collections library (<a href="https://github.com/robotframework/robotframework/issues/4343">#4343</a>).</li>
720
+ <li>
721
+ <a href="https://github.com/d-biehl">Daniel Biehl</a> enhanced performance of traversing
722
+ the parsing model using <code>ModelVisitor</code> (<a href="https://github.com/robotframework/robotframework/issues/4934">#4934</a>).</li>
723
+ </ul>
724
+ <p>Big thanks to Robot Framework Foundation, to community members listed above, and to
725
+ everyone else who has tested preview releases, submitted bug reports, proposed
726
+ enhancements, debugged problems, or otherwise helped with Robot Framework 7.0
727
+ development.</p>
728
+ <p>See you at <a href="https://robocon.io">RoboCon 2024</a> either onsite or online!</p>
729
+ <div>
730
+ <div><a href="https://github.com/pekkaklarck">Pekka Klärck</a></div>
731
+ <div>Robot Framework lead developer</div>
732
+ </div>
733
+ <a name="full-list-of-fixes-and-enhancements"></a>
734
+ <h2><a href="#toc-entry-26">Full list of fixes and enhancements</a></h2>
735
+ <table>
736
+
737
+
738
+
739
+
740
+
741
+
742
+ <thead valign="bottom">
743
+ <tr>
744
+ <th>ID</th>
745
+ <th>Type</th>
746
+ <th>Priority</th>
747
+ <th>Summary</th>
748
+ </tr>
749
+ </thead>
750
+ <tbody valign="top">
751
+ <tr>
752
+ <td><a href="https://github.com/robotframework/robotframework/issues/3296">#3296</a></td>
753
+ <td>enhancement</td>
754
+ <td>critical</td>
755
+ <td>Support keywords and control structures with listener version 3</td>
756
+ </tr>
757
+ <tr>
758
+ <td><a href="https://github.com/robotframework/robotframework/issues/3761">#3761</a></td>
759
+ <td>enhancement</td>
760
+ <td>critical</td>
761
+ <td>Native <code>VAR</code> syntax to create variables inside tests and keywords</td>
762
+ </tr>
763
+ <tr>
764
+ <td><a href="https://github.com/robotframework/robotframework/issues/4294">#4294</a></td>
765
+ <td>enhancement</td>
766
+ <td>critical</td>
767
+ <td>Drop Python 3.6 and 3.7 support</td>
768
+ </tr>
769
+ <tr>
770
+ <td><a href="https://github.com/robotframework/robotframework/issues/4710">#4710</a></td>
771
+ <td>enhancement</td>
772
+ <td>critical</td>
773
+ <td>Support library keywords with both embedded and normal arguments</td>
774
+ </tr>
775
+ <tr>
776
+ <td><a href="https://github.com/robotframework/robotframework/issues/4847">#4847</a></td>
777
+ <td>enhancement</td>
778
+ <td>critical</td>
779
+ <td>Support JSON serialization with result model</td>
780
+ </tr>
781
+ <tr>
782
+ <td><a href="https://github.com/robotframework/robotframework/issues/4659">#4659</a></td>
783
+ <td>bug</td>
784
+ <td>high</td>
785
+ <td>Performance regression when using <code>Run Keyword</code> and keyword name contains a variable</td>
786
+ </tr>
787
+ <tr>
788
+ <td><a href="https://github.com/robotframework/robotframework/issues/4921">#4921</a></td>
789
+ <td>bug</td>
790
+ <td>high</td>
791
+ <td>Log levels don't work correctly with <code>robot:flatten</code>
792
+ </td>
793
+ </tr>
794
+ <tr>
795
+ <td><a href="https://github.com/robotframework/robotframework/issues/3725">#3725</a></td>
796
+ <td>enhancement</td>
797
+ <td>high</td>
798
+ <td>Support dark theme with report and log</td>
799
+ </tr>
800
+ <tr>
801
+ <td><a href="https://github.com/robotframework/robotframework/issues/4258">#4258</a></td>
802
+ <td>enhancement</td>
803
+ <td>high</td>
804
+ <td>Change timestamps from custom strings to <code>datetime</code> in result model and to ISO 8601 format in output.xml</td>
805
+ </tr>
806
+ <tr>
807
+ <td><a href="https://github.com/robotframework/robotframework/issues/4374">#4374</a></td>
808
+ <td>enhancement</td>
809
+ <td>high</td>
810
+ <td>Support removing tags set globally by using <code>-tag</code> syntax with <code>[Tags]</code> setting</td>
811
+ </tr>
812
+ <tr>
813
+ <td><a href="https://github.com/robotframework/robotframework/issues/4633">#4633</a></td>
814
+ <td>enhancement</td>
815
+ <td>high</td>
816
+ <td>Automatic argument conversion and validation for <code>Literal</code>
817
+ </td>
818
+ </tr>
819
+ <tr>
820
+ <td><a href="https://github.com/robotframework/robotframework/issues/4711">#4711</a></td>
821
+ <td>enhancement</td>
822
+ <td>high</td>
823
+ <td>Support type aliases in formats <code>'list[int]'</code> and <code>'int | float'</code> in argument conversion</td>
824
+ </tr>
825
+ <tr>
826
+ <td><a href="https://github.com/robotframework/robotframework/issues/4803">#4803</a></td>
827
+ <td>enhancement</td>
828
+ <td>high</td>
829
+ <td>Async support to dynamic and hybrid library APIs</td>
830
+ </tr>
831
+ <tr>
832
+ <td><a href="https://github.com/robotframework/robotframework/issues/4808">#4808</a></td>
833
+ <td>bug</td>
834
+ <td>medium</td>
835
+ <td>Async keywords are not stopped when execution is stopped gracefully</td>
836
+ </tr>
837
+ <tr>
838
+ <td><a href="https://github.com/robotframework/robotframework/issues/4859">#4859</a></td>
839
+ <td>bug</td>
840
+ <td>medium</td>
841
+ <td>Parsing errors in reStructuredText files have no source</td>
842
+ </tr>
843
+ <tr>
844
+ <td><a href="https://github.com/robotframework/robotframework/issues/4880">#4880</a></td>
845
+ <td>bug</td>
846
+ <td>medium</td>
847
+ <td>Initially empty test fails even if pre-run modifier adds content to it</td>
848
+ </tr>
849
+ <tr>
850
+ <td><a href="https://github.com/robotframework/robotframework/issues/4886">#4886</a></td>
851
+ <td>bug</td>
852
+ <td>medium</td>
853
+ <td>
854
+ <code>Set Variable If</code> is slow if it has several conditions</td>
855
+ </tr>
856
+ <tr>
857
+ <td><a href="https://github.com/robotframework/robotframework/issues/4898">#4898</a></td>
858
+ <td>bug</td>
859
+ <td>medium</td>
860
+ <td>Resolving special variables can fail with confusing message</td>
861
+ </tr>
862
+ <tr>
863
+ <td><a href="https://github.com/robotframework/robotframework/issues/4915">#4915</a></td>
864
+ <td>bug</td>
865
+ <td>medium</td>
866
+ <td>
867
+ <code>cached_property</code> attributes are called when importing library</td>
868
+ </tr>
869
+ <tr>
870
+ <td><a href="https://github.com/robotframework/robotframework/issues/4924">#4924</a></td>
871
+ <td>bug</td>
872
+ <td>medium</td>
873
+ <td>WHILE <code>on_limit</code> missing from listener v2 attributes</td>
874
+ </tr>
875
+ <tr>
876
+ <td><a href="https://github.com/robotframework/robotframework/issues/4926">#4926</a></td>
877
+ <td>bug</td>
878
+ <td>medium</td>
879
+ <td>WHILE and TRY content are not removed with <code>--removekeywords all</code>
880
+ </td>
881
+ </tr>
882
+ <tr>
883
+ <td><a href="https://github.com/robotframework/robotframework/issues/4945">#4945</a></td>
884
+ <td>bug</td>
885
+ <td>medium</td>
886
+ <td>
887
+ <code>TypedDict</code> with forward references do not work in argument conversion</td>
888
+ </tr>
889
+ <tr>
890
+ <td><a href="https://github.com/robotframework/robotframework/issues/4956">#4956</a></td>
891
+ <td>bug</td>
892
+ <td>medium</td>
893
+ <td>DotDict behaves inconsistent on equality checks. <code>x == y</code> != <code>not x != y</code> and not <code>x != y</code> == <code>not x == y</code>
894
+ </td>
895
+ </tr>
896
+ <tr>
897
+ <td><a href="https://github.com/robotframework/robotframework/issues/4964">#4964</a></td>
898
+ <td>bug</td>
899
+ <td>medium</td>
900
+ <td>Variables set using <code>Set Suite Variable</code> with <code>children=True</code> cannot be properly overwritten</td>
901
+ </tr>
902
+ <tr>
903
+ <td><a href="https://github.com/robotframework/robotframework/issues/4980">#4980</a></td>
904
+ <td>bug</td>
905
+ <td>medium</td>
906
+ <td>DateTime library uses deprecated <code>datetime.utcnow()</code>
907
+ </td>
908
+ </tr>
909
+ <tr>
910
+ <td><a href="https://github.com/robotframework/robotframework/issues/4999">#4999</a></td>
911
+ <td>bug</td>
912
+ <td>medium</td>
913
+ <td>XML Library: Double namespace during Element To String</td>
914
+ </tr>
915
+ <tr>
916
+ <td><a href="https://github.com/robotframework/robotframework/issues/5005">#5005</a></td>
917
+ <td>bug</td>
918
+ <td>medium</td>
919
+ <td>
920
+ <code>Log Variables</code> should not consume iterables</td>
921
+ </tr>
922
+ <tr>
923
+ <td><a href="https://github.com/robotframework/robotframework/issues/3017">#3017</a></td>
924
+ <td>enhancement</td>
925
+ <td>medium</td>
926
+ <td>Add return type to Libdoc specs and HTML output</td>
927
+ </tr>
928
+ <tr>
929
+ <td><a href="https://github.com/robotframework/robotframework/issues/4103">#4103</a></td>
930
+ <td>enhancement</td>
931
+ <td>medium</td>
932
+ <td>Process: Change the default <code>stdin</code> behavior from <code>subprocess.PIPE</code> to <code>None</code>
933
+ </td>
934
+ </tr>
935
+ <tr>
936
+ <td><a href="https://github.com/robotframework/robotframework/issues/4302">#4302</a></td>
937
+ <td>enhancement</td>
938
+ <td>medium</td>
939
+ <td>Remove <code>Reserved</code> library</td>
940
+ </tr>
941
+ <tr>
942
+ <td><a href="https://github.com/robotframework/robotframework/issues/4343">#4343</a></td>
943
+ <td>enhancement</td>
944
+ <td>medium</td>
945
+ <td>Collections: Support case-insensitive list and dictionary comparisons</td>
946
+ </tr>
947
+ <tr>
948
+ <td><a href="https://github.com/robotframework/robotframework/issues/4375">#4375</a></td>
949
+ <td>enhancement</td>
950
+ <td>medium</td>
951
+ <td>Change token type of <code>AS</code> (or <code>WITH NAME</code>) used with library imports to <code>Token.AS</code>
952
+ </td>
953
+ </tr>
954
+ <tr>
955
+ <td><a href="https://github.com/robotframework/robotframework/issues/4385">#4385</a></td>
956
+ <td>enhancement</td>
957
+ <td>medium</td>
958
+ <td>Change the parsing model object produced by <code>Test Tags</code> (and <code>Force Tags</code>) to <code>TestTags</code>
959
+ </td>
960
+ </tr>
961
+ <tr>
962
+ <td><a href="https://github.com/robotframework/robotframework/issues/4432">#4432</a></td>
963
+ <td>enhancement</td>
964
+ <td>medium</td>
965
+ <td>Loudly deprecate singular section headers</td>
966
+ </tr>
967
+ <tr>
968
+ <td><a href="https://github.com/robotframework/robotframework/issues/4501">#4501</a></td>
969
+ <td>enhancement</td>
970
+ <td>medium</td>
971
+ <td>Loudly deprecate old Python 2/3 compatibility layer and other deprecated utils</td>
972
+ </tr>
973
+ <tr>
974
+ <td><a href="https://github.com/robotframework/robotframework/issues/4524">#4524</a></td>
975
+ <td>enhancement</td>
976
+ <td>medium</td>
977
+ <td>Loudly deprecate variables used as embedded arguments not matching custom patterns</td>
978
+ </tr>
979
+ <tr>
980
+ <td><a href="https://github.com/robotframework/robotframework/issues/4545">#4545</a></td>
981
+ <td>enhancement</td>
982
+ <td>medium</td>
983
+ <td>Support creating assigned variable name based on another variable like <code>${${var}} = Keyword</code>
984
+ </td>
985
+ </tr>
986
+ <tr>
987
+ <td><a href="https://github.com/robotframework/robotframework/issues/4667">#4667</a></td>
988
+ <td>enhancement</td>
989
+ <td>medium</td>
990
+ <td>Remove deprecated constructs from Libdoc spec files</td>
991
+ </tr>
992
+ <tr>
993
+ <td><a href="https://github.com/robotframework/robotframework/issues/4685">#4685</a></td>
994
+ <td>enhancement</td>
995
+ <td>medium</td>
996
+ <td>Deprecate <code>SHORTEST</code> mode being default with <code>FOR IN ZIP</code> loops</td>
997
+ </tr>
998
+ <tr>
999
+ <td><a href="https://github.com/robotframework/robotframework/issues/4708">#4708</a></td>
1000
+ <td>enhancement</td>
1001
+ <td>medium</td>
1002
+ <td>Use <code>assing</code>, not <code>variable</code>, with FOR and TRY/EXCEPT model objects when referring to assigned variables</td>
1003
+ </tr>
1004
+ <tr>
1005
+ <td><a href="https://github.com/robotframework/robotframework/issues/4720">#4720</a></td>
1006
+ <td>enhancement</td>
1007
+ <td>medium</td>
1008
+ <td>Require <code>--suite parent.suite</code> to match the full suite name</td>
1009
+ </tr>
1010
+ <tr>
1011
+ <td><a href="https://github.com/robotframework/robotframework/issues/4721">#4721</a></td>
1012
+ <td>enhancement</td>
1013
+ <td>medium</td>
1014
+ <td>Change behavior of <code>--test</code> and <code>--include</code> so that they are cumulative</td>
1015
+ </tr>
1016
+ <tr>
1017
+ <td><a href="https://github.com/robotframework/robotframework/issues/4747">#4747</a></td>
1018
+ <td>enhancement</td>
1019
+ <td>medium</td>
1020
+ <td>Support <code>[Setup]</code> with user keywords</td>
1021
+ </tr>
1022
+ <tr>
1023
+ <td><a href="https://github.com/robotframework/robotframework/issues/4784">#4784</a></td>
1024
+ <td>enhancement</td>
1025
+ <td>medium</td>
1026
+ <td>Remote: Enhance <code>datetime</code>, <code>date</code> and <code>timedelta</code> conversion</td>
1027
+ </tr>
1028
+ <tr>
1029
+ <td><a href="https://github.com/robotframework/robotframework/issues/4841">#4841</a></td>
1030
+ <td>enhancement</td>
1031
+ <td>medium</td>
1032
+ <td>Add typing to all modules under <code>robot.api</code>
1033
+ </td>
1034
+ </tr>
1035
+ <tr>
1036
+ <td><a href="https://github.com/robotframework/robotframework/issues/4846">#4846</a></td>
1037
+ <td>enhancement</td>
1038
+ <td>medium</td>
1039
+ <td>Result model: Loudly deprecate not needed attributes and remove already deprecated ones</td>
1040
+ </tr>
1041
+ <tr>
1042
+ <td><a href="https://github.com/robotframework/robotframework/issues/4872">#4872</a></td>
1043
+ <td>enhancement</td>
1044
+ <td>medium</td>
1045
+ <td>Control continue-on-failure mode by using recursive and non-recursive tags together</td>
1046
+ </tr>
1047
+ <tr>
1048
+ <td><a href="https://github.com/robotframework/robotframework/issues/4876">#4876</a></td>
1049
+ <td>enhancement</td>
1050
+ <td>medium</td>
1051
+ <td>Loudly deprecate <code>[Return]</code> setting</td>
1052
+ </tr>
1053
+ <tr>
1054
+ <td><a href="https://github.com/robotframework/robotframework/issues/4877">#4877</a></td>
1055
+ <td>enhancement</td>
1056
+ <td>medium</td>
1057
+ <td>XML: Support ignoring element order with <code>Elements Should Be Equal</code>
1058
+ </td>
1059
+ </tr>
1060
+ <tr>
1061
+ <td><a href="https://github.com/robotframework/robotframework/issues/4883">#4883</a></td>
1062
+ <td>enhancement</td>
1063
+ <td>medium</td>
1064
+ <td>Result model: Add <code>message</code> to keywords and control structures and remove <code>doc</code> from controls</td>
1065
+ </tr>
1066
+ <tr>
1067
+ <td><a href="https://github.com/robotframework/robotframework/issues/4884">#4884</a></td>
1068
+ <td>enhancement</td>
1069
+ <td>medium</td>
1070
+ <td>Result model: Enhance storing keyword name</td>
1071
+ </tr>
1072
+ <tr>
1073
+ <td><a href="https://github.com/robotframework/robotframework/issues/4896">#4896</a></td>
1074
+ <td>enhancement</td>
1075
+ <td>medium</td>
1076
+ <td>Support <code>separator=&lt;value&gt;</code> configuration option with scalar variables in Variables section</td>
1077
+ </tr>
1078
+ <tr>
1079
+ <td><a href="https://github.com/robotframework/robotframework/issues/4903">#4903</a></td>
1080
+ <td>enhancement</td>
1081
+ <td>medium</td>
1082
+ <td>Support argument conversion and named arguments with dynamic variable files</td>
1083
+ </tr>
1084
+ <tr>
1085
+ <td><a href="https://github.com/robotframework/robotframework/issues/4905">#4905</a></td>
1086
+ <td>enhancement</td>
1087
+ <td>medium</td>
1088
+ <td>Support creating variable name based on another variable like <code>${${VAR}}</code> in Variables section</td>
1089
+ </tr>
1090
+ <tr>
1091
+ <td><a href="https://github.com/robotframework/robotframework/issues/4910">#4910</a></td>
1092
+ <td>enhancement</td>
1093
+ <td>medium</td>
1094
+ <td>Make listener v3 the default listener API</td>
1095
+ </tr>
1096
+ <tr>
1097
+ <td><a href="https://github.com/robotframework/robotframework/issues/4912">#4912</a></td>
1098
+ <td>enhancement</td>
1099
+ <td>medium</td>
1100
+ <td>Parsing model: Move <code>type</code> and <code>tokens</code> from <code>_fields</code> to <code>_attributes</code>
1101
+ </td>
1102
+ </tr>
1103
+ <tr>
1104
+ <td><a href="https://github.com/robotframework/robotframework/issues/4930">#4930</a></td>
1105
+ <td>enhancement</td>
1106
+ <td>medium</td>
1107
+ <td>BuiltIn: New <code>Reset Log Level</code> keyword for resetting the log level to the original value</td>
1108
+ </tr>
1109
+ <tr>
1110
+ <td><a href="https://github.com/robotframework/robotframework/issues/4939">#4939</a></td>
1111
+ <td>enhancement</td>
1112
+ <td>medium</td>
1113
+ <td>Parsing model: Rename <code>Return</code> to <code>ReturnSetting</code> and <code>ReturnStatement</code> to <code>Return</code>
1114
+ </td>
1115
+ </tr>
1116
+ <tr>
1117
+ <td><a href="https://github.com/robotframework/robotframework/issues/4942">#4942</a></td>
1118
+ <td>enhancement</td>
1119
+ <td>medium</td>
1120
+ <td>Add public argument conversion API for libraries and other tools</td>
1121
+ </tr>
1122
+ <tr>
1123
+ <td><a href="https://github.com/robotframework/robotframework/issues/4952">#4952</a></td>
1124
+ <td>enhancement</td>
1125
+ <td>medium</td>
1126
+ <td>Collections: Make <code>ignore_order</code> and <code>ignore_keys</code> recursive</td>
1127
+ </tr>
1128
+ <tr>
1129
+ <td><a href="https://github.com/robotframework/robotframework/issues/4960">#4960</a></td>
1130
+ <td>enhancement</td>
1131
+ <td>medium</td>
1132
+ <td>Support integer conversion with strings representing whole number floats like <code>'1.0'</code> and <code>'2e10'</code>
1133
+ </td>
1134
+ </tr>
1135
+ <tr>
1136
+ <td><a href="https://github.com/robotframework/robotframework/issues/4976">#4976</a></td>
1137
+ <td>enhancement</td>
1138
+ <td>medium</td>
1139
+ <td>Support string <code>SELF</code> (case-insenstive) when library registers itself as listener</td>
1140
+ </tr>
1141
+ <tr>
1142
+ <td><a href="https://github.com/robotframework/robotframework/issues/4979">#4979</a></td>
1143
+ <td>enhancement</td>
1144
+ <td>medium</td>
1145
+ <td>Add <code>robot.result.TestSuite.to/from_xml</code> methods</td>
1146
+ </tr>
1147
+ <tr>
1148
+ <td><a href="https://github.com/robotframework/robotframework/issues/4982">#4982</a></td>
1149
+ <td>enhancement</td>
1150
+ <td>medium</td>
1151
+ <td>DateTime: Support <code>datetime.date</code> as an input format with date related keywords</td>
1152
+ </tr>
1153
+ <tr>
1154
+ <td><a href="https://github.com/robotframework/robotframework/issues/4983">#4983</a></td>
1155
+ <td>enhancement</td>
1156
+ <td>medium</td>
1157
+ <td>Type conversion: Remove support for deprecated <code>ByteString</code>
1158
+ </td>
1159
+ </tr>
1160
+ <tr>
1161
+ <td><a href="https://github.com/robotframework/robotframework/issues/5000">#5000</a></td>
1162
+ <td>enhancement</td>
1163
+ <td>medium</td>
1164
+ <td>Nicer API for setting keyword call arguments programmatically</td>
1165
+ </tr>
1166
+ <tr>
1167
+ <td><a href="https://github.com/robotframework/robotframework/issues/4934">#4934</a></td>
1168
+ <td>---</td>
1169
+ <td>medium</td>
1170
+ <td>Enhance performance of visiting parsing model</td>
1171
+ </tr>
1172
+ <tr>
1173
+ <td><a href="https://github.com/robotframework/robotframework/issues/4621">#4621</a></td>
1174
+ <td>bug</td>
1175
+ <td>low</td>
1176
+ <td>OperatingSystem library docs have broken link / title</td>
1177
+ </tr>
1178
+ <tr>
1179
+ <td><a href="https://github.com/robotframework/robotframework/issues/4798">#4798</a></td>
1180
+ <td>bug</td>
1181
+ <td>low</td>
1182
+ <td>
1183
+ <code>--removekeywords passed</code> doesn't remove test setup and teardown</td>
1184
+ </tr>
1185
+ <tr>
1186
+ <td><a href="https://github.com/robotframework/robotframework/issues/4867">#4867</a></td>
1187
+ <td>bug</td>
1188
+ <td>low</td>
1189
+ <td>Original order of dictionaries is not preserved when they are pretty printed in log messages</td>
1190
+ </tr>
1191
+ <tr>
1192
+ <td><a href="https://github.com/robotframework/robotframework/issues/4870">#4870</a></td>
1193
+ <td>bug</td>
1194
+ <td>low</td>
1195
+ <td>User keyword teardown missing from running model JSON schema</td>
1196
+ </tr>
1197
+ <tr>
1198
+ <td><a href="https://github.com/robotframework/robotframework/issues/4904">#4904</a></td>
1199
+ <td>bug</td>
1200
+ <td>low</td>
1201
+ <td>Importing static variable file with arguments does not fail</td>
1202
+ </tr>
1203
+ <tr>
1204
+ <td><a href="https://github.com/robotframework/robotframework/issues/4913">#4913</a></td>
1205
+ <td>bug</td>
1206
+ <td>low</td>
1207
+ <td>Trace log level logs arguments twice for embedded arguments</td>
1208
+ </tr>
1209
+ <tr>
1210
+ <td><a href="https://github.com/robotframework/robotframework/issues/4927">#4927</a></td>
1211
+ <td>bug</td>
1212
+ <td>low</td>
1213
+ <td>WARN level missing from the log level selector in log.html</td>
1214
+ </tr>
1215
+ <tr>
1216
+ <td><a href="https://github.com/robotframework/robotframework/issues/4967">#4967</a></td>
1217
+ <td>bug</td>
1218
+ <td>low</td>
1219
+ <td>Variables are not resolved in keyword name in WUKS error message</td>
1220
+ </tr>
1221
+ <tr>
1222
+ <td><a href="https://github.com/robotframework/robotframework/issues/4861">#4861</a></td>
1223
+ <td>enhancement</td>
1224
+ <td>low</td>
1225
+ <td>Remove deprecated <code>accept_plain_values</code> from <code>timestr_to_secs</code> utility function</td>
1226
+ </tr>
1227
+ <tr>
1228
+ <td><a href="https://github.com/robotframework/robotframework/issues/4862">#4862</a></td>
1229
+ <td>enhancement</td>
1230
+ <td>low</td>
1231
+ <td>Deprecate <code>elapsed_time_to_string</code> accepting time as milliseconds</td>
1232
+ </tr>
1233
+ <tr>
1234
+ <td><a href="https://github.com/robotframework/robotframework/issues/4864">#4864</a></td>
1235
+ <td>enhancement</td>
1236
+ <td>low</td>
1237
+ <td>Process: Make warning about processes hanging if output buffers get full more visible</td>
1238
+ </tr>
1239
+ <tr>
1240
+ <td><a href="https://github.com/robotframework/robotframework/issues/4885">#4885</a></td>
1241
+ <td>enhancement</td>
1242
+ <td>low</td>
1243
+ <td>Add <code>full_name</code> to replace <code>longname</code> to suite and test objects</td>
1244
+ </tr>
1245
+ <tr>
1246
+ <td><a href="https://github.com/robotframework/robotframework/issues/4900">#4900</a></td>
1247
+ <td>enhancement</td>
1248
+ <td>low</td>
1249
+ <td>Make keywords and control structures in log look more like original data</td>
1250
+ </tr>
1251
+ <tr>
1252
+ <td><a href="https://github.com/robotframework/robotframework/issues/4922">#4922</a></td>
1253
+ <td>enhancement</td>
1254
+ <td>low</td>
1255
+ <td>Change the log level of <code>Set Log Level</code> message from INFO to DEBUG</td>
1256
+ </tr>
1257
+ <tr>
1258
+ <td><a href="https://github.com/robotframework/robotframework/issues/4933">#4933</a></td>
1259
+ <td>enhancement</td>
1260
+ <td>low</td>
1261
+ <td>Type conversion: Ignore hyphens when matching enum members</td>
1262
+ </tr>
1263
+ <tr>
1264
+ <td><a href="https://github.com/robotframework/robotframework/issues/4935">#4935</a></td>
1265
+ <td>enhancement</td>
1266
+ <td>low</td>
1267
+ <td>Use <code>casefold</code>, not <code>lower</code>, when comparing strings case-insensitively</td>
1268
+ </tr>
1269
+ <tr>
1270
+ <td><a href="https://github.com/robotframework/robotframework/issues/4936">#4936</a></td>
1271
+ <td>enhancement</td>
1272
+ <td>low</td>
1273
+ <td>Remove bytes support from <code>robot.utils.normalize</code> function</td>
1274
+ </tr>
1275
+ <tr>
1276
+ <td><a href="https://github.com/robotframework/robotframework/issues/4954">#4954</a></td>
1277
+ <td>enhancement</td>
1278
+ <td>low</td>
1279
+ <td>Collections and String: Add <code>ignore_case</code> as alias for <code>case_insensitive</code>
1280
+ </td>
1281
+ </tr>
1282
+ <tr>
1283
+ <td><a href="https://github.com/robotframework/robotframework/issues/4958">#4958</a></td>
1284
+ <td>enhancement</td>
1285
+ <td>low</td>
1286
+ <td>Document <code>robot_running</code> and <code>dry_run_active</code> properties of the BuiltIn library in the User Guide</td>
1287
+ </tr>
1288
+ <tr>
1289
+ <td><a href="https://github.com/robotframework/robotframework/issues/4975">#4975</a></td>
1290
+ <td>enhancement</td>
1291
+ <td>low</td>
1292
+ <td>Support <code>times</code> and <code>x</code> suffixes with <code>WHILE</code> limit to make it more compatible with <code>Wait Until Keyword Succeeds</code>
1293
+ </td>
1294
+ </tr>
1295
+ <tr>
1296
+ <td><a href="https://github.com/robotframework/robotframework/issues/4988">#4988</a></td>
1297
+ <td>enhancement</td>
1298
+ <td>low</td>
1299
+ <td>Change paths passed to listener v3 methods to <code>pathlib.Path</code> instances</td>
1300
+ </tr>
1301
+ </tbody>
1302
+ </table>
1303
+ <p>Altogether 88 issues. View on the <a href="https://github.com/robotframework/robotframework/issues?q=milestone%3Av7.0">issue tracker</a>.</p>