)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f4adc073713a8d562c50aba8bad92757a0bcc379","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Run tests in py34 environment"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A lot of fixes due to compatibility with python 3:"},{"line_number":10,"context_line":"- fix encoding/decoding errors"},{"line_number":11,"context_line":"- fix issues with comparison"},{"line_number":12,"context_line":"- use `reload`, `reraise`, ext. modules from six"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7ad32947_9d4be42b","line":9,"updated":"2015-04-27 17:12:40.000000000","message":"maybe you mean s/compatibility/incompatibility/\n\nor maybe you mean s/due to compatibility/to be compatible/","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Run tests in py34 environment"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A lot of fixes due to compatibility with python 3:"},{"line_number":10,"context_line":"- fix encoding/decoding errors"},{"line_number":11,"context_line":"- fix issues with comparison"},{"line_number":12,"context_line":"- use `reload`, `reraise`, ext. modules from six"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3acd31a7_8905c2c3","line":9,"in_reply_to":"7ad32947_9d4be42b","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    if limit is not None and limit \u003c\u003d 0:"},{"line_number":38,"context_line":"        raise wsme.exc.ClientSideError(_(\"Limit must be positive\"))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    return (min(CONF.api.max_limit, limit)"},{"line_number":41,"context_line":"            if limit is not None else CONF.api.max_limit)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_233b73ed","line":40,"updated":"2015-04-16 16:21:29.000000000","message":"For avoiding double None check you can add \n\n if limit is None:\n     return CONF.api.max_limit\n\non the top of function.","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    if limit is not None and limit \u003c\u003d 0:"},{"line_number":38,"context_line":"        raise wsme.exc.ClientSideError(_(\"Limit must be positive\"))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    return (min(CONF.api.max_limit, limit)"},{"line_number":41,"context_line":"            if limit is not None else CONF.api.max_limit)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_4ad33139","line":40,"in_reply_to":"5aa745d1_233b73ed","updated":"2015-04-20 09:44:21.000000000","message":"Done","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/api/middleware/parsable_error.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                    body \u003d [\u0027\u003cerror_message\u003e%s\u0027 % state[\u0027status_code\u0027]"},{"line_number":86,"context_line":"                            + \u0027\u003c/error_message\u003e\u0027]"},{"line_number":87,"context_line":"                state[\u0027headers\u0027].append((\u0027Content-Type\u0027, \u0027application/xml\u0027))"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                body \u003d [json.dumps({\u0027error_message\u0027: \u0027\\n\u0027.join(app_iter)})]"},{"line_number":90,"context_line":"                state[\u0027headers\u0027].append((\u0027Content-Type\u0027, \u0027application/json\u0027))"},{"line_number":91,"context_line":"            state[\u0027headers\u0027].append((\u0027Content-Length\u0027, str(len(body[0]))))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_8465ac46","line":88,"updated":"2015-04-16 16:21:29.000000000","message":"You can move l71-72 before json.dumps(), insert \"return body\" after l91 and simple \"return app_iter\" at the end.","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                    body \u003d [\u0027\u003cerror_message\u003e%s\u0027 % state[\u0027status_code\u0027]"},{"line_number":86,"context_line":"                            + \u0027\u003c/error_message\u003e\u0027]"},{"line_number":87,"context_line":"                state[\u0027headers\u0027].append((\u0027Content-Type\u0027, \u0027application/xml\u0027))"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                body \u003d [json.dumps({\u0027error_message\u0027: \u0027\\n\u0027.join(app_iter)})]"},{"line_number":90,"context_line":"                state[\u0027headers\u0027].append((\u0027Content-Type\u0027, \u0027application/json\u0027))"},{"line_number":91,"context_line":"            state[\u0027headers\u0027].append((\u0027Content-Length\u0027, str(len(body[0]))))"}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_1bbb4dc6","line":88,"in_reply_to":"5aa745d1_8465ac46","updated":"2015-04-20 09:44:21.000000000","message":"Done","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/common/disk_partitioner.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    output \u003d utils.execute("},{"line_number":192,"context_line":"        \u0027parted\u0027, \u0027-s\u0027, \u0027-m\u0027, device, \u0027unit\u0027, \u0027MiB\u0027, \u0027print\u0027,"},{"line_number":193,"context_line":"        use_standard_locale\u003dTrue)[0]"},{"line_number":194,"context_line":"    if six.PY3 and isinstance(output, bytes):"},{"line_number":195,"context_line":"        output \u003d output.decode(\"utf-8\")"},{"line_number":196,"context_line":"    lines \u003d [line for line in output.split(\u0027\\n\u0027) if line.strip()][2:]"},{"line_number":197,"context_line":"    # Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_4066b0bc","line":194,"updated":"2015-02-16 11:47:25.000000000","message":"does it really require `if six.PY3`? maybe just \n\n if isinstance(output, bytes):\n\n?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    output \u003d utils.execute("},{"line_number":192,"context_line":"        \u0027parted\u0027, \u0027-s\u0027, \u0027-m\u0027, device, \u0027unit\u0027, \u0027MiB\u0027, \u0027print\u0027,"},{"line_number":193,"context_line":"        use_standard_locale\u003dTrue)[0]"},{"line_number":194,"context_line":"    if six.PY3 and isinstance(output, bytes):"},{"line_number":195,"context_line":"        output \u003d output.decode(\"utf-8\")"},{"line_number":196,"context_line":"    lines \u003d [line for line in output.split(\u0027\\n\u0027) if line.strip()][2:]"},{"line_number":197,"context_line":"    # Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_bad078ca","line":194,"in_reply_to":"da86d52c_4066b0bc","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7f4ead2a820eae75ee5c06bab0dfcbb05cff3422","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        \u0027parted\u0027, \u0027-s\u0027, \u0027-m\u0027, device, \u0027unit\u0027, \u0027MiB\u0027, \u0027print\u0027,"},{"line_number":192,"context_line":"        use_standard_locale\u003dTrue)[0]"},{"line_number":193,"context_line":"    if isinstance(output, bytes):"},{"line_number":194,"context_line":"        output \u003d output.decode(\"utf-8\")"},{"line_number":195,"context_line":"    lines \u003d [line for line in output.split(\u0027\\n\u0027) if line.strip()][2:]"},{"line_number":196,"context_line":"    # Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot"},{"line_number":197,"context_line":"    fields \u003d (\u0027start\u0027, \u0027end\u0027, \u0027size\u0027, \u0027filesystem\u0027, \u0027flags\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_8cbd1e05","line":194,"updated":"2015-02-17 09:37:52.000000000","message":"shouldn\u0027t we default to system locale here?","commit_id":"dfd085a9fa8147c6231fa3f3b34d146226607723"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    output \u003d utils.execute("},{"line_number":191,"context_line":"        \u0027parted\u0027, \u0027-s\u0027, \u0027-m\u0027, device, \u0027unit\u0027, \u0027MiB\u0027, \u0027print\u0027,"},{"line_number":192,"context_line":"        use_standard_locale\u003dTrue)[0]"},{"line_number":193,"context_line":"    if isinstance(output, bytes):"},{"line_number":194,"context_line":"        output \u003d output.decode(\"utf-8\")"},{"line_number":195,"context_line":"    lines \u003d [line for line in output.split(\u0027\\n\u0027) if line.strip()][2:]"},{"line_number":196,"context_line":"    # Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_a78f8a22","line":193,"updated":"2015-04-16 16:21:29.000000000","message":"Maybe makes sense move l193-194 to utils.execute() for both stdout and stderr.","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    output \u003d utils.execute("},{"line_number":191,"context_line":"        \u0027parted\u0027, \u0027-s\u0027, \u0027-m\u0027, device, \u0027unit\u0027, \u0027MiB\u0027, \u0027print\u0027,"},{"line_number":192,"context_line":"        use_standard_locale\u003dTrue)[0]"},{"line_number":193,"context_line":"    if isinstance(output, bytes):"},{"line_number":194,"context_line":"        output \u003d output.decode(\"utf-8\")"},{"line_number":195,"context_line":"    lines \u003d [line for line in output.split(\u0027\\n\u0027) if line.strip()][2:]"},{"line_number":196,"context_line":"    # Example of line: 1:1.00MiB:501MiB:500MiB:ext4::boot"}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_bbb0e18c","line":193,"in_reply_to":"5aa745d1_a78f8a22","updated":"2015-04-20 09:44:21.000000000","message":"Hmmm, I\u0027m not very familiar with Ironic codebase, so I\u0027m not sure about all use cases. Anyway, this may be discussed.","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/common/exception.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fac9a14f437c4cd9977173c82670a90072ef1be0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if not six.PY3:"},{"line_number":94,"context_line":"            return unicode(self.args[0]).encode(\u0027utf-8\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        return str(self.args[0])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def format_message(self):"},{"line_number":99,"context_line":"        if self.__class__.__name__.endswith(\u0027_Remote\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab921fb_1a21f94d","line":96,"updated":"2015-04-23 13:06:51.000000000","message":"hmm, what is the type of self.args[0] then?","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if not six.PY3:"},{"line_number":94,"context_line":"            return unicode(self.args[0]).encode(\u0027utf-8\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        return str(self.args[0])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def format_message(self):"},{"line_number":99,"context_line":"        if self.__class__.__name__.endswith(\u0027_Remote\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_29e22e04","line":96,"in_reply_to":"7ad32947_906293d7","updated":"2015-04-30 15:22:12.000000000","message":"Yuriy, thanks for pointing this. Fixed test. Error message string will fix in another patch","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"5e5822cb4f7fe561339faeb8bd7feb1aec8f47ab","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if not six.PY3:"},{"line_number":94,"context_line":"            return unicode(self.args[0]).encode(\u0027utf-8\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        return str(self.args[0])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def format_message(self):"},{"line_number":99,"context_line":"        if self.__class__.__name__.endswith(\u0027_Remote\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_906293d7","line":96,"in_reply_to":"bab921fb_14466523","updated":"2015-04-28 08:10:03.000000000","message":"Victor, the reason of dict here is the bug in test: https://github.com/openstack/ironic/blob/master/ironic/tests/api/v1/test_nodes.py#L1260-L1263 we pass a dict to constructor as argument. Also \u0027node\u0027 key not present in the message string. Please fix.","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4be28e55e381939fc1b25c906667a439d164e54a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if not six.PY3:"},{"line_number":94,"context_line":"            return unicode(self.args[0]).encode(\u0027utf-8\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        return str(self.args[0])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def format_message(self):"},{"line_number":99,"context_line":"        if self.__class__.__name__.endswith(\u0027_Remote\u0027):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bab921fb_14466523","line":96,"in_reply_to":"bab921fb_1a21f94d","updated":"2015-04-23 15:05:44.000000000","message":"dict sometimes :)\n\nSee http://paste.openstack.org/show/205310/","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/common/glance_service/base_image_service.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                else:"},{"line_number":147,"context_line":"                    new_exc \u003d _translate_image_exception("},{"line_number":148,"context_line":"                        args[0], exc_value)"},{"line_number":149,"context_line":"                six.reraise(new_exc, None if six.PY2 else new_exc, exc_trace)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @check_image_service"},{"line_number":152,"context_line":"    def _detail(self, method\u003d\u0027list\u0027, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_60d2d435","line":149,"updated":"2015-02-16 11:47:25.000000000","message":"shouldn\u0027t it be \n\n six.reraise(type(new_exc), new_exc, exc_trace)\n\nwhy is \u0027if\u0027 required?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                else:"},{"line_number":147,"context_line":"                    new_exc \u003d _translate_image_exception("},{"line_number":148,"context_line":"                        args[0], exc_value)"},{"line_number":149,"context_line":"                six.reraise(new_exc, None if six.PY2 else new_exc, exc_trace)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @check_image_service"},{"line_number":152,"context_line":"    def _detail(self, method\u003d\u0027list\u0027, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_fa8750b4","line":149,"in_reply_to":"da86d52c_60d2d435","updated":"2015-02-16 13:54:34.000000000","message":"Hmmm, I was not sure, that this will work for py2x, but it looks ok in tests. Fixed, thanks!","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/common/glance_service/service_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    if not _GLANCE_API_SERVER:"},{"line_number":152,"context_line":"        _GLANCE_API_SERVER \u003d _get_api_server_iterator()"},{"line_number":153,"context_line":"    return (_GLANCE_API_SERVER.__next__()"},{"line_number":154,"context_line":"            if six.PY3 else _GLANCE_API_SERVER.next())"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"def parse_image_ref(image_href):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_e0e5e40a","line":154,"updated":"2015-02-16 11:47:25.000000000","message":"just\n\n six.next(_GLANCE_API_SERVER)","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    if not _GLANCE_API_SERVER:"},{"line_number":152,"context_line":"        _GLANCE_API_SERVER \u003d _get_api_server_iterator()"},{"line_number":153,"context_line":"    return (_GLANCE_API_SERVER.__next__()"},{"line_number":154,"context_line":"            if six.PY3 else _GLANCE_API_SERVER.next())"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"def parse_image_ref(image_href):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_3aa9e824","line":154,"in_reply_to":"da86d52c_e0e5e40a","updated":"2015-02-16 13:54:34.000000000","message":"yes, this looks better","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/common/hash_ring.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _get_partition(self, data):"},{"line_number":108,"context_line":"        try:"},{"line_number":109,"context_line":"            if six.PY3 and data is not None:"},{"line_number":110,"context_line":"                data \u003d data.encode(\u0027utf-8\u0027)"},{"line_number":111,"context_line":"            key_hash \u003d hashlib.md5(data)"},{"line_number":112,"context_line":"            hashed_key \u003d self._hash2int(key_hash)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_db314fee","line":109,"updated":"2015-04-16 16:21:29.000000000","message":"\"and data is not None:\" - this is not needed\n\n \u003e\u003e\u003e hashlib.md5(None)\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n TypeError: object supporting the buffer API required","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _get_partition(self, data):"},{"line_number":108,"context_line":"        try:"},{"line_number":109,"context_line":"            if six.PY3 and data is not None:"},{"line_number":110,"context_line":"                data \u003d data.encode(\u0027utf-8\u0027)"},{"line_number":111,"context_line":"            key_hash \u003d hashlib.md5(data)"},{"line_number":112,"context_line":"            hashed_key \u003d self._hash2int(key_hash)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_2ac11de5","line":109,"in_reply_to":"5aa745d1_db314fee","updated":"2015-04-20 09:44:21.000000000","message":"this is required, at least to avoid of AttributeError on data.encode(\u0027utf-8\u0027). If we will try to call hashlib.md5(None), it will raise TypeError, and we will catch it below","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/common/utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    hostname \u003d hostname.lower()"},{"line_number":291,"context_line":"    hostname \u003d hostname.strip(b\u0027.-\u0027)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    return hostname"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def read_cached_file(filename, cache_info, reload_func\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c0b620f9","line":293,"updated":"2015-02-16 11:47:25.000000000","message":"I wonder if we should decode it back from bytes here...","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    hostname \u003d hostname.lower()"},{"line_number":291,"context_line":"    hostname \u003d hostname.strip(b\u0027.-\u0027)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    return hostname"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def read_cached_file(filename, cache_info, reload_func\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_3d572228","line":293,"in_reply_to":"da86d52c_c0b620f9","updated":"2015-02-16 13:54:34.000000000","message":"I am not familiar with the Ironic codebase, so I left it \"as is\". Your suggestion sound reasonable, should I decode hostname back?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/drivers/base.py":[{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"dda2e1e2eb4f3ea9f97e809cc740b352a487efa6","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    \"\"\""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":447,"context_line":"        inst \u003d super(VendorInterface, cls).__new__(cls, *args, **kwargs)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        inst.vendor_routes \u003d {}"},{"line_number":450,"context_line":"        inst.driver_routes \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_8d73a54c","side":"PARENT","line":447,"updated":"2015-02-20 17:17:18.000000000","message":"I\u0027m not sure why this is a needed change?","commit_id":"f714ddf82abb2b617b43c5ec29bdb18e5575adf0"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"0e38ed4a611b38193b9bb04fe735007bae7d5efc","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    \"\"\""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":447,"context_line":"        inst \u003d super(VendorInterface, cls).__new__(cls, *args, **kwargs)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        inst.vendor_routes \u003d {}"},{"line_number":450,"context_line":"        inst.driver_routes \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_02c03429","side":"PARENT","line":447,"in_reply_to":"ba7be1f8_8d73a54c","updated":"2015-02-23 12:01:22.000000000","message":"In a few worlds - this change required, because object.__new__() takes no parameters","commit_id":"f714ddf82abb2b617b43c5ec29bdb18e5575adf0"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f5e9dfa169c3de6a867e417147ed1b59a7a4a9ff","unresolved":false,"context_lines":[{"line_number":548,"context_line":"    \"\"\""},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":551,"context_line":"        inst \u003d super(VendorInterface, cls).__new__(cls)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        inst.vendor_routes \u003d {}"},{"line_number":554,"context_line":"        inst.driver_routes \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_874e8294","line":551,"updated":"2015-05-04 16:25:29.000000000","message":"What\u0027s the reason for removing *args and **kwargs? Would Python 3 change the behavior here, and will this piece of code still behave as it would in Python 2?\n\nI\u0027m not very familiar with __new__, but my understanding is that it\u0027s called by a constructor before __init__ with the args and kwargs implicitly. Since we have a reference to the base class but aren\u0027t instantiating it directly through the constructor here, I don\u0027t think __new__ will receive args and kwargs here anymore.\n\nIf there\u0027s no difference here with Python 2 and Python 3, perhaps it\u0027s best to separate this change from this patch since it may change behavior and isn\u0027t needed for Python 3. \n\nStill will +1 because I can\u0027t see anything relying on this - a more definite +1 if this call won\u0027t work in Python 3 for some reason.","commit_id":"f4f88a2e676d849a3803a73a69760a08805cacc9"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"bf410da7a3af849d1f997b56c3b9ee315dee9b92","unresolved":false,"context_lines":[{"line_number":548,"context_line":"    \"\"\""},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":551,"context_line":"        inst \u003d super(VendorInterface, cls).__new__(cls)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        inst.vendor_routes \u003d {}"},{"line_number":554,"context_line":"        inst.driver_routes \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aca2d91_75da5b7a","line":551,"in_reply_to":"3acd31a7_874e8294","updated":"2015-05-06 08:42:41.000000000","message":"Beginning with Python 2.6, following from python bug [1], object.__new__ deprecate the support for arbitrary arguments. The old behavior was deprecated in Python 2.6 and removed in Python 3.3.\n\nAdded information about this behavior to commit message, modified code a bit.\n\n[1] http://bugs.python.org/issue1683368","commit_id":"f4f88a2e676d849a3803a73a69760a08805cacc9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"272d3ad6579d08d1a3fadad0d209bea4961b43db","unresolved":false,"context_lines":[{"line_number":555,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":556,"context_line":"        super_new \u003d super(VendorInterface, cls).__new__"},{"line_number":557,"context_line":"        if super_new is object.__new__:"},{"line_number":558,"context_line":"            inst \u003d super_new(cls)"},{"line_number":559,"context_line":"        else:"},{"line_number":560,"context_line":"            inst \u003d super_new(cls, *args, **kwargs)"},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_d74920d2","line":558,"updated":"2015-05-06 16:02:06.000000000","message":"I tried in py27, and this path was taken. Is that what you intended?","commit_id":"70062322a240353989babeddfb904b487a42d668"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"18b05c55ca65943777fff630643ed2f0703bc6c8","unresolved":false,"context_lines":[{"line_number":555,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":556,"context_line":"        super_new \u003d super(VendorInterface, cls).__new__"},{"line_number":557,"context_line":"        if super_new is object.__new__:"},{"line_number":558,"context_line":"            inst \u003d super_new(cls)"},{"line_number":559,"context_line":"        else:"},{"line_number":560,"context_line":"            inst \u003d super_new(cls, *args, **kwargs)"},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_f3276310","line":558,"in_reply_to":"1aca2d91_8b6ecac7","updated":"2015-05-07 14:51:49.000000000","message":"I discussed this with Victor on IRC and he provided these links  [1] [2], and now I \u0027get\u0027 it (or more of it anyway ;)). I also thought (incorrectly) that VendorInterface was subclassed from BaseInterface.\n\n[1] http://blog.jaraco.com/2014/05/how-to-safely-override-init-or-new-in.html\n[2] http://paste.openstack.org/show/216195/","commit_id":"70062322a240353989babeddfb904b487a42d668"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"48dd33cd708b3705bf3af46034f53119fcf24f53","unresolved":false,"context_lines":[{"line_number":555,"context_line":"    def __new__(cls, *args, **kwargs):"},{"line_number":556,"context_line":"        super_new \u003d super(VendorInterface, cls).__new__"},{"line_number":557,"context_line":"        if super_new is object.__new__:"},{"line_number":558,"context_line":"            inst \u003d super_new(cls)"},{"line_number":559,"context_line":"        else:"},{"line_number":560,"context_line":"            inst \u003d super_new(cls, *args, **kwargs)"},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_8b6ecac7","line":558,"in_reply_to":"1aca2d91_d74920d2","updated":"2015-05-07 07:21:57.000000000","message":"Yes, this is correct - object.__new__() can accept *args and **kwargs in python 2.7, but this behavior is deprecated since python 2.6 - please see python bug http://bugs.python.org/issue1683368 for more details.","commit_id":"70062322a240353989babeddfb904b487a42d668"}],"ironic/drivers/modules/amt/common.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8d31f096395fe681d0c1f7fd6249fa6ea56b4a36","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if value:"},{"line_number":154,"context_line":"            if not isinstance(value, six.binary_type):"},{"line_number":155,"context_line":"                value \u003d value.encode()"},{"line_number":156,"context_line":"            d_info[param[4:]] \u003d value"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            missing_info.append(param)"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_d6593990","line":156,"updated":"2015-04-27 17:21:55.000000000","message":"We have code in other drivers that is similar to this. I\u0027m wondering what is different here, that requires this change. (Or do all/most of the parse_driver_info() methods need to be modified similarly?","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if value:"},{"line_number":154,"context_line":"            if not isinstance(value, six.binary_type):"},{"line_number":155,"context_line":"                value \u003d value.encode()"},{"line_number":156,"context_line":"            d_info[param[4:]] \u003d value"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            missing_info.append(param)"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_90495e8e","line":156,"in_reply_to":"7ad32947_d6593990","updated":"2015-04-30 15:22:12.000000000","message":"It seems to be, that only this drivers encoding values to six.binary_type","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/drivers/modules/image_cache.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            fileutils.ensure_tree(master_dir)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __lt__(self, other):"},{"line_number":76,"context_line":"        return False"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def fetch_image(self, href, dest_path, ctx\u003dNone, force_raw\u003dTrue):"},{"line_number":79,"context_line":"        \"\"\"Fetch image by given href to the destination path."}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_009d9857","line":76,"updated":"2015-02-16 11:47:25.000000000","message":"as you\u0027re fixing cleanup() below, why do you need this change?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            fileutils.ensure_tree(master_dir)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __lt__(self, other):"},{"line_number":76,"context_line":"        return False"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def fetch_image(self, href, dest_path, ctx\u003dNone, force_raw\u003dTrue):"},{"line_number":79,"context_line":"        \"\"\"Fetch image by given href to the destination path."}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_5dc21654","line":76,"in_reply_to":"da86d52c_009d9857","updated":"2015-02-16 13:54:34.000000000","message":"Removed","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        _cache_cleanup_list.append((priority, cls))"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        _cache_cleanup_list \u003d sorted(_cache_cleanup_list,"},{"line_number":378,"context_line":"                                     key\u003dlambda tup: tup[0], reverse\u003dTrue)"},{"line_number":379,"context_line":"        return cls"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    return _add_property_to_class_func"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_e0c88458","line":378,"updated":"2015-02-16 11:47:25.000000000","message":"sort() also has \u0027key\u0027 argument, why change to sorted?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        _cache_cleanup_list.append((priority, cls))"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        _cache_cleanup_list \u003d sorted(_cache_cleanup_list,"},{"line_number":378,"context_line":"                                     key\u003dlambda tup: tup[0], reverse\u003dTrue)"},{"line_number":379,"context_line":"        return cls"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    return _add_property_to_class_func"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_dd9b6664","line":378,"in_reply_to":"da86d52c_e0c88458","updated":"2015-02-16 13:54:34.000000000","message":"Fixed","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/objects/base.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    @property"},{"line_number":396,"context_line":"    def obj_fields(self):"},{"line_number":397,"context_line":"        return list(self.fields.keys()) + self.obj_extra_fields"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    # dictish syntactic sugar"},{"line_number":400,"context_line":"    def iteritems(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_40d5d0e3","line":397,"updated":"2015-02-16 11:47:25.000000000","message":"nit: .keys() is redundant","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    @property"},{"line_number":396,"context_line":"    def obj_fields(self):"},{"line_number":397,"context_line":"        return list(self.fields.keys()) + self.obj_extra_fields"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    # dictish syntactic sugar"},{"line_number":400,"context_line":"    def iteritems(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_505cbd19","line":397,"in_reply_to":"da86d52c_40d5d0e3","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        NOTE(danms): May be removed in the future."},{"line_number":404,"context_line":"        \"\"\""},{"line_number":405,"context_line":"        for name in list(self.fields.keys()) + self.obj_extra_fields:"},{"line_number":406,"context_line":"            if (hasattr(self, get_attrname(name)) or"},{"line_number":407,"context_line":"                    name in self.obj_extra_fields):"},{"line_number":408,"context_line":"                yield name, getattr(self, name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_6003b476","line":405,"updated":"2015-02-16 11:47:25.000000000","message":"ditto","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        NOTE(danms): May be removed in the future."},{"line_number":404,"context_line":"        \"\"\""},{"line_number":405,"context_line":"        for name in list(self.fields.keys()) + self.obj_extra_fields:"},{"line_number":406,"context_line":"            if (hasattr(self, get_attrname(name)) or"},{"line_number":407,"context_line":"                    name in self.obj_extra_fields):"},{"line_number":408,"context_line":"                yield name, getattr(self, name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_709aa1c6","line":405,"in_reply_to":"da86d52c_6003b476","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/tests/api/utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7f4ead2a820eae75ee5c06bab0dfcbb05cff3422","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def remove_internal(values, internal):"},{"line_number":75,"context_line":"    # NOTE(yuriyz): internal attributes should not be posted, except uuid"},{"line_number":76,"context_line":"    int_attr \u003d [attr.lstrip(\u0027/\u0027) for attr in internal if attr !\u003d \u0027/uuid\u0027]"},{"line_number":77,"context_line":"    return dict([(k, v) for (k, v) in values.items() if k not in int_attr])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def node_post_data(**kw):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_2c44321a","line":77,"updated":"2015-02-17 09:37:52.000000000","message":"nit: we can switch to dict comprehension:\n\n return {k: v for (k, v) in values.items() if k not in int_attr}","commit_id":"dfd085a9fa8147c6231fa3f3b34d146226607723"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def remove_internal(values, internal):"},{"line_number":75,"context_line":"    # NOTE(yuriyz): internal attributes should not be posted, except uuid"},{"line_number":76,"context_line":"    int_attr \u003d [attr.lstrip(\u0027/\u0027) for attr in internal if attr !\u003d \u0027/uuid\u0027]"},{"line_number":77,"context_line":"    return dict([(k, v) for (k, v) in values.items() if k not in int_attr])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def node_post_data(**kw):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_f6ad4289","line":77,"updated":"2015-04-16 16:21:29.000000000","message":"You can also use dict comprehension here.","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def remove_internal(values, internal):"},{"line_number":75,"context_line":"    # NOTE(yuriyz): internal attributes should not be posted, except uuid"},{"line_number":76,"context_line":"    int_attr \u003d [attr.lstrip(\u0027/\u0027) for attr in internal if attr !\u003d \u0027/uuid\u0027]"},{"line_number":77,"context_line":"    return dict([(k, v) for (k, v) in values.items() if k not in int_attr])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def node_post_data(**kw):"}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_6af9554d","line":77,"in_reply_to":"5aa745d1_f6ad4289","updated":"2015-04-20 09:44:21.000000000","message":"Done","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/tests/api/v1/test_types.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"00f3f6803b0cc399788465c317caa3fa4926a71d","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                          \u0027value\u0027: {\u0027cat\u0027: \u0027meow\u0027}}]"},{"line_number":136,"context_line":"        ret \u003d self._patch_json(valid_patches, False)"},{"line_number":137,"context_line":"        self.assertEqual(200, ret.status_int)"},{"line_number":138,"context_line":"        self.assertItemsEqual(valid_patches, ret.json)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test_cannot_update_internal_attr(self):"},{"line_number":141,"context_line":"        patch \u003d [{\u0027path\u0027: \u0027/internal\u0027, \u0027op\u0027: \u0027replace\u0027, \u0027value\u0027: \u0027foo\u0027}]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ad0253b_69039f10","line":138,"updated":"2015-04-28 23:09:02.000000000","message":"six.assertCountEqual()\n   Alias for assertCountEqual() on Python 3 and assertItemsEqual() on Python 2.\n\nhttps://pythonhosted.org/six/#unittest-assertions","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                          \u0027value\u0027: {\u0027cat\u0027: \u0027meow\u0027}}]"},{"line_number":136,"context_line":"        ret \u003d self._patch_json(valid_patches, False)"},{"line_number":137,"context_line":"        self.assertEqual(200, ret.status_int)"},{"line_number":138,"context_line":"        self.assertItemsEqual(valid_patches, ret.json)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test_cannot_update_internal_attr(self):"},{"line_number":141,"context_line":"        patch \u003d [{\u0027path\u0027: \u0027/internal\u0027, \u0027op\u0027: \u0027replace\u0027, \u0027value\u0027: \u0027foo\u0027}]"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_aae74de3","line":138,"in_reply_to":"5ad0253b_69039f10","updated":"2015-04-30 15:22:12.000000000","message":"self.assertItemsEqual() defined in unittest2 and available in py3 and in py2","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/tests/drivers/test_ipminative.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(expected, self.driver.management.get_properties())"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        expected \u003d list(ipminative.COMMON_PROPERTIES.keys())"},{"line_number":227,"context_line":"        expected +\u003d list(ipminative.CONSOLE_PROPERTIES.keys())"},{"line_number":228,"context_line":"        self.assertEqual(sorted(expected),"},{"line_number":229,"context_line":"                         sorted(self.driver.console.get_properties().keys()))"},{"line_number":230,"context_line":"        self.assertEqual(sorted(expected),"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c00e208c","line":227,"updated":"2015-02-16 11:47:25.000000000","message":"nit: .keys() are redundant","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(expected, self.driver.management.get_properties())"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        expected \u003d list(ipminative.COMMON_PROPERTIES.keys())"},{"line_number":227,"context_line":"        expected +\u003d list(ipminative.CONSOLE_PROPERTIES.keys())"},{"line_number":228,"context_line":"        self.assertEqual(sorted(expected),"},{"line_number":229,"context_line":"                         sorted(self.driver.console.get_properties().keys()))"},{"line_number":230,"context_line":"        self.assertEqual(sorted(expected),"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_90d2b559","line":227,"in_reply_to":"da86d52c_c00e208c","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/tests/drivers/test_ipmitool.py":[{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"ecacc233ed4c04c86fdceabb8fbd3a54b1554a41","unresolved":false,"context_lines":[{"line_number":251,"context_line":"            ValueError,"},{"line_number":252,"context_line":"            self._test__make_password_file,"},{"line_number":253,"context_line":"            mock_sleep, 12345, ValueError(\u0027we should fail\u0027))"},{"line_number":254,"context_line":"        self.assertEqual(result.args[0], \u0027we should fail\u0027)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    @mock.patch.object(tempfile, \u0027NamedTemporaryFile\u0027,"},{"line_number":257,"context_line":"                       new\u003dmock.MagicMock(side_effect\u003dOSError(\u0027Test Error\u0027)))"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_01ed1b8b","line":254,"updated":"2015-04-28 06:14:26.000000000","message":"If you like, you could flip the ordering of the assert params around to follow convention","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":251,"context_line":"            ValueError,"},{"line_number":252,"context_line":"            self._test__make_password_file,"},{"line_number":253,"context_line":"            mock_sleep, 12345, ValueError(\u0027we should fail\u0027))"},{"line_number":254,"context_line":"        self.assertEqual(result.args[0], \u0027we should fail\u0027)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    @mock.patch.object(tempfile, \u0027NamedTemporaryFile\u0027,"},{"line_number":257,"context_line":"                       new\u003dmock.MagicMock(side_effect\u003dOSError(\u0027Test Error\u0027)))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_6a0db53d","line":254,"in_reply_to":"7ad32947_01ed1b8b","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"ecacc233ed4c04c86fdceabb8fbd3a54b1554a41","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        result \u003d self.assertRaises("},{"line_number":271,"context_line":"            OverflowError,"},{"line_number":272,"context_line":"            self._test__make_password_file, mock_sleep, 12345)"},{"line_number":273,"context_line":"        self.assertEqual(result.args[0], \u0027Test Error\u0027)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test__make_password_file_write_exception(self, mock_sleep):"},{"line_number":276,"context_line":"        # Test exception in _make_password_file for write()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_e1021f3e","line":273,"updated":"2015-04-28 06:14:26.000000000","message":"If you like, you could flip the ordering of the assert params around to follow convention","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        result \u003d self.assertRaises("},{"line_number":271,"context_line":"            OverflowError,"},{"line_number":272,"context_line":"            self._test__make_password_file, mock_sleep, 12345)"},{"line_number":273,"context_line":"        self.assertEqual(result.args[0], \u0027Test Error\u0027)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test__make_password_file_write_exception(self, mock_sleep):"},{"line_number":276,"context_line":"        # Test exception in _make_password_file for write()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_4a0af927","line":273,"in_reply_to":"7ad32947_e1021f3e","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/tests/objects/test_objects.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            self.fail(\u0027NotImplementedError was not raised\u0027)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        # FIXME(viktors) we should use this one"},{"line_number":322,"context_line":"        # self.assertRaisesRegexp(NotImplementedError, \"*foobar*\", obj.foobar)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_loaded_in_primitive(self):"},{"line_number":325,"context_line":"        obj \u003d MyObj(self.context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_30766907","line":322,"updated":"2015-02-16 13:54:34.000000000","message":"done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            self.fail(\u0027NotImplementedError was not raised\u0027)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        # FIXME(viktors) we should use this one"},{"line_number":322,"context_line":"        # self.assertRaisesRegexp(NotImplementedError, \"*foobar*\", obj.foobar)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_loaded_in_primitive(self):"},{"line_number":325,"context_line":"        obj \u003d MyObj(self.context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_00675852","line":322,"updated":"2015-02-16 11:47:25.000000000","message":"why not just use it? we\u0027ve dropped py26","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        self.assertRaises(AttributeError, obj.get, \u0027nothing\u0027, 3)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def test_object_inheritance(self):"},{"line_number":472,"context_line":"        base_fields \u003d list(base.IronicObject.fields.keys())"},{"line_number":473,"context_line":"        myobj_fields \u003d [\u0027foo\u0027, \u0027bar\u0027, \u0027missing\u0027] + base_fields"},{"line_number":474,"context_line":"        myobj3_fields \u003d [\u0027new_field\u0027]"},{"line_number":475,"context_line":"        self.assertTrue(issubclass(TestSubclassedObject, MyObj))"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c05c6080","line":472,"updated":"2015-02-16 11:47:25.000000000","message":"nit: .keys() is redundant","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        self.assertRaises(AttributeError, obj.get, \u0027nothing\u0027, 3)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def test_object_inheritance(self):"},{"line_number":472,"context_line":"        base_fields \u003d list(base.IronicObject.fields.keys())"},{"line_number":473,"context_line":"        myobj_fields \u003d [\u0027foo\u0027, \u0027bar\u0027, \u0027missing\u0027] + base_fields"},{"line_number":474,"context_line":"        myobj3_fields \u003d [\u0027new_field\u0027]"},{"line_number":475,"context_line":"        self.assertTrue(issubclass(TestSubclassedObject, MyObj))"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_10bec500","line":472,"in_reply_to":"da86d52c_c05c6080","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"}],"ironic/tests/test_glance_service.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a00008c300094f2f97e9aee3b75f1af69b4d4926","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        self.assertEqual(2, num_images)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        # Check the image is marked as deleted."},{"line_number":384,"context_line":"        num_images \u003d six.moves.reduce("},{"line_number":385,"context_line":"            lambda x, y: x + (0 if y[\u0027deleted\u0027] else 1),"},{"line_number":386,"context_line":"            self.service.detail(), 0)"},{"line_number":387,"context_line":"        self.assertEqual(1, num_images)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_8ac7ee11","line":384,"updated":"2015-04-16 16:21:29.000000000","message":"You can rewrite this magic\n num_images \u003d sum([1 for x in self.service.detail() if not x[\u0027deleted\u0027]])","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"8645fb1862634b81aae494070286d4823a4dc256","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        self.assertEqual(2, num_images)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        # Check the image is marked as deleted."},{"line_number":384,"context_line":"        num_images \u003d six.moves.reduce("},{"line_number":385,"context_line":"            lambda x, y: x + (0 if y[\u0027deleted\u0027] else 1),"},{"line_number":386,"context_line":"            self.service.detail(), 0)"},{"line_number":387,"context_line":"        self.assertEqual(1, num_images)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dac4157f_6ae275a1","line":384,"in_reply_to":"5aa745d1_00405fa4","updated":"2015-04-20 09:44:21.000000000","message":"yes, this looks better, thanks!","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4c2f8d4ee61239d95a7b6335d4adaa2408e17ef0","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        self.assertEqual(2, num_images)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        # Check the image is marked as deleted."},{"line_number":384,"context_line":"        num_images \u003d six.moves.reduce("},{"line_number":385,"context_line":"            lambda x, y: x + (0 if y[\u0027deleted\u0027] else 1),"},{"line_number":386,"context_line":"            self.service.detail(), 0)"},{"line_number":387,"context_line":"        self.assertEqual(1, num_images)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5aa745d1_00405fa4","line":384,"in_reply_to":"5aa745d1_8ac7ee11","updated":"2015-04-16 16:53:53.000000000","message":"or\n num_images \u003d len([x for x in self.service.detail() if not x[\u0027deleted\u0027]])","commit_id":"1db09e2d734f41a35fbbf06a9ac259a14071305d"}],"ironic/tests/test_pxe_utils.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"00f3f6803b0cc399788465c317caa3fa4926a71d","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                         {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":348,"context_line":"                          \u0027opt_value\u0027: \u0027192.0.2.1\u0027}]"},{"line_number":349,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":350,"context_line":"            self.assertEqual(expected_info,"},{"line_number":351,"context_line":"                             pxe_utils.dhcp_options_for_instance(task))"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.config(dhcp_provider\u003d\u0027neutron\u0027, group\u003d\u0027dhcp\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ad0253b_89aa7b18","line":350,"updated":"2015-04-28 23:09:02.000000000","message":"Why did sorted disappear?","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                         {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":348,"context_line":"                          \u0027opt_value\u0027: \u0027192.0.2.1\u0027}]"},{"line_number":349,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":350,"context_line":"            self.assertEqual(expected_info,"},{"line_number":351,"context_line":"                             pxe_utils.dhcp_options_for_instance(task))"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.config(dhcp_provider\u003d\u0027neutron\u0027, group\u003d\u0027dhcp\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_2d6357de","line":350,"in_reply_to":"5ad0253b_89aa7b18","updated":"2015-04-30 15:22:12.000000000","message":"because expected_info elements order was fixed. Replaced to self.assertItemsEqual() to be more clear","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"00f3f6803b0cc399788465c317caa3fa4926a71d","unresolved":false,"context_lines":[{"line_number":361,"context_line":"                         {\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":362,"context_line":"                          \u0027opt_value\u0027: expected_boot_script_url}]"},{"line_number":363,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":364,"context_line":"            self.assertItemsEqual(expected_info,"},{"line_number":365,"context_line":"                                  pxe_utils.dhcp_options_for_instance(task))"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    @mock.patch(\u0027ironic.common.utils.rmtree_without_raise\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ad0253b_89939bfa","line":364,"updated":"2015-04-28 23:09:02.000000000","message":"six.assertCountEqual()\n\nhttps://pythonhosted.org/six/#unittest-assertions","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":361,"context_line":"                         {\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":362,"context_line":"                          \u0027opt_value\u0027: expected_boot_script_url}]"},{"line_number":363,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":364,"context_line":"            self.assertItemsEqual(expected_info,"},{"line_number":365,"context_line":"                                  pxe_utils.dhcp_options_for_instance(task))"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    @mock.patch(\u0027ironic.common.utils.rmtree_without_raise\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_0d1bfb73","line":364,"in_reply_to":"5ad0253b_89939bfa","updated":"2015-04-30 15:22:12.000000000","message":"self.assertItemsEqual() comes from unittests2, so it works for py3 same as for py2","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"ironic/tests/test_states.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"00f3f6803b0cc399788465c317caa3fa4926a71d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        This is specified in db/sqlalchemy/models.py"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"        for key, value in states.__dict__.items():"},{"line_number":34,"context_line":"            # Assumption: A state variable name is all UPPERCASE and contents"},{"line_number":35,"context_line":"            # are a string."},{"line_number":36,"context_line":"            if key.upper() \u003d\u003d key and isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ad0253b_e9ec4f91","line":33,"updated":"2015-04-28 23:09:02.000000000","message":"why not:\n\n six.iteritems","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        This is specified in db/sqlalchemy/models.py"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"        for key, value in states.__dict__.items():"},{"line_number":34,"context_line":"            # Assumption: A state variable name is all UPPERCASE and contents"},{"line_number":35,"context_line":"            # are a string."},{"line_number":36,"context_line":"            if key.upper() \u003d\u003d key and isinstance(value, six.string_types):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3acd31a7_6d738f81","line":33,"in_reply_to":"5ad0253b_e9ec4f91","updated":"2015-04-30 15:22:12.000000000","message":"because items() available in both python versions","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"test-requirements-py3.txt":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5e3b3ad6f67ff308355994ea9a0b562298c6446f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Doc requirements"},{"line_number":18,"context_line":"sphinx\u003e\u003d1.1.2,!\u003d1.2.0,!\u003d1.3b1,\u003c1.3"},{"line_number":19,"context_line":"sphinxcontrib-pecanwsme\u003e\u003d0.8"},{"line_number":20,"context_line":"oslosphinx\u003e\u003d2.2.0  # Apache-2.0"},{"line_number":21,"context_line":""}],"source_content_type":"text/plain","patch_set":8,"id":"7ad32947_f6e1d5d1","line":20,"updated":"2015-04-27 17:16:01.000000000","message":"I\u0027m a bit concerned about this file. How does it get generated/updated? Eg, test-requirements.py has oslosphinx\u003e\u003d2.5.0","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# Doc requirements"},{"line_number":18,"context_line":"sphinx\u003e\u003d1.1.2,!\u003d1.2.0,!\u003d1.3b1,\u003c1.3"},{"line_number":19,"context_line":"sphinxcontrib-pecanwsme\u003e\u003d0.8"},{"line_number":20,"context_line":"oslosphinx\u003e\u003d2.2.0  # Apache-2.0"},{"line_number":21,"context_line":""}],"source_content_type":"text/plain","patch_set":8,"id":"3acd31a7_0def7be9","line":20,"in_reply_to":"7ad32947_f6e1d5d1","updated":"2015-04-30 15:22:12.000000000","message":"this file originally was copied from test-requirements.txt a long time ago, so yes - some versions of python libs are outdated. Fixed.\n\nIn the future, this file will be updated by OpenStack Bot in a same way as another requirements.*.txt files.","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}],"tox.ini":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"abab53a26cc363cd8185e7339b9339042b4297be","unresolved":false,"context_lines":[{"line_number":20,"context_line":"[testenv:py33]"},{"line_number":21,"context_line":"setenv \u003d"},{"line_number":22,"context_line":"    {[testenv]setenv}"},{"line_number":23,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"},{"line_number":24,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":25,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-properties","patch_set":1,"id":"da86d52c_c0cc60be","line":23,"updated":"2015-02-16 11:47:25.000000000","message":"could you comments why this is necessary?","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"20231650c68804519ffaa7251258c5b06f195e32","unresolved":false,"context_lines":[{"line_number":20,"context_line":"[testenv:py33]"},{"line_number":21,"context_line":"setenv \u003d"},{"line_number":22,"context_line":"    {[testenv]setenv}"},{"line_number":23,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"},{"line_number":24,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":25,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-properties","patch_set":1,"id":"da86d52c_9abc94dd","line":23,"in_reply_to":"da86d52c_c0cc60be","updated":"2015-02-16 13:54:34.000000000","message":"Done","commit_id":"f36fb6af964852213f2ea22991aaa4a91832c374"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"483adf650501c47e7263703238457abe91be5caf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"skipsdist \u003d True"},{"line_number":4,"context_line":"envlist \u003d py27,py34,pep8"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"[testenv]"},{"line_number":7,"context_line":"usedevelop \u003d True"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba7be1f8_2d20f948","line":4,"updated":"2015-02-20 17:12:36.000000000","message":"Ironic still has requirements that are not python 3 compatible. Until they\u0027re made compatible, I\u0027d suggest we leave py34 out of the default environment list.","commit_id":"e93af1688665e810cd9bdcb636bc89dedad46f2b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"0e38ed4a611b38193b9bb04fe735007bae7d5efc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 1.6"},{"line_number":3,"context_line":"skipsdist \u003d True"},{"line_number":4,"context_line":"envlist \u003d py27,py34,pep8"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"[testenv]"},{"line_number":7,"context_line":"usedevelop \u003d True"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba7be1f8_021cb4c0","line":4,"in_reply_to":"ba7be1f8_2d20f948","updated":"2015-02-23 12:01:22.000000000","message":"I\u0027m really not very familiar with Ironic environment, so please tell me, which requirements confused you? At the moment tests in py3 env passes ok for me locally, the only incompatible for python 3 requirement was MySQL-python","commit_id":"e93af1688665e810cd9bdcb636bc89dedad46f2b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f4adc073713a8d562c50aba8bad92757a0bcc379","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"[testenv:py34]"},{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."}],"source_content_type":"text/x-properties","patch_set":8,"id":"7ad32947_16e9f11a","line":23,"updated":"2015-04-27 17:12:40.000000000","message":"s/an another/a different/","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"[testenv:py34]"},{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."}],"source_content_type":"text/x-properties","patch_set":8,"id":"3acd31a7_2da0f79e","line":23,"in_reply_to":"7ad32947_16e9f11a","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f4adc073713a8d562c50aba8bad92757a0bcc379","unresolved":false,"context_lines":[{"line_number":21,"context_line":"[testenv:py34]"},{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."},{"line_number":27,"context_line":"setenv \u003d"}],"source_content_type":"text/x-properties","patch_set":8,"id":"7ad32947_565529c4","line":24,"updated":"2015-04-27 17:12:40.000000000","message":"s/to the/in the/","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":21,"context_line":"[testenv:py34]"},{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."},{"line_number":27,"context_line":"setenv \u003d"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3acd31a7_cd8d0333","line":24,"in_reply_to":"7ad32947_565529c4","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f4adc073713a8d562c50aba8bad92757a0bcc379","unresolved":false,"context_lines":[{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."},{"line_number":27,"context_line":"setenv \u003d"},{"line_number":28,"context_line":"    {[testenv]setenv}"}],"source_content_type":"text/x-properties","patch_set":8,"id":"7ad32947_d60ed9e4","line":25,"updated":"2015-04-27 17:12:40.000000000","message":"do you mean \ns/, which are required/ that require/","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":22,"context_line":"# NOTE(viktors): we must change default connection string for MySQL because"},{"line_number":23,"context_line":"#                we use an another DB connector (PyMySQL, not MySQLdb) in py3x"},{"line_number":24,"context_line":"#                env. So we should put new DB URLs to the env variable. This"},{"line_number":25,"context_line":"#                will allow to run tests, which are required MySQL database,"},{"line_number":26,"context_line":"#                for example DB migration tests."},{"line_number":27,"context_line":"setenv \u003d"},{"line_number":28,"context_line":"    {[testenv]setenv}"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3acd31a7_ed8f9f21","line":25,"in_reply_to":"7ad32947_d60ed9e4","updated":"2015-04-30 15:22:12.000000000","message":"Done","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fac9a14f437c4cd9977173c82670a90072ef1be0","unresolved":false,"context_lines":[{"line_number":30,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":31,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"[testenv:py33]"},{"line_number":34,"context_line":"setenv \u003d"},{"line_number":35,"context_line":"    {[testenv]setenv}"},{"line_number":36,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"}],"source_content_type":"text/x-properties","patch_set":8,"id":"bab921fb_4381cc49","line":33,"updated":"2015-04-23 13:06:51.000000000","message":"do we need to support 3.3? gates no longer have it","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"ecacc233ed4c04c86fdceabb8fbd3a54b1554a41","unresolved":false,"context_lines":[{"line_number":30,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":31,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"[testenv:py33]"},{"line_number":34,"context_line":"setenv \u003d"},{"line_number":35,"context_line":"    {[testenv]setenv}"},{"line_number":36,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"}],"source_content_type":"text/x-properties","patch_set":8,"id":"7ad32947_7f9c6a69","line":33,"in_reply_to":"7ad32947_16d3313a","updated":"2015-04-28 06:14:26.000000000","message":"I don\u0027t think we should have this section either.  If we\u0027re not going to support py33, then it should not be here.","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"684c805e097a964e356d84558f1ebe6d5054b042","unresolved":false,"context_lines":[{"line_number":30,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":31,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"[testenv:py33]"},{"line_number":34,"context_line":"setenv \u003d"},{"line_number":35,"context_line":"    {[testenv]setenv}"},{"line_number":36,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3acd31a7_8db94bec","line":33,"in_reply_to":"7ad32947_7f9c6a69","updated":"2015-04-30 15:22:12.000000000","message":"ok, removed","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f4adc073713a8d562c50aba8bad92757a0bcc379","unresolved":false,"context_lines":[{"line_number":30,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":31,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"[testenv:py33]"},{"line_number":34,"context_line":"setenv \u003d"},{"line_number":35,"context_line":"    {[testenv]setenv}"},{"line_number":36,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"}],"source_content_type":"text/x-properties","patch_set":8,"id":"7ad32947_16d3313a","line":33,"in_reply_to":"bab921fb_34dde942","updated":"2015-04-27 17:12:40.000000000","message":"I\u0027m not sure we should have this. why do we want to allow users to run \u0027tox -e py33\u0027? If we put this here, someone may ask why we don\u0027t support py33.","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4be28e55e381939fc1b25c906667a439d164e54a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"deps \u003d -r{toxinidir}/requirements.txt"},{"line_number":31,"context_line":"       -r{toxinidir}/test-requirements-py3.txt"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"[testenv:py33]"},{"line_number":34,"context_line":"setenv \u003d"},{"line_number":35,"context_line":"    {[testenv]setenv}"},{"line_number":36,"context_line":"    OS_TEST_DBAPI_ADMIN_CONNECTION\u003dmysql+pymysql://openstack_citest:openstack_citest@localhost/;postgresql://openstack_citest:openstack_citest@localhost/postgres;sqlite://"}],"source_content_type":"text/x-properties","patch_set":8,"id":"bab921fb_34dde942","line":33,"in_reply_to":"bab921fb_4381cc49","updated":"2015-04-23 15:05:44.000000000","message":"this section only allows to run `tox -e py33` locally (sure, if someone want to do it)","commit_id":"dad6b50378b4036e6a0d395ed2854da9634a418b"}]}
