)]}'
{"tests/ci/osresources.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"fc17210ae97010e24891d0d639a4041908559a26","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            resource_name \u003d prop[5:][:-1]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            for res in resources:"},{"line_number":57,"context_line":"                # NOTE(stpierre): It\u0027d be nice if we could make this a"},{"line_number":58,"context_line":"                # dict, but then we get ordering issues. So a list of"},{"line_number":59,"context_line":"                # 2-tuples it must be."},{"line_number":60,"context_line":"                res_repr \u003d []"},{"line_number":61,"context_line":"                for key in self.REPR_KEYS + (resource_name,):"},{"line_number":62,"context_line":"                    if isinstance(res, dict):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a061dce_18d92622","line":59,"range":{"start_line":57,"start_character":16,"end_line":59,"end_character":38},"updated":"2016-04-05 08:56:40.000000000","message":"we can use OrderedDict:)","commit_id":"e0ef0d7ec072aeb76a5accfbd32c9280ea45a685"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"132b84ee257fc8df590df8429916a92b72b7d74c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            resource_name \u003d prop[5:][:-1]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            for res in resources:"},{"line_number":57,"context_line":"                # NOTE(stpierre): It\u0027d be nice if we could make this a"},{"line_number":58,"context_line":"                # dict, but then we get ordering issues. So a list of"},{"line_number":59,"context_line":"                # 2-tuples it must be."},{"line_number":60,"context_line":"                res_repr \u003d []"},{"line_number":61,"context_line":"                for key in self.REPR_KEYS + (resource_name,):"},{"line_number":62,"context_line":"                    if isinstance(res, dict):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a061dce_3a368be7","line":59,"range":{"start_line":57,"start_character":16,"end_line":59,"end_character":38},"in_reply_to":"9a061dce_18d92622","updated":"2016-04-05 14:34:32.000000000","message":"OrderedDict won\u0027t survive being saved as JSON and then loaded again. If we can\u0027t preserve the order of each resource, then the comparison gets a *lot* harder.","commit_id":"e0ef0d7ec072aeb76a5accfbd32c9280ea45a685"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"423cda049ff2bc96e362bbb26de96e4950ecdd67","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            resource_name \u003d prop[5:][:-1]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            for res in resources:"},{"line_number":57,"context_line":"                # NOTE(stpierre): It\u0027d be nice if we could make this a"},{"line_number":58,"context_line":"                # dict, but then we get ordering issues. So a list of"},{"line_number":59,"context_line":"                # 2-tuples it must be."},{"line_number":60,"context_line":"                res_repr \u003d []"},{"line_number":61,"context_line":"                for key in self.REPR_KEYS + (resource_name,):"},{"line_number":62,"context_line":"                    if isinstance(res, dict):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a061dce_6e6960be","line":59,"range":{"start_line":57,"start_character":16,"end_line":59,"end_character":38},"in_reply_to":"9a061dce_3a368be7","updated":"2016-04-05 16:07:49.000000000","message":"I\u0027m ok with using tuples or lists, but you are wrong about OrderedDict and JSON:) There is a way to save the order there and load it again, like : https://github.com/openstack/rally/blob/0.3.3/rally/common/db/sqlalchemy/types.py#L30-L39","commit_id":"e0ef0d7ec072aeb76a5accfbd32c9280ea45a685"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"fc17210ae97010e24891d0d639a4041908559a26","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            print(\"Removed\")"},{"line_number":317,"context_line":"            print(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\")"},{"line_number":318,"context_line":"            for resource in removed:"},{"line_number":319,"context_line":"                print(resource2string(resource))"},{"line_number":320,"context_line":"            print(\"\")"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if added:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a061dce_38822a95","line":319,"range":{"start_line":319,"start_character":16,"end_line":319,"end_character":48},"updated":"2016-04-05 08:56:40.000000000","message":"can we use here rally.cli.cliutils.print_list here(it accepts dict or object now)? table with headers \"service, resource_name, identifiers\" should be more readable","commit_id":"e0ef0d7ec072aeb76a5accfbd32c9280ea45a685"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"132b84ee257fc8df590df8429916a92b72b7d74c","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            print(\"Removed\")"},{"line_number":317,"context_line":"            print(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\")"},{"line_number":318,"context_line":"            for resource in removed:"},{"line_number":319,"context_line":"                print(resource2string(resource))"},{"line_number":320,"context_line":"            print(\"\")"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if added:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a061dce_45c5648c","line":319,"range":{"start_line":319,"start_character":16,"end_line":319,"end_character":48},"in_reply_to":"9a061dce_38822a95","updated":"2016-04-05 14:34:32.000000000","message":"Done","commit_id":"e0ef0d7ec072aeb76a5accfbd32c9280ea45a685"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"60fa2a8e3cf2ab72446b622a5d1db3fec2ef3a05","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        changes \u003d resources.compare(with_list\u003dgiven_list)"},{"line_number":320,"context_line":"        removed, added \u003d changes"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if removed:"},{"line_number":323,"context_line":"            _print_tabular_resources(removed, \"Removed resources\")"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if added:"},{"line_number":326,"context_line":"            _print_tabular_resources(added, \"Added resources\")"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        if any(changes):"},{"line_number":329,"context_line":"            return 0  # `1\u0027 will fail gate job"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_1079d62f","line":326,"range":{"start_line":322,"start_character":8,"end_line":326,"end_character":62},"updated":"2016-04-05 19:45:46.000000000","message":"it looks really cool","commit_id":"cfa93771561ff0f5eff08ba758813b5a076e1f1b"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ca200d7c9e0080e1ba295f0cde9ebea71014a208","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        changes \u003d resources.compare(with_list\u003dgiven_list)"},{"line_number":320,"context_line":"        removed, added \u003d changes"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if removed:"},{"line_number":323,"context_line":"            _print_tabular_resources(removed, \"Removed resources\")"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if added:"},{"line_number":326,"context_line":"            _print_tabular_resources(added, \"Added resources\")"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        if any(changes):"},{"line_number":329,"context_line":"            return 0  # `1\u0027 will fail gate job"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_d995a187","line":326,"range":{"start_line":322,"start_character":8,"end_line":326,"end_character":62},"in_reply_to":"9a061dce_1079d62f","updated":"2016-04-06 13:51:13.000000000","message":"@Andrey, I do not think that is cool. With JSON, we can load results back into python/etc format, if required, and process them. Now we have ascii table for humans only and parsing results by some script is complicated","commit_id":"cfa93771561ff0f5eff08ba758813b5a076e1f1b"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"30ebeb8cf0a661f040a3d07e164a80901a064e13","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        removed, added \u003d changes"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if removed:"},{"line_number":323,"context_line":"            _print_tabular_resources(removed, \"Removed resources\")"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if added:"},{"line_number":326,"context_line":"            _print_tabular_resources(added, \"Added resources\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_38bace0a","line":323,"updated":"2016-04-06 15:39:42.000000000","message":"This output format differs from L316, and ascii table can not be easily parsed by scripts.\n\nThis should be JSON, not ascii table, because program-readable output can be useful since that is all about cloud resources listing.\n\nAlso resource list (not compare) is stand-alone important CLI command, but it outputs data in JSON, so we have listings in JSON but comparison in ASCII tables - this is at least confusing","commit_id":"73733138e23bc91b49e5f92b9df3aa76ccc2eb8b"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"665d7cb1b6a87e60f38e9144cea4a9c2c09d6b69","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        removed, added \u003d changes"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if removed:"},{"line_number":323,"context_line":"            _print_tabular_resources(removed, \"Removed resources\")"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if added:"},{"line_number":326,"context_line":"            _print_tabular_resources(added, \"Added resources\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_586b4285","line":323,"in_reply_to":"9a061dce_38bace0a","updated":"2016-04-06 15:40:28.000000000","message":"Let\u0027s not overcomplicate this, existing code is enough","commit_id":"73733138e23bc91b49e5f92b9df3aa76ccc2eb8b"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"89c0234a678e4a710979161ef15fb8422f9c8d4d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        removed, added \u003d changes"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if removed:"},{"line_number":323,"context_line":"            _print_tabular_resources(removed, \"Removed resources\")"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if added:"},{"line_number":326,"context_line":"            _print_tabular_resources(added, \"Added resources\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_f894d643","line":323,"in_reply_to":"9a061dce_586b4285","updated":"2016-04-06 15:42:08.000000000","message":"This is optimized for the actual current usage of this script. The output is not used for parsing, it is not consumed by other scripts, it is read by humans. This makes it readable by humans. Outputting JSON optimizes for an imagined use that does not exist and may never exist.","commit_id":"73733138e23bc91b49e5f92b9df3aa76ccc2eb8b"}]}
