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