)]}'
{"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":810,"context_line":"            #   UPDATE image_properties SET value\u003d$value, deleted\u003d0"},{"line_number":811,"context_line":"            #     WHERE name\u003d$name AND deleted!\u003d0"},{"line_number":812,"context_line":"            result \u003d connection.execute(table.update().where("},{"line_number":813,"context_line":"                sa_sql.and_(table.c.name\u003d\u003dname, table.c.deleted!\u003d0)).values("},{"line_number":814,"context_line":"                    value\u003dvalue, deleted\u003d0))"},{"line_number":815,"context_line":"            if result.rowcount \u003d\u003d 1:"},{"line_number":816,"context_line":"                # Found and updated a deleted property, so we win"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_2a72cbad","line":813,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: E225 missing whitespace around operator","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":810,"context_line":"            #   UPDATE image_properties SET value\u003d$value, deleted\u003d0"},{"line_number":811,"context_line":"            #     WHERE name\u003d$name AND deleted!\u003d0"},{"line_number":812,"context_line":"            result \u003d connection.execute(table.update().where("},{"line_number":813,"context_line":"                sa_sql.and_(table.c.name\u003d\u003dname, table.c.deleted!\u003d0)).values("},{"line_number":814,"context_line":"                    value\u003dvalue, deleted\u003d0))"},{"line_number":815,"context_line":"            if result.rowcount \u003d\u003d 1:"},{"line_number":816,"context_line":"                # Found and updated a deleted property, so we win"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_8a6cb7ce","line":813,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: E225 missing whitespace around operator","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b1df0209c7da67ad18c7d1cf8f180033fc01ffbe","unresolved":false,"context_lines":[{"line_number":803,"context_line":"    with session.begin():"},{"line_number":804,"context_line":"        connection \u003d session.connection()"},{"line_number":805,"context_line":"        meta \u003d sqlalchemy.MetaData(get_engine())"},{"line_number":806,"context_line":"        table \u003d sqlalchemy.Table(\u0027image_properties\u0027, meta, autoload\u003dTrue)"},{"line_number":807,"context_line":"        try:"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"            # This should be:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_3c6faefc","line":806,"updated":"2020-06-25 13:52:13.000000000","message":"here\u0027s the first thing I would change.  don\u0027t use reflection inside of the application, instead, use the model class.  also note that reflection query is using a separate transaction too.   Is there an ImageProperties class available I would assume?  you can just get ImageProperties.__table__.","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"41f56766cca3e131d878bd5312ba6d2a86beb357","unresolved":false,"context_lines":[{"line_number":803,"context_line":"    with session.begin():"},{"line_number":804,"context_line":"        connection \u003d session.connection()"},{"line_number":805,"context_line":"        meta \u003d sqlalchemy.MetaData(get_engine())"},{"line_number":806,"context_line":"        table \u003d sqlalchemy.Table(\u0027image_properties\u0027, meta, autoload\u003dTrue)"},{"line_number":807,"context_line":"        try:"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"            # This should be:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_e5de3a3c","line":806,"in_reply_to":"bf51134e_3c6faefc","updated":"2020-06-25 14:45:37.000000000","message":"Ack, yep.","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b1df0209c7da67ad18c7d1cf8f180033fc01ffbe","unresolved":false,"context_lines":[{"line_number":820,"context_line":"            # There might have been no deleted property, or the property"},{"line_number":821,"context_line":"            # exists and is undeleted, so try to create it and use that"},{"line_number":822,"context_line":"            # to determine if we\u0027ve lost the race or not."},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            connection.execute(table.insert(),"},{"line_number":825,"context_line":"                               deleted\u003dFalse,"},{"line_number":826,"context_line":"                               created_at\u003dtimeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_7c0be628","line":823,"updated":"2020-06-25 13:52:13.000000000","message":"I would put the \"try:\" here, since this is the part that can raise the dbduplicate part, this helps readability but is not critical.","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"9eb556e4c89a58a22ffc6fe0e54a71896239124c","unresolved":false,"context_lines":[{"line_number":820,"context_line":"            # There might have been no deleted property, or the property"},{"line_number":821,"context_line":"            # exists and is undeleted, so try to create it and use that"},{"line_number":822,"context_line":"            # to determine if we\u0027ve lost the race or not."},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            connection.execute(table.insert(),"},{"line_number":825,"context_line":"                               deleted\u003dFalse,"},{"line_number":826,"context_line":"                               created_at\u003dtimeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_080d458f","line":823,"in_reply_to":"bf51134e_4841fda8","updated":"2020-06-25 15:55:03.000000000","message":"oh wait, with this UPDATE, you need to include \"value\" in your WHERE clause.  right now, if \"name\" is not being updated, then any number of processes can access the row and they will all match.","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"41f56766cca3e131d878bd5312ba6d2a86beb357","unresolved":false,"context_lines":[{"line_number":820,"context_line":"            # There might have been no deleted property, or the property"},{"line_number":821,"context_line":"            # exists and is undeleted, so try to create it and use that"},{"line_number":822,"context_line":"            # to determine if we\u0027ve lost the race or not."},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            connection.execute(table.insert(),"},{"line_number":825,"context_line":"                               deleted\u003dFalse,"},{"line_number":826,"context_line":"                               created_at\u003dtimeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_a5d8c252","line":823,"in_reply_to":"bf51134e_7c0be628","updated":"2020-06-25 14:45:37.000000000","message":"Okay I thought the update might as well if two threads tried to do the exact same thing. If not, I\u0027ll definitely reduce the scope.","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"9867d82190513f5047ae39d168e67cf9735af5f3","unresolved":false,"context_lines":[{"line_number":820,"context_line":"            # There might have been no deleted property, or the property"},{"line_number":821,"context_line":"            # exists and is undeleted, so try to create it and use that"},{"line_number":822,"context_line":"            # to determine if we\u0027ve lost the race or not."},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            connection.execute(table.insert(),"},{"line_number":825,"context_line":"                               deleted\u003dFalse,"},{"line_number":826,"context_line":"                               created_at\u003dtimeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_4841fda8","line":823,"in_reply_to":"bf51134e_a5d8c252","updated":"2020-06-25 15:53:05.000000000","message":"hmmmmmmm OK let me look at that exception and see if that\u0027s the case, you might be right","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b1df0209c7da67ad18c7d1cf8f180033fc01ffbe","unresolved":false,"context_lines":[{"line_number":822,"context_line":"            # to determine if we\u0027ve lost the race or not."},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            connection.execute(table.insert(),"},{"line_number":825,"context_line":"                               deleted\u003dFalse,"},{"line_number":826,"context_line":"                               created_at\u003dtimeutils.utcnow(),"},{"line_number":827,"context_line":"                               image_id\u003dimage_id,"},{"line_number":828,"context_line":"                               name\u003dname,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_82493461","line":825,"updated":"2020-06-25 13:52:13.000000000","message":"slight thing here that doesn\u0027t matter for the moment and this will probably be a vastly larger job someday, connection.execute() in the next two years will only support the parameters passed as a dict, so you could put dict() here for that\n\n    connection.execute(table.insert(), dict(deleted\u003dFalse, ...))","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b1df0209c7da67ad18c7d1cf8f180033fc01ffbe","unresolved":false,"context_lines":[{"line_number":827,"context_line":"                               image_id\u003dimage_id,"},{"line_number":828,"context_line":"                               name\u003dname,"},{"line_number":829,"context_line":"                               value\u003dvalue)"},{"line_number":830,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":831,"context_line":"            # Lost the race to create the new property"},{"line_number":832,"context_line":"            raise exception.Duplicate()"},{"line_number":833,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_e27110aa","line":830,"updated":"2020-06-25 13:52:13.000000000","message":"assuming openstack projects aren\u0027t yet doing any kind of \"raise from\" for chained exceptions","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b1df0209c7da67ad18c7d1cf8f180033fc01ffbe","unresolved":false,"context_lines":[{"line_number":832,"context_line":"            raise exception.Duplicate()"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        # If we got here, we created a new row, UniqueConstraint would have"},{"line_number":835,"context_line":"        # caused us to fail if we lost the race"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"@retry(retry_on_exception\u003d_retry_on_deadlock, wait_fixed\u003d500,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_226788eb","line":835,"updated":"2020-06-25 13:52:13.000000000","message":"but everyone\u0027s a winner for trying!","commit_id":"7f25c10937ba68773e38d9e02657fb556b29213c"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3b6735927e2e18080ccc2315eb8da2f4a4287199","unresolved":false,"context_lines":[{"line_number":778,"context_line":"            setattr(image_ref, k, values[k])"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"def image_set_property_atomic(context, image_id, name, value):"},{"line_number":782,"context_line":"    \"\"\""},{"line_number":783,"context_line":"    Atomically set an image property to a value."},{"line_number":784,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_ae2d3696","line":781,"range":{"start_line":781,"start_character":30,"end_line":781,"end_character":37},"updated":"2020-06-26 10:11:13.000000000","message":"this is unused","commit_id":"af69b3a12a4360418c5b00f643d7a3f27d98b9d6"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3b6735927e2e18080ccc2315eb8da2f4a4287199","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        # This should be:"},{"line_number":808,"context_line":"        #   UPDATE image_properties SET value\u003d$value, deleted\u003d0"},{"line_number":809,"context_line":"        #     WHERE name\u003d$name AND deleted!\u003d0"},{"line_number":810,"context_line":"        result \u003d connection.execute(table.update().where("},{"line_number":811,"context_line":"            sa_sql.and_(table.c.name \u003d\u003d name,"},{"line_number":812,"context_line":"                        table.c.deleted !\u003d 0)).values("},{"line_number":813,"context_line":"                            value\u003dvalue, deleted\u003d0))"},{"line_number":814,"context_line":"        if result.rowcount \u003d\u003d 1:"},{"line_number":815,"context_line":"            # Found and updated a deleted property, so we win"},{"line_number":816,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_ce4fca68","line":813,"range":{"start_line":810,"start_character":8,"end_line":813,"end_character":52},"updated":"2020-06-26 10:11:13.000000000","message":"Should we not consider image_id here, otherwise it will update records for all image_id\u0027s which matches (table.c.name \u003d\u003d name, table.c.deleted !\u003d 0) condition.","commit_id":"af69b3a12a4360418c5b00f643d7a3f27d98b9d6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1d29eaa17066686bee26014a886a160916d0e6d4","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        # This should be:"},{"line_number":808,"context_line":"        #   UPDATE image_properties SET value\u003d$value, deleted\u003d0"},{"line_number":809,"context_line":"        #     WHERE name\u003d$name AND deleted!\u003d0"},{"line_number":810,"context_line":"        result \u003d connection.execute(table.update().where("},{"line_number":811,"context_line":"            sa_sql.and_(table.c.name \u003d\u003d name,"},{"line_number":812,"context_line":"                        table.c.deleted !\u003d 0)).values("},{"line_number":813,"context_line":"                            value\u003dvalue, deleted\u003d0))"},{"line_number":814,"context_line":"        if result.rowcount \u003d\u003d 1:"},{"line_number":815,"context_line":"            # Found and updated a deleted property, so we win"},{"line_number":816,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_af6ed1fc","line":813,"range":{"start_line":810,"start_character":8,"end_line":813,"end_character":52},"in_reply_to":"bf51134e_ce4fca68","updated":"2020-06-26 13:32:34.000000000","message":"Ah, yes, indeed! :)","commit_id":"af69b3a12a4360418c5b00f643d7a3f27d98b9d6"}],"glance/domain/proxy.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"29ad5da8a7e9e6811a548ff0314ddc479b2b912c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return self.helper.proxy(result)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def set_property_atomic(self, item, name, value):"},{"line_number":108,"context_line":"        msg \u003d \u0027%s is only valid for images\u0027 % __name__"},{"line_number":109,"context_line":"        assert hasattr(item, \u0027image_id\u0027), msg"},{"line_number":110,"context_line":"        self.base.set_property_atomic(item, name, value)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_1b453816","line":108,"range":{"start_line":108,"start_character":46,"end_line":108,"end_character":54},"updated":"2020-07-20 18:09:38.000000000","message":"Don\u0027t you mean \u0027name\u0027, here?","commit_id":"2a51843138e27071bf84269f6b2a601b3ba9978f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fae9369f8bd819860717bb9d7ce80ce3757fdfc0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return self.helper.proxy(result)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def set_property_atomic(self, item, name, value):"},{"line_number":108,"context_line":"        msg \u003d \u0027%s is only valid for images\u0027 % __name__"},{"line_number":109,"context_line":"        assert hasattr(item, \u0027image_id\u0027), msg"},{"line_number":110,"context_line":"        self.base.set_property_atomic(item, name, value)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_fe96723e","line":108,"range":{"start_line":108,"start_character":46,"end_line":108,"end_character":54},"in_reply_to":"bf51134e_1b453816","updated":"2020-07-20 19:27:34.000000000","message":"No, this method gets called through a bunch of proxies and so you could call it on some other repositories-of-things. So what I want this to say is:\n\n \u0027set_property_atomic is only valid for images\u0027","commit_id":"2a51843138e27071bf84269f6b2a601b3ba9978f"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"c63837bddd59d83afc42100024a7a8847f036d12","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return self.helper.proxy(result)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def set_property_atomic(self, item, name, value):"},{"line_number":108,"context_line":"        msg \u003d \u0027%s is only valid for images\u0027 % __name__"},{"line_number":109,"context_line":"        assert hasattr(item, \u0027image_id\u0027), msg"},{"line_number":110,"context_line":"        self.base.set_property_atomic(item, name, value)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_918c8736","line":108,"range":{"start_line":108,"start_character":46,"end_line":108,"end_character":54},"in_reply_to":"bf51134e_fe96723e","updated":"2020-07-20 20:36:29.000000000","message":"OK, makes sense!","commit_id":"2a51843138e27071bf84269f6b2a601b3ba9978f"}],"glance/tests/functional/db/test_sqlalchemy.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_db import options"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from glance.common import exception"},{"line_number":21,"context_line":"from glance import context"},{"line_number":22,"context_line":"import glance.db.sqlalchemy.api"},{"line_number":23,"context_line":"from glance.db.sqlalchemy import models as db_models"},{"line_number":24,"context_line":"from glance.db.sqlalchemy import models_metadef as metadef_models"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_6a67a3ea","line":21,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: F401 \u0027glance.context\u0027 imported but unused","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import glance.tests.functional.db as db_tests"},{"line_number":26,"context_line":"from glance.tests.functional.db import base"},{"line_number":27,"context_line":"from glance.tests.functional.db import base_metadef"},{"line_number":28,"context_line":"from glance.tests import utils as test_utils"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CONF \u003d cfg.CONF"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_ca622fd8","line":28,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: F401 \u0027glance.tests.utils as test_utils\u0027 imported but unused","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            {\u0027status\u0027: \u0027active\u0027,"},{"line_number":188,"context_line":"             \u0027owner\u0027: self.adm_context.owner,"},{"line_number":189,"context_line":"             \u0027properties\u0027: {\u0027speed\u0027: \u002788mph\u0027},"},{"line_number":190,"context_line":"            })"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    @staticmethod"},{"line_number":193,"context_line":"    def _propdict(list_of_props):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_aa5d3b16","line":190,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: E124 closing bracket does not match visual indentation","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    @staticmethod"},{"line_number":193,"context_line":"    def _propdict(list_of_props):"},{"line_number":194,"context_line":"        \"\"\"Convert a list of ImageProperty objects to dict, ignoring"},{"line_number":195,"context_line":"        deleted values.\"\"\""},{"line_number":196,"context_line":"        return {x.name: x.value"},{"line_number":197,"context_line":"                for x in list_of_props"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_0a9ee7b7","line":194,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: H403: multi line docstrings should end on a new line","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f98c45c6baf8d40efc6db8f36a9bc6c46e2e2786","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    @staticmethod"},{"line_number":193,"context_line":"    def _propdict(list_of_props):"},{"line_number":194,"context_line":"        \"\"\"Convert a list of ImageProperty objects to dict, ignoring"},{"line_number":195,"context_line":"        deleted values.\"\"\""},{"line_number":196,"context_line":"        return {x.name: x.value"},{"line_number":197,"context_line":"                for x in list_of_props"},{"line_number":198,"context_line":"                if x.deleted \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_eaa0d3f6","line":195,"updated":"2020-06-24 23:33:53.000000000","message":"pep8: H403: multi line docstrings should end on a new line","commit_id":"75d9b3e88de1b1f23c7bca4e0e77bdec27da1247"}]}
