OutputWrapper class to Commands which outputs to stream object of choice
Review Request #11401 — Created Jan. 23, 2021 and submitted
RBTools commands were previously using
sys.stderr
to output messages. This change abstracting outputting by using a
wrapper around a stream output object. This makes it easier to customize
output streams and suppress output. 4 wrappers (2 for standard output
unicode and byte, 2 for standard error unicode and byte) are initiated
in the Command class that is accessible to all child classes.
Ran all tests in
./tests/runtests.py rbtools.commands
and passed.Added two new tests for
__init__.py
. One that tests if output stream
object is set correctly forOutputWrapper
and another test that makes
sureOutputWrapper
passes the correct message to the output stream object
Summary | ID |
---|---|
ca88dd1ff65187e387fdf17dc19f4c0c89fb903c | |
e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b | |
360b92a955667e881394ee9f8a482d397bf176e6 | |
0e77eec5effa3e23f3d13fb7578f2ef22037f413 | |
f137a9331459e3d88d9cb96f3e499730c6adcb30 | |
70cfb2c6f67be4b3f10af316835aae37488328e4 | |
91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 | |
7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 | |
43788831f5c440ae0832f705ce943535f8d1936f | |
d8a51ac5c9d2315030b6c514177fc089ab9da020 | |
5b2937ea7acf8e4e602f03abdd97dde2ebaae997 | |
ef64e449e9026ac8a171ef712a8295b30a90a88c | |
c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 | |
86196002cfc2c374c4cfa56123fd63da123e657f | |
b7f620e9317c269ef71f3288f6747b02088533f1 |
Description | From | Last Updated |
---|---|---|
All the changes suggested have to do with consistency with self.stdout.new_line(). Other than that, everything else looks good to me! |
amohapatra | |
Your summary should be much shorter, about 70 columns. Further detail (for example, what tests were added) should be in … |
david | |
E501 line too long (85 > 79 characters) |
reviewbot | |
E501 line too long (91 > 79 characters) |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E501 line too long (85 > 79 characters) |
reviewbot | |
E501 line too long (88 > 79 characters) |
reviewbot | |
E501 line too long (89 > 79 characters) |
reviewbot | |
E211 whitespace before '(' |
reviewbot | |
E501 line too long (91 > 79 characters) |
reviewbot | |
E501 line too long (90 > 79 characters) |
reviewbot | |
E501 line too long (89 > 79 characters) |
reviewbot | |
E501 line too long (88 > 79 characters) |
reviewbot | |
E501 line too long (85 > 79 characters) |
reviewbot | |
E501 line too long (84 > 79 characters) |
reviewbot | |
E501 line too long (86 > 79 characters) |
reviewbot | |
E501 line too long (83 > 79 characters) |
reviewbot | |
E501 line too long (84 > 79 characters) |
reviewbot | |
E501 line too long (80 > 79 characters) |
reviewbot | |
E501 line too long (91 > 79 characters) |
reviewbot | |
E501 line too long (81 > 79 characters) |
reviewbot | |
E501 line too long (80 > 79 characters) |
reviewbot | |
E501 line too long (83 > 79 characters) |
reviewbot | |
E501 line too long (88 > 79 characters) |
reviewbot | |
E501 line too long (89 > 79 characters) |
reviewbot | |
E501 line too long (80 > 79 characters) |
reviewbot | |
W292 no newline at end of file |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
E124 closing bracket does not match visual indentation |
reviewbot | |
E231 missing whitespace after ',' |
reviewbot | |
E501 line too long (86 > 79 characters) |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
For consistency with the other changes, should this maybe instead be self.stdout.new_line() ? |
amohapatra | |
Again for consistency, maybe this should be self.stdout.new_line() ? |
amohapatra | |
This should be self.stdout.new_line()? |
amohapatra | |
This should be self.stdout.new_line() ? |
amohapatra | |
This should also be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
This should be self.stdout.new_line() |
amohapatra | |
W292 no newline at end of file |
reviewbot | |
W391 blank line at end of file |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E501 line too long (81 > 79 characters) |
reviewbot | |
E501 line too long (89 > 79 characters) |
reviewbot | |
E501 line too long (83 > 79 characters) |
reviewbot | |
E501 line too long (89 > 79 characters) |
reviewbot | |
All test cases should be in files called test_X, not the __init__.py. In this case I think you could probably … |
david | |
A few changes in here: The file needs a module docstring The first thing after that docstring should be from … |
david | |
Dedent this three spaces. |
david | |
Typo: strea -> stream |
david | |
This needs a method docstring. |
david | |
This needs a method docstring. |
david | |
This needs a method docstring. |
david | |
Can we call these _bytes instead of _byte? |
david | |
Let's add another newline in here, before the format operation. Otherwise it's sometimes easy to miss when scanning quickly through … |
david | |
The second line here needs to be indented a bit more: % (review_request.submitter.fullname or review_request.submitter.username)) |
david | |
When we wrap a string, we put the space at the end of the first line. Let's also put the … |
david | |
Please undo the changes here (so the space is at the end of the first line). |
david | |
One thing Christian just pointed out to me is that he's been moving to just import kgb, and then using … |
david | |
Please make sure this is sorted alphabetically. |
david | |
We still need two blank lines here. |
david | |
This isn't a good description. Let's say "Unit tests for command OutputWrapper" |
david | |
Docstrings need to be in the following form: """Single-line summary. Multi-line description. """ Along with this, for any newly-introduced classes … |
chipx86 | |
Function docstrings must follow the same form, and specify any arguments, return values, and exceptions raised. Take a look at … |
chipx86 | |
We expect a blank line between the end of a block and a new statememt, to help separate that out … |
chipx86 | |
There's some typos in these docstrings ("charater" here, "specifiy" in the class docstring). If your editor supports it, I recommend … |
chipx86 | |
This docstring is old, and needs to be modernized. As a step toward this, since you're introducing some really important … |
chipx86 | |
There's an inconsistency in variable names. You have stderr_bytes (plural) and stderr_byte (singular). The plural form is what we want, … |
chipx86 | |
Here's an area where the new output wrappers solve a problem! Not all diffs can be decoded as UTF-8, so … |
chipx86 | |
The string is a parameter to textwrap.fill(), rather than a second parameter to stdout.write. Since we're wrapping to the following … |
chipx86 | |
To keep lint checkers from complaining about indentations being multiples of 4, this should actually be in the same form … |
chipx86 | |
This should be a single import statement. |
chipx86 | |
This is a class docstring, so it needs to have a trailing period. |
chipx86 | |
All unit test docstrings should be in the form of Testing <Thing> <condition>. For instance, Testing OutputWrapper initializes stream Testing … |
chipx86 | |
W293 blank line contains whitespace |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E501 line too long (80 > 79 characters) |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E126 continuation line over-indented for hanging indent |
reviewbot | |
F401 'rbtools.commands.JSONWrapper' imported but unused |
reviewbot | |
F821 undefined name 'JSONOutput' |
reviewbot |
- Summary:
-
added OutputWrapper class to Commands which outputs to stream object of choice. Added test suite that checks if OutputWrapper has correct stream and that OutputWrapper passes correct message to stream object[WIP] Added OutputWrapper class to Commands which outputs to stream object of choice. Added test suite that checks if OutputWrapper has correct stream and that OutputWrapper passes correct message to stream object
- Description:
-
~ [WIP] RBTools commands were previously using
print
andsys.stderr
~ RBTools commands were previously using
print
andsys.stderr
to output messages. This change abstracting outputting by using a wrapper around a stream output object. This makes it easier to customize output streams and suppress output. 4 wrappers (2 for standard output unicode and byte, 2 for standard error unicode and byte) are initiated in the Command class that is accessible to all child classes.
- Groups:
- Change Summary:
-
Fixing Review Bot issues and multiline string formatting
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413
Checks run (2 succeeded)
- Change Summary:
-
Added new test for Outputwrapper's new_line() that ensures output stream receives new line character
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30
- Change Summary:
-
Replaced self.stdout.write("\n") with self.stdout.new_line()
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9
Checks run (2 succeeded)
- Change Summary:
-
Changed status from work in progress to in review
- Summary:
-
[WIP] Added OutputWrapper class to Commands which outputs to stream object of choice. Added test suite that checks if OutputWrapper has correct stream and that OutputWrapper passes correct message to stream objectAdded OutputWrapper class to Commands which outputs to stream object of choice. Added test suite that checks if OutputWrapper has correct stream and that OutputWrapper passes correct message to stream object
- Testing Done:
-
~ Ran all tests in ./tests/runtests.py rbtools/commands/ and passed.
~ Ran all tests in
./tests/runtests.py rbtools.commands
and passed.~ Added two new tests for
__init.py
. One that tests if output stream~ Added two new tests for
__init__.py
. One that tests if output streamobject is set correctly for OutputWrapper
and another test that makessure OutputWrapper
passes the correct message to the output stream object
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f
Checks run (2 succeeded)
-
-
All test cases should be in files called
test_X
, not the__init__.py
. In this case I think you could probably add your new test class to the existingtest_main.py
file.This class should also probably be called
OutputWrapperTests
. -
A few changes in here:
- The file needs a module docstring
- The first thing after that docstring should be
from __future__ import unicode_literals
- Imports should be structured in three groups: standard library, third-party libraries, and then rbtools. In each group we alphabetize the imports. So these should look like:
import sys from kgb import SpyAgency from rbtools.commands import OutputWrapper from rbtools.utils.testbase import RBTestBase
-
-
- Summary:
-
Added OutputWrapper class to Commands which outputs to stream object of choice. Added test suite that checks if OutputWrapper has correct stream and that OutputWrapper passes correct message to stream objectOutputWrapper class to Commands which outputs to stream object of choice
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997
Checks run (2 succeeded)
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c
Checks run (2 succeeded)
-
-
-
-
-
-
Let's add another newline in here, before the format operation. Otherwise it's sometimes easy to miss when scanning quickly through the code.
self.stdout.write('Please log in to the Review Board server at ' '%s.' % urlparse(uri)[1])
-
The second line here needs to be indented a bit more:
% (review_request.submitter.fullname or review_request.submitter.username))
-
When we wrap a string, we put the space at the end of the first line. Let's also put the format parameters on their own line:
self.stdout.write('Recursively landing dependencies of ' 'review request %s.' % review_request_id)
-
-
-
One thing Christian just pointed out to me is that he's been moving to just
import kgb
, and then usingkgb.SpyAgency
where necessary. This makes it easier when we want to add things later like spy operations. -
-
-
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1
Checks run (2 succeeded)
-
-
Docstrings need to be in the following form:
"""Single-line summary. Multi-line description. """
Along with this, for any newly-introduced classes (or new functions/attributes on existing classes), we want to include version information directly below the description, like so:
"""Single-line summary. Multi-line description. Version Added: 3.0 """
-
Function docstrings must follow the same form, and specify any arguments, return values, and exceptions raised. Take a look at the docs for this on Notion.
We do have a lot of old docstrings in RBTools that don't conform to the modern standard, but if you grep around for "Args:" or "Returns:", you'll see examples.
This comment applies throughout the change.
-
We expect a blank line between the end of a block and a new statememt, to help separate that out as a new chunk of code.
-
There's some typos in these docstrings ("charater" here, "specifiy" in the class docstring). If your editor supports it, I recommend running a spell check.
-
This docstring is old, and needs to be modernized. As a step toward this, since you're introducing some really important new attributes, let's begin documenting them.
To do this, add an
Attributes
section at the end of this docstring:"""... ... Attributes: stderr (OutputWrapper): Standard error output wrapper that subclasses must write to. stdout (OutputWrapper): ... ...
Attributes should be in alphabetical order.
-
There's an inconsistency in variable names. You have
stderr_bytes
(plural) andstderr_byte
(singular).The plural form is what we want, I think.
Also, this if/else always sets both, so we have no reason to default to
None
above. -
Here's an area where the new output wrappers solve a problem!
Not all diffs can be decoded as UTF-8, so we want to write as a byte string. This code here was using
sys.stdout.buffer.write
to let us do that on Python 3, and justprint()
on Python 2.The correct thing will be to replace this entire chunk of logic with a write to
self.stdout_bytes
.Make sure, along with replacing
print
statements, that you're looking for and replacingsys.stdout
orsys.stderr
. -
The string is a parameter to
textwrap.fill()
, rather than a second parameter tostdout.write
. Since we're wrapping to the following line to give us room for the text, we need to keep it 4 spaces indented from the start of the main statement. In order words, what we had before was correct. -
To keep lint checkers from complaining about indentations being multiples of 4, this should actually be in the same form we had before. The parameters indent to 4 spaces relative to the statement, allowing dictionary keys to indent 4 spaces from that. So you can revert these indentation changes, and keep the string on the second line.
-
-
-
All unit test docstrings should be in the form of
Testing <Thing> <condition>
.For instance,
Testing OutputWrapper initializes stream
Testing OutputWrapper.write with ...
Testing OutputWrapper.new_line
etc.
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 86196002cfc2c374c4cfa56123fd63da123e657f
Checks run (1 failed, 1 succeeded)
flake8
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 86196002cfc2c374c4cfa56123fd63da123e657f ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 86196002cfc2c374c4cfa56123fd63da123e657f b7f620e9317c269ef71f3288f6747b02088533f1
Checks run (2 succeeded)
- Commits:
-
Summary ID ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 86196002cfc2c374c4cfa56123fd63da123e657f b7f620e9317c269ef71f3288f6747b02088533f1 fc3442b40f7688eae2dc8943c3905de1189aba49 93a7f52f930aec3fe39c3d0d9c0f15ee4a14922c 8d6ea988b098794628c133cbbcd42f524293d873 312b2d649dc71fa01637c427209d5f972c193402 9ecb2ddb435c1889c5b000d2ad2d57f7bc3f04b8 99df72a53c52f7b839decff237fa694d19baa190 505c93c8f2a525fc8a8114e37b69ccdf4f283b9d 1c4e3367bd82af470f4889056c35e1e137b9d9ff c110d05aca25324d53b55ed678169610aa9a7c07 d58d4e8f8bbe7b1c4486479d2d4ebc25cb545010 29daf66756b65033e122b5cb2466e588ad4a7635 a0ee53dabe7e1c7894412281719b38db1410f16f 40c9ab291084fd36bed86e74761ed579706a612c fe0dd7c90d293e3885890f4ca3be0dafe506a63a b662b573e9452277ea177d990b2f8d750028f2f2
- Commits:
-
Summary ID fc3442b40f7688eae2dc8943c3905de1189aba49 93a7f52f930aec3fe39c3d0d9c0f15ee4a14922c 8d6ea988b098794628c133cbbcd42f524293d873 312b2d649dc71fa01637c427209d5f972c193402 9ecb2ddb435c1889c5b000d2ad2d57f7bc3f04b8 99df72a53c52f7b839decff237fa694d19baa190 505c93c8f2a525fc8a8114e37b69ccdf4f283b9d 1c4e3367bd82af470f4889056c35e1e137b9d9ff c110d05aca25324d53b55ed678169610aa9a7c07 d58d4e8f8bbe7b1c4486479d2d4ebc25cb545010 29daf66756b65033e122b5cb2466e588ad4a7635 a0ee53dabe7e1c7894412281719b38db1410f16f 40c9ab291084fd36bed86e74761ed579706a612c fe0dd7c90d293e3885890f4ca3be0dafe506a63a b662b573e9452277ea177d990b2f8d750028f2f2 fc3442b40f7688eae2dc8943c3905de1189aba49 93a7f52f930aec3fe39c3d0d9c0f15ee4a14922c 8d6ea988b098794628c133cbbcd42f524293d873 312b2d649dc71fa01637c427209d5f972c193402 9ecb2ddb435c1889c5b000d2ad2d57f7bc3f04b8 99df72a53c52f7b839decff237fa694d19baa190 505c93c8f2a525fc8a8114e37b69ccdf4f283b9d 1c4e3367bd82af470f4889056c35e1e137b9d9ff c110d05aca25324d53b55ed678169610aa9a7c07 d58d4e8f8bbe7b1c4486479d2d4ebc25cb545010 29daf66756b65033e122b5cb2466e588ad4a7635 a0ee53dabe7e1c7894412281719b38db1410f16f 40c9ab291084fd36bed86e74761ed579706a612c fe0dd7c90d293e3885890f4ca3be0dafe506a63a b662b573e9452277ea177d990b2f8d750028f2f2 412f531a218f3c9bf2eac16ebb765ef74d0bcb30
Checks run (2 succeeded)
- Commits:
-
Summary ID fc3442b40f7688eae2dc8943c3905de1189aba49 93a7f52f930aec3fe39c3d0d9c0f15ee4a14922c 8d6ea988b098794628c133cbbcd42f524293d873 312b2d649dc71fa01637c427209d5f972c193402 9ecb2ddb435c1889c5b000d2ad2d57f7bc3f04b8 99df72a53c52f7b839decff237fa694d19baa190 505c93c8f2a525fc8a8114e37b69ccdf4f283b9d 1c4e3367bd82af470f4889056c35e1e137b9d9ff c110d05aca25324d53b55ed678169610aa9a7c07 d58d4e8f8bbe7b1c4486479d2d4ebc25cb545010 29daf66756b65033e122b5cb2466e588ad4a7635 a0ee53dabe7e1c7894412281719b38db1410f16f 40c9ab291084fd36bed86e74761ed579706a612c fe0dd7c90d293e3885890f4ca3be0dafe506a63a b662b573e9452277ea177d990b2f8d750028f2f2 412f531a218f3c9bf2eac16ebb765ef74d0bcb30 ca88dd1ff65187e387fdf17dc19f4c0c89fb903c e31adcfce9cf6cdbc5272a57a81cb0c7acdd7c5b 360b92a955667e881394ee9f8a482d397bf176e6 0e77eec5effa3e23f3d13fb7578f2ef22037f413 f137a9331459e3d88d9cb96f3e499730c6adcb30 70cfb2c6f67be4b3f10af316835aae37488328e4 91baf8a9e9f2e4d8c9b30a19c76d72b0860849b9 7d65b3e5683ebcc7b9e0920146a7bf0b20bd28a9 43788831f5c440ae0832f705ce943535f8d1936f d8a51ac5c9d2315030b6c514177fc089ab9da020 5b2937ea7acf8e4e602f03abdd97dde2ebaae997 ef64e449e9026ac8a171ef712a8295b30a90a88c c25d2df4c21dd1da9a1f6f9df6dbdc483ec5bea1 86196002cfc2c374c4cfa56123fd63da123e657f b7f620e9317c269ef71f3288f6747b02088533f1