Skip to content

Commit 0db4fac

Browse files
committed
Replaced safe_repr with prepr that drops u prefix and used b.
Main idea was to get Unicode strings logged w/o the annoying u prefix. Now b prefix is added to byte strings instead. Got also some other nice functionality kind of for free by extending PrettyPrinter. safe_repr being replaced by prepr needs to be mentioned in robotframework#1924.
1 parent 0c6afdb commit 0db4fac

18 files changed

Lines changed: 222 additions & 135 deletions

File tree

atest/robot/cli/rebot/log_level.robot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ ${LOG NAME} logfile.html
99

1010
By default all messages are included
1111
${tc} = Rebot
12-
Check Log Message ${tc.kws[0].msgs[0]} Arguments: [ u'Test 1' ] TRACE
12+
Check Log Message ${tc.kws[0].msgs[0]} Arguments: [ 'Test 1' ] TRACE
1313
Check Log Message ${tc.kws[0].msgs[1]} Test 1 INFO
1414
Check Log Message ${tc.kws[0].msgs[2]} Return: None TRACE
15-
Check Log Message ${tc.kws[1].msgs[0]} Arguments: [ u'Logging with debug level' | u'DEBUG' ] TRACE
15+
Check Log Message ${tc.kws[1].msgs[0]} Arguments: [ 'Logging with debug level' | 'DEBUG' ] TRACE
1616
Check Log Message ${tc.kws[1].msgs[1]} Logging with debug level DEBUG
1717
Check Log Message ${tc.kws[1].msgs[2]} Return: None TRACE
1818
Min level should be 'TRACE' and default 'TRACE'

atest/robot/cli/runner/log_level.robot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ Should Log On Debug Level
7575
Check Log Message ${SUITE.tests[1].kws[1].msgs[0]} Expected failure FAIL
7676

7777
Should Log On Trace Level
78-
Check Log Message ${SUITE.tests[0].kws[0].kws[0].msgs[0]} Arguments: [ u'Hello says "Pass"!' | u'INFO' ] TRACE
78+
Check Log Message ${SUITE.tests[0].kws[0].kws[0].msgs[0]} Arguments: [ 'Hello says "Pass"!' | 'INFO' ] TRACE
7979
Check Log Message ${SUITE.tests[0].kws[0].kws[0].msgs[1]} Hello says "Pass"! INFO
8080
Check Log Message ${SUITE.tests[0].kws[0].kws[0].msgs[2]} Return: None TRACE
8181
Check Log Message ${SUITE.tests[0].kws[0].kws[1].msgs[1]} Debug message DEBUG
82-
Check Log Message ${SUITE.tests[1].kws[1].msgs[0]} Arguments: [ u'Expected failure' ] TRACE
82+
Check Log Message ${SUITE.tests[1].kws[1].msgs[0]} Arguments: [ 'Expected failure' ] TRACE
8383
Check Log Message ${SUITE.tests[1].kws[1].msgs[1]} Expected failure FAIL

atest/robot/keywords/trace_log_keyword_arguments.robot

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,56 @@ Force Tags regression pybot jybot
44
Resource atest_resource.robot
55

66
*** Variables ***
7-
${NON ASCII} u'Hyv\\xe4\\xe4 P\\xe4iv\\xe4\\xe4'
8-
${OBJECT REPR} u'Circle is 360\\xb0, Hyv\\xe4\\xe4 \\xfc\\xf6t\\xe4, \\u0989\\u09c4 \\u09f0 \\u09fa \\u099f \\u09eb \\u09ea \\u09b9'
7+
${NON ASCII} 'Hyv\\xe4\\xe4 P\\xe4iv\\xe4\\xe4'
8+
${OBJECT REPR} u'Circle is 360\\xb0, Hyv\\xe4\\xe4 \\xfc\\xf6t\\xe4,
9+
... \\u0989\\u09c4 \\u09f0 \\u09fa \\u099f \\u09eb \\u09ea \\u09b9'
910

1011
*** Test Cases ***
1112
Only Mandatory Arguments
1213
Check Argument Value Trace
13-
... \${mand1}=u'arg1' | \${mand2}=u'arg2'
14-
... u'arg1' | u'arg2'
14+
... \${mand1}='arg1' | \${mand2}='arg2'
15+
... 'arg1' | 'arg2'
1516

1617
Mandatory And Default Arguments
1718
Check Argument Value Trace
18-
... \${mand}=u'mandatory' | \${default}=u'default value'
19-
... u'mandatory'
19+
... \${mand}='mandatory' | \${default}='default value'
20+
... 'mandatory'
2021

2122
Multiple Default Values
2223
Check Argument Value Trace
23-
... \${a1}=u'10' | \${a2}=u'2' | \${a3}=u'30' | \${a4}=4
24-
... u'10' | a3=u'30'
24+
... \${a1}='10' | \${a2}='2' | \${a3}='30' | \${a4}=4
25+
... '10' | a3='30'
2526

2627
Named Arguments
2728
Check Argument Value Trace
28-
... \${mand}=u'mandatory' | \${default}=u'bar'
29-
... u'mandatory' | default=u'bar'
29+
... \${mand}='mandatory' | \${default}='bar'
30+
... 'mandatory' | default='bar'
3031

3132
Named Arguments when Name Is Not Matching
3233
Check Argument Value Trace
33-
... \${mand}=u'mandatory' | \${default}=u'foo=bar'
34-
... u'mandatory' | u'foo=bar'
34+
... \${mand}='mandatory' | \${default}='foo=bar'
35+
... 'mandatory' | 'foo=bar'
3536

3637
Variable Number of Arguments
3738
Check Argument Value Trace
38-
... \${mand}=u'a' | \@{vargs}=[u'b', u'c', u'd']
39-
... u'a' | u'b' | u'c' | u'd'
40-
... \${mand}=u'mandatory' | \@{vargs}=[u'a', u'b', u'c', u'd']
41-
... u'mandatory' | u'a' | u'b' | u'c' | u'd'
42-
... \${mand}=u'mandatory' | \@{vargs}=[]
43-
... u'mandatory'
39+
... \${mand}='a' | \@{vargs}=['b', 'c', 'd']
40+
... 'a' | 'b' | 'c' | 'd'
41+
... \${mand}='mandatory' | \@{vargs}=['a', 'b', 'c', 'd']
42+
... 'mandatory' | 'a' | 'b' | 'c' | 'd'
43+
... \${mand}='mandatory' | \@{vargs}=[]
44+
... 'mandatory'
4445

4546
Kwargs
4647
Check Argument Value Trace
4748
... \&{kwargs}={}
4849
... ${EMPTY}
49-
... \&{kwargs}={u'a': u'1', u'b': 2, u'c': u'3'}
50-
... a=u'1' | b=2 | c=u'3'
50+
... \&{kwargs}={'a': '1', 'b': 2, 'c': '3'}
51+
... a='1' | b=2 | c='3'
5152

5253
All args
5354
Check Argument Value Trace
54-
... \${positional}=u'1' | \@{varargs}=[u'2', u'3'] | \&{kwargs}={u'd': u'4'}
55-
... u'1' | u'2' | u'3' | d=u'4'
55+
... \${positional}='1' | \@{varargs}=['2', '3'] | \&{kwargs}={'d': '4'}
56+
... '1' | '2' | '3' | d='4'
5657

5758
Non String Object as Argument
5859
Check Argument Value Trace
@@ -72,8 +73,8 @@ Object With Unicode Repr as Argument
7273

7374
Arguments With Run Keyword
7475
${tc}= Check Test Case ${TEST NAME}
75-
Check Log Message ${tc.kws[1].msgs[0]} Arguments: [ u'Log Many' | u'\@{VALUES}' ] TRACE
76-
Check Log Message ${tc.kws[1].kws[0].msgs[0]} Arguments: [ u'a' | u'b' | u'c' | u'd' ] TRACE
76+
Check Log Message ${tc.kws[1].msgs[0]} Arguments: [ 'Log Many' | '\@{VALUES}' ] TRACE
77+
Check Log Message ${tc.kws[1].kws[0].msgs[0]} Arguments: [ 'a' | 'b' | 'c' | 'd' ] TRACE
7778

7879
*** Keywords ***
7980
Check Argument Value Trace

atest/robot/keywords/trace_log_return_value.robot

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ Resource atest_resource.robot
77

88
Return from Userkeyword
99
${test} = Check Test Case ${TESTNAME}
10-
Check Log Message ${test.kws[0].msgs[1]} Return: u'value' TRACE
11-
Check Log Message ${test.kws[0].kws[0].msgs[1]} Return: u'value' TRACE
10+
Check Log Message ${test.kws[0].msgs[1]} Return: 'value' TRACE
11+
Check Log Message ${test.kws[0].kws[0].msgs[1]} Return: 'value' TRACE
1212

1313
Return from Library Keyword
1414
${test} = Check Test Case ${TESTNAME}
15-
Check Log Message ${test.kws[0].msgs[1]} Return: u'value' TRACE
15+
Check Log Message ${test.kws[0].msgs[1]} Return: 'value' TRACE
1616

1717
Return from Run Keyword
1818
${test} = Check Test Case ${TESTNAME}
19-
Check Log Message ${test.kws[0].msgs[1]} Return: u'value' TRACE
20-
Check Log Message ${test.kws[0].kws[0].msgs[1]} Return: u'value' TRACE
19+
Check Log Message ${test.kws[0].msgs[1]} Return: 'value' TRACE
20+
Check Log Message ${test.kws[0].kws[0].msgs[1]} Return: 'value' TRACE
2121

2222
Return Non String Object
2323
${test} = Check Test Case ${TESTNAME}
@@ -29,7 +29,7 @@ Return None
2929

3030
Return Non Ascii String
3131
${test} = Check Test Case ${TESTNAME}
32-
Check Log Message ${test.kws[0].msgs[1]} Return: u'Hyv\\xe4\\xe4 P\\xe4iv\\xe4\\xe4' TRACE
32+
Check Log Message ${test.kws[0].msgs[1]} Return: 'Hyv\\xe4\\xe4 P\\xe4iv\\xe4\\xe4' TRACE
3333

3434
Return Object With Unicode Repr
3535
${test} = Check Test Case ${TESTNAME}
@@ -39,8 +39,9 @@ Return Object with Invalid Unicode Repr
3939
[Documentation] How the return value is logged depends on the interpreter.
4040
${test} = Check Test Case ${TESTNAME}
4141
${path} ${base} = Split Path ${INTERPRETER}
42-
${ret} = Set Variable If 'python' in '${base}' u'Hyv\\xe4' Hyvä
43-
Check Log Message ${test.kws[0].msgs[1]} Return: ${ret} TRACE
42+
${ret} = Set Variable If 'python' in '${base}'
43+
... <Unrepresentable object InvalidRepr. Error: UnicodeEncodeError: * Hyv*
44+
Check Log Message ${test.kws[0].msgs[1]} Return: ${ret} TRACE pattern=yes
4445

4546
Return Object with Non Ascii String from Repr
4647
[Documentation] How the return value is logged depends on the interpreter.

atest/robot/standard_libraries/builtin/log.robot

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,26 @@ Log also to console
5252

5353
Log repr
5454
${tc} = Check Test Case ${TEST NAME}
55-
Check Log Message ${tc.kws[0].msgs[0]} u'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!'
55+
Check Log Message ${tc.kws[0].msgs[0]} 'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!'
5656
Check Log Message ${tc.kws[1].msgs[0]} 42 DEBUG
57-
${bytes} = Set Variable If not "${IRONPYTHON}" '\\x00\\xff' u'\\x00\\xff'
57+
${bytes} = Set Variable If not "${IRONPYTHON}" b'\\x00\\xff' '\\x00\\xff'
5858
Check Log Message ${tc.kws[3].msgs[0]} ${bytes}
59-
Check Log Message ${tc.kws[5].msgs[0]} [u'Hyv\\xe4', u'\\u2603', 42, ${bytes}]
60-
Check Stdout Contains [u'Hyv\\xe4', u'\\u2603', 42, ${bytes}]
59+
Check Log Message ${tc.kws[5].msgs[0]} ['Hyv\\xe4', '\\u2603', 42, ${bytes}]
60+
Check Stdout Contains ['Hyv\\xe4', '\\u2603', 42, ${bytes}]
6161

6262
Log pprint
6363
${tc} = Check Test Case ${TEST NAME}
64-
${bytes} = Set Variable If not "${IRONPYTHON}" '\\x00\\xff' u'\\x00\\xff'
64+
${b} = Set Variable If not "${IRONPYTHON}" b ${EMPTY}
6565
Check Log Message ${tc.kws[1].msgs[0]} {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}'a longer string!',\n${SPACE * 10}'a much, much, much, much, much, much longer string']}
6666
Check Stdout Contains {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}'a longer string!',\n${SPACE * 10}'a much, much, much, much, much, much longer string']}
67-
Check Log Message ${tc.kws[3].msgs[0]} ['One',${SPACE}'Two',${SPACE}3]
68-
Check Stdout Contains ['One',${SPACE}'Two',${SPACE}3]
69-
Check Log Message ${tc.kws[5].msgs[0]} ['a long string',\n${SPACE}'a longer string!',\n${SPACE}'a much, much, much, much, much, much longer string']
70-
Check Stdout Contains ['a long string',\n${SPACE}'a longer string!',\n${SPACE}'a much, much, much, much, much, much longer string']
67+
Check Log Message ${tc.kws[3].msgs[0]} [${b}'One', 'Two', 3]
68+
Check Stdout Contains [${b}'One', 'Two', 3]
69+
Check Log Message ${tc.kws[5].msgs[0]} [${b}'a long string',\n${SPACE}'a longer string!',\n${SPACE}'a much, much, much, much, much, much longer string']
70+
Check Stdout Contains [${b}'a long string',\n${SPACE}'a longer string!',\n${SPACE}'a much, much, much, much, much, much longer string']
7171
Check Log Message ${tc.kws[7].msgs[0]} {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}'a longer string!',\n${SPACE * 10}'a much, much, much, much, much, much longer string']}
72-
Check Log Message ${tc.kws[9].msgs[0]} ['One',${SPACE}'Two',${SPACE}3]
73-
Check Log Message ${tc.kws[11].msgs[0]} {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}42,\n${SPACE * 10}u'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!',\n${SPACE * 10}'a much, much, much, much, much, much longer string',\n${SPACE * 10}${bytes}]}
74-
Check Stdout Contains {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}42,\n${SPACE * 10}u'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!',\n${SPACE * 10}'a much, much, much, much, much, much longer string',\n${SPACE * 10}${bytes}]}
72+
Check Log Message ${tc.kws[9].msgs[0]} ['One', ${b}'Two', 3]
73+
Check Log Message ${tc.kws[11].msgs[0]} {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}42,\n${SPACE * 10}'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!',\n${SPACE * 10}'a much, much, much, much, much, much longer string',\n${SPACE * 10}${b}'\\x00\\xff']}
74+
Check Stdout Contains {'a long string': 1,\n${SPACE}'a longer string!': 2,\n${SPACE}'a much, much, much, much, much, much longer string': 3,\n${SPACE}'list': ['a long string',\n${SPACE * 10}42,\n${SPACE * 10}'Hyv\\xe4\\xe4 y\\xf6t\\xe4 \\u2603!',\n${SPACE * 10}'a much, much, much, much, much, much longer string',\n${SPACE * 10}${b}'\\x00\\xff']}
7575

7676
Log callable
7777
${tc} = Check Test Case ${TEST NAME}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
*** Settings ***
2-
Suite Setup Run Tests ${EMPTY}
3-
... test_libraries/as_listener/empty_library.robot
2+
Suite Setup Run Tests ${EMPTY} test_libraries/as_listener/empty_library.robot
43
Force Tags regression jybot pybot
54
Resource atest_resource.robot
65

@@ -9,10 +8,9 @@ Empty library should not cause warning when it is listener
98
Stderr Should Match
109
... SEPARATOR=\n
1110
... *START TEST
12-
... MESSAGE Arguments: [ u'We do nothing' ]
11+
... MESSAGE Arguments: [ 'We do nothing' ]
1312
... MESSAGE We do nothing
1413
... MESSAGE Return: None
1514
... END TEST
1615
... CLOSE
1716
Check Stderr Does Not Contain WARN
18-

atest/robot/test_libraries/logging_with_logging.robot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Messages below threshold level are ignored fully
3535

3636
Error in creating message is logged
3737
${tc}= Check test case ${TEST NAME}
38-
Check log message ${tc.kws[0].msgs[0]} Failed to log following message properly: <Unrepresentable object 'InvalidMessage'. Error: Should not have been logged>
38+
Check log message ${tc.kws[0].msgs[0]} Failed to log following message properly: <Unrepresentable object InvalidMessage. Error: Should not have been logged>
3939
Check log message ${tc.kws[0].msgs[1]} Should not have been logged\nTraceback (most recent call last):* DEBUG pattern=true
4040

4141
Log using custom logger

atest/robot/variables/return_values.robot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Force Tags regression pybot jybot
88
Resource atest_resource.robot
99

1010
*** Variables ***
11-
${UNREPR STR} <Unrepresentable object 'FailiningStr'. Error: *>
12-
${UNREPR UNIC} <Unrepresentable object 'FailiningUnicode'. Error: *>
11+
${UNREPR STR} <Unrepresentable object FailiningStr. Error: *>
12+
${UNREPR UNIC} <Unrepresentable object FailiningUnicode. Error: *>
1313

1414
*** Test Cases ***
1515
Simple Scalar Variable

atest/testdata/standard_libraries/builtin/log.robot

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,17 @@ Log repr
5353
Log ${list} repr=yes console=please
5454

5555
Log pprint
56-
${dict} = Evaluate {'a long string': 1, 'a longer string!': 2, 'a much, much, much, much, much, much longer string': 3, 'list': ['a long string', 'a longer string!', 'a much, much, much, much, much, much longer string']}
56+
${dict} = Evaluate {u'a long string': 1, u'a longer string!': 2, u'a much, much, much, much, much, much longer string': 3, u'list': [u'a long string', u'a longer string!', u'a much, much, much, much, much, much longer string']}
5757
Log ${dict} repr=yes console=please
58-
${list} = Evaluate ['One', 'Two', 3]
58+
${list} = Evaluate ['One', u'Two', 3]
5959
Log ${list} repr=yes console=please
60-
${list} = Evaluate ['a long string', 'a longer string!', 'a much, much, much, much, much, much longer string']
60+
${list} = Evaluate ['a long string', u'a longer string!', u'a much, much, much, much, much, much longer string']
6161
Log ${list} repr=yes console=please
62-
${dict} = Evaluate {'a long string': 1, 'a longer string!': 2, 'a much, much, much, much, much, much longer string': 3, 'list': ['a long string', 'a longer string!', 'a much, much, much, much, much, much longer string']}
62+
${dict} = Evaluate {u'a long string': 1, u'a longer string!': 2, u'a much, much, much, much, much, much longer string': 3, u'list': [u'a long string', u'a longer string!', u'a much, much, much, much, much, much longer string']}
6363
Log ${dict} repr=yes
64-
${list} = Evaluate ['One', 'Two', 3]
64+
${list} = Evaluate [u'One', 'Two', 3]
6565
Log ${list} repr=yes
66-
${dict} = Evaluate {'a long string': 1, 'a longer string!': 2, 'a much, much, much, much, much, much longer string': 3, 'list': ['a long string', ${42}, u'Hyvää yötä \u2603!', 'a much, much, much, much, much, much longer string', '\\x00\\xff']}
66+
${dict} = Evaluate {u'a long string': 1, u'a longer string!': 2, u'a much, much, much, much, much, much longer string': 3, u'list': [u'a long string', ${42}, u'Hyvää yötä \u2603!', u'a much, much, much, much, much, much longer string', '\\x00\\xff']}
6767
Log ${dict} repr=yes console=please
6868

6969
Log callable

src/robot/libraries/BuiltIn.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import pprint
1615
import re
1716
import time
1817

@@ -2120,9 +2119,12 @@ def log(self, message, level='INFO', html=False, console=False, repr=False):
21202119
instead if either of these is undesirable,
21212120
21222121
If the `repr` argument is true, the given item will be passed through
2123-
Python's `pprint.pformat()` function before logging it. This is useful,
2124-
for example, when working with strings or bytes containing invisible
2125-
characters, or when working with nested data structures.
2122+
a custom version of Python's `pprint.pformat()` function before
2123+
logging it. This is useful, for example, when working with strings or
2124+
bytes containing invisible characters, or when working with nested data
2125+
structures. The custom version differs from the standard one so that it
2126+
omits the `u` prefix from Unicode strings and adds `b` prefix to
2127+
byte strings.
21262128
21272129
Examples:
21282130
| Log | Hello, world! | | | # Normal INFO message. |
@@ -2131,19 +2133,20 @@ def log(self, message, level='INFO', html=False, console=False, repr=False):
21312133
| Log | <b>Hello</b>, world! | HTML | | # Same as above. |
21322134
| Log | <b>Hello</b>, world! | DEBUG | html=true | # DEBUG as HTML. |
21332135
| Log | Hello, console! | console=yes | | # Log also to the console. |
2134-
| Log | Hyv\xe4 \\x00 | repr=yes | | # Log `u'Hyv\\xe4 \\x00'`. |
2136+
| Log | Hyv\xe4 \\x00 | repr=yes | | # Log `'Hyv\\xe4 \\x00'`. |
21352137
21362138
See `Log Many` if you want to log multiple messages in one go, and
21372139
`Log To Console` if you only want to write to the console.
21382140
21392141
Arguments `html`, `console`, and `repr` are new in Robot Framework
21402142
2.8.2.
21412143
2142-
Pprint support when `repr` is true is new in Robot Framework 2.8.6.
2144+
Pprint support when `repr` is used is new in Robot Framework 2.8.6,
2145+
and it was changed to drop the `u` prefix and add the `b` prefix
2146+
in Robot Framework 2.9.
21432147
"""
21442148
if repr:
2145-
message = utils.safe_repr(message) if utils.is_str_like(message) \
2146-
else pprint.pformat(message)
2149+
message = utils.prepr(message, width=80)
21472150
logger.write(message, level, html)
21482151
if console:
21492152
logger.console(message)

0 commit comments

Comments
 (0)