robotframework 6.1.1__zip → 7.0__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {robotframework-6.1.1 → robotframework-7.0}/INSTALL.rst +25 -25
- {robotframework-6.1.1 → robotframework-7.0}/PKG-INFO +6 -8
- {robotframework-6.1.1 → robotframework-7.0}/README.rst +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/setup.py +3 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/interfaces.py +402 -67
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
- robotframework-7.0/src/robot/api/py.typed +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/languages.py +0 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.html +10 -0
- robotframework-7.0/src/robot/htmldata/rebot/common.css +362 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/body.py +44 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/configurer.py +15 -11
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/control.py +226 -84
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
- robotframework-7.0/src/robot/model/keyword.py +77 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/message.py +19 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modelobject.py +25 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testsuite.py +17 -26
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
- robotframework-7.0/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
- robotframework-7.0/src/robot/output/listeners.py +753 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
- robotframework-7.0/src/robot/output/loggerapi.py +215 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0/src/robot/output/output.py +185 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
- robotframework-7.0/src/robot/output/xmllogger.py +459 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
- robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/rebot.py +2 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
- robotframework-7.0/src/robot/result/keywordremover.py +207 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
- robotframework-7.0/src/robot/result/model.py +1185 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/run.py +2 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
- robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +82 -60
- robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
- robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +233 -213
- robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
- robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
- robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/builders.py +2 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/parsers.py +10 -11
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
- robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/context.py +113 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
- robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
- robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
- robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
- robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
- robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
- robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/model.py +195 -377
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
- robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
- robotframework-7.0/src/robot/running/suiterunner.py +265 -0
- robotframework-7.0/src/robot/running/testlibraries.py +500 -0
- robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0/src/robot/utils/notset.py +33 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
- robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/version.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
- {robotframework-6.1.1 → robotframework-7.0}/tasks.py +6 -6
- robotframework-6.1.1/src/robot/htmldata/rebot/common.css +0 -239
- robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
- robotframework-6.1.1/src/robot/model/keyword.py +0 -173
- robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
- robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
- robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
- robotframework-6.1.1/src/robot/output/listeners.py +0 -174
- robotframework-6.1.1/src/robot/output/output.py +0 -95
- robotframework-6.1.1/src/robot/output/xmllogger.py +0 -354
- robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1.1/src/robot/result/keywordremover.py +0 -183
- robotframework-6.1.1/src/robot/result/model.py +0 -957
- robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1.1/src/robot/running/arguments/argumentresolver.py +0 -131
- robotframework-6.1.1/src/robot/running/arguments/embedded.py +0 -146
- robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1.1/src/robot/running/builder/transformers.py +0 -642
- robotframework-6.1.1/src/robot/running/handlers.py +0 -321
- robotframework-6.1.1/src/robot/running/handlerstore.py +0 -66
- robotframework-6.1.1/src/robot/running/librarykeywordrunner.py +0 -238
- robotframework-6.1.1/src/robot/running/libraryscopes.py +0 -97
- robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1.1/src/robot/running/suiterunner.py +0 -248
- robotframework-6.1.1/src/robot/running/testlibraries.py +0 -423
- robotframework-6.1.1/src/robot/running/usererrorhandler.py +0 -75
- robotframework-6.1.1/src/robot/running/userkeyword.py +0 -111
- robotframework-6.1.1/src/robot/running/userkeywordrunner.py +0 -274
- robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1.1 → robotframework-7.0}/AUTHORS.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/BUILD.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/LICENSE.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/MANIFEST.in +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/setup.cfg +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/__main__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/errors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modifier.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/status.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -15,15 +15,13 @@
|
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
17
|
|
|
18
|
-
from .robottypes import is_string
|
|
19
|
-
|
|
20
18
|
|
|
21
19
|
_CONTROL_WORDS = frozenset(('ELSE', 'ELSE IF', 'AND', 'WITH NAME', 'AS'))
|
|
22
20
|
_SEQUENCES_TO_BE_ESCAPED = ('\\', '${', '@{', '%{', '&{', '*{', '=')
|
|
23
21
|
|
|
24
22
|
|
|
25
23
|
def escape(item):
|
|
26
|
-
if not
|
|
24
|
+
if not isinstance(item, str):
|
|
27
25
|
return item
|
|
28
26
|
if item in _CONTROL_WORDS:
|
|
29
27
|
return '\\' + item
|
|
@@ -75,7 +73,7 @@ class Unescaper:
|
|
|
75
73
|
return chr(ordinal)
|
|
76
74
|
|
|
77
75
|
def unescape(self, item):
|
|
78
|
-
if not (
|
|
76
|
+
if not isinstance(item, str) or '\\' not in item:
|
|
79
77
|
return item
|
|
80
78
|
return self._escape_sequences.sub(self._handle_escapes, item)
|
|
81
79
|
|
|
@@ -93,28 +91,30 @@ class Unescaper:
|
|
|
93
91
|
unescape = Unescaper().unescape
|
|
94
92
|
|
|
95
93
|
|
|
96
|
-
def split_from_equals(
|
|
97
|
-
from robot.variables import
|
|
98
|
-
if not
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
if not
|
|
102
|
-
return tuple(
|
|
94
|
+
def split_from_equals(value):
|
|
95
|
+
from robot.variables import VariableMatches
|
|
96
|
+
if not isinstance(value, str) or '=' not in value:
|
|
97
|
+
return value, None
|
|
98
|
+
matches = VariableMatches(value, ignore_errors=True)
|
|
99
|
+
if not matches and '\\' not in value:
|
|
100
|
+
return tuple(value.split('=', 1))
|
|
103
101
|
try:
|
|
104
|
-
index = _find_split_index(
|
|
102
|
+
index = _find_split_index(value, matches)
|
|
105
103
|
except ValueError:
|
|
106
|
-
return
|
|
107
|
-
return
|
|
104
|
+
return value, None
|
|
105
|
+
return value[:index], value[index + 1:]
|
|
108
106
|
|
|
109
107
|
|
|
110
|
-
def _find_split_index(string,
|
|
108
|
+
def _find_split_index(string, matches):
|
|
109
|
+
remaining = string
|
|
111
110
|
relative_index = 0
|
|
112
|
-
for
|
|
111
|
+
for match in matches:
|
|
113
112
|
try:
|
|
114
|
-
return _find_split_index_from_part(before) + relative_index
|
|
113
|
+
return _find_split_index_from_part(match.before) + relative_index
|
|
115
114
|
except ValueError:
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
remaining = match.after
|
|
116
|
+
relative_index += match.end
|
|
117
|
+
return _find_split_index_from_part(remaining) + relative_index
|
|
118
118
|
|
|
119
119
|
|
|
120
120
|
def _find_split_index_from_part(string):
|
|
@@ -189,7 +189,7 @@ class Importer:
|
|
|
189
189
|
raise DataError(err.args[0])
|
|
190
190
|
try:
|
|
191
191
|
return imported(*positional, **dict(named))
|
|
192
|
-
except:
|
|
192
|
+
except Exception:
|
|
193
193
|
raise DataError('Creating instance failed: %s\n%s' % get_error_details())
|
|
194
194
|
|
|
195
195
|
def _get_arg_spec(self, imported):
|
|
@@ -215,7 +215,7 @@ class _Importer:
|
|
|
215
215
|
importlib.invalidate_caches()
|
|
216
216
|
try:
|
|
217
217
|
return __import__(name, fromlist=fromlist)
|
|
218
|
-
except:
|
|
218
|
+
except Exception:
|
|
219
219
|
message, traceback = get_error_details(full_traceback=False)
|
|
220
220
|
path = '\n'.join(f' {p}' for p in sys.path)
|
|
221
221
|
raise DataError(f'{message}\n{traceback}\nPYTHONPATH:\n{path}')
|
|
@@ -20,7 +20,7 @@ from .robotio import file_writer
|
|
|
20
20
|
|
|
21
21
|
class _MarkupWriter:
|
|
22
22
|
|
|
23
|
-
def __init__(self, output, write_empty=True, usage=None):
|
|
23
|
+
def __init__(self, output, write_empty=True, usage=None, preamble=True):
|
|
24
24
|
"""
|
|
25
25
|
:param output: Either an opened, file like object, or a path to the
|
|
26
26
|
desired output file. In the latter case, the file is created
|
|
@@ -31,22 +31,24 @@ class _MarkupWriter:
|
|
|
31
31
|
output = file_writer(output, usage=usage)
|
|
32
32
|
self.output = output
|
|
33
33
|
self._write_empty = write_empty
|
|
34
|
-
|
|
34
|
+
if preamble:
|
|
35
|
+
self._preamble()
|
|
35
36
|
|
|
36
37
|
def _preamble(self):
|
|
37
38
|
pass
|
|
38
39
|
|
|
39
|
-
def start(self, name, attrs=None, newline=True):
|
|
40
|
-
attrs = self._format_attrs(attrs)
|
|
40
|
+
def start(self, name, attrs=None, newline=True, write_empty=None):
|
|
41
|
+
attrs = self._format_attrs(attrs, write_empty)
|
|
41
42
|
self._start(name, attrs, newline)
|
|
42
43
|
|
|
43
44
|
def _start(self, name, attrs, newline):
|
|
44
45
|
self._write(f'<{name} {attrs}>' if attrs else f'<{name}>', newline)
|
|
45
46
|
|
|
46
|
-
def _format_attrs(self, attrs):
|
|
47
|
+
def _format_attrs(self, attrs, write_empty):
|
|
47
48
|
if not attrs:
|
|
48
49
|
return ''
|
|
49
|
-
write_empty
|
|
50
|
+
if write_empty is None:
|
|
51
|
+
write_empty = self._write_empty
|
|
50
52
|
return ' '.join(f"{name}=\"{attribute_escape(value or '')}\""
|
|
51
53
|
for name, value in self._order_attrs(attrs)
|
|
52
54
|
if write_empty or value)
|
|
@@ -64,9 +66,12 @@ class _MarkupWriter:
|
|
|
64
66
|
def end(self, name, newline=True):
|
|
65
67
|
self._write(f'</{name}>', newline)
|
|
66
68
|
|
|
67
|
-
def element(self, name, content=None, attrs=None, escape=True, newline=True
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
def element(self, name, content=None, attrs=None, escape=True, newline=True,
|
|
70
|
+
write_empty=None):
|
|
71
|
+
attrs = self._format_attrs(attrs, write_empty)
|
|
72
|
+
if write_empty is None:
|
|
73
|
+
write_empty = self._write_empty
|
|
74
|
+
if write_empty or content or attrs:
|
|
70
75
|
self._start(name, attrs, newline=False)
|
|
71
76
|
self.content(content, escape)
|
|
72
77
|
self.end(name, newline)
|
|
@@ -98,15 +103,18 @@ class XmlWriter(_MarkupWriter):
|
|
|
98
103
|
def _escape(self, text):
|
|
99
104
|
return xml_escape(text)
|
|
100
105
|
|
|
101
|
-
def element(self, name, content=None, attrs=None, escape=True, newline=True
|
|
106
|
+
def element(self, name, content=None, attrs=None, escape=True, newline=True,
|
|
107
|
+
write_empty=None):
|
|
102
108
|
if content:
|
|
103
|
-
super().element(name, content, attrs, escape, newline)
|
|
109
|
+
super().element(name, content, attrs, escape, newline, write_empty)
|
|
104
110
|
else:
|
|
105
|
-
self._self_closing_element(name, attrs, newline)
|
|
111
|
+
self._self_closing_element(name, attrs, newline, write_empty)
|
|
106
112
|
|
|
107
|
-
def _self_closing_element(self, name, attrs, newline):
|
|
108
|
-
attrs = self._format_attrs(attrs)
|
|
109
|
-
if
|
|
113
|
+
def _self_closing_element(self, name, attrs, newline, write_empty):
|
|
114
|
+
attrs = self._format_attrs(attrs, write_empty)
|
|
115
|
+
if write_empty is None:
|
|
116
|
+
write_empty = self._write_empty
|
|
117
|
+
if write_empty or attrs:
|
|
110
118
|
self._write(f'<{name} {attrs}/>' if attrs else f'<{name}/>', newline)
|
|
111
119
|
|
|
112
120
|
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
17
|
|
|
18
|
-
from .robottypes import is_integer
|
|
19
18
|
from .unic import safe_str
|
|
20
19
|
|
|
21
20
|
|
|
@@ -71,7 +70,7 @@ def _is_camel_case_boundary(prev, char, next):
|
|
|
71
70
|
|
|
72
71
|
|
|
73
72
|
def plural_or_not(item):
|
|
74
|
-
count = item if
|
|
73
|
+
count = item if isinstance(item, int) else len(item)
|
|
75
74
|
return '' if count in (1, -1) else 's'
|
|
76
75
|
|
|
77
76
|
|
|
@@ -14,47 +14,32 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
|
-
from collections.abc import
|
|
18
|
-
from typing import Any, MutableMapping,
|
|
17
|
+
from collections.abc import Iterator, Mapping, Sequence
|
|
18
|
+
from typing import Any, MutableMapping, TypeVar
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
V = TypeVar('V')
|
|
22
22
|
Self = TypeVar('Self', bound='NormalizedDict')
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
@overload
|
|
26
25
|
def normalize(string: str, ignore: 'Sequence[str]' = (), caseless: bool = True,
|
|
27
26
|
spaceless: bool = True) -> str:
|
|
28
|
-
...
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@overload
|
|
32
|
-
def normalize(string: bytes, ignore: 'Sequence[bytes]' = (), caseless: bool = True,
|
|
33
|
-
spaceless: bool = True) -> bytes:
|
|
34
|
-
...
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# TODO: Remove bytes support in RF 7.0. There shouldn't be needs for that with Python 3.
|
|
38
|
-
def normalize(string, ignore=(), caseless=True, spaceless=True):
|
|
39
27
|
"""Normalize the ``string`` according to the given spec.
|
|
40
28
|
|
|
41
|
-
By default, string is turned to lower case and all
|
|
42
|
-
Additional characters can be removed by giving them
|
|
29
|
+
By default, string is turned to lower case (actually case-folded) and all
|
|
30
|
+
whitespace is removed. Additional characters can be removed by giving them
|
|
31
|
+
in ``ignore`` list.
|
|
43
32
|
"""
|
|
44
|
-
empty = '' if isinstance(string, str) else b''
|
|
45
|
-
if isinstance(ignore, bytes):
|
|
46
|
-
# Iterating bytes in Python3 yields integers.
|
|
47
|
-
ignore = [bytes([i]) for i in ignore]
|
|
48
33
|
if spaceless:
|
|
49
|
-
string =
|
|
34
|
+
string = ''.join(string.split())
|
|
50
35
|
if caseless:
|
|
51
|
-
string = string.
|
|
52
|
-
ignore = [i.
|
|
36
|
+
string = string.casefold()
|
|
37
|
+
ignore = [i.casefold() for i in ignore]
|
|
53
38
|
# both if statements below enhance performance a little
|
|
54
39
|
if ignore:
|
|
55
40
|
for ign in ignore:
|
|
56
41
|
if ign in string:
|
|
57
|
-
string = string.replace(ign,
|
|
42
|
+
string = string.replace(ign, '')
|
|
58
43
|
return string
|
|
59
44
|
|
|
60
45
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright 2008-2015 Nokia Networks
|
|
2
|
+
# Copyright 2016- Robot Framework Foundation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
class NotSet:
|
|
17
|
+
"""Represents value that is not set.
|
|
18
|
+
|
|
19
|
+
Can be used instead of the standard ``None`` in cases where ``None``
|
|
20
|
+
itself is a valid value.
|
|
21
|
+
|
|
22
|
+
Use the constant ``robot.utils.NOT_SET`` instead of creating new instances
|
|
23
|
+
of the class.
|
|
24
|
+
|
|
25
|
+
New in Robot Framework 7.0.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __repr__(self):
|
|
29
|
+
return ''
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
NOT_SET = NotSet()
|
|
33
|
+
|
|
@@ -23,11 +23,6 @@ UNIXY = os.sep == '/'
|
|
|
23
23
|
WINDOWS = not UNIXY
|
|
24
24
|
RERAISED_EXCEPTIONS = (KeyboardInterrupt, SystemExit, MemoryError)
|
|
25
25
|
|
|
26
|
-
# Part of the deprecated Python 2/3 compatibility layer. For more details see
|
|
27
|
-
# the comment in `utils/__init__.py`. This constant was added to support
|
|
28
|
-
# SSHLibrary: https://github.com/robotframework/SSHLibrary/issues/401
|
|
29
|
-
PY2 = False
|
|
30
|
-
|
|
31
26
|
|
|
32
27
|
def isatty(stream):
|
|
33
28
|
# first check if buffer was detached
|
|
@@ -39,3 +34,18 @@ def isatty(stream):
|
|
|
39
34
|
return stream.isatty()
|
|
40
35
|
except ValueError: # Occurs if file is closed.
|
|
41
36
|
return False
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def __getattr__(name):
|
|
40
|
+
# Part of the deprecated Python 2/3 compatibility layer. For more details see
|
|
41
|
+
# the comment in `utils/__init__.py`. The 'PY2' constant exists here to support
|
|
42
|
+
# SSHLibrary: https://github.com/robotframework/SSHLibrary/issues/401
|
|
43
|
+
|
|
44
|
+
import warnings
|
|
45
|
+
|
|
46
|
+
if name == 'PY2':
|
|
47
|
+
warnings.warn("'robot.utils.platform.PY2' is deprecated and will be removed "
|
|
48
|
+
"in Robot Framework 9.0.", DeprecationWarning)
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
raise AttributeError(f"'robot.utils.platform' has no attribute '{name}'.")
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import io
|
|
17
17
|
import os.path
|
|
18
|
+
from pathlib import Path
|
|
18
19
|
|
|
19
20
|
from robot.errors import DataError
|
|
20
21
|
|
|
@@ -47,14 +48,13 @@ def binary_file_writer(path=None):
|
|
|
47
48
|
return f
|
|
48
49
|
|
|
49
50
|
|
|
50
|
-
def create_destination_directory(path, usage=None):
|
|
51
|
-
if is_pathlike(path):
|
|
52
|
-
path =
|
|
53
|
-
|
|
54
|
-
if directory and not os.path.exists(directory):
|
|
51
|
+
def create_destination_directory(path: 'Path|str', usage=None):
|
|
52
|
+
if not is_pathlike(path):
|
|
53
|
+
path = Path(path)
|
|
54
|
+
if not path.parent.exists():
|
|
55
55
|
try:
|
|
56
|
-
os.makedirs(
|
|
56
|
+
os.makedirs(path.parent, exist_ok=True)
|
|
57
57
|
except EnvironmentError:
|
|
58
|
-
usage = '
|
|
59
|
-
raise DataError("Creating
|
|
60
|
-
|
|
58
|
+
usage = f'{usage} directory' if usage else 'directory'
|
|
59
|
+
raise DataError(f"Creating {usage} '{path.parent}' failed: "
|
|
60
|
+
f"{get_error_message()}")
|
|
@@ -44,6 +44,7 @@ def normpath(path, case_normalize=False):
|
|
|
44
44
|
That includes Windows and also OSX in default configuration.
|
|
45
45
|
4. Turn ``c:`` into ``c:\\`` on Windows instead of keeping it as ``c:``.
|
|
46
46
|
"""
|
|
47
|
+
# FIXME: Support pathlib.Path
|
|
47
48
|
if not is_string(path):
|
|
48
49
|
path = system_decode(path)
|
|
49
50
|
path = safe_str(path) # Handles NFC normalization on OSX
|