)]}'
{"tox.ini":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"[testenv:trovestack]"},{"line_number":128,"context_line":"basepython \u003d python3"},{"line_number":129,"context_line":"skip_install \u003d True"},{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_405a4a85","line":129,"updated":"2018-12-04 12:40:12.000000000","message":"Why do we need skip_install?","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"[testenv:trovestack]"},{"line_number":128,"context_line":"basepython \u003d python3"},{"line_number":129,"context_line":"skip_install \u003d True"},{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_0fa4d605","line":129,"in_reply_to":"3f79a3b5_405a4a85","updated":"2018-12-12 08:46:01.000000000","message":"skip_install makes that testenv:install_command will not be executed.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"},{"line_number":133,"context_line":"    pip install --no-binary :all: {toxinidir}"},{"line_number":134,"context_line":"    ./trovestack {posargs}"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_dfb15a2e","line":133,"updated":"2018-12-04 12:40:12.000000000","message":"We should include upper constraints in dependency installation, simlarly to install_command.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"},{"line_number":133,"context_line":"    pip install --no-binary :all: {toxinidir}"},{"line_number":134,"context_line":"    ./trovestack {posargs}"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_7f2e065c","line":133,"range":{"start_line":133,"start_character":16,"end_line":133,"end_character":27},"updated":"2018-12-04 12:40:12.000000000","message":"Why do we need --no-binary flag?","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"},{"line_number":133,"context_line":"    pip install --no-binary :all: {toxinidir}"},{"line_number":134,"context_line":"    ./trovestack {posargs}"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_4f040ec5","line":133,"range":{"start_line":133,"start_character":16,"end_line":133,"end_character":27},"in_reply_to":"3f79a3b5_7f2e065c","updated":"2018-12-12 08:46:01.000000000","message":"There was permission denied issues when installing binary packages in your environment used for tests.\nAs we don\u0027t need them I have disabled compiling them.\n\nLooking in indexes: http://mirror.mtl01.inap.openstack.org/pypi/simple, http://mirror.mtl01.inap.openstack.org/wheel/ubuntu-16.04-x86_64\nObtaining file:///opt/stack/trove\n    Complete output from command python setup.py egg_info:\n    running egg_info\n    error: [Errno 13] Permission denied\n    \n    ----------------------------------------\nCommand \"python setup.py egg_info\" failed with error code 1 in /opt/stack/trove/","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"changedir \u003d {toxinidir}/integration/scripts"},{"line_number":131,"context_line":"passenv \u003d *"},{"line_number":132,"context_line":"commands \u003d"},{"line_number":133,"context_line":"    pip install --no-binary :all: {toxinidir}"},{"line_number":134,"context_line":"    ./trovestack {posargs}"}],"source_content_type":"text/x-properties","patch_set":45,"id":"3f79a3b5_0fee16ff","line":133,"in_reply_to":"3f79a3b5_dfb15a2e","updated":"2018-12-12 08:46:01.000000000","message":"Done","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/common/utils.py":[{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"f4063195e27b67dc3afaec1cd0d15f45e872a0e1","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        obj \u003d retriever()"},{"line_number":193,"context_line":"        if condition(obj):"},{"line_number":194,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dobj)"},{"line_number":195,"context_line":"        if time_out \u003e 0 and time.time() - start_time \u003e time_out:"},{"line_number":196,"context_line":"            raise exception.PollTimeOut"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    return loopingcall.BackOffLoopingCall("}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_69f54d20","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":23},"updated":"2018-11-29 09:25:24.000000000","message":"This can be skipped - 0 is treated as False.\nAlso I\u0027m not sure why you changed None to 0 ?","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"22b7e65ba581c1b21082e2bb3c4fbe63a9ba4436","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        obj \u003d retriever()"},{"line_number":193,"context_line":"        if condition(obj):"},{"line_number":194,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dobj)"},{"line_number":195,"context_line":"        if time_out \u003e 0 and time.time() - start_time \u003e time_out:"},{"line_number":196,"context_line":"            raise exception.PollTimeOut"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    return loopingcall.BackOffLoopingCall("}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_e2e7fa0f","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":23},"in_reply_to":"3f79a3b5_4443686f","updated":"2018-12-03 10:09:45.000000000","message":"Ok. Still why having \u003e 0 condition instead of just\nif time_out and ...","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b6c85776e7a5a6531c44dcc3cf0778bff74dcd5e","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        obj \u003d retriever()"},{"line_number":193,"context_line":"        if condition(obj):"},{"line_number":194,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dobj)"},{"line_number":195,"context_line":"        if time_out \u003e 0 and time.time() - start_time \u003e time_out:"},{"line_number":196,"context_line":"            raise exception.PollTimeOut"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    return loopingcall.BackOffLoopingCall("}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_4443686f","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":23},"in_reply_to":"3f79a3b5_69f54d20","updated":"2018-12-01 19:29:07.000000000","message":"All timeouts which are passed to build_polling_task has been chnages from None to 0:\n\n\nThe reason is that, build_polling_task uses BackOffLoopingCall class from oslo_service where timeout value is passed.\nThen, oslo performs arithmetic operation on this value [1].\n\nIn python2 it was possible to compare built-in types using arithmetic operations like None:\n\u003e\u003e\u003e 1 \u003e None\nTrue\n\nBut for python3 TypeError is raised:\n\u003e\u003e\u003e 1 \u003e None\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: unorderable types: int() \u003e NoneType()\n\n[1] https://github.com/openstack/oslo.service/blob/master/oslo_service/loopingcall.py#L369","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        obj \u003d retriever()"},{"line_number":193,"context_line":"        if condition(obj):"},{"line_number":194,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dobj)"},{"line_number":195,"context_line":"        if time_out \u003e 0 and time.time() - start_time \u003e time_out:"},{"line_number":196,"context_line":"            raise exception.PollTimeOut"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    return loopingcall.BackOffLoopingCall("}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_64a356fe","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":23},"in_reply_to":"3f79a3b5_e2e7fa0f","updated":"2018-12-10 19:14:15.000000000","message":"This will change behaviour for negative values.\n\n\u003e\u003e\u003e bool(-1)\nTrue\n\nSimilar condition is implemented in oslo.service BackOffLoopingCall:\n\nhttps://github.com/openstack/oslo.service/blob/master/oslo_service/loopingcall.py#L369","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"}],"trove/tests/api/replication.py":[{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"f4063195e27b67dc3afaec1cd0d15f45e872a0e1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"               \"| awk \u0027/Slave_running/{print $4}\u0027\")"},{"line_number":65,"context_line":"        stdout, stderr \u003d server.execute(cmd)"},{"line_number":66,"context_line":"        expected \u003d \"ON\" if running else \"OFF\""},{"line_number":67,"context_line":"        return stdout.decode().rstrip() \u003d\u003d expected"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return check_slave_is_running"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_491df15f","line":67,"range":{"start_line":67,"start_character":22,"end_line":67,"end_character":31},"updated":"2018-11-29 09:25:24.000000000","message":"This looks weird to me :/ Why do we need decode, but if so then I would hide it in server.execute function to maintain the same code on the client\u0027s side.","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"22b7e65ba581c1b21082e2bb3c4fbe63a9ba4436","unresolved":false,"context_lines":[{"line_number":64,"context_line":"               \"| awk \u0027/Slave_running/{print $4}\u0027\")"},{"line_number":65,"context_line":"        stdout, stderr \u003d server.execute(cmd)"},{"line_number":66,"context_line":"        expected \u003d \"ON\" if running else \"OFF\""},{"line_number":67,"context_line":"        return stdout.decode().rstrip() \u003d\u003d expected"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return check_slave_is_running"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_827de6e6","line":67,"range":{"start_line":67,"start_character":22,"end_line":67,"end_character":31},"in_reply_to":"3f79a3b5_040b302d","updated":"2018-12-03 10:09:45.000000000","message":"I understand why bytes type is returned. I\u0027m just not convinced why we are changing API from the client point of view.\nAs you noticed we are wrapping up subprocess.Popen and till now all clients of this code were depending on the fact that str is returned. But now it is changed so we should modify all calls of this method or we should modify the wrapper.\nI\u0027m on the side we should modify the wrapper to maintain the API. \nRegarding encoding, I suppose all calls are ASCI only since we are calling DB related code to check if something is working as expected. UTF-8 should be sufficient.","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b6c85776e7a5a6531c44dcc3cf0778bff74dcd5e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"               \"| awk \u0027/Slave_running/{print $4}\u0027\")"},{"line_number":65,"context_line":"        stdout, stderr \u003d server.execute(cmd)"},{"line_number":66,"context_line":"        expected \u003d \"ON\" if running else \"OFF\""},{"line_number":67,"context_line":"        return stdout.decode().rstrip() \u003d\u003d expected"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return check_slave_is_running"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_040b302d","line":67,"range":{"start_line":67,"start_character":22,"end_line":67,"end_character":31},"in_reply_to":"3f79a3b5_491df15f","updated":"2018-12-01 19:29:07.000000000","message":"To handle server.execute command execution, the subprocess module is used (trove/tests/util/__init__.py:process())\n\nThe difference is that stdout of executed command for python2 is string, but for python3 it is bye array.\n\nPlease examine example:\n\npython2:\n\u003e\u003e\u003e import subprocess\n\u003e\u003e\u003e subprocess.Popen(\u0027echo hello\u0027, shell\u003dTrue, stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE).communicate()\n(\u0027hello\\n\u0027, \u0027\u0027)\n\npython2:\n\u003e\u003e\u003e import subprocess\n\u003e\u003e\u003e subprocess.Popen(\u0027echo hello\u0027, shell\u003dTrue, stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE).communicate()\n(b\u0027hello\\n\u0027, b\u0027\u0027)\n\n\nThis is why we need call decode here.\n\n\nI\u0027m not convinced to moving this logic to server.execute.\nIt is simple wraper for subprocess.\nMoreover, we dont know which encoding would have to be used - decode() has utf-8 as a default but what if someone would like to use other one?","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"               \"| awk \u0027/Slave_running/{print $4}\u0027\")"},{"line_number":65,"context_line":"        stdout, stderr \u003d server.execute(cmd)"},{"line_number":66,"context_line":"        expected \u003d \"ON\" if running else \"OFF\""},{"line_number":67,"context_line":"        return stdout.decode().rstrip() \u003d\u003d expected"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return check_slave_is_running"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3f79a3b5_391ee774","line":67,"range":{"start_line":67,"start_character":22,"end_line":67,"end_character":31},"in_reply_to":"3f79a3b5_827de6e6","updated":"2018-12-10 19:14:15.000000000","message":"OK I agree, we can move this to server.execute.","commit_id":"a9cf6cc1da8582f8c09dc335cca911f2eff701ff"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"           \u0027 where user like \\\\\\\"slave_%\\\\\\\"\\\\\\\u0027\u0027)"},{"line_number":54,"context_line":"    server \u003d create_server_connection(server_info.id)"},{"line_number":55,"context_line":"    stdout, stderr \u003d server.execute(cmd)"},{"line_number":56,"context_line":"    return int(stdout)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def slave_is_running(running\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_ff74563a","line":56,"updated":"2018-12-04 12:40:12.000000000","message":"Why removed rstrip?","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"           \u0027 where user like \\\\\\\"slave_%\\\\\\\"\\\\\\\u0027\u0027)"},{"line_number":54,"context_line":"    server \u003d create_server_connection(server_info.id)"},{"line_number":55,"context_line":"    stdout, stderr \u003d server.execute(cmd)"},{"line_number":56,"context_line":"    return int(stdout)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def slave_is_running(running\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_367034db","line":56,"in_reply_to":"3f79a3b5_ff74563a","updated":"2018-12-10 19:14:15.000000000","message":"It is not needed to explicitly remove white characters when coasting to int:\n\n\u003e\u003e\u003e int(\u0027  123  \u0027)\n123","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            cmd \u003d \"mysql -BNq -e \\\\\\\u0027select @@read_only\\\\\\\u0027\""},{"line_number":365,"context_line":"            server \u003d create_server_connection(slave_instance.id)"},{"line_number":366,"context_line":"            stdout, stderr \u003d server.execute(cmd)"},{"line_number":367,"context_line":"            return stdout.rstrip() \u003d\u003d \"0\""},{"line_number":368,"context_line":"        poll_until(check_not_read_only)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_3f05ee68","line":367,"updated":"2018-12-04 12:40:12.000000000","message":"As you noted in the comments, server.execute returns bytes array. In that case, does it mean that this condition will always evaluate to False?\n\n b\"0\" !\u003d \"\"","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            cmd \u003d \"mysql -BNq -e \\\\\\\u0027select @@read_only\\\\\\\u0027\""},{"line_number":365,"context_line":"            server \u003d create_server_connection(slave_instance.id)"},{"line_number":366,"context_line":"            stdout, stderr \u003d server.execute(cmd)"},{"line_number":367,"context_line":"            return stdout.rstrip() \u003d\u003d \"0\""},{"line_number":368,"context_line":"        poll_until(check_not_read_only)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_ef55daee","line":367,"in_reply_to":"3f79a3b5_3f05ee68","updated":"2018-12-12 08:46:01.000000000","message":"Good catch. You\u0027re right.\nInteresting, tests was still stable :)\nFixed.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/tests/scenario/helpers/mysql_helper.py":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, expected_override_name, report):"},{"line_number":22,"context_line":"        super(MysqlHelper, self).__init__(expected_override_name, report,"},{"line_number":23,"context_line":"                                          \u0027mysql+pymysql\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def get_helper_credentials(self):"},{"line_number":26,"context_line":"        return {\u0027name\u0027: \u0027lite\u0027, \u0027password\u0027: \u0027litepass\u0027, \u0027database\u0027: \u0027firstdb\u0027}"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_7aca947b","line":23,"updated":"2018-12-04 12:40:12.000000000","message":"Why do we introduce pymysql into MySQL protocol? It was not required before.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, expected_override_name, report):"},{"line_number":22,"context_line":"        super(MysqlHelper, self).__init__(expected_override_name, report,"},{"line_number":23,"context_line":"                                          \u0027mysql+pymysql\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def get_helper_credentials(self):"},{"line_number":26,"context_line":"        return {\u0027name\u0027: \u0027lite\u0027, \u0027password\u0027: \u0027litepass\u0027, \u0027database\u0027: \u0027firstdb\u0027}"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_39c90779","line":23,"in_reply_to":"3f79a3b5_7aca947b","updated":"2018-12-10 19:14:15.000000000","message":"This changes mysql driver. it is defined like: \"dialect[+driver]\"\n\nIn sqlalchemy, the MySQL dialect uses mysql-python as the default DBAPI.\nmysql-python is not supported for python3 and I had to change driver to pymysql.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/tests/scenario/helpers/sql_helper.py":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    DATA_COLUMN_NAME \u003d \u0027value\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, expected_override_name, report,"},{"line_number":31,"context_line":"                 protocol\u003d\"mysql+pymysql\", port\u003dNone):"},{"line_number":32,"context_line":"        super(SqlHelper, self).__init__(expected_override_name, report)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_5ad79822","line":30,"updated":"2018-12-04 12:40:12.000000000","message":"Why do we introduce pymysql into MySQL protocol? It was not required before.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    DATA_COLUMN_NAME \u003d \u0027value\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, expected_override_name, report,"},{"line_number":31,"context_line":"                 protocol\u003d\"mysql+pymysql\", port\u003dNone):"},{"line_number":32,"context_line":"        super(SqlHelper, self).__init__(expected_override_name, report)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_99913b47","line":30,"in_reply_to":"3f79a3b5_5ad79822","updated":"2018-12-10 19:14:15.000000000","message":"Umm... it wasn\u0027t and it is still not needed.\nThis is extra change, if you want, we can restore it as it was before.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/tests/scenario/runners/configuration_runners.py":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            configuration.has_field(\u0027description\u0027, six.string_types)"},{"line_number":145,"context_line":"            configuration.has_field(\u0027values\u0027, dict)"},{"line_number":146,"context_line":"            configuration.has_field(\u0027datastore_name\u0027, six.string_types)"},{"line_number":147,"context_line":"            configuration.has_field(\u0027datastore_version_id\u0027, six.text_type)"},{"line_number":148,"context_line":"            configuration.has_field(\u0027datastore_version_name\u0027, six.string_types)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            self.assert_equal(name, result.name)"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_3aadfca3","line":147,"range":{"start_line":147,"start_character":64,"end_line":147,"end_character":73},"updated":"2018-12-04 12:40:12.000000000","message":"Why not six.string_types?","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"05f7d1f1be1368b1cc9a6577e266df5c13738b5f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            configuration.has_field(\u0027description\u0027, six.string_types)"},{"line_number":145,"context_line":"            configuration.has_field(\u0027values\u0027, dict)"},{"line_number":146,"context_line":"            configuration.has_field(\u0027datastore_name\u0027, six.string_types)"},{"line_number":147,"context_line":"            configuration.has_field(\u0027datastore_version_id\u0027, six.text_type)"},{"line_number":148,"context_line":"            configuration.has_field(\u0027datastore_version_name\u0027, six.string_types)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            self.assert_equal(name, result.name)"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_79a77fa5","line":147,"range":{"start_line":147,"start_character":64,"end_line":147,"end_character":73},"in_reply_to":"3f79a3b5_3aadfca3","updated":"2018-12-10 19:14:15.000000000","message":"For unicode, text_type should be used.\n\nFrom six documentation:\n\nsix.text_type\nType for representing (Unicode) textual data. This is unicode() in Python 2 and str in Python 3.\n\nMore: https://pythonhosted.org/six/","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/tests/scenario/runners/module_runners.py":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                        expected \u003d expected[\u0027contents\u0027]"},{"line_number":1288,"context_line":"                        try:"},{"line_number":1289,"context_line":"                            expected \u003d expected.encode()"},{"line_number":1290,"context_line":"                        except AttributeError:"},{"line_number":1291,"context_line":"                            pass"},{"line_number":1292,"context_line":""},{"line_number":1293,"context_line":"                        self.assert_equal(expected, contents,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_46126266","line":1290,"updated":"2018-12-04 12:40:12.000000000","message":"Try to check variable type instead of catching exception:\n\n isinstance(expected, six...)","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                        expected \u003d expected[\u0027contents\u0027]"},{"line_number":1288,"context_line":"                        try:"},{"line_number":1289,"context_line":"                            expected \u003d expected.encode()"},{"line_number":1290,"context_line":"                        except AttributeError:"},{"line_number":1291,"context_line":"                            pass"},{"line_number":1292,"context_line":""},{"line_number":1293,"context_line":"                        self.assert_equal(expected, contents,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_8f6b06ba","line":1290,"in_reply_to":"3f79a3b5_46126266","updated":"2018-12-12 08:46:01.000000000","message":"Done","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}],"trove/tests/scenario/runners/test_runners.py":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"14186ce7d0f78737ae54080bc13e994c6409a79c","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        if expected and isinstance(expected[0], dict):"},{"line_number":411,"context_line":"            return cls.assert_equal(sort_by_key(expected),"},{"line_number":412,"context_line":"                                    sort_by_key(actual),"},{"line_number":413,"context_line":"                                    message)"},{"line_number":414,"context_line":"        return cls.assert_equal(sorted(expected), sorted(actual), message)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_60d8a622","line":413,"updated":"2018-12-04 12:40:12.000000000","message":"Consider the following snippet:\n\n \u003e\u003e\u003e sorted([(\u0027a\u0027, 1), (\u0027c\u0027, 3), (\u0027b\u0027, 2)], key\u003dlambda e: sorted(e.keys()) if isinstance(e, dict) else e)\n [(\u0027a\u0027, 1), (\u0027b\u0027, 2), (\u0027c\u0027, 3)]\n\n \u003e\u003e\u003e sorted([{\u0027a\u0027: 1}, {\u0027c\u0027: 3}, {\u0027b\u0027: 2}], key\u003dlambda e: sorted(e.keys()) if isinstance(e, dict) else e)\n [{\u0027a\u0027: 1}, {\u0027b\u0027: 2}, {\u0027c\u0027: 3}]\n\n \u003e\u003e\u003e sorted([1, 3, 2], key\u003dlambda e: sorted(e.keys()) if isinstance(e, dict) else e)\n [1, 2, 3]\n\n \u003e\u003e\u003e sorted([\u0027a\u0027, \u0027c\u0027, \u0027b\u0027], key\u003dlambda e: sorted(e.keys()) if isinstance(e, dict) else e)\n [\u0027a\u0027, \u0027b\u0027, \u0027c\u0027]\n\nWe do not have to add separate condition for dict use-case. Instead we may leave single assertion.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"b04858450643f35b1b8efb0ceb0a0599fc4984c2","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        if expected and isinstance(expected[0], dict):"},{"line_number":411,"context_line":"            return cls.assert_equal(sort_by_key(expected),"},{"line_number":412,"context_line":"                                    sort_by_key(actual),"},{"line_number":413,"context_line":"                                    message)"},{"line_number":414,"context_line":"        return cls.assert_equal(sorted(expected), sorted(actual), message)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":45,"id":"3f79a3b5_4f4c0e74","line":413,"in_reply_to":"3f79a3b5_60d8a622","updated":"2018-12-12 08:46:01.000000000","message":"Looks neatly. Thanks.","commit_id":"36fa593fc9fcd0b6185e09ece49eebd81a0920f4"}]}
