github-markup 4.0.2 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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>